@lv-x-software-house/x_view 1.2.5-dev.20 → 1.2.5-dev.22

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 +749 -456
  2. package/dist/index.mjs +649 -356
  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_react26 = __toESM(require("react"));
47
+ var import_react27 = __toESM(require("react"));
48
48
  var import_navigation = require("next/navigation");
49
- var import_react27 = require("next-auth/react");
49
+ var import_react28 = 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");
@@ -145,7 +145,8 @@ function ContextMenu({
145
145
  onClose,
146
146
  viewMembers,
147
147
  currentUser,
148
- onStartQuest
148
+ onStartQuest,
149
+ onFinishQuest
149
150
  }) {
150
151
  var _a, _b, _c;
151
152
  const menuRef = (0, import_react.useRef)(null);
@@ -346,12 +347,13 @@ function ContextMenu({
346
347
  });
347
348
  };
348
349
  const renderMainView = () => {
349
- var _a2, _b2, _c2;
350
+ var _a2, _b2, _c2, _d;
350
351
  const hasVersions = computedVersions.length > 0;
351
352
  const canCreateVersion = ability.can("create", "Versioning");
352
353
  const canReadVersion = ability.can("read", "Versioning");
353
354
  const shouldShowVersioningBtn = canCreateVersion || canReadVersion && hasVersions;
354
355
  const canStartQuest = isCurrentNodeQuest && (((_a2 = data.nodeData) == null ? void 0 : _a2.status) !== "In Progress" || ((_b2 = data.nodeData) == null ? void 0 : _b2.assignee_id) !== (currentUser == null ? void 0 : currentUser.id));
356
+ const canFinishQuest = isCurrentNodeQuest && ((_c2 = data.nodeData) == null ? void 0 : _c2.assignee_id) === (currentUser == null ? void 0 : currentUser.id);
355
357
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_12px_1px_rgba(99,102,241,0.5)]" }), /* @__PURE__ */ import_react.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es R\xE1pidas")), /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col gap-1" }, canStartQuest && /* @__PURE__ */ import_react.default.createElement(
356
358
  "button",
357
359
  {
@@ -364,7 +366,19 @@ function ContextMenu({
364
366
  },
365
367
  /* @__PURE__ */ import_react.default.createElement("span", null, "\u{1F680}"),
366
368
  /* @__PURE__ */ import_react.default.createElement("span", null, "Iniciar Quest")
367
- ), ability.can("create", "Connection") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartConnection == null ? void 0 : onStartConnection(data.nodeData), className: baseButtonClass, title: "Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conectar")), ability.can("create", "Node") && !((_c2 = data.nodeData) == null ? void 0 : _c2.is_quest) && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartCreation == null ? void 0 : onStartCreation(data.nodeData), className: baseButtonClass, title: "Criar e Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "16" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "8", y1: "12", x2: "16", y2: "12" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Criar e Conectar")), ability.can("create", "Ancestry") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartAncestryCreation == null ? void 0 : onStartAncestryCreation(data.nodeData), className: baseButtonClass, title: "Criar Ancestralidade" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 20.5c.5-.5.8-1.2.8-2s-.3-1.5-.8-2c-.5-.5-1.2-.8-2-.8s-1.5.3-2 .8c-.5.5-.8 1.2-.8 2s.3 1.5.8 2c.5.5 1.2-.8 2 .8s1.5-.3 2-.8c-.5-.5-.8-1.2-.8-2s.3-1.5.8-2c.5.5 1.2-.8 2 .8s1.5.3 2 .8Z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 16v-3a2 2 0 0 1 2-2h4" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 3.5c.5.5.8 1.2.8 2s-.3 1.5-.8 2c-.5-.5-1.2-.8-2 .8s1.5.3-2-.8c-.5-.5-.8-1.2-.8-2s.3-1.5.8-2c.5.5 1.2-.8 2 .8s1.5.3 2 .8Z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 8v3a2 2 0 0 0 2 2h4" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Criar Ancestralidade")), shouldShowVersioningBtn && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("versioning"), className: baseButtonClass, title: hasVersions ? "Versionamento" : "Criar Versionamento" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("line", { x1: "6", y1: "3", x2: "6", y2: "15" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "18", cy: "6", r: "3" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "6", cy: "18", r: "3" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M18 9a9 9 0 0 1-9 9" })), /* @__PURE__ */ import_react.default.createElement("span", null, hasVersions || !canCreateVersion ? "Versionamento" : "Criar Versionamento")), (connections.length > 0 || availableAncestries.length > 0) && ability.can("read", "Connection") && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("connections"), className: baseButtonClass, title: "Conex\xF5es" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M8 12h8" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 8v8" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conex\xF5es (", totalConnectionsCount, ")"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => {
369
+ ), canFinishQuest && /* @__PURE__ */ import_react.default.createElement(
370
+ "button",
371
+ {
372
+ onClick: () => {
373
+ onFinishQuest == null ? void 0 : onFinishQuest(data.nodeData);
374
+ onClose();
375
+ },
376
+ className: `w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20 hover:text-emerald-300 transition-colors duration-150 truncate font-semibold shadow-inner`,
377
+ title: "Finalizar esta quest"
378
+ },
379
+ /* @__PURE__ */ import_react.default.createElement("span", null, "\u2705"),
380
+ /* @__PURE__ */ import_react.default.createElement("span", null, "Finalizar Quest")
381
+ ), ability.can("create", "Connection") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartConnection == null ? void 0 : onStartConnection(data.nodeData), className: baseButtonClass, title: "Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conectar")), ability.can("create", "Node") && !((_d = data.nodeData) == null ? void 0 : _d.is_quest) && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartCreation == null ? void 0 : onStartCreation(data.nodeData), className: baseButtonClass, title: "Criar e Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "16" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "8", y1: "12", x2: "16", y2: "12" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Criar e Conectar")), ability.can("create", "Ancestry") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartAncestryCreation == null ? void 0 : onStartAncestryCreation(data.nodeData), className: baseButtonClass, title: "Criar Ancestralidade" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 20.5c.5-.5.8-1.2.8-2s-.3-1.5-.8-2c-.5-.5-1.2-.8-2-.8s-1.5.3-2 .8c-.5.5-.8 1.2-.8 2s.3 1.5.8 2c.5.5 1.2-.8 2 .8s1.5-.3 2-.8c-.5-.5-.8-1.2-.8-2s.3-1.5.8-2c.5.5 1.2-.8 2 .8s1.5.3 2 .8Z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 16v-3a2 2 0 0 1 2-2h4" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 3.5c.5.5.8 1.2.8 2s-.3 1.5-.8 2c-.5-.5-1.2-.8-2 .8s1.5.3-2-.8c-.5-.5-.8-1.2-.8-2s.3-1.5.8-2c.5.5 1.2-.8 2 .8s1.5.3 2 .8Z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 8v3a2 2 0 0 0 2 2h4" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Criar Ancestralidade")), shouldShowVersioningBtn && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("versioning"), className: baseButtonClass, title: hasVersions ? "Versionamento" : "Criar Versionamento" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("line", { x1: "6", y1: "3", x2: "6", y2: "15" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "18", cy: "6", r: "3" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "6", cy: "18", r: "3" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M18 9a9 9 0 0 1-9 9" })), /* @__PURE__ */ import_react.default.createElement("span", null, hasVersions || !canCreateVersion ? "Versionamento" : "Criar Versionamento")), (connections.length > 0 || availableAncestries.length > 0) && ability.can("read", "Connection") && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("connections"), className: baseButtonClass, title: "Conex\xF5es" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M8 12h8" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 8v8" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conex\xF5es (", totalConnectionsCount, ")"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => {
368
382
  onFocusNode == null ? void 0 : onFocusNode(data.nodeData);
369
383
  onClose();
370
384
  }, className: baseButtonClass, title: "Focar na c\xE2mera" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "3" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Focar neste Node")), /* @__PURE__ */ import_react.default.createElement("button", { onClick: (e) => handleCopyLink(e, data.nodeData), className: baseButtonClass, title: "Copiar Link para Compartilhar" }, isLinkCopied ? /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#4ade80", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("polyline", { points: "20 6 9 17 4 12" })) : /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })), /* @__PURE__ */ import_react.default.createElement("span", { className: isLinkCopied ? "text-green-400" : "" }, isLinkCopied ? "Copiado!" : "Copiar Link")), ability.can("dismiss", "Node") && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onDismissNode == null ? void 0 : onDismissNode(data.nodeData), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Dismiss")), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onDismissOtherNodes == null ? void 0 : onDismissOtherNodes(data.nodeData), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Dismiss other nodes"))), ability.can("delete", "Node") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("deleteConfirmation"), className: deleteButtonClass, title: "Excluir Node" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Excluir Node"))));
@@ -2769,7 +2783,15 @@ var userActionHandlers = {
2769
2783
  var _a;
2770
2784
  const { graphDataRef, sceneDataRef, stateRef, setters } = context;
2771
2785
  if (!graphDataRef.current || !sceneDataRef.current) return;
2772
- const { _baseEmissiveIntensity: ignored, ...nodeToSave } = updatedNode;
2786
+ const {
2787
+ _baseEmissiveIntensity,
2788
+ _baseScale,
2789
+ labelObject,
2790
+ labelOffset,
2791
+ timelineIntervalBar,
2792
+ timelineEndLabel,
2793
+ ...nodeToSave
2794
+ } = updatedNode;
2773
2795
  const parentInfo = getParentFileInfoForNode(graphDataRef.current, sceneDataRef.current, nodeToSave.id, context.sceneConfigId, context.ownerId);
2774
2796
  if (!parentInfo || !parentInfo.ownerId) {
2775
2797
  console.error("N\xE3o foi poss\xEDvel encontrar as informa\xE7\xF5es do arquivo pai (ou ownerId) para o Node a ser atualizado:", nodeToSave.id);
@@ -8366,8 +8388,116 @@ function InSceneVersionForm({
8366
8388
  }
8367
8389
 
8368
8390
  // src/components/InSceneQuestForm.jsx
8391
+ var import_react17 = __toESM(require("react"));
8392
+ var import_fi15 = require("react-icons/fi");
8393
+
8394
+ // src/components/QuestReviewStackEditor.jsx
8369
8395
  var import_react16 = __toESM(require("react"));
8370
8396
  var import_fi14 = require("react-icons/fi");
8397
+ function QuestReviewStackEditor({
8398
+ reviewStack = [],
8399
+ onChange,
8400
+ viewMembers = [],
8401
+ readOnly = false
8402
+ }) {
8403
+ const [isAdding, setIsAdding] = (0, import_react16.useState)(false);
8404
+ const [searchQuery, setSearchQuery] = (0, import_react16.useState)("");
8405
+ const handleAddReviewer = (userId) => {
8406
+ const newStack = [...reviewStack, { userId, status: "pending", mandatory: false }];
8407
+ onChange(newStack);
8408
+ setIsAdding(false);
8409
+ setSearchQuery("");
8410
+ };
8411
+ const handleRemoveReviewer = (index) => {
8412
+ const newStack = reviewStack.filter((_, i) => i !== index);
8413
+ onChange(newStack);
8414
+ };
8415
+ const handleToggleMandatory = (index) => {
8416
+ const newStack = [...reviewStack];
8417
+ newStack[index] = { ...newStack[index], mandatory: !newStack[index].mandatory };
8418
+ onChange(newStack);
8419
+ };
8420
+ const handleMove = (index, direction) => {
8421
+ const newStack = [...reviewStack];
8422
+ const targetIndex = index + direction;
8423
+ if (targetIndex < 0 || targetIndex >= newStack.length) return;
8424
+ [newStack[index], newStack[targetIndex]] = [newStack[targetIndex], newStack[index]];
8425
+ onChange(newStack);
8426
+ };
8427
+ const filteredMembers = viewMembers.filter((m) => {
8428
+ const search = searchQuery.toLowerCase();
8429
+ return (m.name || "").toLowerCase().includes(search) || (m.email || "").toLowerCase().includes(search);
8430
+ });
8431
+ return /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Review Stack (Sequential)"), !readOnly && !isAdding && /* @__PURE__ */ import_react16.default.createElement(
8432
+ "button",
8433
+ {
8434
+ type: "button",
8435
+ onClick: () => setIsAdding(true),
8436
+ className: "flex items-center gap-1 px-2 py-1 text-[10px] bg-sky-500/20 text-sky-300 border border-sky-500/30 rounded hover:bg-sky-500/30 transition-colors"
8437
+ },
8438
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiPlus, { size: 10 }),
8439
+ " Adicionar Camada"
8440
+ )), isAdding && /* @__PURE__ */ import_react16.default.createElement("div", { className: "bg-slate-900/50 border border-sky-500/30 rounded-lg p-2 space-y-2 animate-in fade-in slide-in-from-top-1 duration-200" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiSearch, { className: "absolute left-2 top-1/2 -translate-y-1/2 text-slate-500", size: 12 }), /* @__PURE__ */ import_react16.default.createElement(
8441
+ "input",
8442
+ {
8443
+ autoFocus: true,
8444
+ type: "text",
8445
+ placeholder: "Buscar revisor...",
8446
+ value: searchQuery,
8447
+ onChange: (e) => setSearchQuery(e.target.value),
8448
+ className: "w-full bg-slate-800 border border-white/10 rounded p-1.5 pl-7 text-xs focus:outline-none focus:ring-1 focus:ring-sky-400"
8449
+ }
8450
+ ), /* @__PURE__ */ import_react16.default.createElement("button", { onClick: () => setIsAdding(false), className: "absolute right-2 top-1/2 -translate-y-1/2 text-slate-500 hover:text-white" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 14 }))), /* @__PURE__ */ import_react16.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar space-y-1" }, filteredMembers.map((m) => /* @__PURE__ */ import_react16.default.createElement(
8451
+ "li",
8452
+ {
8453
+ key: m.id,
8454
+ onClick: () => handleAddReviewer(m.id),
8455
+ className: "px-2 py-1.5 hover:bg-white/5 rounded cursor-pointer text-xs flex items-center gap-2"
8456
+ },
8457
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiUser, { size: 12, className: "text-slate-400" }),
8458
+ /* @__PURE__ */ import_react16.default.createElement("span", { className: "truncate" }, m.name || m.email)
8459
+ )), filteredMembers.length === 0 && /* @__PURE__ */ import_react16.default.createElement("li", { className: "text-[10px] text-slate-500 text-center py-2 italic font-light" }, "Nenhum membro encontrado"))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5" }, reviewStack.map((item, index) => {
8460
+ const member = viewMembers.find((m) => m.id === item.userId);
8461
+ const isCompleted = item.status === "completed";
8462
+ return /* @__PURE__ */ import_react16.default.createElement(
8463
+ "div",
8464
+ {
8465
+ key: index,
8466
+ className: `group relative flex items-center gap-3 p-2 rounded-lg border ${isCompleted ? "bg-green-500/5 border-green-500/20" : "bg-white/5 border-white/10"} hover:border-white/20 transition-all`
8467
+ },
8468
+ /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex flex-col items-center gap-0.5 text-slate-500" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] font-bold opacity-50" }, index + 1), !readOnly && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: () => handleMove(index, -1), disabled: index === 0, className: "hover:text-sky-400 disabled:opacity-20" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronUp, { size: 12 })), /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: () => handleMove(index, 1), disabled: index === reviewStack.length - 1, className: "hover:text-sky-400 disabled:opacity-20" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { size: 12 })))),
8469
+ /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: `truncate text-sm font-medium ${isCompleted ? "text-green-300" : "text-slate-200"}` }, (member == null ? void 0 : member.name) || (member == null ? void 0 : member.email) || "Unknown User"), item.mandatory && /* @__PURE__ */ import_react16.default.createElement("span", { className: "flex-shrink-0 px-1.5 py-0.5 rounded-full bg-amber-500/20 text-amber-300 text-[8px] font-bold uppercase tracking-tighter border border-amber-500/30" }, "Obrigat\xF3rio")), /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-[10px] text-slate-500 flex items-center gap-1" }, isCompleted ? "\u2713 Review Conclu\xEDda" : "\u23F3 Pendente")),
8470
+ !readOnly && /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react16.default.createElement(
8471
+ "button",
8472
+ {
8473
+ type: "button",
8474
+ onClick: () => handleToggleMandatory(index),
8475
+ title: item.mandatory ? "Remover obrigatoriedade" : "Tornar obrigat\xF3rio",
8476
+ className: `p-1.5 rounded hover:bg-white/10 transition-colors ${item.mandatory ? "text-amber-400" : "text-slate-500"}`
8477
+ },
8478
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiAlertCircle, { size: 14 })
8479
+ ), /* @__PURE__ */ import_react16.default.createElement(
8480
+ "button",
8481
+ {
8482
+ type: "button",
8483
+ onClick: () => handleRemoveReviewer(index),
8484
+ className: "p-1.5 rounded hover:bg-red-500/20 text-slate-500 hover:text-red-400 transition-colors"
8485
+ },
8486
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 14 })
8487
+ ))
8488
+ );
8489
+ }), reviewStack.length === 0 && !isAdding && /* @__PURE__ */ import_react16.default.createElement("div", { className: "py-6 border-2 border-dashed border-white/5 rounded-xl flex flex-col items-center justify-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-xs text-slate-500 font-light italic" }, "Nenhum revisor definido"), !readOnly && /* @__PURE__ */ import_react16.default.createElement(
8490
+ "button",
8491
+ {
8492
+ type: "button",
8493
+ onClick: () => setIsAdding(true),
8494
+ className: "text-[10px] text-sky-400 hover:underline"
8495
+ },
8496
+ "+ Come\xE7ar a Review Stack"
8497
+ ))));
8498
+ }
8499
+
8500
+ // src/components/InSceneQuestForm.jsx
8371
8501
  var QUEST_STATUS_COLORS2 = {
8372
8502
  "Backlog": "#64748b",
8373
8503
  "In Progress": "#eab308",
@@ -8391,23 +8521,25 @@ function InSceneQuestForm({
8391
8521
  // NOVA PROP
8392
8522
  questCounter = 1,
8393
8523
  // NOVA PROP
8394
- viewMembers = []
8524
+ viewMembers = [],
8525
+ session = null
8395
8526
  }) {
8396
8527
  var _a, _b;
8397
- const [name, setName] = (0, import_react16.useState)("");
8398
- const [assigneeId, setAssigneeId] = (0, import_react16.useState)("");
8399
- const [types, setTypes] = (0, import_react16.useState)(["quest"]);
8400
- const [typeInput, setTypeInput] = (0, import_react16.useState)("");
8401
- const [status, setStatus] = (0, import_react16.useState)("Backlog");
8402
- const [size, setSize] = (0, import_react16.useState)("medium");
8403
- const [intensity, setIntensity] = (0, import_react16.useState)(0);
8404
- const [description, setDescription] = (0, import_react16.useState)("");
8405
- const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react16.useState)(false);
8406
- const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react16.useState)(false);
8407
- const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react16.useState)("");
8408
- const [customProps, setCustomProps] = (0, import_react16.useState)([]);
8409
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react16.useState)(false);
8410
- const propsEndRef = (0, import_react16.useRef)(null);
8528
+ const [name, setName] = (0, import_react17.useState)("");
8529
+ const [assigneeId, setAssigneeId] = (0, import_react17.useState)("");
8530
+ const [types, setTypes] = (0, import_react17.useState)(["quest"]);
8531
+ const [typeInput, setTypeInput] = (0, import_react17.useState)("");
8532
+ const [status, setStatus] = (0, import_react17.useState)("Backlog");
8533
+ const [size, setSize] = (0, import_react17.useState)("medium");
8534
+ const [intensity, setIntensity] = (0, import_react17.useState)(0);
8535
+ const [description, setDescription] = (0, import_react17.useState)("");
8536
+ const [reviewStack, setReviewStack] = (0, import_react17.useState)([]);
8537
+ const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react17.useState)(false);
8538
+ const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react17.useState)(false);
8539
+ const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react17.useState)("");
8540
+ const [customProps, setCustomProps] = (0, import_react17.useState)([]);
8541
+ const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react17.useState)(false);
8542
+ const propsEndRef = (0, import_react17.useRef)(null);
8411
8543
  const standardizedName = `${viewName} - ${questCounter} - \xBB ${name || "Nova Quest"}`;
8412
8544
  const handleAddProp = () => {
8413
8545
  const newProp = createNewCustomProperty(customProps);
@@ -8443,6 +8575,7 @@ function InSceneQuestForm({
8443
8575
  }
8444
8576
  };
8445
8577
  const handleSubmit = (e) => {
8578
+ var _a2, _b2, _c, _d;
8446
8579
  e.preventDefault();
8447
8580
  if (!name.trim()) {
8448
8581
  alert("O campo 'T\xEDtulo' \xE9 obrigat\xF3rio.");
@@ -8452,6 +8585,22 @@ function InSceneQuestForm({
8452
8585
  customProps.filter((prop) => prop.key.trim() && !prop.isEditing)
8453
8586
  );
8454
8587
  const processedSections = processDescriptionForSave(description, []);
8588
+ const initialTimeline = [{
8589
+ type: "quest_created",
8590
+ timestamp: Date.now(),
8591
+ actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
8592
+ description: `Quest criada por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
8593
+ }];
8594
+ if (assigneeId) {
8595
+ initialTimeline.push({
8596
+ type: "assignee_changed",
8597
+ timestamp: Date.now() + 1,
8598
+ // Ensure sequential timestamp
8599
+ actorId: ((_c = session == null ? void 0 : session.user) == null ? void 0 : _c.id) || "unknown",
8600
+ to_assignee_id: assigneeId,
8601
+ description: `Quest atribu\xEDda para ${((_d = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _d.name) || "respons\xE1vel"}.`
8602
+ });
8603
+ }
8455
8604
  onSave({
8456
8605
  name: standardizedName,
8457
8606
  // SALVA O NOME FORMATADO
@@ -8467,13 +8616,15 @@ function InSceneQuestForm({
8467
8616
  description_sections: processedSections,
8468
8617
  useImageAsTexture: false,
8469
8618
  textureImageUrl: null,
8619
+ reviewStack,
8620
+ timeline: initialTimeline,
8470
8621
  ...additionalData
8471
8622
  });
8472
8623
  };
8473
8624
  const swallow = (e) => e.stopPropagation();
8474
8625
  const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
8475
8626
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
8476
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(
8627
+ return /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
8477
8628
  "div",
8478
8629
  {
8479
8630
  ref: refEl,
@@ -8485,8 +8636,8 @@ function InSceneQuestForm({
8485
8636
  onContextMenu: swallow,
8486
8637
  onDoubleClick: swallow
8487
8638
  },
8488
- /* @__PURE__ */ import_react16.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS2[status]}, transparent)` } }),
8489
- /* @__PURE__ */ import_react16.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react16.default.createElement("div", null, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Nova quest")), /* @__PURE__ */ import_react16.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Criar Quest")), /* @__PURE__ */ import_react16.default.createElement(
8639
+ /* @__PURE__ */ import_react17.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS2[status]}, transparent)` } }),
8640
+ /* @__PURE__ */ import_react17.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react17.default.createElement("div", null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react17.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Nova quest")), /* @__PURE__ */ import_react17.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Criar Quest")), /* @__PURE__ */ import_react17.default.createElement(
8490
8641
  "button",
8491
8642
  {
8492
8643
  type: "button",
@@ -8496,7 +8647,7 @@ function InSceneQuestForm({
8496
8647
  },
8497
8648
  "\xD7"
8498
8649
  )),
8499
- /* @__PURE__ */ import_react16.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react16.default.createElement(
8650
+ /* @__PURE__ */ import_react17.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react17.default.createElement(
8500
8651
  "input",
8501
8652
  {
8502
8653
  required: true,
@@ -8510,16 +8661,16 @@ function InSceneQuestForm({
8510
8661
  },
8511
8662
  className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none focus:ring-2 focus:ring-indigo-400/60"
8512
8663
  }
8513
- ), /* @__PURE__ */ import_react16.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(
8664
+ ), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react17.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Status da Quest"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react17.default.createElement(
8514
8665
  "button",
8515
8666
  {
8516
8667
  type: "button",
8517
8668
  onClick: () => setIsStatusDropdownOpen(!isStatusDropdownOpen),
8518
8669
  className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
8519
8670
  },
8520
- /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]", style: { backgroundColor: QUEST_STATUS_COLORS2[status] } }), /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
8521
- /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
8522
- ), isStatusDropdownOpen && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react16.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS2).map((s) => /* @__PURE__ */ import_react16.default.createElement(
8671
+ /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]", style: { backgroundColor: QUEST_STATUS_COLORS2[status] } }), /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
8672
+ /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
8673
+ ), isStatusDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react17.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS2).map((s) => /* @__PURE__ */ import_react17.default.createElement(
8523
8674
  "li",
8524
8675
  {
8525
8676
  key: s,
@@ -8530,21 +8681,21 @@ function InSceneQuestForm({
8530
8681
  },
8531
8682
  className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${status === s ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
8532
8683
  },
8533
- /* @__PURE__ */ import_react16.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS2[s] } }),
8684
+ /* @__PURE__ */ import_react17.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS2[s] } }),
8534
8685
  s
8535
- )))))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(
8686
+ )))))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Assignee (Respons\xE1vel)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react17.default.createElement(
8536
8687
  "button",
8537
8688
  {
8538
8689
  type: "button",
8539
8690
  onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
8540
8691
  className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
8541
8692
  },
8542
- /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_a = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _a.name) || ((_b = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _b.email) || "Nenhum")),
8543
- /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
8544
- ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
8693
+ /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_a = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _a.name) || ((_b = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _b.email) || "Nenhum")),
8694
+ /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
8695
+ ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
8545
8696
  setIsAssigneeDropdownOpen(false);
8546
8697
  setAssigneeSearchQuery("");
8547
- } }), /* @__PURE__ */ import_react16.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react16.default.createElement(
8698
+ } }), /* @__PURE__ */ import_react17.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react17.default.createElement(
8548
8699
  "input",
8549
8700
  {
8550
8701
  type: "text",
@@ -8555,7 +8706,7 @@ function InSceneQuestForm({
8555
8706
  className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
8556
8707
  onClick: (e) => e.stopPropagation()
8557
8708
  }
8558
- )), /* @__PURE__ */ import_react16.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react16.default.createElement(
8709
+ )), /* @__PURE__ */ import_react17.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react17.default.createElement(
8559
8710
  "li",
8560
8711
  {
8561
8712
  onClick: () => {
@@ -8569,7 +8720,7 @@ function InSceneQuestForm({
8569
8720
  ), viewMembers.filter((member) => {
8570
8721
  const search = assigneeSearchQuery.toLowerCase();
8571
8722
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
8572
- }).map((member) => /* @__PURE__ */ import_react16.default.createElement(
8723
+ }).map((member) => /* @__PURE__ */ import_react17.default.createElement(
8573
8724
  "li",
8574
8725
  {
8575
8726
  key: member.id,
@@ -8584,7 +8735,14 @@ function InSceneQuestForm({
8584
8735
  )), viewMembers.filter((member) => {
8585
8736
  const search = assigneeSearchQuery.toLowerCase();
8586
8737
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
8587
- }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react16.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ import_react16.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, t !== "quest" && /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 12 })))), /* @__PURE__ */ import_react16.default.createElement(
8738
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react17.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react17.default.createElement(
8739
+ QuestReviewStackEditor,
8740
+ {
8741
+ reviewStack,
8742
+ onChange: setReviewStack,
8743
+ viewMembers
8744
+ }
8745
+ )), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Tipos Adicionais"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ import_react17.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, t !== "quest" && /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiX, { size: 12 })))), /* @__PURE__ */ import_react17.default.createElement(
8588
8746
  "input",
8589
8747
  {
8590
8748
  type: "text",
@@ -8597,7 +8755,7 @@ function InSceneQuestForm({
8597
8755
  className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
8598
8756
  autoComplete: "off"
8599
8757
  }
8600
- ))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative group min-h-[80px] bg-slate-800/70 p-2.5 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react16.default.createElement(
8758
+ ))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Descri\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative group min-h-[80px] bg-slate-800/70 p-2.5 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(
8601
8759
  DescriptionDisplay,
8602
8760
  {
8603
8761
  description,
@@ -8607,7 +8765,7 @@ function InSceneQuestForm({
8607
8765
  onMentionClick,
8608
8766
  onSaveDescription: (newDesc) => setDescription(newDesc)
8609
8767
  }
8610
- ), /* @__PURE__ */ import_react16.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: () => setIsDescriptionModalOpen(true), className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiEdit2, { size: 14 }))), !description && /* @__PURE__ */ import_react16.default.createElement("div", { onClick: () => setIsDescriptionModalOpen(true), className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text" }, "Adicionar descri\xE7\xE3o..."))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => /* @__PURE__ */ import_react16.default.createElement(
8768
+ ), /* @__PURE__ */ import_react17.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: () => setIsDescriptionModalOpen(true), className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiEdit2, { size: 14 }))), !description && /* @__PURE__ */ import_react17.default.createElement("div", { onClick: () => setIsDescriptionModalOpen(true), className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text" }, "Adicionar descri\xE7\xE3o..."))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => /* @__PURE__ */ import_react17.default.createElement(
8611
8769
  "button",
8612
8770
  {
8613
8771
  key: s,
@@ -8618,9 +8776,9 @@ function InSceneQuestForm({
8618
8776
  },
8619
8777
  className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
8620
8778
  },
8621
- /* @__PURE__ */ import_react16.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${size === s ? "bg-indigo-500 border-indigo-500" : "border-slate-600 bg-transparent group-hover:border-slate-500"}` }, size === s && /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiCheck, { size: 12, className: "text-white" })),
8622
- /* @__PURE__ */ import_react16.default.createElement("span", { className: `text-sm capitalize transition-colors ${size === s ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}` }, s)
8623
- )))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react16.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react16.default.createElement(
8779
+ /* @__PURE__ */ import_react17.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${size === s ? "bg-indigo-500 border-indigo-500" : "border-slate-600 bg-transparent group-hover:border-slate-500"}` }, size === s && /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiCheck, { size: 12, className: "text-white" })),
8780
+ /* @__PURE__ */ import_react17.default.createElement("span", { className: `text-sm capitalize transition-colors ${size === s ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}` }, s)
8781
+ )))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react17.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react17.default.createElement(
8624
8782
  CustomPropertyDisplay,
8625
8783
  {
8626
8784
  key: prop.id,
@@ -8631,8 +8789,8 @@ function InSceneQuestForm({
8631
8789
  unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
8632
8790
  onUploadFile
8633
8791
  }
8634
- )), /* @__PURE__ */ import_react16.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: onCancel, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm" }, "Cancelar"), /* @__PURE__ */ import_react16.default.createElement("button", { type: "submit", className: "px-4 py-2 rounded-lg bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 transition-colors font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)]" }, "Salvar Quest")))
8635
- ), isDescriptionModalOpen && /* @__PURE__ */ import_react16.default.createElement(
8792
+ )), /* @__PURE__ */ import_react17.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: onCancel, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm" }, "Cancelar"), /* @__PURE__ */ import_react17.default.createElement("button", { type: "submit", className: "px-4 py-2 rounded-lg bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 transition-colors font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)]" }, "Salvar Quest")))
8793
+ ), isDescriptionModalOpen && /* @__PURE__ */ import_react17.default.createElement(
8636
8794
  DescriptionEditModal,
8637
8795
  {
8638
8796
  isOpen: isDescriptionModalOpen,
@@ -8648,8 +8806,8 @@ function InSceneQuestForm({
8648
8806
  }
8649
8807
 
8650
8808
  // src/components/NodeDetailsPanel.jsx
8651
- var import_react17 = __toESM(require("react"));
8652
- var import_fi15 = require("react-icons/fi");
8809
+ var import_react18 = __toESM(require("react"));
8810
+ var import_fi16 = require("react-icons/fi");
8653
8811
  function NodeDetailsPanel({
8654
8812
  node,
8655
8813
  onClose,
@@ -8670,39 +8828,39 @@ function NodeDetailsPanel({
8670
8828
  userRole,
8671
8829
  currentDatasetName
8672
8830
  }) {
8673
- const [name, setName] = (0, import_react17.useState)((node == null ? void 0 : node.name) ?? "");
8674
- const [types, setTypes] = (0, import_react17.useState)([]);
8675
- const [typeInput, setTypeInput] = (0, import_react17.useState)("");
8676
- const [color, setColor] = (0, import_react17.useState)((node == null ? void 0 : node.color) ?? "#8b5cf6");
8677
- const [size, setSize] = (0, import_react17.useState)((node == null ? void 0 : node.size) ?? "medium");
8678
- const [description, setDescription] = (0, import_react17.useState)((node == null ? void 0 : node.description) ?? "");
8679
- const [intensity, setIntensity] = (0, import_react17.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
8680
- const [customProps, setCustomProps] = (0, import_react17.useState)(() => extractCustomPropsFromNode(node || {}));
8681
- const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react17.useState)(false);
8682
- const [filteredTypes, setFilteredTypes] = (0, import_react17.useState)([]);
8683
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react17.useState)(false);
8684
- const [isReadMode, setIsReadMode] = (0, import_react17.useState)(false);
8685
- const [existingSections, setExistingSections] = (0, import_react17.useState)((node == null ? void 0 : node.description_sections) || []);
8686
- const [isSaving, setIsSaving] = (0, import_react17.useState)(false);
8687
- const [isLinkCopied, setIsLinkCopied] = (0, import_react17.useState)(false);
8688
- const [useImageAsTexture, setUseImageAsTexture] = (0, import_react17.useState)(() => {
8831
+ const [name, setName] = (0, import_react18.useState)((node == null ? void 0 : node.name) ?? "");
8832
+ const [types, setTypes] = (0, import_react18.useState)([]);
8833
+ const [typeInput, setTypeInput] = (0, import_react18.useState)("");
8834
+ const [color, setColor] = (0, import_react18.useState)((node == null ? void 0 : node.color) ?? "#8b5cf6");
8835
+ const [size, setSize] = (0, import_react18.useState)((node == null ? void 0 : node.size) ?? "medium");
8836
+ const [description, setDescription] = (0, import_react18.useState)((node == null ? void 0 : node.description) ?? "");
8837
+ const [intensity, setIntensity] = (0, import_react18.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
8838
+ const [customProps, setCustomProps] = (0, import_react18.useState)(() => extractCustomPropsFromNode(node || {}));
8839
+ const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react18.useState)(false);
8840
+ const [filteredTypes, setFilteredTypes] = (0, import_react18.useState)([]);
8841
+ const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react18.useState)(false);
8842
+ const [isReadMode, setIsReadMode] = (0, import_react18.useState)(false);
8843
+ const [existingSections, setExistingSections] = (0, import_react18.useState)((node == null ? void 0 : node.description_sections) || []);
8844
+ const [isSaving, setIsSaving] = (0, import_react18.useState)(false);
8845
+ const [isLinkCopied, setIsLinkCopied] = (0, import_react18.useState)(false);
8846
+ const [useImageAsTexture, setUseImageAsTexture] = (0, import_react18.useState)(() => {
8689
8847
  if ((node == null ? void 0 : node.useImageAsTexture) === "true") return true;
8690
8848
  if ((node == null ? void 0 : node.useImageAsTexture) === "false") return false;
8691
8849
  return !!(node == null ? void 0 : node.useImageAsTexture);
8692
8850
  });
8693
- const [selectedImageUrl, setSelectedImageUrl] = (0, import_react17.useState)((node == null ? void 0 : node.textureImageUrl) ?? null);
8694
- const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react17.useState)(false);
8851
+ const [selectedImageUrl, setSelectedImageUrl] = (0, import_react18.useState)((node == null ? void 0 : node.textureImageUrl) ?? null);
8852
+ const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react18.useState)(false);
8695
8853
  const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
8696
8854
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
8697
8855
  initialWidth: isReadMode ? 700 : 440,
8698
8856
  minWidth: 320,
8699
8857
  maxWidth: maxPanelW
8700
8858
  });
8701
- (0, import_react17.useEffect)(() => {
8859
+ (0, import_react18.useEffect)(() => {
8702
8860
  setWidth(isReadMode ? 700 : 440);
8703
8861
  }, [isReadMode, setWidth]);
8704
- const prevNodeIdRef = (0, import_react17.useRef)(null);
8705
- const propsEndRef = (0, import_react17.useRef)(null);
8862
+ const prevNodeIdRef = (0, import_react18.useRef)(null);
8863
+ const propsEndRef = (0, import_react18.useRef)(null);
8706
8864
  const canEdit = userRole !== "viewer";
8707
8865
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
8708
8866
  const handleImageClickFromText = (url, name2) => {
@@ -8710,7 +8868,7 @@ function NodeDetailsPanel({
8710
8868
  onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
8711
8869
  }
8712
8870
  };
8713
- (0, import_react17.useEffect)(() => {
8871
+ (0, import_react18.useEffect)(() => {
8714
8872
  if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
8715
8873
  prevNodeIdRef.current = node == null ? void 0 : node.id;
8716
8874
  setName((node == null ? void 0 : node.name) ?? "");
@@ -8733,13 +8891,13 @@ function NodeDetailsPanel({
8733
8891
  }
8734
8892
  }, [node]);
8735
8893
  const hasImages = customProps.some((p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value));
8736
- (0, import_react17.useEffect)(() => {
8894
+ (0, import_react18.useEffect)(() => {
8737
8895
  if (!hasImages && useImageAsTexture) {
8738
8896
  setUseImageAsTexture(false);
8739
8897
  setSelectedImageUrl(null);
8740
8898
  }
8741
8899
  }, [hasImages, useImageAsTexture]);
8742
- (0, import_react17.useEffect)(() => {
8900
+ (0, import_react18.useEffect)(() => {
8743
8901
  const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
8744
8902
  if (typeInput.trim() === "") {
8745
8903
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
@@ -8934,7 +9092,7 @@ function NodeDetailsPanel({
8934
9092
  onClose();
8935
9093
  };
8936
9094
  const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
8937
- return /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
9095
+ return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement(
8938
9096
  "div",
8939
9097
  {
8940
9098
  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 ${isResizing ? "transition-none" : "transition-all duration-300 ease-out"}`,
@@ -8947,7 +9105,7 @@ function NodeDetailsPanel({
8947
9105
  onContextMenu: swallow,
8948
9106
  onDoubleClick: swallow
8949
9107
  },
8950
- /* @__PURE__ */ import_react17.default.createElement(
9108
+ /* @__PURE__ */ import_react18.default.createElement(
8951
9109
  "div",
8952
9110
  {
8953
9111
  onPointerDown: (e) => {
@@ -8958,7 +9116,7 @@ function NodeDetailsPanel({
8958
9116
  title: "Arraste para redimensionar"
8959
9117
  }
8960
9118
  ),
8961
- isReadMode ? /* @__PURE__ */ import_react17.default.createElement(
9119
+ isReadMode ? /* @__PURE__ */ import_react18.default.createElement(
8962
9120
  DescriptionReadModePanel,
8963
9121
  {
8964
9122
  title: name || (node == null ? void 0 : node.name),
@@ -8979,23 +9137,23 @@ function NodeDetailsPanel({
8979
9137
  onImageClick: handleImageClickFromText,
8980
9138
  onSaveDescription: handleSaveDescriptionInline
8981
9139
  }
8982
- ) : /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }), /* @__PURE__ */ import_react17.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-indigo-400/80 shadow-[0_0_18px_2px_rgba(99,102,241,0.55)]" }), /* @__PURE__ */ import_react17.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes do Node"), /* @__PURE__ */ import_react17.default.createElement(
9140
+ ) : /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }), /* @__PURE__ */ import_react18.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-indigo-400/80 shadow-[0_0_18px_2px_rgba(99,102,241,0.55)]" }), /* @__PURE__ */ import_react18.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes do Node"), /* @__PURE__ */ import_react18.default.createElement(
8983
9141
  "button",
8984
9142
  {
8985
9143
  onClick: handleCopyLink,
8986
9144
  className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-indigo-400"}`,
8987
9145
  title: isLinkCopied ? "Link Copiado!" : "Copiar link para este Node"
8988
9146
  },
8989
- isLinkCopied ? /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiCheck, { size: 12 }) : /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiLink, { size: 12 })
8990
- )), /* @__PURE__ */ import_react17.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react17.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Cancelar" }, "\xD7")), /* @__PURE__ */ import_react17.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos"), /* @__PURE__ */ import_react17.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react17.default.createElement("span", { key: index, className: "flex items-center gap-1 bg-indigo-500/30 text-indigo-100 px-1.5 py-0.5 rounded-md text-xs font-medium border border-indigo-500/20" }, t, canEdit && /* @__PURE__ */ import_react17.default.createElement(
9147
+ isLinkCopied ? /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiCheck, { size: 12 }) : /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiLink, { size: 12 })
9148
+ )), /* @__PURE__ */ import_react18.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react18.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Cancelar" }, "\xD7")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos"), /* @__PURE__ */ import_react18.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react18.default.createElement("span", { key: index, className: "flex items-center gap-1 bg-indigo-500/30 text-indigo-100 px-1.5 py-0.5 rounded-md text-xs font-medium border border-indigo-500/20" }, t, canEdit && /* @__PURE__ */ import_react18.default.createElement(
8991
9149
  "button",
8992
9150
  {
8993
9151
  type: "button",
8994
9152
  onClick: () => handleRemoveType(index),
8995
9153
  className: "hover:text-white transition-colors"
8996
9154
  },
8997
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiX, { size: 12 })
8998
- ))), canEdit && /* @__PURE__ */ import_react17.default.createElement(
9155
+ /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiX, { size: 12 })
9156
+ ))), canEdit && /* @__PURE__ */ import_react18.default.createElement(
8999
9157
  "input",
9000
9158
  {
9001
9159
  type: "text",
@@ -9016,7 +9174,7 @@ function NodeDetailsPanel({
9016
9174
  placeholder: types.length === 0 ? "Ex.: Cliente" : "",
9017
9175
  autoComplete: "off"
9018
9176
  }
9019
- ), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react17.default.createElement("ul", { className: "custom-scrollbar absolute top-full left-0 z-10 w-full mt-1 max-h-40 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-lg" }, filteredTypes.map((suggestedType, index) => /* @__PURE__ */ import_react17.default.createElement(
9177
+ ), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react18.default.createElement("ul", { className: "custom-scrollbar absolute top-full left-0 z-10 w-full mt-1 max-h-40 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-lg" }, filteredTypes.map((suggestedType, index) => /* @__PURE__ */ import_react18.default.createElement(
9020
9178
  "li",
9021
9179
  {
9022
9180
  key: index,
@@ -9027,7 +9185,7 @@ function NodeDetailsPanel({
9027
9185
  }
9028
9186
  },
9029
9187
  suggestedType
9030
- ))))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome"), /* @__PURE__ */ import_react17.default.createElement(
9188
+ ))))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome"), /* @__PURE__ */ import_react18.default.createElement(
9031
9189
  "input",
9032
9190
  {
9033
9191
  type: "text",
@@ -9036,7 +9194,7 @@ function NodeDetailsPanel({
9036
9194
  readOnly: !canEdit,
9037
9195
  className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-2 focus:ring-indigo-400/60" : "cursor-default text-slate-400"}`
9038
9196
  }
9039
- )), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(
9197
+ )), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(
9040
9198
  DescriptionDisplay,
9041
9199
  {
9042
9200
  description,
@@ -9048,7 +9206,7 @@ function NodeDetailsPanel({
9048
9206
  onImageClick: handleImageClickFromText,
9049
9207
  onSaveDescription: handleSaveDescriptionInline
9050
9208
  }
9051
- ), /* @__PURE__ */ import_react17.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react17.default.createElement(
9209
+ ), /* @__PURE__ */ import_react18.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react18.default.createElement(
9052
9210
  "button",
9053
9211
  {
9054
9212
  type: "button",
@@ -9056,8 +9214,8 @@ function NodeDetailsPanel({
9056
9214
  className: `p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors ${canEdit ? "border-r border-white/5" : ""}`,
9057
9215
  title: "Modo de Leitura"
9058
9216
  },
9059
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiBookOpen, { size: 14 })
9060
- ), canEdit && /* @__PURE__ */ import_react17.default.createElement(
9217
+ /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiBookOpen, { size: 14 })
9218
+ ), canEdit && /* @__PURE__ */ import_react18.default.createElement(
9061
9219
  "button",
9062
9220
  {
9063
9221
  type: "button",
@@ -9065,17 +9223,17 @@ function NodeDetailsPanel({
9065
9223
  className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
9066
9224
  title: "Editar descri\xE7\xE3o (Modo de Escrita)"
9067
9225
  },
9068
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiEdit2, { size: 14 })
9069
- )), canEdit && !description && /* @__PURE__ */ import_react17.default.createElement(
9226
+ /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiEdit2, { size: 14 })
9227
+ )), canEdit && !description && /* @__PURE__ */ import_react18.default.createElement(
9070
9228
  "div",
9071
9229
  {
9072
9230
  onClick: () => setIsDescriptionModalOpen(true),
9073
9231
  className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
9074
9232
  },
9075
9233
  "Adicionar descri\xE7\xE3o..."
9076
- ))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300" }, "Size"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
9234
+ ))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Size"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
9077
9235
  const isSelected = size === s;
9078
- return /* @__PURE__ */ import_react17.default.createElement(
9236
+ return /* @__PURE__ */ import_react18.default.createElement(
9079
9237
  "button",
9080
9238
  {
9081
9239
  key: s,
@@ -9083,10 +9241,10 @@ function NodeDetailsPanel({
9083
9241
  onClick: () => canEdit && handleSizeChange(s),
9084
9242
  className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}`
9085
9243
  },
9086
- /* @__PURE__ */ import_react17.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${isSelected ? "bg-indigo-500 border-indigo-500 shadow-[0_0_10px_rgba(99,102,241,0.4)]" : "border-slate-600 bg-transparent " + (canEdit ? "group-hover:border-slate-500" : "")}` }, isSelected && /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiCheck, { size: 12, className: "text-white" })),
9087
- /* @__PURE__ */ import_react17.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s)
9244
+ /* @__PURE__ */ import_react18.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${isSelected ? "bg-indigo-500 border-indigo-500 shadow-[0_0_10px_rgba(99,102,241,0.4)]" : "border-slate-600 bg-transparent " + (canEdit ? "group-hover:border-slate-500" : "")}` }, isSelected && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiCheck, { size: 12, className: "text-white" })),
9245
+ /* @__PURE__ */ import_react18.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s)
9088
9246
  );
9089
- }))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor e Brilho"), canEdit && hasImages && /* @__PURE__ */ import_react17.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: `w-4 h-4 rounded border flex items-center justify-center transition-colors ${useImageAsTexture ? "bg-indigo-500 border-indigo-500" : "border-slate-500 bg-transparent"}` }, useImageAsTexture && /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react17.default.createElement(
9247
+ }))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor e Brilho"), canEdit && hasImages && /* @__PURE__ */ import_react18.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: `w-4 h-4 rounded border flex items-center justify-center transition-colors ${useImageAsTexture ? "bg-indigo-500 border-indigo-500" : "border-slate-500 bg-transparent"}` }, useImageAsTexture && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react18.default.createElement(
9090
9248
  "input",
9091
9249
  {
9092
9250
  type: "checkbox",
@@ -9094,14 +9252,14 @@ function NodeDetailsPanel({
9094
9252
  onChange: handleToggleImageMode,
9095
9253
  className: "hidden"
9096
9254
  }
9097
- ), /* @__PURE__ */ import_react17.default.createElement("span", { className: `text-xs ${useImageAsTexture ? "text-indigo-300" : "text-slate-400 group-hover:text-slate-300"}` }, "Usar imagem para representar o node"))), /* @__PURE__ */ import_react17.default.createElement(
9255
+ ), /* @__PURE__ */ import_react18.default.createElement("span", { className: `text-xs ${useImageAsTexture ? "text-indigo-300" : "text-slate-400 group-hover:text-slate-300"}` }, "Usar imagem para representar o node"))), /* @__PURE__ */ import_react18.default.createElement(
9098
9256
  ColorPicker,
9099
9257
  {
9100
9258
  color,
9101
9259
  onChange: handleColorChange,
9102
9260
  disabled: !canEdit || useImageAsTexture
9103
9261
  }
9104
- ), /* @__PURE__ */ import_react17.default.createElement("div", { className: "mt-3 flex items-center gap-3" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiSun, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react17.default.createElement(
9262
+ ), /* @__PURE__ */ import_react18.default.createElement("div", { className: "mt-3 flex items-center gap-3" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiSun, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react18.default.createElement(
9105
9263
  "input",
9106
9264
  {
9107
9265
  type: "range",
@@ -9114,7 +9272,7 @@ function NodeDetailsPanel({
9114
9272
  className: `w-full h-1.5 bg-slate-700 rounded-lg appearance-none ${canEdit ? "cursor-pointer accent-indigo-500 hover:accent-indigo-400" : "cursor-default accent-slate-500"}`,
9115
9273
  title: `Intensidade do brilho: ${intensity}`
9116
9274
  }
9117
- ), /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-xs text-slate-400 w-6 text-right" }, intensity)), /* @__PURE__ */ import_react17.default.createElement("span", { className: `text-xs block mt-1 transition-opacity ${useImageAsTexture ? "opacity-40" : "text-slate-400"}` }, useImageAsTexture ? "Cor da borda (definida pela imagem)" : "Ajuste a cor e a intensidade do brilho.")), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react17.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react17.default.createElement(
9275
+ ), /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-xs text-slate-400 w-6 text-right" }, intensity)), /* @__PURE__ */ import_react18.default.createElement("span", { className: `text-xs block mt-1 transition-opacity ${useImageAsTexture ? "opacity-40" : "text-slate-400"}` }, useImageAsTexture ? "Cor da borda (definida pela imagem)" : "Ajuste a cor e a intensidade do brilho.")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react18.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react18.default.createElement(
9118
9276
  CustomPropertyDisplay,
9119
9277
  {
9120
9278
  key: prop.id,
@@ -9129,7 +9287,7 @@ function NodeDetailsPanel({
9129
9287
  onUploadFile: canEdit ? onUploadFile : void 0,
9130
9288
  readOnly: !canEdit
9131
9289
  }
9132
- )), /* @__PURE__ */ import_react17.default.createElement("div", { ref: propsEndRef }))), currentDatasetName && /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-3 mt-4 border-t border-white/10 flex items-center justify-end gap-2 text-xs text-slate-400" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react17.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react17.default.createElement(
9290
+ )), /* @__PURE__ */ import_react18.default.createElement("div", { ref: propsEndRef }))), currentDatasetName && /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-3 mt-4 border-t border-white/10 flex items-center justify-end gap-2 text-xs text-slate-400" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react18.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react18.default.createElement(
9133
9291
  "button",
9134
9292
  {
9135
9293
  onClick: () => handleSave(false),
@@ -9138,10 +9296,10 @@ function NodeDetailsPanel({
9138
9296
  ${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 text-white"}
9139
9297
  `
9140
9298
  },
9141
- isSaving && /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiLoader, { className: "animate-spin" }),
9299
+ isSaving && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiLoader, { className: "animate-spin" }),
9142
9300
  isSaving ? "Salvando..." : "Salvar"
9143
9301
  )))
9144
- ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react17.default.createElement(
9302
+ ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react18.default.createElement(
9145
9303
  DescriptionEditModal,
9146
9304
  {
9147
9305
  isOpen: isDescriptionModalOpen,
@@ -9162,8 +9320,8 @@ function NodeDetailsPanel({
9162
9320
  }
9163
9321
 
9164
9322
  // src/components/QuestDetailsPanel.jsx
9165
- var import_react18 = __toESM(require("react"));
9166
- var import_fi16 = require("react-icons/fi");
9323
+ var import_react19 = __toESM(require("react"));
9324
+ var import_fi17 = require("react-icons/fi");
9167
9325
  var QUEST_STATUS_COLORS3 = {
9168
9326
  "Backlog": "#64748b",
9169
9327
  "In Progress": "#eab308",
@@ -9191,40 +9349,42 @@ function QuestDetailsPanel({
9191
9349
  }) {
9192
9350
  var _a;
9193
9351
  const initialRawTitle = (node == null ? void 0 : node.raw_title) || (((_a = node == null ? void 0 : node.name) == null ? void 0 : _a.includes(" - \xBB ")) ? node.name.split(" - \xBB ")[1] : node == null ? void 0 : node.name) || "";
9194
- const [rawTitle, setRawTitle] = (0, import_react18.useState)(initialRawTitle);
9352
+ const [rawTitle, setRawTitle] = (0, import_react19.useState)(initialRawTitle);
9195
9353
  const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
9196
9354
  const questPrefix = prefixParts.length > 1 ? prefixParts[0] : "";
9197
9355
  const standardizedName = questPrefix ? `${questPrefix} - \xBB ${rawTitle || "Sem t\xEDtulo"}` : rawTitle;
9198
- const [types, setTypes] = (0, import_react18.useState)((node == null ? void 0 : node.type) ? Array.isArray(node.type) ? node.type : [node.type] : ["quest"]);
9199
- const [typeInput, setTypeInput] = (0, import_react18.useState)("");
9200
- const [status, setStatus] = (0, import_react18.useState)((node == null ? void 0 : node.status) ?? "Backlog");
9201
- const [size, setSize] = (0, import_react18.useState)((node == null ? void 0 : node.size) ?? "medium");
9202
- const [assigneeId, setAssigneeId] = (0, import_react18.useState)((node == null ? void 0 : node.assignee_id) || "");
9203
- const [description, setDescription] = (0, import_react18.useState)((node == null ? void 0 : node.description) ?? "");
9204
- const [intensity, setIntensity] = (0, import_react18.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9205
- const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react18.useState)(false);
9206
- const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react18.useState)(false);
9207
- const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react18.useState)("");
9208
- const [customProps, setCustomProps] = (0, import_react18.useState)(() => extractCustomPropsFromNode(node || {}));
9209
- const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react18.useState)(false);
9210
- const [filteredTypes, setFilteredTypes] = (0, import_react18.useState)([]);
9211
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react18.useState)(false);
9212
- const [isReadMode, setIsReadMode] = (0, import_react18.useState)(false);
9213
- const [existingSections, setExistingSections] = (0, import_react18.useState)((node == null ? void 0 : node.description_sections) || []);
9214
- const [isSaving, setIsSaving] = (0, import_react18.useState)(false);
9215
- const [isLinkCopied, setIsLinkCopied] = (0, import_react18.useState)(false);
9216
- const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react18.useState)(false);
9356
+ const [types, setTypes] = (0, import_react19.useState)((node == null ? void 0 : node.type) ? Array.isArray(node.type) ? node.type : [node.type] : ["quest"]);
9357
+ const [typeInput, setTypeInput] = (0, import_react19.useState)("");
9358
+ const [status, setStatus] = (0, import_react19.useState)((node == null ? void 0 : node.status) ?? "Backlog");
9359
+ const [size, setSize] = (0, import_react19.useState)((node == null ? void 0 : node.size) ?? "medium");
9360
+ const [assigneeId, setAssigneeId] = (0, import_react19.useState)((node == null ? void 0 : node.assignee_id) || "");
9361
+ const [description, setDescription] = (0, import_react19.useState)((node == null ? void 0 : node.description) ?? "");
9362
+ const [intensity, setIntensity] = (0, import_react19.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9363
+ const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react19.useState)(false);
9364
+ const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react19.useState)(false);
9365
+ const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react19.useState)("");
9366
+ const [customProps, setCustomProps] = (0, import_react19.useState)(() => extractCustomPropsFromNode(node || {}));
9367
+ const [reviewStack, setReviewStack] = (0, import_react19.useState)((node == null ? void 0 : node.reviewStack) || []);
9368
+ const [timeline, setTimeline] = (0, import_react19.useState)((node == null ? void 0 : node.timeline) || []);
9369
+ const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react19.useState)(false);
9370
+ const [filteredTypes, setFilteredTypes] = (0, import_react19.useState)([]);
9371
+ const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react19.useState)(false);
9372
+ const [isReadMode, setIsReadMode] = (0, import_react19.useState)(false);
9373
+ const [existingSections, setExistingSections] = (0, import_react19.useState)((node == null ? void 0 : node.description_sections) || []);
9374
+ const [isSaving, setIsSaving] = (0, import_react19.useState)(false);
9375
+ const [isLinkCopied, setIsLinkCopied] = (0, import_react19.useState)(false);
9376
+ const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react19.useState)(false);
9217
9377
  const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
9218
9378
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
9219
9379
  initialWidth: isReadMode ? 700 : 440,
9220
9380
  minWidth: 320,
9221
9381
  maxWidth: maxPanelW
9222
9382
  });
9223
- (0, import_react18.useEffect)(() => {
9383
+ (0, import_react19.useEffect)(() => {
9224
9384
  setWidth(isReadMode ? 700 : 440);
9225
9385
  }, [isReadMode, setWidth]);
9226
- const prevNodeIdRef = (0, import_react18.useRef)(null);
9227
- const propsEndRef = (0, import_react18.useRef)(null);
9386
+ const prevNodeIdRef = (0, import_react19.useRef)(null);
9387
+ const propsEndRef = (0, import_react19.useRef)(null);
9228
9388
  const canEdit = userRole !== "viewer";
9229
9389
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
9230
9390
  const handleImageClickFromText = (url, name) => {
@@ -9232,7 +9392,7 @@ function QuestDetailsPanel({
9232
9392
  onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
9233
9393
  }
9234
9394
  };
9235
- (0, import_react18.useEffect)(() => {
9395
+ (0, import_react19.useEffect)(() => {
9236
9396
  var _a2;
9237
9397
  if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
9238
9398
  prevNodeIdRef.current = node == null ? void 0 : node.id;
@@ -9246,10 +9406,12 @@ function QuestDetailsPanel({
9246
9406
  setIntensity((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9247
9407
  setExistingSections((node == null ? void 0 : node.description_sections) || []);
9248
9408
  setCustomProps(extractCustomPropsFromNode(node || {}));
9409
+ setReviewStack((node == null ? void 0 : node.reviewStack) || []);
9410
+ setTimeline((node == null ? void 0 : node.timeline) || []);
9249
9411
  setHasUnsavedChanges(false);
9250
9412
  }
9251
9413
  }, [node]);
9252
- (0, import_react18.useEffect)(() => {
9414
+ (0, import_react19.useEffect)(() => {
9253
9415
  const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
9254
9416
  if (typeInput.trim() === "") {
9255
9417
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
@@ -9361,6 +9523,8 @@ function QuestDetailsPanel({
9361
9523
  const currentAssigneeId = overrides.assigneeId !== void 0 ? overrides.assigneeId : assigneeId;
9362
9524
  const currentDescription = overrides.description !== void 0 ? overrides.description : description;
9363
9525
  const currentCustomProps = overrides.customProps !== void 0 ? overrides.customProps : customProps;
9526
+ const currentReviewStack = overrides.reviewStack !== void 0 ? overrides.reviewStack : reviewStack;
9527
+ const currentTimeline = overrides.timeline !== void 0 ? overrides.timeline : timeline;
9364
9528
  const currentExistingSections = overrides.existingSections !== void 0 ? overrides.existingSections : existingSections;
9365
9529
  const currentStatus = overrides.status !== void 0 ? overrides.status : status;
9366
9530
  if (!keepOpen && !hasUnsavedChanges) {
@@ -9392,6 +9556,8 @@ function QuestDetailsPanel({
9392
9556
  textureImageUrl: null,
9393
9557
  intensity,
9394
9558
  is_quest: true,
9559
+ reviewStack: currentReviewStack,
9560
+ timeline: currentTimeline,
9395
9561
  ...extrasObj,
9396
9562
  version_node: node.version_node
9397
9563
  };
@@ -9419,7 +9585,7 @@ function QuestDetailsPanel({
9419
9585
  const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
9420
9586
  const assigneeMember = viewMembers.find((m) => m.id === assigneeId);
9421
9587
  const isAssigneeUndefined = assigneeId && !assigneeMember;
9422
- return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement(
9588
+ return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(
9423
9589
  "div",
9424
9590
  {
9425
9591
  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 ${isResizing ? "transition-none" : "transition-all duration-300 ease-out"}`,
@@ -9432,11 +9598,11 @@ function QuestDetailsPanel({
9432
9598
  onContextMenu: swallow,
9433
9599
  onDoubleClick: swallow
9434
9600
  },
9435
- /* @__PURE__ */ import_react18.default.createElement("div", { onPointerDown: (e) => {
9601
+ /* @__PURE__ */ import_react19.default.createElement("div", { onPointerDown: (e) => {
9436
9602
  e.stopPropagation();
9437
9603
  handleResize(e);
9438
9604
  }, className: "absolute left-0 top-0 bottom-0 w-2 cursor-col-resize hover:bg-indigo-500/50 z-[2000] transition-colors", title: "Arraste para redimensionar" }),
9439
- isReadMode ? /* @__PURE__ */ import_react18.default.createElement(
9605
+ isReadMode ? /* @__PURE__ */ import_react19.default.createElement(
9440
9606
  DescriptionReadModePanel,
9441
9607
  {
9442
9608
  title: standardizedName || (node == null ? void 0 : node.name),
@@ -9457,7 +9623,7 @@ function QuestDetailsPanel({
9457
9623
  onImageClick: handleImageClickFromText,
9458
9624
  onSaveDescription: handleSaveDescriptionInline
9459
9625
  }
9460
- ) : /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS3[status]}, transparent)` } }), /* @__PURE__ */ import_react18.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react18.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Quest"), /* @__PURE__ */ import_react18.default.createElement("button", { onClick: handleCopyLink, className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-sky-400"}`, title: isLinkCopied ? "Link Copiado!" : "Copiar link para esta Quest" }, isLinkCopied ? /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiCheck, { size: 12 }) : /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiLink, { size: 12 }))), /* @__PURE__ */ import_react18.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, standardizedName || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react18.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Cancelar" }, "\xD7")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react18.default.createElement(
9626
+ ) : /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS3[status]}, transparent)` } }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Quest"), /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCopyLink, className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-sky-400"}`, title: isLinkCopied ? "Link Copiado!" : "Copiar link para esta Quest" }, isLinkCopied ? /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiCheck, { size: 12 }) : /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLink, { size: 12 }))), /* @__PURE__ */ import_react19.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, standardizedName || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Cancelar" }, "\xD7")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react19.default.createElement(
9461
9627
  "input",
9462
9628
  {
9463
9629
  type: "text",
@@ -9466,7 +9632,7 @@ function QuestDetailsPanel({
9466
9632
  readOnly: !canEdit,
9467
9633
  className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-2 focus:ring-indigo-400/60" : "cursor-default text-slate-400"}`
9468
9634
  }
9469
- ), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react18.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react18.default.createElement(
9635
+ ), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
9470
9636
  "button",
9471
9637
  {
9472
9638
  type: "button",
@@ -9474,9 +9640,9 @@ function QuestDetailsPanel({
9474
9640
  disabled: !canEdit,
9475
9641
  className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 transition-colors flex items-center justify-between ${canEdit ? "hover:border-white/20 focus:ring-2 focus:ring-indigo-400/60 cursor-pointer" : "cursor-default opacity-80"}`
9476
9642
  },
9477
- /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]", style: { backgroundColor: QUEST_STATUS_COLORS3[status] } }), /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
9478
- canEdit && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
9479
- ), isStatusDropdownOpen && canEdit && /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react18.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS3).map((s) => /* @__PURE__ */ import_react18.default.createElement(
9643
+ /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]", style: { backgroundColor: QUEST_STATUS_COLORS3[status] } }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
9644
+ canEdit && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
9645
+ ), isStatusDropdownOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS3).map((s) => /* @__PURE__ */ import_react19.default.createElement(
9480
9646
  "li",
9481
9647
  {
9482
9648
  key: s,
@@ -9486,21 +9652,21 @@ function QuestDetailsPanel({
9486
9652
  },
9487
9653
  className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${status === s ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
9488
9654
  },
9489
- /* @__PURE__ */ import_react18.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
9655
+ /* @__PURE__ */ import_react19.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
9490
9656
  s
9491
- )))))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react18.default.createElement(
9657
+ )))))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
9492
9658
  "button",
9493
9659
  {
9494
9660
  type: "button",
9495
9661
  onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
9496
9662
  className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
9497
9663
  },
9498
- /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-slate-200 font-medium" }, isAssigneeUndefined ? "Undefined" : (assigneeMember == null ? void 0 : assigneeMember.name) || (assigneeMember == null ? void 0 : assigneeMember.email) || "Nenhum")),
9499
- /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
9500
- ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
9664
+ /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, isAssigneeUndefined ? "Undefined" : (assigneeMember == null ? void 0 : assigneeMember.name) || (assigneeMember == null ? void 0 : assigneeMember.email) || "Nenhum")),
9665
+ /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
9666
+ ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
9501
9667
  setIsAssigneeDropdownOpen(false);
9502
9668
  setAssigneeSearchQuery("");
9503
- } }), /* @__PURE__ */ import_react18.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react18.default.createElement(
9669
+ } }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react19.default.createElement(
9504
9670
  "input",
9505
9671
  {
9506
9672
  type: "text",
@@ -9511,11 +9677,19 @@ function QuestDetailsPanel({
9511
9677
  className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
9512
9678
  onClick: (e) => e.stopPropagation()
9513
9679
  }
9514
- )), /* @__PURE__ */ import_react18.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react18.default.createElement(
9680
+ )), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react19.default.createElement(
9515
9681
  "li",
9516
9682
  {
9517
9683
  onClick: () => {
9518
9684
  setAssigneeId("");
9685
+ const newTimeline = [...timeline, {
9686
+ type: "assignee_changed",
9687
+ timestamp: Date.now(),
9688
+ actorId: "user",
9689
+ to_assignee_id: null,
9690
+ description: `Respons\xE1vel removido.`
9691
+ }];
9692
+ setTimeline(newTimeline);
9519
9693
  setHasUnsavedChanges(true);
9520
9694
  setIsAssigneeDropdownOpen(false);
9521
9695
  setAssigneeSearchQuery("");
@@ -9523,7 +9697,7 @@ function QuestDetailsPanel({
9523
9697
  className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${!assigneeId ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
9524
9698
  },
9525
9699
  "Nenhum"
9526
- ), isAssigneeUndefined && /* @__PURE__ */ import_react18.default.createElement(
9700
+ ), isAssigneeUndefined && /* @__PURE__ */ import_react19.default.createElement(
9527
9701
  "li",
9528
9702
  {
9529
9703
  onClick: () => {
@@ -9536,12 +9710,20 @@ function QuestDetailsPanel({
9536
9710
  ), viewMembers.filter((member) => {
9537
9711
  const search = assigneeSearchQuery.toLowerCase();
9538
9712
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
9539
- }).map((member) => /* @__PURE__ */ import_react18.default.createElement(
9713
+ }).map((member) => /* @__PURE__ */ import_react19.default.createElement(
9540
9714
  "li",
9541
9715
  {
9542
9716
  key: member.id,
9543
9717
  onClick: () => {
9544
9718
  setAssigneeId(member.id);
9719
+ const newTimeline = [...timeline, {
9720
+ type: "assignee_changed",
9721
+ timestamp: Date.now(),
9722
+ actorId: "user",
9723
+ to_assignee_id: member.id,
9724
+ description: `Quest atribu\xEDda para ${member.name || member.email}.`
9725
+ }];
9726
+ setTimeline(newTimeline);
9545
9727
  setHasUnsavedChanges(true);
9546
9728
  setIsAssigneeDropdownOpen(false);
9547
9729
  setAssigneeSearchQuery("");
@@ -9552,7 +9734,18 @@ function QuestDetailsPanel({
9552
9734
  )), viewMembers.filter((member) => {
9553
9735
  const search = assigneeSearchQuery.toLowerCase();
9554
9736
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
9555
- }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react18.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react18.default.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react18.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react18.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, canEdit && t !== "quest" && /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiX, { size: 12 })))), canEdit && /* @__PURE__ */ import_react18.default.createElement(
9737
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react19.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react19.default.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement(
9738
+ QuestReviewStackEditor,
9739
+ {
9740
+ reviewStack,
9741
+ onChange: (newStack) => {
9742
+ setReviewStack(newStack);
9743
+ setHasUnsavedChanges(true);
9744
+ },
9745
+ viewMembers,
9746
+ readOnly: !canEdit
9747
+ }
9748
+ )), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react19.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react19.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, canEdit && t !== "quest" && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiX, { size: 12 })))), canEdit && /* @__PURE__ */ import_react19.default.createElement(
9556
9749
  "input",
9557
9750
  {
9558
9751
  type: "text",
@@ -9573,14 +9766,18 @@ function QuestDetailsPanel({
9573
9766
  placeholder: "",
9574
9767
  autoComplete: "off"
9575
9768
  }
9576
- ), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react18.default.createElement("ul", { className: "custom-scrollbar absolute top-full left-0 z-10 w-full mt-1 max-h-40 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-lg" }, filteredTypes.map((suggestedType, index) => /* @__PURE__ */ import_react18.default.createElement("li", { key: index, className: "px-3 py-2 text-sm text-slate-200 cursor-pointer hover:bg-indigo-600/50", onMouseDown: (e) => {
9769
+ ), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react19.default.createElement("ul", { className: "custom-scrollbar absolute top-full left-0 z-10 w-full mt-1 max-h-40 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-lg" }, filteredTypes.map((suggestedType, index) => /* @__PURE__ */ import_react19.default.createElement("li", { key: index, className: "px-3 py-2 text-sm text-slate-200 cursor-pointer hover:bg-indigo-600/50", onMouseDown: (e) => {
9577
9770
  e.preventDefault();
9578
9771
  handleAddType(suggestedType);
9579
- } }, suggestedType))))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(DescriptionDisplay, { description, savedSections: existingSections, availableNodes, availableAncestries, onOpenReference, onMentionClick, onImageClick: handleImageClickFromText, onSaveDescription: handleSaveDescriptionInline }), /* @__PURE__ */ import_react18.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: () => setIsReadMode(true), className: `p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors ${canEdit ? "border-r border-white/5" : ""}`, title: "Modo de Leitura" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiBookOpen, { size: 14 })), canEdit && /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: () => setIsDescriptionModalOpen(true), className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors", title: "Editar descri\xE7\xE3o (Modo de Escrita)" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiEdit2, { size: 14 }))), canEdit && !description && /* @__PURE__ */ import_react18.default.createElement("div", { onClick: () => setIsDescriptionModalOpen(true), className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text" }, "Adicionar descri\xE7\xE3o..."))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
9772
+ } }, suggestedType))))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(DescriptionDisplay, { description, savedSections: existingSections, availableNodes, availableAncestries, onOpenReference, onMentionClick, onImageClick: handleImageClickFromText, onSaveDescription: handleSaveDescriptionInline }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => setIsReadMode(true), className: `p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors ${canEdit ? "border-r border-white/5" : ""}`, title: "Modo de Leitura" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiBookOpen, { size: 14 })), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => setIsDescriptionModalOpen(true), className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors", title: "Editar descri\xE7\xE3o (Modo de Escrita)" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiEdit2, { size: 14 }))), canEdit && !description && /* @__PURE__ */ import_react19.default.createElement("div", { onClick: () => setIsDescriptionModalOpen(true), className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text" }, "Adicionar descri\xE7\xE3o..."))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
9580
9773
  const isSelected = size === s;
9581
- return /* @__PURE__ */ import_react18.default.createElement("button", { key: s, type: "button", onClick: () => canEdit && handleSizeChange(s), className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}` }, /* @__PURE__ */ import_react18.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${isSelected ? "bg-indigo-500 border-indigo-500 shadow-[0_0_10px_rgba(99,102,241,0.4)]" : "border-slate-600 bg-transparent " + (canEdit ? "group-hover:border-slate-500" : "")}` }, isSelected && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react18.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s));
9582
- }))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react18.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react18.default.createElement(CustomPropertyDisplay, { key: prop.id, prop, onUpdate: canEdit ? (updatedProp) => handleUpdateProp(idx, updatedProp) : void 0, onRemove: canEdit ? () => handleRemoveProp(idx) : void 0, onOpenImageViewer, unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type), isTextureMode: false, onUploadFile: canEdit ? onUploadFile : void 0, readOnly: !canEdit })), /* @__PURE__ */ import_react18.default.createElement("div", { ref: propsEndRef }))), currentDatasetName && /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-3 mt-4 border-t border-white/10 flex items-center justify-end gap-2 text-xs text-slate-400" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react18.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react18.default.createElement("button", { onClick: () => handleSave(false), disabled: isSaving, className: `px-4 py-2 rounded-lg transition-all font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)] flex items-center gap-2 ${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 text-white"}` }, isSaving && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiLoader, { className: "animate-spin" }), isSaving ? "Salvando..." : "Salvar Quest")))
9583
- ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react18.default.createElement(
9774
+ return /* @__PURE__ */ import_react19.default.createElement("button", { key: s, type: "button", onClick: () => canEdit && handleSizeChange(s), className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}` }, /* @__PURE__ */ import_react19.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${isSelected ? "bg-indigo-500 border-indigo-500 shadow-[0_0_10px_rgba(99,102,241,0.4)]" : "border-slate-600 bg-transparent " + (canEdit ? "group-hover:border-slate-500" : "")}` }, isSelected && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react19.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s));
9775
+ }))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react19.default.createElement(CustomPropertyDisplay, { key: prop.id, prop, onUpdate: canEdit ? (updatedProp) => handleUpdateProp(idx, updatedProp) : void 0, onRemove: canEdit ? () => handleRemoveProp(idx) : void 0, onOpenImageViewer, unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type), isTextureMode: false, onUploadFile: canEdit ? onUploadFile : void 0, readOnly: !canEdit })), /* @__PURE__ */ import_react19.default.createElement("div", { ref: propsEndRef }))), timeline && timeline.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-4 pb-2 border-t border-white/10 mt-4" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider mb-3" }, "Timeline & Hist\xF3rico"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative border-l border-white/10 ml-2.5 space-y-4" }, timeline.slice().sort((a, b) => a.timestamp - b.timestamp).map((event, idx) => {
9776
+ const dateObj = new Date(event.timestamp);
9777
+ const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
9778
+ return /* @__PURE__ */ import_react19.default.createElement("div", { key: idx, className: "relative pl-4 flex flex-col gap-0.5" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute left-[-4.5px] top-1.5 w-2 h-2 rounded-full bg-slate-400/50 border-[1.5px] border-slate-900" }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[11px] text-slate-300" }, event.description), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[9px] text-slate-500 font-mono tracking-tighter" }, dateString));
9779
+ }))), currentDatasetName && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-3 mt-4 border-t border-white/10 flex items-center justify-end gap-2 text-xs text-slate-400" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { onClick: () => handleSave(false), disabled: isSaving, className: `px-4 py-2 rounded-lg transition-all font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)] flex items-center gap-2 ${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 text-white"}` }, isSaving && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLoader, { className: "animate-spin" }), isSaving ? "Salvando..." : "Salvar Quest")))
9780
+ ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(
9584
9781
  DescriptionEditModal,
9585
9782
  {
9586
9783
  isOpen: isDescriptionModalOpen,
@@ -9600,7 +9797,7 @@ function QuestDetailsPanel({
9600
9797
  }
9601
9798
 
9602
9799
  // src/components/MultiNodeContextMenu.jsx
9603
- var import_react19 = __toESM(require("react"));
9800
+ var import_react20 = __toESM(require("react"));
9604
9801
  function MultiNodeContextMenu({
9605
9802
  data,
9606
9803
  userRole,
@@ -9609,12 +9806,12 @@ function MultiNodeContextMenu({
9609
9806
  onDismissOtherNodes,
9610
9807
  onDeleteNodes
9611
9808
  }) {
9612
- const menuRef = (0, import_react19.useRef)(null);
9613
- const [menuPos, setMenuPos] = (0, import_react19.useState)({ left: 0, top: 0 });
9614
- const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react19.useState)(false);
9809
+ const menuRef = (0, import_react20.useRef)(null);
9810
+ const [menuPos, setMenuPos] = (0, import_react20.useState)({ left: 0, top: 0 });
9811
+ const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react20.useState)(false);
9615
9812
  const ability = defineAbilityFor(userRole);
9616
9813
  const canDelete = ability.can("delete", "Node");
9617
- (0, import_react19.useLayoutEffect)(() => {
9814
+ (0, import_react20.useLayoutEffect)(() => {
9618
9815
  if (!data.visible || !menuRef.current) return;
9619
9816
  const el = menuRef.current;
9620
9817
  const w = el.clientWidth;
@@ -9627,7 +9824,7 @@ function MultiNodeContextMenu({
9627
9824
  if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
9628
9825
  setMenuPos({ left, top });
9629
9826
  }, [data]);
9630
- (0, import_react19.useEffect)(() => {
9827
+ (0, import_react20.useEffect)(() => {
9631
9828
  if (data.visible) {
9632
9829
  setIsConfirmingDelete(false);
9633
9830
  }
@@ -9642,7 +9839,7 @@ function MultiNodeContextMenu({
9642
9839
  const baseButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-indigo-500/20 text-slate-200 hover:text-white transition-colors duration-150 truncate";
9643
9840
  const deleteButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-red-500/25 text-red-400 hover:text-red-300 transition-colors duration-150 truncate";
9644
9841
  const nodeCount = data.nodeIds.size;
9645
- return /* @__PURE__ */ import_react19.default.createElement(
9842
+ return /* @__PURE__ */ import_react20.default.createElement(
9646
9843
  "div",
9647
9844
  {
9648
9845
  ref: menuRef,
@@ -9656,28 +9853,28 @@ function MultiNodeContextMenu({
9656
9853
  onContextMenu: swallow,
9657
9854
  onDoubleClick: swallow
9658
9855
  },
9659
- /* @__PURE__ */ import_react19.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
9660
- /* @__PURE__ */ import_react19.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center text-red-400 mb-1" }, /* @__PURE__ */ import_react19.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react19.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir ", /* @__PURE__ */ import_react19.default.createElement("strong", null, nodeCount, " Nodes"), "?"), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight" }, "Esta a\xE7\xE3o \xE9 irrevers\xEDvel. Todas as conex\xF5es associadas a eles ser\xE3o apagadas.")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react19.default.createElement(
9856
+ /* @__PURE__ */ import_react20.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
9857
+ /* @__PURE__ */ import_react20.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center text-red-400 mb-1" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir ", /* @__PURE__ */ import_react20.default.createElement("strong", null, nodeCount, " Nodes"), "?"), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight" }, "Esta a\xE7\xE3o \xE9 irrevers\xEDvel. Todas as conex\xF5es associadas a eles ser\xE3o apagadas.")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react20.default.createElement(
9661
9858
  "button",
9662
9859
  {
9663
9860
  onClick: () => setIsConfirmingDelete(false),
9664
9861
  className: "flex-1 px-2 py-2 text-xs font-medium bg-white/10 hover:bg-white/20 rounded-md text-white transition-colors"
9665
9862
  },
9666
9863
  "Cancelar"
9667
- ), /* @__PURE__ */ import_react19.default.createElement(
9864
+ ), /* @__PURE__ */ import_react20.default.createElement(
9668
9865
  "button",
9669
9866
  {
9670
9867
  onClick: () => onDeleteNodes(data.nodeIds),
9671
9868
  className: "flex-1 px-2 py-2 text-xs font-medium bg-red-500 hover:bg-red-600 rounded-md text-white transition-colors"
9672
9869
  },
9673
9870
  "Excluir"
9674
- ))) : /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_12px_1px_rgba(99,102,241,0.5)]" }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es em Grupo (", nodeCount, " Nodes)")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react19.default.createElement("button", { onClick: () => onDismissNodes(data.nodeIds), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react19.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react19.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" }), /* @__PURE__ */ import_react19.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react19.default.createElement("span", null, "Dismiss (", nodeCount, ")")), /* @__PURE__ */ import_react19.default.createElement("button", { onClick: () => onDismissOtherNodes(data.nodeIds), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react19.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react19.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react19.default.createElement("span", null, "Dismiss other nodes")), canDelete && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react19.default.createElement("button", { onClick: () => setIsConfirmingDelete(true), className: deleteButtonClass, title: "Excluir Nodes" }, /* @__PURE__ */ import_react19.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react19.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react19.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react19.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react19.default.createElement("span", null, "Excluir Nodes (", nodeCount, ")"))))))
9871
+ ))) : /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_12px_1px_rgba(99,102,241,0.5)]" }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es em Grupo (", nodeCount, " Nodes)")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => onDismissNodes(data.nodeIds), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Dismiss (", nodeCount, ")")), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => onDismissOtherNodes(data.nodeIds), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Dismiss other nodes")), canDelete && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => setIsConfirmingDelete(true), className: deleteButtonClass, title: "Excluir Nodes" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Excluir Nodes (", nodeCount, ")"))))))
9675
9872
  );
9676
9873
  }
9677
9874
 
9678
9875
  // src/components/RelationshipDetailsPanel.jsx
9679
- var import_react20 = __toESM(require("react"));
9680
- var import_fi17 = require("react-icons/fi");
9876
+ var import_react21 = __toESM(require("react"));
9877
+ var import_fi18 = require("react-icons/fi");
9681
9878
  function RelationshipDetailsPanel({
9682
9879
  link,
9683
9880
  onClose,
@@ -9691,22 +9888,22 @@ function RelationshipDetailsPanel({
9691
9888
  onUploadFile,
9692
9889
  userRole
9693
9890
  }) {
9694
- const [name, setName] = (0, import_react20.useState)((link == null ? void 0 : link.name) ?? "");
9695
- const [description, setDescription] = (0, import_react20.useState)((link == null ? void 0 : link.description) ?? "");
9696
- const [customProps, setCustomProps] = (0, import_react20.useState)(() => extractCustomPropsFromNode(link || {}));
9697
- const [existingSections, setExistingSections] = (0, import_react20.useState)((link == null ? void 0 : link.description_sections) || []);
9698
- const [sourceLabel, setSourceLabel] = (0, import_react20.useState)((link == null ? void 0 : link.source_label) ?? "");
9699
- const [targetLabel, setTargetLabel] = (0, import_react20.useState)((link == null ? void 0 : link.target_label) ?? "");
9700
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react20.useState)(false);
9701
- const [isSaving, setIsSaving] = (0, import_react20.useState)(false);
9702
- const [isReadMode, setIsReadMode] = (0, import_react20.useState)(false);
9703
- const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react20.useState)(false);
9704
- const propsEndRef = (0, import_react20.useRef)(null);
9705
- const canEdit = (0, import_react20.useMemo)(() => {
9891
+ const [name, setName] = (0, import_react21.useState)((link == null ? void 0 : link.name) ?? "");
9892
+ const [description, setDescription] = (0, import_react21.useState)((link == null ? void 0 : link.description) ?? "");
9893
+ const [customProps, setCustomProps] = (0, import_react21.useState)(() => extractCustomPropsFromNode(link || {}));
9894
+ const [existingSections, setExistingSections] = (0, import_react21.useState)((link == null ? void 0 : link.description_sections) || []);
9895
+ const [sourceLabel, setSourceLabel] = (0, import_react21.useState)((link == null ? void 0 : link.source_label) ?? "");
9896
+ const [targetLabel, setTargetLabel] = (0, import_react21.useState)((link == null ? void 0 : link.target_label) ?? "");
9897
+ const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react21.useState)(false);
9898
+ const [isSaving, setIsSaving] = (0, import_react21.useState)(false);
9899
+ const [isReadMode, setIsReadMode] = (0, import_react21.useState)(false);
9900
+ const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react21.useState)(false);
9901
+ const propsEndRef = (0, import_react21.useRef)(null);
9902
+ const canEdit = (0, import_react21.useMemo)(() => {
9706
9903
  const ability = defineAbilityFor(userRole);
9707
9904
  return ability.can("update", "Connection");
9708
9905
  }, [userRole]);
9709
- (0, import_react20.useEffect)(() => {
9906
+ (0, import_react21.useEffect)(() => {
9710
9907
  setName((link == null ? void 0 : link.name) ?? "");
9711
9908
  setDescription((link == null ? void 0 : link.description) ?? "");
9712
9909
  setExistingSections((link == null ? void 0 : link.description_sections) || []);
@@ -9797,7 +9994,7 @@ function RelationshipDetailsPanel({
9797
9994
  onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
9798
9995
  }
9799
9996
  };
9800
- return /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement(
9997
+ return /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement(
9801
9998
  "div",
9802
9999
  {
9803
10000
  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 transition-all duration-300 ease-out
@@ -9812,7 +10009,7 @@ function RelationshipDetailsPanel({
9812
10009
  onContextMenu: swallow,
9813
10010
  onDoubleClick: swallow
9814
10011
  },
9815
- isReadMode ? /* @__PURE__ */ import_react20.default.createElement(
10012
+ isReadMode ? /* @__PURE__ */ import_react21.default.createElement(
9816
10013
  DescriptionReadModePanel,
9817
10014
  {
9818
10015
  title: name || "Rela\xE7\xE3o",
@@ -9833,7 +10030,7 @@ function RelationshipDetailsPanel({
9833
10030
  onImageClick: handleImageClickFromText,
9834
10031
  onSaveDescription: handleSaveDescriptionInline
9835
10032
  }
9836
- ) : /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }), /* @__PURE__ */ import_react20.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-teal-400/80 shadow-[0_0_18px_2px_rgba(45,212,191,0.55)]" }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o")), /* @__PURE__ */ import_react20.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || "Rela\xE7\xE3o")), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: onClose, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome da Rela\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react20.default.createElement(
10033
+ ) : /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }), /* @__PURE__ */ import_react21.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react21.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-teal-400/80 shadow-[0_0_18px_2px_rgba(45,212,191,0.55)]" }), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || "Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement("button", { onClick: onClose, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome da Rela\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react21.default.createElement(
9837
10034
  "input",
9838
10035
  {
9839
10036
  type: "text",
@@ -9848,7 +10045,7 @@ function RelationshipDetailsPanel({
9848
10045
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
9849
10046
  `
9850
10047
  }
9851
- )), /* @__PURE__ */ import_react20.default.createElement("div", { className: "rounded-xl border border-white/8 bg-slate-800/30 p-3 space-y-3" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-violet-400 flex-shrink-0" }, /* @__PURE__ */ import_react20.default.createElement("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs font-medium text-violet-300/80 uppercase tracking-wider" }, "Labels de Agrupamento")), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-[11px] text-slate-400 leading-relaxed" }, "Labels agrupam conex\xF5es no menu de Conex\xF5es. Cada lado da conex\xE3o pode ter sua pr\xF3pria label."), /* @__PURE__ */ import_react20.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Source"), /* @__PURE__ */ import_react20.default.createElement(
10048
+ )), /* @__PURE__ */ import_react21.default.createElement("div", { className: "rounded-xl border border-white/8 bg-slate-800/30 p-3 space-y-3" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react21.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-violet-400 flex-shrink-0" }, /* @__PURE__ */ import_react21.default.createElement("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z" }), /* @__PURE__ */ import_react21.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-xs font-medium text-violet-300/80 uppercase tracking-wider" }, "Labels de Agrupamento")), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-[11px] text-slate-400 leading-relaxed" }, "Labels agrupam conex\xF5es no menu de Conex\xF5es. Cada lado da conex\xE3o pode ter sua pr\xF3pria label."), /* @__PURE__ */ import_react21.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Source"), /* @__PURE__ */ import_react21.default.createElement(
9852
10049
  "input",
9853
10050
  {
9854
10051
  type: "text",
@@ -9863,7 +10060,7 @@ function RelationshipDetailsPanel({
9863
10060
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
9864
10061
  `
9865
10062
  }
9866
- )), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Target"), /* @__PURE__ */ import_react20.default.createElement(
10063
+ )), /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Target"), /* @__PURE__ */ import_react21.default.createElement(
9867
10064
  "input",
9868
10065
  {
9869
10066
  type: "text",
@@ -9878,7 +10075,7 @@ function RelationshipDetailsPanel({
9878
10075
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
9879
10076
  `
9880
10077
  }
9881
- )))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react20.default.createElement(
10078
+ )))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react21.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react21.default.createElement(
9882
10079
  DescriptionDisplay,
9883
10080
  {
9884
10081
  description,
@@ -9890,7 +10087,7 @@ function RelationshipDetailsPanel({
9890
10087
  onImageClick: handleImageClickFromText,
9891
10088
  onSaveDescription: handleSaveDescriptionInline
9892
10089
  }
9893
- ), /* @__PURE__ */ import_react20.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react20.default.createElement(
10090
+ ), /* @__PURE__ */ import_react21.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react21.default.createElement(
9894
10091
  "button",
9895
10092
  {
9896
10093
  type: "button",
@@ -9898,8 +10095,8 @@ function RelationshipDetailsPanel({
9898
10095
  className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors border-r border-white/5",
9899
10096
  title: "Modo de Leitura"
9900
10097
  },
9901
- /* @__PURE__ */ import_react20.default.createElement(import_fi17.FiBookOpen, { size: 14 })
9902
- ), canEdit && /* @__PURE__ */ import_react20.default.createElement(
10098
+ /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiBookOpen, { size: 14 })
10099
+ ), canEdit && /* @__PURE__ */ import_react21.default.createElement(
9903
10100
  "button",
9904
10101
  {
9905
10102
  type: "button",
@@ -9907,15 +10104,15 @@ function RelationshipDetailsPanel({
9907
10104
  className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
9908
10105
  title: "Editar descri\xE7\xE3o"
9909
10106
  },
9910
- /* @__PURE__ */ import_react20.default.createElement(import_fi17.FiEdit2, { size: 14 })
9911
- )), !description && canEdit && /* @__PURE__ */ import_react20.default.createElement(
10107
+ /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiEdit2, { size: 14 })
10108
+ )), !description && canEdit && /* @__PURE__ */ import_react21.default.createElement(
9912
10109
  "div",
9913
10110
  {
9914
10111
  onClick: () => setIsDescriptionModalOpen(true),
9915
10112
  className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
9916
10113
  },
9917
10114
  "Adicionar descri\xE7\xE3o..."
9918
- ))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react20.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react20.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react20.default.createElement(import_fi17.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react20.default.createElement(
10115
+ ))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react21.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react21.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react21.default.createElement(
9919
10116
  CustomPropertyDisplay,
9920
10117
  {
9921
10118
  key: prop.id,
@@ -9927,7 +10124,7 @@ function RelationshipDetailsPanel({
9927
10124
  onUploadFile,
9928
10125
  disabled: !canEdit
9929
10126
  }
9930
- )), /* @__PURE__ */ import_react20.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react20.default.createElement("button", { onClick: onClose, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react20.default.createElement(
10127
+ )), /* @__PURE__ */ import_react21.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react21.default.createElement("button", { onClick: onClose, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react21.default.createElement(
9931
10128
  "button",
9932
10129
  {
9933
10130
  onClick: () => handleSave(false),
@@ -9936,10 +10133,10 @@ function RelationshipDetailsPanel({
9936
10133
  ${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-teal-600 to-teal-400 hover:from-teal-500 hover:to-teal-300 text-white"}
9937
10134
  `
9938
10135
  },
9939
- isSaving && /* @__PURE__ */ import_react20.default.createElement(import_fi17.FiLoader, { className: "animate-spin" }),
10136
+ isSaving && /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiLoader, { className: "animate-spin" }),
9940
10137
  isSaving ? "Salvando..." : "Salvar"
9941
10138
  )))
9942
- ), isDescriptionModalOpen && /* @__PURE__ */ import_react20.default.createElement(
10139
+ ), isDescriptionModalOpen && /* @__PURE__ */ import_react21.default.createElement(
9943
10140
  DescriptionEditModal,
9944
10141
  {
9945
10142
  isOpen: isDescriptionModalOpen,
@@ -9961,7 +10158,7 @@ function RelationshipDetailsPanel({
9961
10158
  }
9962
10159
 
9963
10160
  // src/components/RelationshipContextMenu.jsx
9964
- var import_react21 = __toESM(require("react"));
10161
+ var import_react22 = __toESM(require("react"));
9965
10162
  function RelationshipContextMenu({
9966
10163
  data,
9967
10164
  userRole,
@@ -9971,25 +10168,25 @@ function RelationshipContextMenu({
9971
10168
  onDelete,
9972
10169
  onClose
9973
10170
  }) {
9974
- const menuRef = (0, import_react21.useRef)(null);
9975
- const [menuPos, setMenuPos] = (0, import_react21.useState)({ left: 0, top: 0 });
9976
- const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react21.useState)(false);
9977
- const ability = (0, import_react21.useMemo)(() => defineAbilityFor(userRole), [userRole]);
9978
- const sourceName = (0, import_react21.useMemo)(
10171
+ const menuRef = (0, import_react22.useRef)(null);
10172
+ const [menuPos, setMenuPos] = (0, import_react22.useState)({ left: 0, top: 0 });
10173
+ const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react22.useState)(false);
10174
+ const ability = (0, import_react22.useMemo)(() => defineAbilityFor(userRole), [userRole]);
10175
+ const sourceName = (0, import_react22.useMemo)(
9979
10176
  () => {
9980
10177
  var _a, _b, _c, _d;
9981
10178
  return ((_d = (_c = (_b = (_a = data == null ? void 0 : data.linkObject) == null ? void 0 : _a.userData) == null ? void 0 : _b.sourceNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) ?? "(sem nome)";
9982
10179
  },
9983
10180
  [data == null ? void 0 : data.linkObject]
9984
10181
  );
9985
- const targetName = (0, import_react21.useMemo)(
10182
+ const targetName = (0, import_react22.useMemo)(
9986
10183
  () => {
9987
10184
  var _a, _b, _c, _d;
9988
10185
  return ((_d = (_c = (_b = (_a = data == null ? void 0 : data.linkObject) == null ? void 0 : _a.userData) == null ? void 0 : _b.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) ?? "(sem nome)";
9989
10186
  },
9990
10187
  [data == null ? void 0 : data.linkObject]
9991
10188
  );
9992
- (0, import_react21.useLayoutEffect)(() => {
10189
+ (0, import_react22.useLayoutEffect)(() => {
9993
10190
  if (!data.visible || !menuRef.current) return;
9994
10191
  const el = menuRef.current;
9995
10192
  const w = el.clientWidth;
@@ -10002,7 +10199,7 @@ function RelationshipContextMenu({
10002
10199
  if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
10003
10200
  setMenuPos({ left, top });
10004
10201
  }, [data]);
10005
- (0, import_react21.useEffect)(() => {
10202
+ (0, import_react22.useEffect)(() => {
10006
10203
  if (data.visible) {
10007
10204
  setIsConfirmingDelete(false);
10008
10205
  }
@@ -10018,7 +10215,7 @@ function RelationshipContextMenu({
10018
10215
  const dangerButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-rose-500/20 text-rose-300 hover:text-rose-100 transition-colors duration-150 truncate";
10019
10216
  const canUpdate = ability.can("update", "Connection");
10020
10217
  const canDelete = ability.can("delete", "Connection");
10021
- return /* @__PURE__ */ import_react21.default.createElement(
10218
+ return /* @__PURE__ */ import_react22.default.createElement(
10022
10219
  "div",
10023
10220
  {
10024
10221
  ref: menuRef,
@@ -10032,29 +10229,29 @@ function RelationshipContextMenu({
10032
10229
  onContextMenu: swallow,
10033
10230
  onDoubleClick: swallow
10034
10231
  },
10035
- /* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }),
10036
- /* @__PURE__ */ import_react21.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "w-10 h-10 rounded-full bg-rose-500/20 flex items-center justify-center text-rose-400 mb-1" }, /* @__PURE__ */ import_react21.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react21.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M10 11v6" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M14 11v6" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir rela\xE7\xE3o?"), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight break-words" }, "Desconectar ", /* @__PURE__ */ import_react21.default.createElement("strong", null, sourceName), " de ", /* @__PURE__ */ import_react21.default.createElement("strong", null, targetName), ".")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react21.default.createElement(
10232
+ /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }),
10233
+ /* @__PURE__ */ import_react22.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "w-10 h-10 rounded-full bg-rose-500/20 flex items-center justify-center text-rose-400 mb-1" }, /* @__PURE__ */ import_react22.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 11v6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11v6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir rela\xE7\xE3o?"), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight break-words" }, "Desconectar ", /* @__PURE__ */ import_react22.default.createElement("strong", null, sourceName), " de ", /* @__PURE__ */ import_react22.default.createElement("strong", null, targetName), ".")), /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react22.default.createElement(
10037
10234
  "button",
10038
10235
  {
10039
10236
  onClick: () => setIsConfirmingDelete(false),
10040
10237
  className: "flex-1 px-2 py-2 text-xs font-medium bg-white/10 hover:bg-white/20 rounded-md text-white transition-colors"
10041
10238
  },
10042
10239
  "Cancelar"
10043
- ), /* @__PURE__ */ import_react21.default.createElement(
10240
+ ), /* @__PURE__ */ import_react22.default.createElement(
10044
10241
  "button",
10045
10242
  {
10046
10243
  onClick: () => onDelete == null ? void 0 : onDelete(data.linkObject),
10047
10244
  className: "flex-1 px-2 py-2 text-xs font-medium bg-rose-600 hover:bg-rose-500 rounded-md text-white transition-colors"
10048
10245
  },
10049
10246
  "Excluir"
10050
- ))) : /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react21.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-teal-400/80 shadow-[0_0_12px_1px_rgba(45,212,191,0.5)]" }), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-1" }, canUpdate && /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement(
10247
+ ))) : /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react22.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-teal-400/80 shadow-[0_0_12px_1px_rgba(45,212,191,0.5)]" }), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Rela\xE7\xE3o")), /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col gap-1" }, canUpdate && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement(
10051
10248
  "button",
10052
10249
  {
10053
10250
  onClick: () => onRelinkSource == null ? void 0 : onRelinkSource(data.linkObject),
10054
10251
  className: baseButtonClass,
10055
10252
  title: "Desconectar ponta ligada ao Source"
10056
10253
  },
10057
- /* @__PURE__ */ import_react21.default.createElement(
10254
+ /* @__PURE__ */ import_react22.default.createElement(
10058
10255
  "svg",
10059
10256
  {
10060
10257
  xmlns: "http://www.w3.org/2000/svg",
@@ -10067,18 +10264,18 @@ function RelationshipContextMenu({
10067
10264
  strokeLinecap: "round",
10068
10265
  strokeLinejoin: "round"
10069
10266
  },
10070
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }),
10071
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })
10267
+ /* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }),
10268
+ /* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })
10072
10269
  ),
10073
- /* @__PURE__ */ import_react21.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
10074
- ), /* @__PURE__ */ import_react21.default.createElement(
10270
+ /* @__PURE__ */ import_react22.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
10271
+ ), /* @__PURE__ */ import_react22.default.createElement(
10075
10272
  "button",
10076
10273
  {
10077
10274
  onClick: () => onRelinkTarget == null ? void 0 : onRelinkTarget(data.linkObject),
10078
10275
  className: baseButtonClass,
10079
10276
  title: "Desconectar ponta ligada ao Target"
10080
10277
  },
10081
- /* @__PURE__ */ import_react21.default.createElement(
10278
+ /* @__PURE__ */ import_react22.default.createElement(
10082
10279
  "svg",
10083
10280
  {
10084
10281
  xmlns: "http://www.w3.org/2000/svg",
@@ -10091,21 +10288,21 @@ function RelationshipContextMenu({
10091
10288
  strokeLinecap: "round",
10092
10289
  strokeLinejoin: "round"
10093
10290
  },
10094
- /* @__PURE__ */ import_react21.default.createElement("polyline", { points: "16 3 21 3 21 8" }),
10095
- /* @__PURE__ */ import_react21.default.createElement("line", { x1: "4", y1: "20", x2: "21", y2: "3" }),
10096
- /* @__PURE__ */ import_react21.default.createElement("polyline", { points: "21 16 21 21 16 21" }),
10097
- /* @__PURE__ */ import_react21.default.createElement("line", { x1: "15", y1: "15", x2: "21", y2: "21" }),
10098
- /* @__PURE__ */ import_react21.default.createElement("line", { x1: "4", y1: "4", x2: "9", y2: "9" })
10291
+ /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "16 3 21 3 21 8" }),
10292
+ /* @__PURE__ */ import_react22.default.createElement("line", { x1: "4", y1: "20", x2: "21", y2: "3" }),
10293
+ /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "21 16 21 21 16 21" }),
10294
+ /* @__PURE__ */ import_react22.default.createElement("line", { x1: "15", y1: "15", x2: "21", y2: "21" }),
10295
+ /* @__PURE__ */ import_react22.default.createElement("line", { x1: "4", y1: "4", x2: "9", y2: "9" })
10099
10296
  ),
10100
- /* @__PURE__ */ import_react21.default.createElement("span", null, "Desconectar Target (", targetName, ")")
10101
- ), /* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" })), /* @__PURE__ */ import_react21.default.createElement(
10297
+ /* @__PURE__ */ import_react22.default.createElement("span", null, "Desconectar Target (", targetName, ")")
10298
+ ), /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" })), /* @__PURE__ */ import_react22.default.createElement(
10102
10299
  "button",
10103
10300
  {
10104
10301
  onClick: () => onOpenDetails == null ? void 0 : onOpenDetails(data.linkObject),
10105
10302
  className: baseButtonClass,
10106
10303
  title: "Abrir detalhes da rela\xE7\xE3o"
10107
10304
  },
10108
- /* @__PURE__ */ import_react21.default.createElement(
10305
+ /* @__PURE__ */ import_react22.default.createElement(
10109
10306
  "svg",
10110
10307
  {
10111
10308
  xmlns: "http://www.w3.org/2000/svg",
@@ -10118,19 +10315,19 @@ function RelationshipContextMenu({
10118
10315
  strokeLinecap: "round",
10119
10316
  strokeLinejoin: "round"
10120
10317
  },
10121
- /* @__PURE__ */ import_react21.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
10122
- /* @__PURE__ */ import_react21.default.createElement("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
10123
- /* @__PURE__ */ import_react21.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "8" })
10318
+ /* @__PURE__ */ import_react22.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
10319
+ /* @__PURE__ */ import_react22.default.createElement("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
10320
+ /* @__PURE__ */ import_react22.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "8" })
10124
10321
  ),
10125
- /* @__PURE__ */ import_react21.default.createElement("span", null, "Abrir Detalhes")
10126
- ), canDelete && /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" }), /* @__PURE__ */ import_react21.default.createElement(
10322
+ /* @__PURE__ */ import_react22.default.createElement("span", null, "Abrir Detalhes")
10323
+ ), canDelete && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" }), /* @__PURE__ */ import_react22.default.createElement(
10127
10324
  "button",
10128
10325
  {
10129
10326
  onClick: () => setIsConfirmingDelete(true),
10130
10327
  className: dangerButtonClass,
10131
10328
  title: "Excluir esta conex\xE3o"
10132
10329
  },
10133
- /* @__PURE__ */ import_react21.default.createElement(
10330
+ /* @__PURE__ */ import_react22.default.createElement(
10134
10331
  "svg",
10135
10332
  {
10136
10333
  xmlns: "http://www.w3.org/2000/svg",
@@ -10143,19 +10340,19 @@ function RelationshipContextMenu({
10143
10340
  strokeLinecap: "round",
10144
10341
  strokeLinejoin: "round"
10145
10342
  },
10146
- /* @__PURE__ */ import_react21.default.createElement("polyline", { points: "3 6 5 6 21 6" }),
10147
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
10148
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M10 11v6" }),
10149
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M14 11v6" }),
10150
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" })
10343
+ /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "3 6 5 6 21 6" }),
10344
+ /* @__PURE__ */ import_react22.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
10345
+ /* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 11v6" }),
10346
+ /* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11v6" }),
10347
+ /* @__PURE__ */ import_react22.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" })
10151
10348
  ),
10152
- /* @__PURE__ */ import_react21.default.createElement("span", null, "Excluir conex\xE3o (", sourceName, " \u2192 ", targetName, ")")
10349
+ /* @__PURE__ */ import_react22.default.createElement("span", null, "Excluir conex\xE3o (", sourceName, " \u2192 ", targetName, ")")
10153
10350
  )))))
10154
10351
  );
10155
10352
  }
10156
10353
 
10157
10354
  // src/components/LoadingScreen.jsx
10158
- var import_react22 = __toESM(require("react"));
10355
+ var import_react23 = __toESM(require("react"));
10159
10356
  var styles = {
10160
10357
  loadingOverlay: {
10161
10358
  position: "fixed",
@@ -10187,11 +10384,11 @@ var styles = {
10187
10384
  `
10188
10385
  };
10189
10386
  function LoadingScreen() {
10190
- return /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("style", null, styles.keyframes), /* @__PURE__ */ import_react22.default.createElement("div", { style: styles.loadingOverlay }, /* @__PURE__ */ import_react22.default.createElement("div", { style: styles.spinner })));
10387
+ return /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("style", null, styles.keyframes), /* @__PURE__ */ import_react23.default.createElement("div", { style: styles.loadingOverlay }, /* @__PURE__ */ import_react23.default.createElement("div", { style: styles.spinner })));
10191
10388
  }
10192
10389
 
10193
10390
  // src/components/ImportParentFileModal.jsx
10194
- var import_react23 = __toESM(require("react"));
10391
+ var import_react24 = __toESM(require("react"));
10195
10392
  function ImportParentFileModal({
10196
10393
  isOpen,
10197
10394
  onClose,
@@ -10202,12 +10399,12 @@ function ImportParentFileModal({
10202
10399
  onFetchAvailableFiles,
10203
10400
  currentViewName
10204
10401
  }) {
10205
- const [activeTab, setActiveTab] = (0, import_react23.useState)("databases");
10206
- const [availableDbs, setAvailableDbs] = (0, import_react23.useState)([]);
10207
- const [availableViews, setAvailableViews] = (0, import_react23.useState)([]);
10208
- const [selectedItem, setSelectedItem] = (0, import_react23.useState)(null);
10209
- const [isLoading, setIsLoading] = (0, import_react23.useState)(false);
10210
- (0, import_react23.useEffect)(() => {
10402
+ const [activeTab, setActiveTab] = (0, import_react24.useState)("databases");
10403
+ const [availableDbs, setAvailableDbs] = (0, import_react24.useState)([]);
10404
+ const [availableViews, setAvailableViews] = (0, import_react24.useState)([]);
10405
+ const [selectedItem, setSelectedItem] = (0, import_react24.useState)(null);
10406
+ const [isLoading, setIsLoading] = (0, import_react24.useState)(false);
10407
+ (0, import_react24.useEffect)(() => {
10211
10408
  if (isOpen && session && onFetchAvailableFiles) {
10212
10409
  const fetchData = async () => {
10213
10410
  setIsLoading(true);
@@ -10243,7 +10440,7 @@ function ImportParentFileModal({
10243
10440
  fetchData();
10244
10441
  }
10245
10442
  }, [isOpen, session, parentDbs, onFetchAvailableFiles, currentViewName]);
10246
- (0, import_react23.useEffect)(() => {
10443
+ (0, import_react24.useEffect)(() => {
10247
10444
  setSelectedItem(null);
10248
10445
  }, [activeTab]);
10249
10446
  if (!isOpen) {
@@ -10272,13 +10469,13 @@ function ImportParentFileModal({
10272
10469
  const swallow = (e) => e.stopPropagation();
10273
10470
  const currentList = activeTab === "databases" ? availableDbs : availableViews;
10274
10471
  const emptyMessage = activeTab === "databases" ? "Nenhum novo arquivo parent dispon\xEDvel." : "Nenhuma view dispon\xEDvel para importa\xE7\xE3o.";
10275
- return /* @__PURE__ */ import_react23.default.createElement(
10472
+ return /* @__PURE__ */ import_react24.default.createElement(
10276
10473
  "div",
10277
10474
  {
10278
10475
  className: "ui-overlay fixed inset-0 z-[1200] flex items-center justify-center bg-black/60 backdrop-blur-sm",
10279
10476
  onClick: onClose
10280
10477
  },
10281
- /* @__PURE__ */ import_react23.default.createElement(
10478
+ /* @__PURE__ */ import_react24.default.createElement(
10282
10479
  "div",
10283
10480
  {
10284
10481
  className: "ui-overlay relative rounded-2xl border border-white/10 bg-slate-950/80 shadow-[0_20px_80px_rgba(0,0,0,0.6)] text-white w-[min(92vw,500px)] flex flex-col max-h-[85vh]",
@@ -10290,14 +10487,14 @@ function ImportParentFileModal({
10290
10487
  onContextMenu: swallow,
10291
10488
  onDoubleClick: swallow
10292
10489
  },
10293
- /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex items-center justify-between px-6 py-4 border-b border-white/10 flex-shrink-0" }, /* @__PURE__ */ import_react23.default.createElement("h2", { className: "text-lg font-semibold" }, "Importar"), /* @__PURE__ */ import_react23.default.createElement(
10490
+ /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-between px-6 py-4 border-b border-white/10 flex-shrink-0" }, /* @__PURE__ */ import_react24.default.createElement("h2", { className: "text-lg font-semibold" }, "Importar"), /* @__PURE__ */ import_react24.default.createElement(
10294
10491
  "button",
10295
10492
  {
10296
10493
  onClick: onClose,
10297
10494
  className: "p-2 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
10298
10495
  title: "Fechar"
10299
10496
  },
10300
- /* @__PURE__ */ import_react23.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react23.default.createElement(
10497
+ /* @__PURE__ */ import_react24.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react24.default.createElement(
10301
10498
  "path",
10302
10499
  {
10303
10500
  fillRule: "evenodd",
@@ -10306,14 +10503,14 @@ function ImportParentFileModal({
10306
10503
  }
10307
10504
  ))
10308
10505
  )),
10309
- /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex px-6 border-b border-white/10 bg-white/5 flex-shrink-0" }, /* @__PURE__ */ import_react23.default.createElement(
10506
+ /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex px-6 border-b border-white/10 bg-white/5 flex-shrink-0" }, /* @__PURE__ */ import_react24.default.createElement(
10310
10507
  "button",
10311
10508
  {
10312
10509
  onClick: () => setActiveTab("databases"),
10313
10510
  className: `flex-1 py-3 text-sm font-medium border-b-2 transition-colors ${activeTab === "databases" ? "border-indigo-500 text-white" : "border-transparent text-slate-400 hover:text-slate-200"}`
10314
10511
  },
10315
10512
  "Arquivos Parent"
10316
- ), /* @__PURE__ */ import_react23.default.createElement(
10513
+ ), /* @__PURE__ */ import_react24.default.createElement(
10317
10514
  "button",
10318
10515
  {
10319
10516
  onClick: () => setActiveTab("views"),
@@ -10321,24 +10518,24 @@ function ImportParentFileModal({
10321
10518
  },
10322
10519
  "Views (Ancestralidades)"
10323
10520
  )),
10324
- /* @__PURE__ */ import_react23.default.createElement("div", { className: "p-6 overflow-y-auto custom-scrollbar flex-grow min-h-[200px]" }, isLoading ? /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex items-center justify-center h-40" }, /* @__PURE__ */ import_react23.default.createElement("div", { className: "w-8 h-8 border-4 border-t-indigo-500 border-slate-700 rounded-full animate-spin" })) : /* @__PURE__ */ import_react23.default.createElement("div", { className: "space-y-2" }, currentList.length > 0 ? currentList.map((item) => /* @__PURE__ */ import_react23.default.createElement(
10521
+ /* @__PURE__ */ import_react24.default.createElement("div", { className: "p-6 overflow-y-auto custom-scrollbar flex-grow min-h-[200px]" }, isLoading ? /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-center h-40" }, /* @__PURE__ */ import_react24.default.createElement("div", { className: "w-8 h-8 border-4 border-t-indigo-500 border-slate-700 rounded-full animate-spin" })) : /* @__PURE__ */ import_react24.default.createElement("div", { className: "space-y-2" }, currentList.length > 0 ? currentList.map((item) => /* @__PURE__ */ import_react24.default.createElement(
10325
10522
  "div",
10326
10523
  {
10327
10524
  key: item.id,
10328
10525
  onClick: () => setSelectedItem(item),
10329
10526
  className: `px-4 py-3 rounded-lg border cursor-pointer transition-all duration-150 flex flex-col gap-1 ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "bg-indigo-600 border-indigo-500 shadow-lg" : "bg-slate-800/60 border-white/10 hover:border-white/20 hover:bg-slate-800"}`
10330
10527
  },
10331
- /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react23.default.createElement("span", { className: "font-medium text-slate-100" }, item.name), activeTab === "views" && /* @__PURE__ */ import_react23.default.createElement("span", { className: "text-[10px] px-1.5 py-0.5 rounded bg-black/30 text-indigo-300 border border-indigo-500/30" }, "VIEW")),
10332
- item.description && /* @__PURE__ */ import_react23.default.createElement("p", { className: `text-xs ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "text-indigo-200" : "text-slate-400"}` }, item.description)
10333
- )) : /* @__PURE__ */ import_react23.default.createElement("p", { className: "text-slate-400 text-center py-10" }, emptyMessage))),
10334
- /* @__PURE__ */ import_react23.default.createElement("div", { className: "px-6 py-4 border-t border-white/10 flex justify-end gap-3 flex-shrink-0 bg-slate-900/50" }, /* @__PURE__ */ import_react23.default.createElement(
10528
+ /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react24.default.createElement("span", { className: "font-medium text-slate-100" }, item.name), activeTab === "views" && /* @__PURE__ */ import_react24.default.createElement("span", { className: "text-[10px] px-1.5 py-0.5 rounded bg-black/30 text-indigo-300 border border-indigo-500/30" }, "VIEW")),
10529
+ item.description && /* @__PURE__ */ import_react24.default.createElement("p", { className: `text-xs ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "text-indigo-200" : "text-slate-400"}` }, item.description)
10530
+ )) : /* @__PURE__ */ import_react24.default.createElement("p", { className: "text-slate-400 text-center py-10" }, emptyMessage))),
10531
+ /* @__PURE__ */ import_react24.default.createElement("div", { className: "px-6 py-4 border-t border-white/10 flex justify-end gap-3 flex-shrink-0 bg-slate-900/50" }, /* @__PURE__ */ import_react24.default.createElement(
10335
10532
  "button",
10336
10533
  {
10337
10534
  onClick: onClose,
10338
10535
  className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm text-slate-300"
10339
10536
  },
10340
10537
  "Cancelar"
10341
- ), /* @__PURE__ */ import_react23.default.createElement(
10538
+ ), /* @__PURE__ */ import_react24.default.createElement(
10342
10539
  "button",
10343
10540
  {
10344
10541
  onClick: handleConfirm,
@@ -10352,8 +10549,8 @@ function ImportParentFileModal({
10352
10549
  }
10353
10550
 
10354
10551
  // src/components/AncestryLinkDetailsPanel.jsx
10355
- var import_react24 = __toESM(require("react"));
10356
- var import_fi18 = require("react-icons/fi");
10552
+ var import_react25 = __toESM(require("react"));
10553
+ var import_fi19 = require("react-icons/fi");
10357
10554
  function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenReference, onMentionClick, onUploadFile }) {
10358
10555
  var _a, _b, _c, _d;
10359
10556
  const relationshipData = data.relationship || {};
@@ -10362,21 +10559,21 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10362
10559
  const customProps = extractCustomPropsFromNode(relationshipData);
10363
10560
  const sourceName = ((_b = (_a = data.sourceNode) == null ? void 0 : _a.userData) == null ? void 0 : _b.name) || "Origem";
10364
10561
  const targetName = ((_d = (_c = data.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) || "Destino";
10365
- const [isReadMode, setIsReadMode] = (0, import_react24.useState)(false);
10562
+ const [isReadMode, setIsReadMode] = (0, import_react25.useState)(false);
10366
10563
  const swallow = (e) => e.stopPropagation();
10367
10564
  const handleImageClickFromText = (url, name) => {
10368
10565
  if (onOpenImageViewer) {
10369
10566
  onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
10370
10567
  }
10371
10568
  };
10372
- return /* @__PURE__ */ import_react24.default.createElement(
10569
+ return /* @__PURE__ */ import_react25.default.createElement(
10373
10570
  "div",
10374
10571
  {
10375
10572
  className: "ui-overlay fixed inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-[1200]",
10376
10573
  onClick: onClose,
10377
10574
  onPointerDown: swallow
10378
10575
  },
10379
- /* @__PURE__ */ import_react24.default.createElement(
10576
+ /* @__PURE__ */ import_react25.default.createElement(
10380
10577
  "div",
10381
10578
  {
10382
10579
  className: `relative group rounded-2xl border border-white/10 bg-slate-950/80 shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white overflow-hidden flex flex-col max-h-[calc(100vh-4rem)] transition-all duration-300 ease-out
@@ -10384,7 +10581,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10384
10581
  `,
10385
10582
  onClick: swallow
10386
10583
  },
10387
- isReadMode ? /* @__PURE__ */ import_react24.default.createElement(
10584
+ isReadMode ? /* @__PURE__ */ import_react25.default.createElement(
10388
10585
  DescriptionReadModePanel,
10389
10586
  {
10390
10587
  title: `${sourceName} \u2794 ${targetName}`,
@@ -10396,15 +10593,15 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10396
10593
  onMentionClick,
10397
10594
  onImageClick: handleImageClickFromText
10398
10595
  }
10399
- ) : /* @__PURE__ */ import_react24.default.createElement(import_react24.default.Fragment, null, /* @__PURE__ */ import_react24.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-blue-500/0 via-blue-500/70 to-blue-500/0" }), /* @__PURE__ */ import_react24.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react24.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react24.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-blue-500/80 shadow-[0_0_18px_2px_rgba(59,130,246,0.55)]" }), /* @__PURE__ */ import_react24.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Ancestralidade")), /* @__PURE__ */ import_react24.default.createElement("h2", { className: "text-lg font-semibold tracking-tight flex items-center gap-2" }, /* @__PURE__ */ import_react24.default.createElement("span", { className: "truncate max-w-[150px]" }, sourceName), /* @__PURE__ */ import_react24.default.createElement("span", { className: "text-slate-500 text-sm" }, "\u2794"), /* @__PURE__ */ import_react24.default.createElement("span", { className: "truncate max-w-[150px]" }, targetName))), /* @__PURE__ */ import_react24.default.createElement("button", { onClick: onClose, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react24.default.createElement("div", { className: "px-6 pb-6 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, description && /* @__PURE__ */ import_react24.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react24.default.createElement("label", { className: "text-xs text-slate-300 font-medium" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react24.default.createElement(
10596
+ ) : /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, /* @__PURE__ */ import_react25.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-blue-500/0 via-blue-500/70 to-blue-500/0" }), /* @__PURE__ */ import_react25.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-blue-500/80 shadow-[0_0_18px_2px_rgba(59,130,246,0.55)]" }), /* @__PURE__ */ import_react25.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Ancestralidade")), /* @__PURE__ */ import_react25.default.createElement("h2", { className: "text-lg font-semibold tracking-tight flex items-center gap-2" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "truncate max-w-[150px]" }, sourceName), /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-slate-500 text-sm" }, "\u2794"), /* @__PURE__ */ import_react25.default.createElement("span", { className: "truncate max-w-[150px]" }, targetName))), /* @__PURE__ */ import_react25.default.createElement("button", { onClick: onClose, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react25.default.createElement("div", { className: "px-6 pb-6 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, description && /* @__PURE__ */ import_react25.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react25.default.createElement("label", { className: "text-xs text-slate-300 font-medium" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react25.default.createElement(
10400
10597
  "button",
10401
10598
  {
10402
10599
  onClick: () => setIsReadMode(true),
10403
10600
  className: "p-1 text-slate-400 hover:text-white transition-colors",
10404
10601
  title: "Modo de Leitura"
10405
10602
  },
10406
- /* @__PURE__ */ import_react24.default.createElement(import_fi18.FiBookOpen, { size: 14 })
10407
- )), /* @__PURE__ */ import_react24.default.createElement("div", { className: "bg-slate-800/40 rounded-lg border border-white/10 p-1 relative group" }, /* @__PURE__ */ import_react24.default.createElement(
10603
+ /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiBookOpen, { size: 14 })
10604
+ )), /* @__PURE__ */ import_react25.default.createElement("div", { className: "bg-slate-800/40 rounded-lg border border-white/10 p-1 relative group" }, /* @__PURE__ */ import_react25.default.createElement(
10408
10605
  DescriptionDisplay,
10409
10606
  {
10410
10607
  description,
@@ -10413,7 +10610,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10413
10610
  onMentionClick,
10414
10611
  onImageClick: handleImageClickFromText
10415
10612
  }
10416
- ))), customProps.length > 0 && /* @__PURE__ */ import_react24.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react24.default.createElement("label", { className: "text-xs text-slate-300 font-medium mb-2 block" }, "Propriedades"), /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop) => /* @__PURE__ */ import_react24.default.createElement(
10613
+ ))), customProps.length > 0 && /* @__PURE__ */ import_react25.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react25.default.createElement("label", { className: "text-xs text-slate-300 font-medium mb-2 block" }, "Propriedades"), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop) => /* @__PURE__ */ import_react25.default.createElement(
10417
10614
  CustomPropertyDisplay,
10418
10615
  {
10419
10616
  key: prop.id,
@@ -10422,14 +10619,14 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10422
10619
  onOpenImageViewer,
10423
10620
  onUploadFile
10424
10621
  }
10425
- )))), !description && customProps.length === 0 && /* @__PURE__ */ import_react24.default.createElement("div", { className: "py-8 text-center text-slate-500 text-sm italic border border-dashed border-white/10 rounded-lg" }, "Nenhum detalhe adicional dispon\xEDvel para esta conex\xE3o."), /* @__PURE__ */ import_react24.default.createElement("div", { className: "mt-4 p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg text-xs text-blue-200/80 text-center" }, 'Para editar esta conex\xE3o, utilize o menu "Editar Ancestralidade".')))
10622
+ )))), !description && customProps.length === 0 && /* @__PURE__ */ import_react25.default.createElement("div", { className: "py-8 text-center text-slate-500 text-sm italic border border-dashed border-white/10 rounded-lg" }, "Nenhum detalhe adicional dispon\xEDvel para esta conex\xE3o."), /* @__PURE__ */ import_react25.default.createElement("div", { className: "mt-4 p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg text-xs text-blue-200/80 text-center" }, 'Para editar esta conex\xE3o, utilize o menu "Editar Ancestralidade".')))
10426
10623
  )
10427
10624
  );
10428
10625
  }
10429
10626
 
10430
10627
  // src/components/AncestryBoard.jsx
10431
- var import_react25 = __toESM(require("react"));
10432
- var import_fi19 = require("react-icons/fi");
10628
+ var import_react26 = __toESM(require("react"));
10629
+ var import_fi20 = require("react-icons/fi");
10433
10630
  var GroupItem = ({
10434
10631
  group,
10435
10632
  index,
@@ -10448,7 +10645,7 @@ var GroupItem = ({
10448
10645
  }) => {
10449
10646
  const canIndent = index > 0;
10450
10647
  const isPickingForThisGroup = pickingGroupId === group.id;
10451
- const textareaRef = (0, import_react25.useRef)(null);
10648
+ const textareaRef = (0, import_react26.useRef)(null);
10452
10649
  const adjustHeight = () => {
10453
10650
  const textarea = textareaRef.current;
10454
10651
  if (textarea) {
@@ -10456,10 +10653,10 @@ var GroupItem = ({
10456
10653
  textarea.style.height = `${textarea.scrollHeight}px`;
10457
10654
  }
10458
10655
  };
10459
- (0, import_react25.useEffect)(() => {
10656
+ (0, import_react26.useEffect)(() => {
10460
10657
  adjustHeight();
10461
10658
  }, [group.text]);
10462
- return /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col gap-2 mb-3 pl-3 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react25.default.createElement(
10659
+ return /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col gap-2 mb-3 pl-3 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react26.default.createElement(
10463
10660
  "div",
10464
10661
  {
10465
10662
  className: `
@@ -10467,7 +10664,7 @@ var GroupItem = ({
10467
10664
  ${isPickingForThisGroup ? "bg-indigo-500/10 border-l-2 border-indigo-500" : "hover:bg-white/5 border-l-2 border-transparent hover:border-white/20"}
10468
10665
  `
10469
10666
  },
10470
- /* @__PURE__ */ import_react25.default.createElement(
10667
+ /* @__PURE__ */ import_react26.default.createElement(
10471
10668
  "textarea",
10472
10669
  {
10473
10670
  ref: textareaRef,
@@ -10485,9 +10682,9 @@ var GroupItem = ({
10485
10682
  }
10486
10683
  }
10487
10684
  ),
10488
- group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-wrap gap-2 mt-1" }, group.ancestries.map((anc) => {
10685
+ group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-wrap gap-2 mt-1" }, group.ancestries.map((anc) => {
10489
10686
  const isValid = availableIds.has(String(anc.ancestry_id));
10490
- return /* @__PURE__ */ import_react25.default.createElement(
10687
+ return /* @__PURE__ */ import_react26.default.createElement(
10491
10688
  "div",
10492
10689
  {
10493
10690
  key: anc.ancestry_id,
@@ -10499,40 +10696,40 @@ var GroupItem = ({
10499
10696
  },
10500
10697
  isValid ? (
10501
10698
  // [MANTIDO] Botão Play visível para todos
10502
- /* @__PURE__ */ import_react25.default.createElement(
10699
+ /* @__PURE__ */ import_react26.default.createElement(
10503
10700
  "button",
10504
10701
  {
10505
10702
  onClick: () => onPlayAncestry(anc.ancestry_id),
10506
10703
  className: "text-indigo-400 hover:text-white hover:bg-indigo-500 p-1 rounded-full transition-colors",
10507
10704
  title: "Renderizar no cen\xE1rio"
10508
10705
  },
10509
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
10706
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
10510
10707
  )
10511
- ) : /* @__PURE__ */ import_react25.default.createElement("div", { className: "p-1 text-red-500 cursor-not-allowed" }, /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiAlertTriangle, { size: 10 })),
10512
- /* @__PURE__ */ import_react25.default.createElement(
10708
+ ) : /* @__PURE__ */ import_react26.default.createElement("div", { className: "p-1 text-red-500 cursor-not-allowed" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiAlertTriangle, { size: 10 })),
10709
+ /* @__PURE__ */ import_react26.default.createElement(
10513
10710
  "span",
10514
10711
  {
10515
10712
  className: `font-medium truncate max-w-[150px] ${!isValid && "line-through decoration-red-500/50"}`
10516
10713
  },
10517
10714
  anc.name
10518
10715
  ),
10519
- canEdit && /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, /* @__PURE__ */ import_react25.default.createElement(
10716
+ canEdit && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(
10520
10717
  "div",
10521
10718
  {
10522
10719
  className: `w-px h-3 mx-0.5 ${isValid ? "bg-white/10" : "bg-red-500/20"}`
10523
10720
  }
10524
- ), /* @__PURE__ */ import_react25.default.createElement(
10721
+ ), /* @__PURE__ */ import_react26.default.createElement(
10525
10722
  "button",
10526
10723
  {
10527
10724
  onClick: () => onRemoveAncestry(group.id, anc.ancestry_id),
10528
10725
  className: `${isValid ? "text-slate-500 hover:text-red-400" : "text-red-400 hover:text-red-200"} p-0.5 rounded transition-colors`,
10529
10726
  title: "Remover men\xE7\xE3o"
10530
10727
  },
10531
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiX, { size: 12 })
10728
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiX, { size: 12 })
10532
10729
  ))
10533
10730
  );
10534
10731
  })),
10535
- canEdit && /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react25.default.createElement(
10732
+ canEdit && /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react26.default.createElement(
10536
10733
  "button",
10537
10734
  {
10538
10735
  onClick: () => onRequestPickAncestry(group.id),
@@ -10542,17 +10739,17 @@ var GroupItem = ({
10542
10739
  `,
10543
10740
  title: "Adicionar Ancestralidade a este grupo"
10544
10741
  },
10545
- isPickingForThisGroup ? /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiSearch, { size: 12 }),
10742
+ isPickingForThisGroup ? /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiSearch, { size: 12 }),
10546
10743
  isPickingForThisGroup ? "Selecionando..." : "Adicionar"
10547
- ), /* @__PURE__ */ import_react25.default.createElement(
10744
+ ), /* @__PURE__ */ import_react26.default.createElement(
10548
10745
  "button",
10549
10746
  {
10550
10747
  onClick: () => onAddSubgroup(group.id),
10551
10748
  className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
10552
10749
  title: "Criar Subgrupo"
10553
10750
  },
10554
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiPlus, { size: 14 })
10555
- )), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react25.default.createElement(
10751
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 14 })
10752
+ )), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react26.default.createElement(
10556
10753
  "button",
10557
10754
  {
10558
10755
  onClick: () => onIndent(group.id),
@@ -10560,25 +10757,25 @@ var GroupItem = ({
10560
10757
  className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
10561
10758
  title: "Aninhar no grupo acima"
10562
10759
  },
10563
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiArrowRight, { size: 14 })
10564
- ), /* @__PURE__ */ import_react25.default.createElement(
10760
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiArrowRight, { size: 14 })
10761
+ ), /* @__PURE__ */ import_react26.default.createElement(
10565
10762
  "button",
10566
10763
  {
10567
10764
  onClick: () => onOutdent(group.id),
10568
10765
  className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
10569
10766
  title: "Desaninhar"
10570
10767
  },
10571
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiArrowLeft, { size: 14 })
10572
- ), /* @__PURE__ */ import_react25.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react25.default.createElement(
10768
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiArrowLeft, { size: 14 })
10769
+ ), /* @__PURE__ */ import_react26.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react26.default.createElement(
10573
10770
  "button",
10574
10771
  {
10575
10772
  onClick: () => onDelete(group.id),
10576
10773
  className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
10577
10774
  title: "Remover Grupo"
10578
10775
  },
10579
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiTrash2, { size: 14 })
10776
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiTrash2, { size: 14 })
10580
10777
  )))
10581
- ), group.children && group.children.length > 0 && /* @__PURE__ */ import_react25.default.createElement("div", { className: "ml-2" }, group.children.map((childGroup, idx) => /* @__PURE__ */ import_react25.default.createElement(
10778
+ ), group.children && group.children.length > 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "ml-2" }, group.children.map((childGroup, idx) => /* @__PURE__ */ import_react26.default.createElement(
10582
10779
  GroupItem,
10583
10780
  {
10584
10781
  key: childGroup.id,
@@ -10610,21 +10807,21 @@ function AncestryBoard({
10610
10807
  userRole
10611
10808
  // [NOVO] Recebe a role do usuário
10612
10809
  }) {
10613
- const [searchTerm, setSearchTerm] = (0, import_react25.useState)("");
10614
- const [groups, setGroups] = (0, import_react25.useState)([]);
10615
- const [isLoaded, setIsLoaded] = (0, import_react25.useState)(false);
10616
- const [pickingGroupId, setPickingGroupId] = (0, import_react25.useState)(null);
10617
- const [saveStatus, setSaveStatus] = (0, import_react25.useState)("idle");
10618
- const canEdit = (0, import_react25.useMemo)(() => {
10810
+ const [searchTerm, setSearchTerm] = (0, import_react26.useState)("");
10811
+ const [groups, setGroups] = (0, import_react26.useState)([]);
10812
+ const [isLoaded, setIsLoaded] = (0, import_react26.useState)(false);
10813
+ const [pickingGroupId, setPickingGroupId] = (0, import_react26.useState)(null);
10814
+ const [saveStatus, setSaveStatus] = (0, import_react26.useState)("idle");
10815
+ const canEdit = (0, import_react26.useMemo)(() => {
10619
10816
  return userRole !== "viewer";
10620
10817
  }, [userRole]);
10621
- (0, import_react25.useEffect)(() => {
10818
+ (0, import_react26.useEffect)(() => {
10622
10819
  if (initialGroups && !isLoaded) {
10623
10820
  setGroups(initialGroups);
10624
10821
  setIsLoaded(true);
10625
10822
  }
10626
10823
  }, [initialGroups, isLoaded]);
10627
- const nodeNamesMap = (0, import_react25.useMemo)(() => {
10824
+ const nodeNamesMap = (0, import_react26.useMemo)(() => {
10628
10825
  const map = /* @__PURE__ */ new Map();
10629
10826
  if (availableNodes && Array.isArray(availableNodes)) {
10630
10827
  availableNodes.forEach((node) => {
@@ -10635,7 +10832,7 @@ function AncestryBoard({
10635
10832
  }
10636
10833
  return map;
10637
10834
  }, [availableNodes]);
10638
- const availableIds = (0, import_react25.useMemo)(() => {
10835
+ const availableIds = (0, import_react26.useMemo)(() => {
10639
10836
  return new Set(availableAncestries.map((a) => String(a.ancestry_id)));
10640
10837
  }, [availableAncestries]);
10641
10838
  const sanitizeGroups = (groupList) => {
@@ -10649,7 +10846,7 @@ function AncestryBoard({
10649
10846
  children: sanitizeGroups(g.children || [])
10650
10847
  }));
10651
10848
  };
10652
- (0, import_react25.useEffect)(() => {
10849
+ (0, import_react26.useEffect)(() => {
10653
10850
  if (!isLoaded || !onSave) return;
10654
10851
  const timeoutId = setTimeout(async () => {
10655
10852
  setSaveStatus("saving");
@@ -10667,7 +10864,7 @@ function AncestryBoard({
10667
10864
  }, 3e3);
10668
10865
  return () => clearTimeout(timeoutId);
10669
10866
  }, [groups, isLoaded, onSave]);
10670
- (0, import_react25.useEffect)(() => {
10867
+ (0, import_react26.useEffect)(() => {
10671
10868
  if (!isOpen) return;
10672
10869
  const handleKeyDown = (e) => {
10673
10870
  if (e.key === "Escape") {
@@ -10683,7 +10880,7 @@ function AncestryBoard({
10683
10880
  window.addEventListener("keydown", handleKeyDown);
10684
10881
  return () => window.removeEventListener("keydown", handleKeyDown);
10685
10882
  }, [isOpen, onClose, pickingGroupId]);
10686
- const filtered = (0, import_react25.useMemo)(() => {
10883
+ const filtered = (0, import_react26.useMemo)(() => {
10687
10884
  const term = searchTerm.toLowerCase().trim();
10688
10885
  return availableAncestries.filter((a) => {
10689
10886
  if (!term) return true;
@@ -10833,33 +11030,33 @@ function AncestryBoard({
10833
11030
  });
10834
11031
  };
10835
11032
  if (!isOpen) return null;
10836
- return /* @__PURE__ */ import_react25.default.createElement(
11033
+ return /* @__PURE__ */ import_react26.default.createElement(
10837
11034
  "div",
10838
11035
  {
10839
11036
  className: "fixed inset-0 z-[2200] bg-black/80 backdrop-blur-sm flex items-center justify-center p-2",
10840
11037
  onClick: onClose
10841
11038
  },
10842
- /* @__PURE__ */ import_react25.default.createElement(
11039
+ /* @__PURE__ */ import_react26.default.createElement(
10843
11040
  "div",
10844
11041
  {
10845
11042
  className: "bg-slate-950 border border-white/10 rounded-xl w-[98vw] h-[97vh] flex flex-col shadow-2xl overflow-hidden animate-in fade-in zoom-in-95 duration-200",
10846
11043
  onClick: (e) => e.stopPropagation()
10847
11044
  },
10848
- /* @__PURE__ */ import_react25.default.createElement("div", { className: "h-14 px-4 border-b border-white/10 bg-slate-900/90 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react25.default.createElement("h3", { className: "text-base font-semibold text-white flex items-center gap-2 whitespace-nowrap" }, /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiLayers, { className: "text-indigo-400" }), "Ancestry Board"), saveStatus !== "idle" && /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "w-px h-4 bg-white/10 mx-1" }), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-slate-900/50 border border-white/5" }, saveStatus === "saving" && /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, /* @__PURE__ */ import_react25.default.createElement(
10849
- import_fi19.FiLoader,
11045
+ /* @__PURE__ */ import_react26.default.createElement("div", { className: "h-14 px-4 border-b border-white/10 bg-slate-900/90 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react26.default.createElement("h3", { className: "text-base font-semibold text-white flex items-center gap-2 whitespace-nowrap" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { className: "text-indigo-400" }), "Ancestry Board"), saveStatus !== "idle" && /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "w-px h-4 bg-white/10 mx-1" }), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-slate-900/50 border border-white/5" }, saveStatus === "saving" && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(
11046
+ import_fi20.FiLoader,
10850
11047
  {
10851
11048
  className: "animate-spin text-indigo-400",
10852
11049
  size: 12
10853
11050
  }
10854
- ), /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-indigo-300" }, "Salvando")), saveStatus === "saved" && /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiCheckCircle, { className: "text-emerald-400", size: 12 }), /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-slate-400" }, "Salvo")), saveStatus === "error" && /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, /* @__PURE__ */ import_react25.default.createElement("span", { className: "w-2 h-2 rounded-full bg-red-500" }), /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-red-400" }, "Erro"))))), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-3" }, pickingGroupId && /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-xs text-indigo-300 font-medium animate-pulse hidden sm:inline-block mr-2" }, "Selecione na lateral..."), canEdit && /* @__PURE__ */ import_react25.default.createElement(
11051
+ ), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-indigo-300" }, "Salvando")), saveStatus === "saved" && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCheckCircle, { className: "text-emerald-400", size: 12 }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-slate-400" }, "Salvo")), saveStatus === "error" && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement("span", { className: "w-2 h-2 rounded-full bg-red-500" }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-red-400" }, "Erro"))))), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-3" }, pickingGroupId && /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-xs text-indigo-300 font-medium animate-pulse hidden sm:inline-block mr-2" }, "Selecione na lateral..."), canEdit && /* @__PURE__ */ import_react26.default.createElement(
10855
11052
  "button",
10856
11053
  {
10857
11054
  onClick: handleAddRootGroup,
10858
11055
  className: "\n flex items-center gap-2 px-3 py-1.5 \n bg-white/5 hover:bg-white/10 \n border border-white/10 hover:border-white/20\n backdrop-blur-sm\n text-slate-200 hover:text-white\n rounded-md transition-all duration-200\n text-xs font-medium shadow-sm\n "
10859
11056
  },
10860
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiPlus, { size: 14, className: "text-indigo-400" }),
10861
- /* @__PURE__ */ import_react25.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
10862
- ), /* @__PURE__ */ import_react25.default.createElement(
11057
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 14, className: "text-indigo-400" }),
11058
+ /* @__PURE__ */ import_react26.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
11059
+ ), /* @__PURE__ */ import_react26.default.createElement(
10863
11060
  "button",
10864
11061
  {
10865
11062
  onClick: onClose,
@@ -10867,7 +11064,7 @@ function AncestryBoard({
10867
11064
  },
10868
11065
  "\xD7"
10869
11066
  ))),
10870
- /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react25.default.createElement(
11067
+ /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react26.default.createElement(
10871
11068
  "div",
10872
11069
  {
10873
11070
  className: `
@@ -10876,12 +11073,12 @@ function AncestryBoard({
10876
11073
  min-w-[280px] max-w-[500px] bg-slate-900
10877
11074
  `
10878
11075
  },
10879
- /* @__PURE__ */ import_react25.default.createElement("div", { className: "p-3 border-b border-white/5 bg-slate-900/50" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "relative group" }, /* @__PURE__ */ import_react25.default.createElement(
10880
- import_fi19.FiSearch,
11076
+ /* @__PURE__ */ import_react26.default.createElement("div", { className: "p-3 border-b border-white/5 bg-slate-900/50" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "relative group" }, /* @__PURE__ */ import_react26.default.createElement(
11077
+ import_fi20.FiSearch,
10881
11078
  {
10882
11079
  className: `absolute left-3 top-1/2 -translate-y-1/2 transition-colors ${pickingGroupId ? "text-indigo-400" : "text-slate-500 group-focus-within:text-indigo-400"}`
10883
11080
  }
10884
- ), /* @__PURE__ */ import_react25.default.createElement(
11081
+ ), /* @__PURE__ */ import_react26.default.createElement(
10885
11082
  "input",
10886
11083
  {
10887
11084
  type: "text",
@@ -10895,10 +11092,10 @@ function AncestryBoard({
10895
11092
  autoFocus: !pickingGroupId
10896
11093
  }
10897
11094
  ))),
10898
- /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
11095
+ /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
10899
11096
  const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
10900
11097
  const isPicking = !!pickingGroupId;
10901
- return /* @__PURE__ */ import_react25.default.createElement(
11098
+ return /* @__PURE__ */ import_react26.default.createElement(
10902
11099
  "div",
10903
11100
  {
10904
11101
  key: anc.ancestry_id,
@@ -10910,7 +11107,7 @@ function AncestryBoard({
10910
11107
  ${isPicking ? "border-indigo-500/30 bg-indigo-500/5 hover:bg-indigo-500/20 hover:border-indigo-400 cursor-pointer" : "border-white/5 bg-slate-800/40 hover:bg-indigo-600/10 hover:border-indigo-500/30 cursor-default"}
10911
11108
  `
10912
11109
  },
10913
- /* @__PURE__ */ import_react25.default.createElement(
11110
+ /* @__PURE__ */ import_react26.default.createElement(
10914
11111
  "div",
10915
11112
  {
10916
11113
  className: `
@@ -10918,10 +11115,10 @@ function AncestryBoard({
10918
11115
  ${isPicking ? "bg-indigo-500 text-white border-indigo-400" : "bg-slate-800 text-indigo-400 border-white/5 group-hover:bg-indigo-500 group-hover:text-white"}
10919
11116
  `
10920
11117
  },
10921
- isPicking ? /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiPlus, { size: 16 }) : /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiLayers, { size: 14 })
11118
+ isPicking ? /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 16 }) : /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { size: 14 })
10922
11119
  ),
10923
- /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react25.default.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.name || "Sem Nome"), anc.is_private && /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-[9px] px-1 py-0.5 rounded bg-amber-500/10 text-amber-300 border border-amber-500/20" }, "Priv")), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-1.5 mt-0.5 text-[11px] text-slate-500 group-hover:text-indigo-200/70 transition-colors" }, /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react25.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.description && /* @__PURE__ */ import_react25.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.description)),
10924
- !isPicking && /* @__PURE__ */ import_react25.default.createElement(
11120
+ /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react26.default.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.name || "Sem Nome"), anc.is_private && /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[9px] px-1 py-0.5 rounded bg-amber-500/10 text-amber-300 border border-amber-500/20" }, "Priv")), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1.5 mt-0.5 text-[11px] text-slate-500 group-hover:text-indigo-200/70 transition-colors" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.description && /* @__PURE__ */ import_react26.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.description)),
11121
+ !isPicking && /* @__PURE__ */ import_react26.default.createElement(
10925
11122
  "button",
10926
11123
  {
10927
11124
  onClick: (e) => {
@@ -10931,11 +11128,11 @@ function AncestryBoard({
10931
11128
  className: "absolute right-2 bottom-2 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0 z-10",
10932
11129
  title: "Renderizar Ancestralidade"
10933
11130
  },
10934
- /* @__PURE__ */ import_react25.default.createElement("div", { className: "bg-indigo-500 text-white p-2 rounded-full shadow-lg hover:bg-indigo-400 hover:scale-110 transition-all" }, /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiPlay, { size: 14, className: "ml-0.5" }))
11131
+ /* @__PURE__ */ import_react26.default.createElement("div", { className: "bg-indigo-500 text-white p-2 rounded-full shadow-lg hover:bg-indigo-400 hover:scale-110 transition-all" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlay, { size: 14, className: "ml-0.5" }))
10935
11132
  )
10936
11133
  );
10937
11134
  }))
10938
- ), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react25.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react25.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react25.default.createElement(
11135
+ ), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react26.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react26.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react26.default.createElement(
10939
11136
  GroupItem,
10940
11137
  {
10941
11138
  key: group.id,
@@ -10955,7 +11152,7 @@ function AncestryBoard({
10955
11152
  canEdit
10956
11153
  }
10957
11154
  ))))),
10958
- /* @__PURE__ */ import_react25.default.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-between flex-shrink-0" }, /* @__PURE__ */ import_react25.default.createElement("span", null, filtered.length, " itens encontrados"), /* @__PURE__ */ import_react25.default.createElement("span", null, groups.length, " grupos raiz"))
11155
+ /* @__PURE__ */ import_react26.default.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-between flex-shrink-0" }, /* @__PURE__ */ import_react26.default.createElement("span", null, filtered.length, " itens encontrados"), /* @__PURE__ */ import_react26.default.createElement("span", null, groups.length, " grupos raiz"))
10959
11156
  )
10960
11157
  );
10961
11158
  }
@@ -11039,12 +11236,12 @@ function XViewScene({
11039
11236
  get_view_members
11040
11237
  }) {
11041
11238
  var _a, _b, _c, _d, _e, _f, _g, _h;
11042
- const { data: session, status } = (0, import_react27.useSession)();
11239
+ const { data: session, status } = (0, import_react28.useSession)();
11043
11240
  const router = (0, import_navigation.useRouter)();
11044
11241
  const searchParams = (0, import_navigation.useSearchParams)();
11045
11242
  const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
11046
11243
  const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
11047
- const viewParams = (0, import_react26.useMemo)(() => {
11244
+ const viewParams = (0, import_react27.useMemo)(() => {
11048
11245
  if (encryptedConfig) {
11049
11246
  const data = decryptData(encryptedConfig);
11050
11247
  if (data) {
@@ -11053,7 +11250,7 @@ function XViewScene({
11053
11250
  }
11054
11251
  return null;
11055
11252
  }, [encryptedConfig, session]);
11056
- (0, import_react26.useEffect)(() => {
11253
+ (0, import_react27.useEffect)(() => {
11057
11254
  async function verifyPermission() {
11058
11255
  if (!viewParams || !session || !check_user_permission) return;
11059
11256
  const { id, type, owner_id } = viewParams;
@@ -11090,65 +11287,65 @@ function XViewScene({
11090
11287
  setIsLoading(false);
11091
11288
  }
11092
11289
  }, [viewParams, session, status, check_user_permission]);
11093
- const sceneConfigId = (0, import_react26.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
11094
- const ownerId = (0, import_react26.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
11095
- const dbSaveUrl = (0, import_react26.useMemo)(() => {
11290
+ const sceneConfigId = (0, import_react27.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
11291
+ const ownerId = (0, import_react27.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
11292
+ const dbSaveUrl = (0, import_react27.useMemo)(() => {
11096
11293
  if (ownerId && sceneConfigId) {
11097
11294
  return `x_view_dbs/${ownerId}/${sceneConfigId}`;
11098
11295
  }
11099
11296
  return null;
11100
11297
  }, [ownerId, sceneConfigId]);
11101
- const sceneSaveUrl = (0, import_react26.useMemo)(() => {
11298
+ const sceneSaveUrl = (0, import_react27.useMemo)(() => {
11102
11299
  if (ownerId && sceneConfigId) {
11103
11300
  return `x_view_scenes/${ownerId}/${sceneConfigId}`;
11104
11301
  }
11105
11302
  return null;
11106
11303
  }, [ownerId, sceneConfigId]);
11107
- const ancestry_save_url = (0, import_react26.useMemo)(() => {
11304
+ const ancestry_save_url = (0, import_react27.useMemo)(() => {
11108
11305
  if (ownerId && sceneConfigId) {
11109
11306
  return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
11110
11307
  }
11111
11308
  return null;
11112
11309
  }, [ownerId, sceneConfigId]);
11113
- const sceneDataRef = (0, import_react26.useRef)(null);
11114
- const parentDataRef = (0, import_react26.useRef)(null);
11115
- const ancestryDataRef = (0, import_react26.useRef)(null);
11116
- const [isLoading, setIsLoading] = (0, import_react26.useState)(true);
11117
- const [permissionStatus, setPermissionStatus] = (0, import_react26.useState)("loading");
11118
- const [userPermissionRole, setUserPermissionRole] = (0, import_react26.useState)(null);
11119
- const [viewMembers, setViewMembers] = (0, import_react26.useState)([]);
11120
- const [isInitialized, setIsInitialized] = (0, import_react26.useState)(false);
11121
- const [sceneVersion, setSceneVersion] = (0, import_react26.useState)(0);
11122
- const [contextMenu, setContextMenu] = (0, import_react26.useState)({
11310
+ const sceneDataRef = (0, import_react27.useRef)(null);
11311
+ const parentDataRef = (0, import_react27.useRef)(null);
11312
+ const ancestryDataRef = (0, import_react27.useRef)(null);
11313
+ const [isLoading, setIsLoading] = (0, import_react27.useState)(true);
11314
+ const [permissionStatus, setPermissionStatus] = (0, import_react27.useState)("loading");
11315
+ const [userPermissionRole, setUserPermissionRole] = (0, import_react27.useState)(null);
11316
+ const [viewMembers, setViewMembers] = (0, import_react27.useState)([]);
11317
+ const [isInitialized, setIsInitialized] = (0, import_react27.useState)(false);
11318
+ const [sceneVersion, setSceneVersion] = (0, import_react27.useState)(0);
11319
+ const [contextMenu, setContextMenu] = (0, import_react27.useState)({
11123
11320
  visible: false,
11124
11321
  x: 0,
11125
11322
  y: 0,
11126
11323
  nodeData: null
11127
11324
  });
11128
- const [multiContextMenu, setMultiContextMenu] = (0, import_react26.useState)({
11325
+ const [multiContextMenu, setMultiContextMenu] = (0, import_react27.useState)({
11129
11326
  visible: false,
11130
11327
  x: 0,
11131
11328
  y: 0,
11132
11329
  nodeIds: null
11133
11330
  });
11134
- const [relationshipMenu, setRelationshipMenu] = (0, import_react26.useState)({
11331
+ const [relationshipMenu, setRelationshipMenu] = (0, import_react27.useState)({
11135
11332
  visible: false,
11136
11333
  x: 0,
11137
11334
  y: 0,
11138
11335
  linkObject: null
11139
11336
  });
11140
- const [creationMode, setCreationMode] = (0, import_react26.useState)({
11337
+ const [creationMode, setCreationMode] = (0, import_react27.useState)({
11141
11338
  isActive: false,
11142
11339
  sourceNodeData: null
11143
11340
  });
11144
- const [versionMode, setVersionMode] = (0, import_react26.useState)({
11341
+ const [versionMode, setVersionMode] = (0, import_react27.useState)({
11145
11342
  isActive: false,
11146
11343
  sourceNodeData: null
11147
11344
  });
11148
- const [questMode, setQuestMode] = (0, import_react26.useState)({ isActive: false });
11149
- const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react26.useState)(false);
11150
- const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react26.useState)(false);
11151
- const [ancestryMode, setAncestryMode] = (0, import_react26.useState)({
11345
+ const [questMode, setQuestMode] = (0, import_react27.useState)({ isActive: false });
11346
+ const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react27.useState)(false);
11347
+ const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react27.useState)(false);
11348
+ const [ancestryMode, setAncestryMode] = (0, import_react27.useState)({
11152
11349
  isActive: false,
11153
11350
  tree: null,
11154
11351
  selectedParentId: null,
@@ -11159,41 +11356,41 @@ function XViewScene({
11159
11356
  ancestryDescriptionSections: [],
11160
11357
  isAddingNodes: false
11161
11358
  });
11162
- const [readingMode, setReadingMode] = (0, import_react26.useState)({
11359
+ const [readingMode, setReadingMode] = (0, import_react27.useState)({
11163
11360
  isActive: false,
11164
11361
  ancestry: null,
11165
11362
  branchStack: [],
11166
11363
  autoAbstraction: false
11167
11364
  });
11168
- const [formPosition, setFormPosition] = (0, import_react26.useState)({
11365
+ const [formPosition, setFormPosition] = (0, import_react27.useState)({
11169
11366
  left: 16,
11170
11367
  top: 16,
11171
11368
  opacity: 0
11172
11369
  });
11173
- const [detailsNode, setDetailsNode] = (0, import_react26.useState)(null);
11174
- const [detailsLink, setDetailsLink] = (0, import_react26.useState)(null);
11175
- const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react26.useState)(null);
11176
- const [imageViewer, setImageViewer] = (0, import_react26.useState)({
11370
+ const [detailsNode, setDetailsNode] = (0, import_react27.useState)(null);
11371
+ const [detailsLink, setDetailsLink] = (0, import_react27.useState)(null);
11372
+ const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react27.useState)(null);
11373
+ const [imageViewer, setImageViewer] = (0, import_react27.useState)({
11177
11374
  visible: false,
11178
11375
  images: [],
11179
11376
  startIndex: 0
11180
11377
  });
11181
- const [editingAncestryRel, setEditingAncestryRel] = (0, import_react26.useState)({
11378
+ const [editingAncestryRel, setEditingAncestryRel] = (0, import_react27.useState)({
11182
11379
  visible: false,
11183
11380
  data: null,
11184
11381
  path: null
11185
11382
  });
11186
- const [isImportModalOpen, setIsImportModalOpen] = (0, import_react26.useState)(false);
11187
- const [importSuccessMessage, setImportSuccessMessage] = (0, import_react26.useState)("");
11188
- const [invalidTargetError, setInvalidTargetError] = (0, import_react26.useState)(null);
11189
- const [highlightedNodeId, setHighlightedNodeId] = (0, import_react26.useState)(null);
11190
- const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react26.useState)(false);
11191
- const [ancestryBoardData, setAncestryBoardData] = (0, import_react26.useState)([]);
11192
- const [isSidebarOpen, setIsSidebarOpen] = (0, import_react26.useState)(false);
11193
- const mountRef = (0, import_react26.useRef)(null);
11194
- const tooltipRef = (0, import_react26.useRef)(null);
11195
- const formRef = (0, import_react26.useRef)(null);
11196
- const stateRef = (0, import_react26.useRef)({
11383
+ const [isImportModalOpen, setIsImportModalOpen] = (0, import_react27.useState)(false);
11384
+ const [importSuccessMessage, setImportSuccessMessage] = (0, import_react27.useState)("");
11385
+ const [invalidTargetError, setInvalidTargetError] = (0, import_react27.useState)(null);
11386
+ const [highlightedNodeId, setHighlightedNodeId] = (0, import_react27.useState)(null);
11387
+ const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react27.useState)(false);
11388
+ const [ancestryBoardData, setAncestryBoardData] = (0, import_react27.useState)([]);
11389
+ const [isSidebarOpen, setIsSidebarOpen] = (0, import_react27.useState)(false);
11390
+ const mountRef = (0, import_react27.useRef)(null);
11391
+ const tooltipRef = (0, import_react27.useRef)(null);
11392
+ const formRef = (0, import_react27.useRef)(null);
11393
+ const stateRef = (0, import_react27.useRef)({
11197
11394
  readMode: {
11198
11395
  currentMaxIndex: 0,
11199
11396
  progressMap: {}
@@ -11257,10 +11454,10 @@ function XViewScene({
11257
11454
  minWidth: 320,
11258
11455
  maxWidth: maxReadPanelW
11259
11456
  });
11260
- (0, import_react26.useEffect)(() => {
11457
+ (0, import_react27.useEffect)(() => {
11261
11458
  stateRef.current.ancestry = ancestryMode;
11262
11459
  }, [ancestryMode]);
11263
- (0, import_react26.useEffect)(() => {
11460
+ (0, import_react27.useEffect)(() => {
11264
11461
  var _a2;
11265
11462
  if (!isInitialized) return;
11266
11463
  const map = /* @__PURE__ */ new Map();
@@ -11283,10 +11480,10 @@ function XViewScene({
11283
11480
  }
11284
11481
  stateRef.current.nodeIdToParentFileMap = map;
11285
11482
  }, [isInitialized, sceneVersion]);
11286
- const handleNavigateBack = (0, import_react26.useCallback)(() => {
11483
+ const handleNavigateBack = (0, import_react27.useCallback)(() => {
11287
11484
  router.push("/dashboard/scenes");
11288
11485
  }, [router]);
11289
- const handleConfirmImport = (0, import_react26.useCallback)(
11486
+ const handleConfirmImport = (0, import_react27.useCallback)(
11290
11487
  async (importPayload) => {
11291
11488
  var _a2, _b2;
11292
11489
  let files = [];
@@ -11414,7 +11611,7 @@ function XViewScene({
11414
11611
  const handleOpenImageViewer = (images, startIndex) => {
11415
11612
  setImageViewer({ visible: true, images, startIndex });
11416
11613
  };
11417
- const tweenToTarget = (0, import_react26.useCallback)(
11614
+ const tweenToTarget = (0, import_react27.useCallback)(
11418
11615
  (target, zoomFactor = 1, forcedDirection = null) => {
11419
11616
  const { camera, controls, tweenGroup } = stateRef.current;
11420
11617
  if (!camera || !controls || !tweenGroup) return;
@@ -11440,7 +11637,7 @@ function XViewScene({
11440
11637
  if (!t || typeof t.closest !== "function") return false;
11441
11638
  return !!t.closest(".ui-overlay");
11442
11639
  };
11443
- const buildFullAncestryTree = (0, import_react26.useCallback)(
11640
+ const buildFullAncestryTree = (0, import_react27.useCallback)(
11444
11641
  (idTree, nodes, ancestries = []) => {
11445
11642
  if (!idTree) return null;
11446
11643
  const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
@@ -11525,7 +11722,7 @@ function XViewScene({
11525
11722
  },
11526
11723
  []
11527
11724
  );
11528
- const handleActivateTimeline = (0, import_react26.useCallback)(() => {
11725
+ const handleActivateTimeline = (0, import_react27.useCallback)(() => {
11529
11726
  const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
11530
11727
  if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
11531
11728
  while (timelineIntervalsGroup.children.length > 0) {
@@ -11685,7 +11882,7 @@ function XViewScene({
11685
11882
  }
11686
11883
  });
11687
11884
  }, []);
11688
- const handleVersionTimeline = (0, import_react26.useCallback)((sourceMesh, versionMeshes) => {
11885
+ const handleVersionTimeline = (0, import_react27.useCallback)((sourceMesh, versionMeshes) => {
11689
11886
  const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
11690
11887
  if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
11691
11888
  return;
@@ -11822,7 +12019,7 @@ function XViewScene({
11822
12019
  }
11823
12020
  });
11824
12021
  }, []);
11825
- (0, import_react26.useEffect)(() => {
12022
+ (0, import_react27.useEffect)(() => {
11826
12023
  async function fetchAllData(configPath, ownerId2) {
11827
12024
  var _a2, _b2;
11828
12025
  if (!get_scene_view_data) {
@@ -11924,12 +12121,12 @@ function XViewScene({
11924
12121
  focusNodeId,
11925
12122
  focusAncestryId
11926
12123
  ]);
11927
- const isNodeInView = (0, import_react26.useCallback)((id) => {
12124
+ const isNodeInView = (0, import_react27.useCallback)((id) => {
11928
12125
  const key = String(id);
11929
12126
  const objs = stateRef.current.nodeObjects || {};
11930
12127
  return !!objs[key];
11931
12128
  }, []);
11932
- const addOrUpdateNodeMesh = (0, import_react26.useCallback)(
12129
+ const addOrUpdateNodeMesh = (0, import_react27.useCallback)(
11933
12130
  (nodeData, position, suppressVersionUpdate = false) => {
11934
12131
  const {
11935
12132
  graphGroup,
@@ -11969,7 +12166,7 @@ function XViewScene({
11969
12166
  },
11970
12167
  []
11971
12168
  );
11972
- (0, import_react26.useEffect)(() => {
12169
+ (0, import_react27.useEffect)(() => {
11973
12170
  if (!isInitialized || !sceneDataRef.current) return;
11974
12171
  const currentMount = mountRef.current;
11975
12172
  if (!currentMount) return;
@@ -12725,7 +12922,7 @@ function XViewScene({
12725
12922
  get_scene_view_data,
12726
12923
  save_view_data
12727
12924
  ]);
12728
- const handleGhostNodeImageChange = (0, import_react26.useCallback)((useImage, imageUrl) => {
12925
+ const handleGhostNodeImageChange = (0, import_react27.useCallback)((useImage, imageUrl) => {
12729
12926
  const {
12730
12927
  node: ghostNode,
12731
12928
  line: ghostLine,
@@ -12773,7 +12970,7 @@ function XViewScene({
12773
12970
  aura: newGhostNode.getObjectByName("aura")
12774
12971
  };
12775
12972
  }, []);
12776
- const handleGhostNodeIntensityChange = (0, import_react26.useCallback)((newIntensity) => {
12973
+ const handleGhostNodeIntensityChange = (0, import_react27.useCallback)((newIntensity) => {
12777
12974
  const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
12778
12975
  if (!ghostNode) return;
12779
12976
  const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
@@ -12794,7 +12991,7 @@ function XViewScene({
12794
12991
  ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
12795
12992
  }
12796
12993
  }, []);
12797
- const handleDetailNodeIntensityChange = (0, import_react26.useCallback)(
12994
+ const handleDetailNodeIntensityChange = (0, import_react27.useCallback)(
12798
12995
  (nodeId, newIntensity) => {
12799
12996
  const mesh = stateRef.current.nodeObjects[String(nodeId)];
12800
12997
  if (!mesh) return;
@@ -12950,7 +13147,7 @@ function XViewScene({
12950
13147
  mountRef.current.style.cursor = "default";
12951
13148
  }
12952
13149
  };
12953
- const handleAncestryTreeUpdate = (0, import_react26.useCallback)((newTree, extraData = null) => {
13150
+ const handleAncestryTreeUpdate = (0, import_react27.useCallback)((newTree, extraData = null) => {
12954
13151
  setAncestryMode((prev) => {
12955
13152
  const prevTreeStr = JSON.stringify(prev.tree);
12956
13153
  const newTreeStr = JSON.stringify(newTree);
@@ -12973,7 +13170,7 @@ function XViewScene({
12973
13170
  };
12974
13171
  });
12975
13172
  }, []);
12976
- const actionHandlerContext = (0, import_react26.useMemo)(
13173
+ const actionHandlerContext = (0, import_react27.useMemo)(
12977
13174
  () => {
12978
13175
  var _a2;
12979
13176
  return {
@@ -13034,20 +13231,115 @@ function XViewScene({
13034
13231
  const handleStartVersioning = (nodeData) => {
13035
13232
  userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
13036
13233
  };
13037
- const handleStartQuestQuick = (0, import_react26.useCallback)((questNode) => {
13038
- var _a2;
13234
+ const handleStartQuestQuick = (0, import_react27.useCallback)((questNode) => {
13235
+ var _a2, _b2, _c2;
13039
13236
  if (!questNode || !actionHandlerContext) return;
13237
+ const {
13238
+ labelObject,
13239
+ labelOffset,
13240
+ aura,
13241
+ borderRing,
13242
+ timelineIntervalBar,
13243
+ timelineEndLabel,
13244
+ ...cleanQuestNode
13245
+ } = questNode;
13246
+ const newTimeline = [...cleanQuestNode.timeline || [], {
13247
+ type: "status_changed",
13248
+ timestamp: Date.now(),
13249
+ actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
13250
+ description: `Quest iniciada ("In Progress") por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
13251
+ }];
13040
13252
  const updatedNode = {
13041
- ...questNode,
13253
+ ...cleanQuestNode,
13042
13254
  status: "In Progress",
13043
13255
  color: "#eab308",
13044
- assignee_id: (_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id
13256
+ assignee_id: (_c2 = session == null ? void 0 : session.user) == null ? void 0 : _c2.id,
13257
+ timeline: newTimeline
13045
13258
  };
13046
13259
  if (userActionHandlers.handleSaveNodeDetails) {
13047
13260
  userActionHandlers.handleSaveNodeDetails(actionHandlerContext, updatedNode);
13048
13261
  }
13049
13262
  }, [session, actionHandlerContext]);
13050
- const handleCancelQuest = (0, import_react26.useCallback)(() => {
13263
+ const handleFinishQuestQuick = (0, import_react27.useCallback)((questNode) => {
13264
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2;
13265
+ if (!questNode || !actionHandlerContext) return;
13266
+ const {
13267
+ labelObject,
13268
+ labelOffset,
13269
+ aura,
13270
+ borderRing,
13271
+ timelineIntervalBar,
13272
+ timelineEndLabel,
13273
+ ...cleanQuestNode
13274
+ } = questNode;
13275
+ let nextAssigneeId = cleanQuestNode.assignee_id;
13276
+ let nextStatus = "Done";
13277
+ let newTimeline = [...cleanQuestNode.timeline || []];
13278
+ const reviewStack = [...cleanQuestNode.reviewStack || []];
13279
+ const currentReviewerIdx = reviewStack.findIndex((r) => r.status !== "completed");
13280
+ let nextIdxToAssign = 0;
13281
+ if (currentReviewerIdx !== -1 && reviewStack[currentReviewerIdx].userId === cleanQuestNode.assignee_id) {
13282
+ reviewStack[currentReviewerIdx].status = "completed";
13283
+ nextIdxToAssign = currentReviewerIdx + 1;
13284
+ newTimeline.push({
13285
+ type: "review_completed",
13286
+ timestamp: Date.now(),
13287
+ actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || cleanQuestNode.assignee_id,
13288
+ description: `Review conclu\xEDda por ${((_b2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _b2.name) || "revisor"}.`
13289
+ });
13290
+ } else {
13291
+ nextIdxToAssign = currentReviewerIdx !== -1 ? currentReviewerIdx : reviewStack.length;
13292
+ newTimeline.push({
13293
+ type: "task_completed",
13294
+ timestamp: Date.now(),
13295
+ actorId: ((_c2 = session == null ? void 0 : session.user) == null ? void 0 : _c2.id) || cleanQuestNode.assignee_id,
13296
+ description: `Tarefa principal entregue por ${((_d2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _d2.name) || ((_e2 = session == null ? void 0 : session.user) == null ? void 0 : _e2.name) || "respons\xE1vel"}.`
13297
+ });
13298
+ }
13299
+ if (nextIdxToAssign < reviewStack.length) {
13300
+ const remainingMandatory = reviewStack.slice(nextIdxToAssign).some((r) => r.mandatory);
13301
+ const hasAnyMandatory = reviewStack.some((r) => r.mandatory);
13302
+ if (!hasAnyMandatory || remainingMandatory) {
13303
+ const nextReviewer = reviewStack[nextIdxToAssign];
13304
+ nextAssigneeId = nextReviewer.userId;
13305
+ nextStatus = "Review";
13306
+ newTimeline.push({
13307
+ type: "assignee_changed",
13308
+ timestamp: Date.now() + 1,
13309
+ actorId: ((_f2 = session == null ? void 0 : session.user) == null ? void 0 : _f2.id) || "system",
13310
+ to_assignee_id: nextAssigneeId,
13311
+ description: `Quest atribu\xEDda para revis\xE3o a ${((_g2 = viewMembers.find((m) => m.id === nextAssigneeId)) == null ? void 0 : _g2.name) || "revisor"}.`
13312
+ });
13313
+ } else {
13314
+ nextStatus = "Done";
13315
+ for (let i = nextIdxToAssign; i < reviewStack.length; i++) {
13316
+ reviewStack[i].status = "skipped";
13317
+ }
13318
+ }
13319
+ } else {
13320
+ nextStatus = "Done";
13321
+ }
13322
+ if (nextStatus === "Done") {
13323
+ newTimeline.push({
13324
+ type: "quest_finished",
13325
+ timestamp: Date.now() + 2,
13326
+ actorId: ((_h2 = session == null ? void 0 : session.user) == null ? void 0 : _h2.id) || "system",
13327
+ description: `Quest finalizada!`
13328
+ });
13329
+ }
13330
+ const updatedNode = {
13331
+ ...cleanQuestNode,
13332
+ status: nextStatus,
13333
+ color: nextStatus === "Done" ? "#22c55e" : "#a855f7",
13334
+ assignee_id: nextAssigneeId,
13335
+ reviewStack,
13336
+ timeline: newTimeline
13337
+ };
13338
+ if (userActionHandlers.handleSaveNodeDetails) {
13339
+ userActionHandlers.handleSaveNodeDetails(actionHandlerContext, updatedNode);
13340
+ }
13341
+ }, [session, actionHandlerContext, viewMembers]);
13342
+ const handleCancelQuest = (0, import_react27.useCallback)(() => {
13051
13343
  const { graphGroup, ghostElements } = stateRef.current;
13052
13344
  if (ghostElements.node && graphGroup) {
13053
13345
  if (ghostElements.node.userData.labelObject) {
@@ -13198,7 +13490,7 @@ function XViewScene({
13198
13490
  }
13199
13491
  userActionHandlers.handleCancelConnection(context);
13200
13492
  };
13201
- const handleClearAncestryVisuals = (0, import_react26.useCallback)((ancestryId) => {
13493
+ const handleClearAncestryVisuals = (0, import_react27.useCallback)((ancestryId) => {
13202
13494
  const { renderedAncestries, ancestryGroup } = stateRef.current;
13203
13495
  const renderIndex = renderedAncestries.findIndex(
13204
13496
  (a) => String(a.id) === String(ancestryId)
@@ -13216,7 +13508,7 @@ function XViewScene({
13216
13508
  );
13217
13509
  }
13218
13510
  }, []);
13219
- const handleRenderAncestry = (0, import_react26.useCallback)(
13511
+ const handleRenderAncestry = (0, import_react27.useCallback)(
13220
13512
  async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
13221
13513
  setContextMenu(
13222
13514
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -13710,7 +14002,7 @@ function XViewScene({
13710
14002
  ancestryMode.isActive
13711
14003
  ]
13712
14004
  );
13713
- const handleRenderAbstractionTree = (0, import_react26.useCallback)(
14005
+ const handleRenderAbstractionTree = (0, import_react27.useCallback)(
13714
14006
  (ancestryObject, targetNodeId = null) => {
13715
14007
  setContextMenu(
13716
14008
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -13798,7 +14090,7 @@ function XViewScene({
13798
14090
  handleClearAncestryVisuals
13799
14091
  ]
13800
14092
  );
13801
- const handleReadModeBranchNav = (0, import_react26.useCallback)(
14093
+ const handleReadModeBranchNav = (0, import_react27.useCallback)(
13802
14094
  (nodeId, action, direction = "right") => {
13803
14095
  const { ancestry, branchStack } = readingMode;
13804
14096
  if (!ancestry || !ancestry.tree) return;
@@ -13976,13 +14268,13 @@ function XViewScene({
13976
14268
  },
13977
14269
  [readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
13978
14270
  );
13979
- const handleReadModeHighlight = (0, import_react26.useCallback)((nodeId) => {
14271
+ const handleReadModeHighlight = (0, import_react27.useCallback)((nodeId) => {
13980
14272
  if (stateRef.current.highlightedNodeId !== nodeId) {
13981
14273
  stateRef.current.highlightedNodeId = nodeId;
13982
14274
  }
13983
14275
  setHighlightedNodeId(nodeId);
13984
14276
  }, []);
13985
- const activeNodeBranches = (0, import_react26.useMemo)(() => {
14277
+ const activeNodeBranches = (0, import_react27.useMemo)(() => {
13986
14278
  if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
13987
14279
  return null;
13988
14280
  const fullTree = buildFullAncestryTree(
@@ -14026,7 +14318,7 @@ function XViewScene({
14026
14318
  readingMode.branchStack,
14027
14319
  ancestryDataRef.current
14028
14320
  ]);
14029
- const backNavigationInfo = (0, import_react26.useMemo)(() => {
14321
+ const backNavigationInfo = (0, import_react27.useMemo)(() => {
14030
14322
  const { branchStack } = readingMode;
14031
14323
  if (!branchStack || branchStack.length === 0) return null;
14032
14324
  const lastStep = branchStack[branchStack.length - 1];
@@ -14037,7 +14329,7 @@ function XViewScene({
14037
14329
  name: "Voltar para anterior"
14038
14330
  };
14039
14331
  }, [readingMode.branchStack]);
14040
- const getReadModeDisplayContext = (0, import_react26.useMemo)(() => {
14332
+ const getReadModeDisplayContext = (0, import_react27.useMemo)(() => {
14041
14333
  const { ancestry, branchStack } = readingMode;
14042
14334
  if (!ancestry) return null;
14043
14335
  if (branchStack.length === 0) {
@@ -14080,7 +14372,7 @@ function XViewScene({
14080
14372
  customProperties: branchProps
14081
14373
  };
14082
14374
  }, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
14083
- const readModeAbstractionTree = (0, import_react26.useMemo)(() => {
14375
+ const readModeAbstractionTree = (0, import_react27.useMemo)(() => {
14084
14376
  if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
14085
14377
  return null;
14086
14378
  }
@@ -14099,7 +14391,7 @@ function XViewScene({
14099
14391
  buildFullAncestryTree,
14100
14392
  sceneVersion
14101
14393
  ]);
14102
- const handleStartReadingAncestry = (0, import_react26.useCallback)(
14394
+ const handleStartReadingAncestry = (0, import_react27.useCallback)(
14103
14395
  async (ancestryObject, renderMode = "full") => {
14104
14396
  setContextMenu(
14105
14397
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -14142,7 +14434,7 @@ function XViewScene({
14142
14434
  },
14143
14435
  [handleRenderAncestry, handleRenderAbstractionTree]
14144
14436
  );
14145
- const handleReadModeSectionChange = (0, import_react26.useCallback)(
14437
+ const handleReadModeSectionChange = (0, import_react27.useCallback)(
14146
14438
  (activeSectionId) => {
14147
14439
  const { ancestry, branchStack } = readingMode;
14148
14440
  if (!ancestry || !readingMode.isActive) return;
@@ -14227,10 +14519,10 @@ function XViewScene({
14227
14519
  ancestryDataRef.current
14228
14520
  ]
14229
14521
  );
14230
- const handleCloseReadMode = (0, import_react26.useCallback)(() => {
14522
+ const handleCloseReadMode = (0, import_react27.useCallback)(() => {
14231
14523
  setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
14232
14524
  }, []);
14233
- const handleAncestrySectionChange = (0, import_react26.useCallback)(
14525
+ const handleAncestrySectionChange = (0, import_react27.useCallback)(
14234
14526
  (activeSectionId, ancestryOverride = null, rotation = 0) => {
14235
14527
  var _a2, _b2;
14236
14528
  const currentMode = stateRef.current.ancestry;
@@ -14292,7 +14584,7 @@ function XViewScene({
14292
14584
  },
14293
14585
  [handleRenderAncestry]
14294
14586
  );
14295
- const handleEditAncestry = (0, import_react26.useCallback)(
14587
+ const handleEditAncestry = (0, import_react27.useCallback)(
14296
14588
  async (ancestryObject) => {
14297
14589
  setContextMenu(
14298
14590
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -14347,7 +14639,7 @@ function XViewScene({
14347
14639
  const handleSelectAncestryParent = (nodeId) => {
14348
14640
  setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
14349
14641
  };
14350
- const handleRemoveFromAncestry = (0, import_react26.useCallback)((pathToRemove) => {
14642
+ const handleRemoveFromAncestry = (0, import_react27.useCallback)((pathToRemove) => {
14351
14643
  if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
14352
14644
  console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
14353
14645
  return;
@@ -14372,7 +14664,7 @@ function XViewScene({
14372
14664
  return { ...prev, tree: newTree };
14373
14665
  });
14374
14666
  }, []);
14375
- const handleSaveAncestry = (0, import_react26.useCallback)(
14667
+ const handleSaveAncestry = (0, import_react27.useCallback)(
14376
14668
  async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
14377
14669
  const treeToUse = treeOverride || ancestryMode.tree;
14378
14670
  const { isEditMode, currentAncestryId } = ancestryMode;
@@ -14608,7 +14900,7 @@ function XViewScene({
14608
14900
  });
14609
14901
  setEditingAncestryRel({ visible: false, data: null, path: null });
14610
14902
  };
14611
- const handleDeleteAncestry = (0, import_react26.useCallback)(
14903
+ const handleDeleteAncestry = (0, import_react27.useCallback)(
14612
14904
  async (ancestryIdToDelete) => {
14613
14905
  if (!ancestryIdToDelete) {
14614
14906
  alert("ID da ancestralidade n\xE3o encontrado.");
@@ -14690,10 +14982,10 @@ function XViewScene({
14690
14982
  },
14691
14983
  [save_view_data, delete_file_action]
14692
14984
  );
14693
- const handleOpenAncestryBoard = (0, import_react26.useCallback)(() => {
14985
+ const handleOpenAncestryBoard = (0, import_react27.useCallback)(() => {
14694
14986
  setIsAncestryBoardOpen(true);
14695
14987
  }, []);
14696
- const handleSelectAncestryFromBoard = (0, import_react26.useCallback)(
14988
+ const handleSelectAncestryFromBoard = (0, import_react27.useCallback)(
14697
14989
  (ancestry) => {
14698
14990
  setIsAncestryBoardOpen(false);
14699
14991
  setIsSidebarOpen(false);
@@ -14701,7 +14993,7 @@ function XViewScene({
14701
14993
  },
14702
14994
  [handleStartReadingAncestry]
14703
14995
  );
14704
- const handleSaveAncestryBoard = (0, import_react26.useCallback)(
14996
+ const handleSaveAncestryBoard = (0, import_react27.useCallback)(
14705
14997
  async (groups) => {
14706
14998
  if (!sceneConfigId || !viewParams || !session) return;
14707
14999
  const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
@@ -14715,7 +15007,7 @@ function XViewScene({
14715
15007
  },
14716
15008
  [sceneConfigId, viewParams, session, save_ancestry_board_action, ownerId]
14717
15009
  );
14718
- const existingNodeTypes = (0, import_react26.useMemo)(() => {
15010
+ const existingNodeTypes = (0, import_react27.useMemo)(() => {
14719
15011
  if (!parentDataRef.current) {
14720
15012
  return [];
14721
15013
  }
@@ -14727,7 +15019,7 @@ function XViewScene({
14727
15019
  ).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
14728
15020
  return [...new Set(allTypes)];
14729
15021
  }, [parentDataRef.current, sceneVersion]);
14730
- const searchableDbNodes = (0, import_react26.useMemo)(() => {
15022
+ const searchableDbNodes = (0, import_react27.useMemo)(() => {
14731
15023
  if (!parentDataRef.current) {
14732
15024
  return [];
14733
15025
  }
@@ -14742,7 +15034,7 @@ function XViewScene({
14742
15034
  return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
14743
15035
  });
14744
15036
  }, [parentDataRef.current, sceneVersion]);
14745
- const handleAddExistingNode = (0, import_react26.useCallback)(
15037
+ const handleAddExistingNode = (0, import_react27.useCallback)(
14746
15038
  (nodeId) => {
14747
15039
  return userActionHandlers.handleAddExistingNodeById(
14748
15040
  actionHandlerContext,
@@ -14751,7 +15043,7 @@ function XViewScene({
14751
15043
  },
14752
15044
  [actionHandlerContext]
14753
15045
  );
14754
- const handleSaveCurrentView = (0, import_react26.useCallback)(async () => {
15046
+ const handleSaveCurrentView = (0, import_react27.useCallback)(async () => {
14755
15047
  var _a2, _b2, _c2;
14756
15048
  const { nodeObjects, allLinks } = stateRef.current;
14757
15049
  if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
@@ -14792,16 +15084,16 @@ function XViewScene({
14792
15084
  console.error("Erro na chamada de save_view_data:", error);
14793
15085
  }
14794
15086
  }, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
14795
- const allAvailableNodes = (0, import_react26.useMemo)(() => {
15087
+ const allAvailableNodes = (0, import_react27.useMemo)(() => {
14796
15088
  if (!parentDataRef.current) return [];
14797
15089
  return Object.values(parentDataRef.current).flatMap(
14798
15090
  (fileData) => fileData.nodes || []
14799
15091
  );
14800
15092
  }, [sceneVersion, isInitialized]);
14801
- const allAvailableAncestries = (0, import_react26.useMemo)(() => {
15093
+ const allAvailableAncestries = (0, import_react27.useMemo)(() => {
14802
15094
  return ancestryDataRef.current || [];
14803
15095
  }, [sceneVersion, isInitialized]);
14804
- const handleOpenReference = (0, import_react26.useCallback)(
15096
+ const handleOpenReference = (0, import_react27.useCallback)(
14805
15097
  (referenceData) => {
14806
15098
  const { type, id } = referenceData;
14807
15099
  if (type === "node") {
@@ -14840,13 +15132,13 @@ function XViewScene({
14840
15132
  tweenToTarget
14841
15133
  ]
14842
15134
  );
14843
- const handleToggleAncestryAddMode = (0, import_react26.useCallback)(() => {
15135
+ const handleToggleAncestryAddMode = (0, import_react27.useCallback)(() => {
14844
15136
  setAncestryMode((prev) => ({
14845
15137
  ...prev,
14846
15138
  isAddingNodes: !prev.isAddingNodes
14847
15139
  }));
14848
15140
  }, []);
14849
- const handleFocusNode = (0, import_react26.useCallback)(
15141
+ const handleFocusNode = (0, import_react27.useCallback)(
14850
15142
  (nodeData) => {
14851
15143
  if (!nodeData) return;
14852
15144
  const nodeMesh = stateRef.current.nodeObjects[String(nodeData.id)];
@@ -14856,7 +15148,7 @@ function XViewScene({
14856
15148
  },
14857
15149
  [tweenToTarget]
14858
15150
  );
14859
- const availableDatasets = (0, import_react26.useMemo)(() => {
15151
+ const availableDatasets = (0, import_react27.useMemo)(() => {
14860
15152
  if (!sceneDataRef.current || !parentDataRef.current) return [];
14861
15153
  return sceneDataRef.current.parent_dbs.map((db) => {
14862
15154
  var _a2;
@@ -14870,7 +15162,7 @@ function XViewScene({
14870
15162
  String(creationMode.sourceNodeData.id)
14871
15163
  )) == null ? void 0 : _b.parentFileId : null;
14872
15164
  const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
14873
- (0, import_react26.useEffect)(() => {
15165
+ (0, import_react27.useEffect)(() => {
14874
15166
  if (isInitialized && focusNodeId && !hasFocusedInitial) {
14875
15167
  const nodeObjects = stateRef.current.nodeObjects || {};
14876
15168
  const targetMesh = nodeObjects[String(focusNodeId)];
@@ -14893,7 +15185,7 @@ function XViewScene({
14893
15185
  hasFocusedInitial,
14894
15186
  tweenToTarget
14895
15187
  ]);
14896
- (0, import_react26.useEffect)(() => {
15188
+ (0, import_react27.useEffect)(() => {
14897
15189
  if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
14898
15190
  const ancestries = ancestryDataRef.current || [];
14899
15191
  const targetAncestry = ancestries.find(
@@ -14918,7 +15210,7 @@ function XViewScene({
14918
15210
  hasOpenedInitialAncestry,
14919
15211
  handleStartReadingAncestry
14920
15212
  ]);
14921
- (0, import_react26.useEffect)(() => {
15213
+ (0, import_react27.useEffect)(() => {
14922
15214
  function handleKeyDown(event) {
14923
15215
  var _a2, _b2, _c2;
14924
15216
  const context = actionHandlerContext;
@@ -15041,10 +15333,10 @@ function XViewScene({
15041
15333
  // <-- handleCancelQuest adicionado aqui
15042
15334
  ]);
15043
15335
  if (isLoading || status === "loading" || permissionStatus === "loading") {
15044
- return /* @__PURE__ */ import_react26.default.createElement(LoadingScreen, null);
15336
+ return /* @__PURE__ */ import_react27.default.createElement(LoadingScreen, null);
15045
15337
  }
15046
15338
  if (permissionStatus === "denied") {
15047
- return /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react26.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_react26.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react26.default.createElement(
15339
+ return /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react27.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_react27.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react27.default.createElement(
15048
15340
  "svg",
15049
15341
  {
15050
15342
  xmlns: "http://www.w3.org/2000/svg",
@@ -15054,7 +15346,7 @@ function XViewScene({
15054
15346
  stroke: "currentColor",
15055
15347
  className: "w-16 h-16 mx-auto"
15056
15348
  },
15057
- /* @__PURE__ */ import_react26.default.createElement(
15349
+ /* @__PURE__ */ import_react27.default.createElement(
15058
15350
  "path",
15059
15351
  {
15060
15352
  strokeLinecap: "round",
@@ -15062,13 +15354,13 @@ function XViewScene({
15062
15354
  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"
15063
15355
  }
15064
15356
  )
15065
- )), /* @__PURE__ */ import_react26.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react26.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_react26.default.createElement(
15357
+ )), /* @__PURE__ */ import_react27.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react27.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_react27.default.createElement(
15066
15358
  "button",
15067
15359
  {
15068
15360
  onClick: () => router.push("/dashboard/scenes"),
15069
15361
  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"
15070
15362
  },
15071
- /* @__PURE__ */ import_react26.default.createElement(
15363
+ /* @__PURE__ */ import_react27.default.createElement(
15072
15364
  "svg",
15073
15365
  {
15074
15366
  xmlns: "http://www.w3.org/2000/svg",
@@ -15078,7 +15370,7 @@ function XViewScene({
15078
15370
  stroke: "currentColor",
15079
15371
  className: "w-5 h-5"
15080
15372
  },
15081
- /* @__PURE__ */ import_react26.default.createElement(
15373
+ /* @__PURE__ */ import_react27.default.createElement(
15082
15374
  "path",
15083
15375
  {
15084
15376
  strokeLinecap: "round",
@@ -15090,7 +15382,7 @@ function XViewScene({
15090
15382
  "Voltar para Scenes"
15091
15383
  )));
15092
15384
  }
15093
- return /* @__PURE__ */ import_react26.default.createElement(
15385
+ return /* @__PURE__ */ import_react27.default.createElement(
15094
15386
  "div",
15095
15387
  {
15096
15388
  ref: mountRef,
@@ -15102,7 +15394,7 @@ function XViewScene({
15102
15394
  cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
15103
15395
  }
15104
15396
  },
15105
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react26.default.createElement(
15397
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react27.default.createElement(
15106
15398
  XViewSidebar,
15107
15399
  {
15108
15400
  dbNodes: searchableDbNodes,
@@ -15122,7 +15414,7 @@ function XViewScene({
15122
15414
  userRole: userPermissionRole
15123
15415
  }
15124
15416
  ),
15125
- creationMode.isActive && /* @__PURE__ */ import_react26.default.createElement(
15417
+ creationMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
15126
15418
  InSceneCreationForm,
15127
15419
  {
15128
15420
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -15154,7 +15446,7 @@ function XViewScene({
15154
15446
  availableAncestries: allAvailableAncestries
15155
15447
  }
15156
15448
  ),
15157
- versionMode.isActive && /* @__PURE__ */ import_react26.default.createElement(
15449
+ versionMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
15158
15450
  InSceneVersionForm,
15159
15451
  {
15160
15452
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -15180,7 +15472,7 @@ function XViewScene({
15180
15472
  availableAncestries: allAvailableAncestries
15181
15473
  }
15182
15474
  ),
15183
- questMode.isActive && /* @__PURE__ */ import_react26.default.createElement(
15475
+ questMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
15184
15476
  InSceneQuestForm,
15185
15477
  {
15186
15478
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -15206,7 +15498,7 @@ function XViewScene({
15206
15498
  viewMembers
15207
15499
  }
15208
15500
  ),
15209
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react26.default.createElement(
15501
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react27.default.createElement(
15210
15502
  "div",
15211
15503
  {
15212
15504
  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"}`,
@@ -15219,7 +15511,7 @@ function XViewScene({
15219
15511
  maxWidth: "92vw"
15220
15512
  }
15221
15513
  },
15222
- /* @__PURE__ */ import_react26.default.createElement(
15514
+ /* @__PURE__ */ import_react27.default.createElement(
15223
15515
  "div",
15224
15516
  {
15225
15517
  onPointerDown: (e) => {
@@ -15230,7 +15522,7 @@ function XViewScene({
15230
15522
  title: "Arraste para redimensionar"
15231
15523
  }
15232
15524
  ),
15233
- /* @__PURE__ */ import_react26.default.createElement(
15525
+ /* @__PURE__ */ import_react27.default.createElement(
15234
15526
  DescriptionReadModePanel,
15235
15527
  {
15236
15528
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -15265,7 +15557,7 @@ function XViewScene({
15265
15557
  }
15266
15558
  )
15267
15559
  ),
15268
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react26.default.createElement(
15560
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react27.default.createElement(
15269
15561
  CreateAncestryPanel,
15270
15562
  {
15271
15563
  ancestryMode,
@@ -15301,7 +15593,7 @@ function XViewScene({
15301
15593
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
15302
15594
  }
15303
15595
  ),
15304
- editingAncestryRel.visible && /* @__PURE__ */ import_react26.default.createElement(
15596
+ editingAncestryRel.visible && /* @__PURE__ */ import_react27.default.createElement(
15305
15597
  AncestryRelationshipPanel,
15306
15598
  {
15307
15599
  data: editingAncestryRel.data,
@@ -15315,7 +15607,7 @@ function XViewScene({
15315
15607
  onUploadFile: upload_file_action
15316
15608
  }
15317
15609
  ),
15318
- detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react26.default.createElement(
15610
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
15319
15611
  QuestDetailsPanel,
15320
15612
  {
15321
15613
  node: detailsNode,
@@ -15337,7 +15629,7 @@ function XViewScene({
15337
15629
  viewMembers
15338
15630
  }
15339
15631
  ),
15340
- detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react26.default.createElement(
15632
+ detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
15341
15633
  NodeDetailsPanel,
15342
15634
  {
15343
15635
  node: detailsNode,
@@ -15369,7 +15661,7 @@ function XViewScene({
15369
15661
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
15370
15662
  }
15371
15663
  ),
15372
- detailsLink && /* @__PURE__ */ import_react26.default.createElement(
15664
+ detailsLink && /* @__PURE__ */ import_react27.default.createElement(
15373
15665
  RelationshipDetailsPanel,
15374
15666
  {
15375
15667
  link: detailsLink,
@@ -15383,7 +15675,7 @@ function XViewScene({
15383
15675
  userRole: userPermissionRole
15384
15676
  }
15385
15677
  ),
15386
- ancestryLinkDetails && /* @__PURE__ */ import_react26.default.createElement(
15678
+ ancestryLinkDetails && /* @__PURE__ */ import_react27.default.createElement(
15387
15679
  AncestryLinkDetailsPanel,
15388
15680
  {
15389
15681
  data: ancestryLinkDetails,
@@ -15394,7 +15686,7 @@ function XViewScene({
15394
15686
  onUploadFile: upload_file_action
15395
15687
  }
15396
15688
  ),
15397
- /* @__PURE__ */ import_react26.default.createElement(
15689
+ /* @__PURE__ */ import_react27.default.createElement(
15398
15690
  "div",
15399
15691
  {
15400
15692
  ref: tooltipRef,
@@ -15421,7 +15713,7 @@ function XViewScene({
15421
15713
  }
15422
15714
  }
15423
15715
  ),
15424
- /* @__PURE__ */ import_react26.default.createElement(
15716
+ /* @__PURE__ */ import_react27.default.createElement(
15425
15717
  ContextMenu,
15426
15718
  {
15427
15719
  data: contextMenu,
@@ -15450,10 +15742,11 @@ function XViewScene({
15450
15742
  onFocusNode: handleFocusNode,
15451
15743
  viewMembers,
15452
15744
  currentUser: session == null ? void 0 : session.user,
15453
- onStartQuest: handleStartQuestQuick
15745
+ onStartQuest: handleStartQuestQuick,
15746
+ onFinishQuest: handleFinishQuestQuick
15454
15747
  }
15455
15748
  ),
15456
- /* @__PURE__ */ import_react26.default.createElement(
15749
+ /* @__PURE__ */ import_react27.default.createElement(
15457
15750
  MultiNodeContextMenu,
15458
15751
  {
15459
15752
  data: multiContextMenu,
@@ -15473,7 +15766,7 @@ function XViewScene({
15473
15766
  )
15474
15767
  }
15475
15768
  ),
15476
- /* @__PURE__ */ import_react26.default.createElement(
15769
+ /* @__PURE__ */ import_react27.default.createElement(
15477
15770
  RelationshipContextMenu,
15478
15771
  {
15479
15772
  data: relationshipMenu,
@@ -15491,14 +15784,14 @@ function XViewScene({
15491
15784
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
15492
15785
  }
15493
15786
  ),
15494
- /* @__PURE__ */ import_react26.default.createElement(
15787
+ /* @__PURE__ */ import_react27.default.createElement(
15495
15788
  ImageViewer,
15496
15789
  {
15497
15790
  data: imageViewer,
15498
15791
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
15499
15792
  }
15500
15793
  ),
15501
- /* @__PURE__ */ import_react26.default.createElement(
15794
+ /* @__PURE__ */ import_react27.default.createElement(
15502
15795
  AncestryBoard,
15503
15796
  {
15504
15797
  isOpen: isAncestryBoardOpen,
@@ -15511,7 +15804,7 @@ function XViewScene({
15511
15804
  userRole: userPermissionRole
15512
15805
  }
15513
15806
  ),
15514
- /* @__PURE__ */ import_react26.default.createElement(
15807
+ /* @__PURE__ */ import_react27.default.createElement(
15515
15808
  ImportParentFileModal,
15516
15809
  {
15517
15810
  isOpen: isImportModalOpen,
@@ -15524,7 +15817,7 @@ function XViewScene({
15524
15817
  currentAncestries: ancestryDataRef.current || []
15525
15818
  }
15526
15819
  ),
15527
- invalidTargetError && /* @__PURE__ */ import_react26.default.createElement(
15820
+ invalidTargetError && /* @__PURE__ */ import_react27.default.createElement(
15528
15821
  "div",
15529
15822
  {
15530
15823
  className: "ui-overlay",
@@ -15549,13 +15842,13 @@ function XViewScene({
15549
15842
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
15550
15843
  }
15551
15844
  },
15552
- /* @__PURE__ */ import_react26.default.createElement("style", null, `
15845
+ /* @__PURE__ */ import_react27.default.createElement("style", null, `
15553
15846
  @keyframes fadeInDown {
15554
15847
  from { opacity: 0; transform: translate(-50%, -20px); }
15555
15848
  to { opacity: 1; transform: translate(-50%, 0); }
15556
15849
  }
15557
15850
  `),
15558
- /* @__PURE__ */ import_react26.default.createElement(
15851
+ /* @__PURE__ */ import_react27.default.createElement(
15559
15852
  "svg",
15560
15853
  {
15561
15854
  width: "20",
@@ -15567,12 +15860,12 @@ function XViewScene({
15567
15860
  strokeLinecap: "round",
15568
15861
  strokeLinejoin: "round"
15569
15862
  },
15570
- /* @__PURE__ */ import_react26.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
15571
- /* @__PURE__ */ import_react26.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
15572
- /* @__PURE__ */ import_react26.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
15863
+ /* @__PURE__ */ import_react27.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
15864
+ /* @__PURE__ */ import_react27.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
15865
+ /* @__PURE__ */ import_react27.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
15573
15866
  ),
15574
- /* @__PURE__ */ import_react26.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
15575
- /* @__PURE__ */ import_react26.default.createElement(
15867
+ /* @__PURE__ */ import_react27.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
15868
+ /* @__PURE__ */ import_react27.default.createElement(
15576
15869
  "button",
15577
15870
  {
15578
15871
  onClick: () => setInvalidTargetError(null),