@lv-x-software-house/x_view 1.2.5-dev.21 → 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 +730 -454
  2. package/dist/index.mjs +630 -354
  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"))));
@@ -8374,8 +8388,116 @@ function InSceneVersionForm({
8374
8388
  }
8375
8389
 
8376
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
8377
8395
  var import_react16 = __toESM(require("react"));
8378
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
8379
8501
  var QUEST_STATUS_COLORS2 = {
8380
8502
  "Backlog": "#64748b",
8381
8503
  "In Progress": "#eab308",
@@ -8399,23 +8521,25 @@ function InSceneQuestForm({
8399
8521
  // NOVA PROP
8400
8522
  questCounter = 1,
8401
8523
  // NOVA PROP
8402
- viewMembers = []
8524
+ viewMembers = [],
8525
+ session = null
8403
8526
  }) {
8404
8527
  var _a, _b;
8405
- const [name, setName] = (0, import_react16.useState)("");
8406
- const [assigneeId, setAssigneeId] = (0, import_react16.useState)("");
8407
- const [types, setTypes] = (0, import_react16.useState)(["quest"]);
8408
- const [typeInput, setTypeInput] = (0, import_react16.useState)("");
8409
- const [status, setStatus] = (0, import_react16.useState)("Backlog");
8410
- const [size, setSize] = (0, import_react16.useState)("medium");
8411
- const [intensity, setIntensity] = (0, import_react16.useState)(0);
8412
- const [description, setDescription] = (0, import_react16.useState)("");
8413
- const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react16.useState)(false);
8414
- const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react16.useState)(false);
8415
- const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react16.useState)("");
8416
- const [customProps, setCustomProps] = (0, import_react16.useState)([]);
8417
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react16.useState)(false);
8418
- 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);
8419
8543
  const standardizedName = `${viewName} - ${questCounter} - \xBB ${name || "Nova Quest"}`;
8420
8544
  const handleAddProp = () => {
8421
8545
  const newProp = createNewCustomProperty(customProps);
@@ -8451,6 +8575,7 @@ function InSceneQuestForm({
8451
8575
  }
8452
8576
  };
8453
8577
  const handleSubmit = (e) => {
8578
+ var _a2, _b2, _c, _d;
8454
8579
  e.preventDefault();
8455
8580
  if (!name.trim()) {
8456
8581
  alert("O campo 'T\xEDtulo' \xE9 obrigat\xF3rio.");
@@ -8460,6 +8585,22 @@ function InSceneQuestForm({
8460
8585
  customProps.filter((prop) => prop.key.trim() && !prop.isEditing)
8461
8586
  );
8462
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
+ }
8463
8604
  onSave({
8464
8605
  name: standardizedName,
8465
8606
  // SALVA O NOME FORMATADO
@@ -8475,13 +8616,15 @@ function InSceneQuestForm({
8475
8616
  description_sections: processedSections,
8476
8617
  useImageAsTexture: false,
8477
8618
  textureImageUrl: null,
8619
+ reviewStack,
8620
+ timeline: initialTimeline,
8478
8621
  ...additionalData
8479
8622
  });
8480
8623
  };
8481
8624
  const swallow = (e) => e.stopPropagation();
8482
8625
  const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
8483
8626
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
8484
- 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(
8485
8628
  "div",
8486
8629
  {
8487
8630
  ref: refEl,
@@ -8493,8 +8636,8 @@ function InSceneQuestForm({
8493
8636
  onContextMenu: swallow,
8494
8637
  onDoubleClick: swallow
8495
8638
  },
8496
- /* @__PURE__ */ import_react16.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS2[status]}, transparent)` } }),
8497
- /* @__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(
8498
8641
  "button",
8499
8642
  {
8500
8643
  type: "button",
@@ -8504,7 +8647,7 @@ function InSceneQuestForm({
8504
8647
  },
8505
8648
  "\xD7"
8506
8649
  )),
8507
- /* @__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(
8508
8651
  "input",
8509
8652
  {
8510
8653
  required: true,
@@ -8518,16 +8661,16 @@ function InSceneQuestForm({
8518
8661
  },
8519
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"
8520
8663
  }
8521
- ), /* @__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(
8522
8665
  "button",
8523
8666
  {
8524
8667
  type: "button",
8525
8668
  onClick: () => setIsStatusDropdownOpen(!isStatusDropdownOpen),
8526
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"
8527
8670
  },
8528
- /* @__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)),
8529
- /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
8530
- ), 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(
8531
8674
  "li",
8532
8675
  {
8533
8676
  key: s,
@@ -8538,21 +8681,21 @@ function InSceneQuestForm({
8538
8681
  },
8539
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"}`
8540
8683
  },
8541
- /* @__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] } }),
8542
8685
  s
8543
- )))))), /* @__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(
8544
8687
  "button",
8545
8688
  {
8546
8689
  type: "button",
8547
8690
  onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
8548
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"
8549
8692
  },
8550
- /* @__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")),
8551
- /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
8552
- ), 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: () => {
8553
8696
  setIsAssigneeDropdownOpen(false);
8554
8697
  setAssigneeSearchQuery("");
8555
- } }), /* @__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(
8556
8699
  "input",
8557
8700
  {
8558
8701
  type: "text",
@@ -8563,7 +8706,7 @@ function InSceneQuestForm({
8563
8706
  className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
8564
8707
  onClick: (e) => e.stopPropagation()
8565
8708
  }
8566
- )), /* @__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(
8567
8710
  "li",
8568
8711
  {
8569
8712
  onClick: () => {
@@ -8577,7 +8720,7 @@ function InSceneQuestForm({
8577
8720
  ), viewMembers.filter((member) => {
8578
8721
  const search = assigneeSearchQuery.toLowerCase();
8579
8722
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
8580
- }).map((member) => /* @__PURE__ */ import_react16.default.createElement(
8723
+ }).map((member) => /* @__PURE__ */ import_react17.default.createElement(
8581
8724
  "li",
8582
8725
  {
8583
8726
  key: member.id,
@@ -8592,7 +8735,14 @@ function InSceneQuestForm({
8592
8735
  )), viewMembers.filter((member) => {
8593
8736
  const search = assigneeSearchQuery.toLowerCase();
8594
8737
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
8595
- }).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(
8596
8746
  "input",
8597
8747
  {
8598
8748
  type: "text",
@@ -8605,7 +8755,7 @@ function InSceneQuestForm({
8605
8755
  className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
8606
8756
  autoComplete: "off"
8607
8757
  }
8608
- ))), /* @__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(
8609
8759
  DescriptionDisplay,
8610
8760
  {
8611
8761
  description,
@@ -8615,7 +8765,7 @@ function InSceneQuestForm({
8615
8765
  onMentionClick,
8616
8766
  onSaveDescription: (newDesc) => setDescription(newDesc)
8617
8767
  }
8618
- ), /* @__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(
8619
8769
  "button",
8620
8770
  {
8621
8771
  key: s,
@@ -8626,9 +8776,9 @@ function InSceneQuestForm({
8626
8776
  },
8627
8777
  className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
8628
8778
  },
8629
- /* @__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" })),
8630
- /* @__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)
8631
- )))), /* @__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(
8632
8782
  CustomPropertyDisplay,
8633
8783
  {
8634
8784
  key: prop.id,
@@ -8639,8 +8789,8 @@ function InSceneQuestForm({
8639
8789
  unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
8640
8790
  onUploadFile
8641
8791
  }
8642
- )), /* @__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")))
8643
- ), 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(
8644
8794
  DescriptionEditModal,
8645
8795
  {
8646
8796
  isOpen: isDescriptionModalOpen,
@@ -8656,8 +8806,8 @@ function InSceneQuestForm({
8656
8806
  }
8657
8807
 
8658
8808
  // src/components/NodeDetailsPanel.jsx
8659
- var import_react17 = __toESM(require("react"));
8660
- var import_fi15 = require("react-icons/fi");
8809
+ var import_react18 = __toESM(require("react"));
8810
+ var import_fi16 = require("react-icons/fi");
8661
8811
  function NodeDetailsPanel({
8662
8812
  node,
8663
8813
  onClose,
@@ -8678,39 +8828,39 @@ function NodeDetailsPanel({
8678
8828
  userRole,
8679
8829
  currentDatasetName
8680
8830
  }) {
8681
- const [name, setName] = (0, import_react17.useState)((node == null ? void 0 : node.name) ?? "");
8682
- const [types, setTypes] = (0, import_react17.useState)([]);
8683
- const [typeInput, setTypeInput] = (0, import_react17.useState)("");
8684
- const [color, setColor] = (0, import_react17.useState)((node == null ? void 0 : node.color) ?? "#8b5cf6");
8685
- const [size, setSize] = (0, import_react17.useState)((node == null ? void 0 : node.size) ?? "medium");
8686
- const [description, setDescription] = (0, import_react17.useState)((node == null ? void 0 : node.description) ?? "");
8687
- const [intensity, setIntensity] = (0, import_react17.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
8688
- const [customProps, setCustomProps] = (0, import_react17.useState)(() => extractCustomPropsFromNode(node || {}));
8689
- const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react17.useState)(false);
8690
- const [filteredTypes, setFilteredTypes] = (0, import_react17.useState)([]);
8691
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react17.useState)(false);
8692
- const [isReadMode, setIsReadMode] = (0, import_react17.useState)(false);
8693
- const [existingSections, setExistingSections] = (0, import_react17.useState)((node == null ? void 0 : node.description_sections) || []);
8694
- const [isSaving, setIsSaving] = (0, import_react17.useState)(false);
8695
- const [isLinkCopied, setIsLinkCopied] = (0, import_react17.useState)(false);
8696
- 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)(() => {
8697
8847
  if ((node == null ? void 0 : node.useImageAsTexture) === "true") return true;
8698
8848
  if ((node == null ? void 0 : node.useImageAsTexture) === "false") return false;
8699
8849
  return !!(node == null ? void 0 : node.useImageAsTexture);
8700
8850
  });
8701
- const [selectedImageUrl, setSelectedImageUrl] = (0, import_react17.useState)((node == null ? void 0 : node.textureImageUrl) ?? null);
8702
- 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);
8703
8853
  const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
8704
8854
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
8705
8855
  initialWidth: isReadMode ? 700 : 440,
8706
8856
  minWidth: 320,
8707
8857
  maxWidth: maxPanelW
8708
8858
  });
8709
- (0, import_react17.useEffect)(() => {
8859
+ (0, import_react18.useEffect)(() => {
8710
8860
  setWidth(isReadMode ? 700 : 440);
8711
8861
  }, [isReadMode, setWidth]);
8712
- const prevNodeIdRef = (0, import_react17.useRef)(null);
8713
- const propsEndRef = (0, import_react17.useRef)(null);
8862
+ const prevNodeIdRef = (0, import_react18.useRef)(null);
8863
+ const propsEndRef = (0, import_react18.useRef)(null);
8714
8864
  const canEdit = userRole !== "viewer";
8715
8865
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
8716
8866
  const handleImageClickFromText = (url, name2) => {
@@ -8718,7 +8868,7 @@ function NodeDetailsPanel({
8718
8868
  onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
8719
8869
  }
8720
8870
  };
8721
- (0, import_react17.useEffect)(() => {
8871
+ (0, import_react18.useEffect)(() => {
8722
8872
  if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
8723
8873
  prevNodeIdRef.current = node == null ? void 0 : node.id;
8724
8874
  setName((node == null ? void 0 : node.name) ?? "");
@@ -8741,13 +8891,13 @@ function NodeDetailsPanel({
8741
8891
  }
8742
8892
  }, [node]);
8743
8893
  const hasImages = customProps.some((p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value));
8744
- (0, import_react17.useEffect)(() => {
8894
+ (0, import_react18.useEffect)(() => {
8745
8895
  if (!hasImages && useImageAsTexture) {
8746
8896
  setUseImageAsTexture(false);
8747
8897
  setSelectedImageUrl(null);
8748
8898
  }
8749
8899
  }, [hasImages, useImageAsTexture]);
8750
- (0, import_react17.useEffect)(() => {
8900
+ (0, import_react18.useEffect)(() => {
8751
8901
  const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
8752
8902
  if (typeInput.trim() === "") {
8753
8903
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
@@ -8942,7 +9092,7 @@ function NodeDetailsPanel({
8942
9092
  onClose();
8943
9093
  };
8944
9094
  const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
8945
- 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(
8946
9096
  "div",
8947
9097
  {
8948
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"}`,
@@ -8955,7 +9105,7 @@ function NodeDetailsPanel({
8955
9105
  onContextMenu: swallow,
8956
9106
  onDoubleClick: swallow
8957
9107
  },
8958
- /* @__PURE__ */ import_react17.default.createElement(
9108
+ /* @__PURE__ */ import_react18.default.createElement(
8959
9109
  "div",
8960
9110
  {
8961
9111
  onPointerDown: (e) => {
@@ -8966,7 +9116,7 @@ function NodeDetailsPanel({
8966
9116
  title: "Arraste para redimensionar"
8967
9117
  }
8968
9118
  ),
8969
- isReadMode ? /* @__PURE__ */ import_react17.default.createElement(
9119
+ isReadMode ? /* @__PURE__ */ import_react18.default.createElement(
8970
9120
  DescriptionReadModePanel,
8971
9121
  {
8972
9122
  title: name || (node == null ? void 0 : node.name),
@@ -8987,23 +9137,23 @@ function NodeDetailsPanel({
8987
9137
  onImageClick: handleImageClickFromText,
8988
9138
  onSaveDescription: handleSaveDescriptionInline
8989
9139
  }
8990
- ) : /* @__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(
8991
9141
  "button",
8992
9142
  {
8993
9143
  onClick: handleCopyLink,
8994
9144
  className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-indigo-400"}`,
8995
9145
  title: isLinkCopied ? "Link Copiado!" : "Copiar link para este Node"
8996
9146
  },
8997
- isLinkCopied ? /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiCheck, { size: 12 }) : /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiLink, { size: 12 })
8998
- )), /* @__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(
8999
9149
  "button",
9000
9150
  {
9001
9151
  type: "button",
9002
9152
  onClick: () => handleRemoveType(index),
9003
9153
  className: "hover:text-white transition-colors"
9004
9154
  },
9005
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiX, { size: 12 })
9006
- ))), canEdit && /* @__PURE__ */ import_react17.default.createElement(
9155
+ /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiX, { size: 12 })
9156
+ ))), canEdit && /* @__PURE__ */ import_react18.default.createElement(
9007
9157
  "input",
9008
9158
  {
9009
9159
  type: "text",
@@ -9024,7 +9174,7 @@ function NodeDetailsPanel({
9024
9174
  placeholder: types.length === 0 ? "Ex.: Cliente" : "",
9025
9175
  autoComplete: "off"
9026
9176
  }
9027
- ), 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(
9028
9178
  "li",
9029
9179
  {
9030
9180
  key: index,
@@ -9035,7 +9185,7 @@ function NodeDetailsPanel({
9035
9185
  }
9036
9186
  },
9037
9187
  suggestedType
9038
- ))))), /* @__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(
9039
9189
  "input",
9040
9190
  {
9041
9191
  type: "text",
@@ -9044,7 +9194,7 @@ function NodeDetailsPanel({
9044
9194
  readOnly: !canEdit,
9045
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"}`
9046
9196
  }
9047
- )), /* @__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(
9048
9198
  DescriptionDisplay,
9049
9199
  {
9050
9200
  description,
@@ -9056,7 +9206,7 @@ function NodeDetailsPanel({
9056
9206
  onImageClick: handleImageClickFromText,
9057
9207
  onSaveDescription: handleSaveDescriptionInline
9058
9208
  }
9059
- ), /* @__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(
9060
9210
  "button",
9061
9211
  {
9062
9212
  type: "button",
@@ -9064,8 +9214,8 @@ function NodeDetailsPanel({
9064
9214
  className: `p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors ${canEdit ? "border-r border-white/5" : ""}`,
9065
9215
  title: "Modo de Leitura"
9066
9216
  },
9067
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiBookOpen, { size: 14 })
9068
- ), canEdit && /* @__PURE__ */ import_react17.default.createElement(
9217
+ /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiBookOpen, { size: 14 })
9218
+ ), canEdit && /* @__PURE__ */ import_react18.default.createElement(
9069
9219
  "button",
9070
9220
  {
9071
9221
  type: "button",
@@ -9073,17 +9223,17 @@ function NodeDetailsPanel({
9073
9223
  className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
9074
9224
  title: "Editar descri\xE7\xE3o (Modo de Escrita)"
9075
9225
  },
9076
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiEdit2, { size: 14 })
9077
- )), 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(
9078
9228
  "div",
9079
9229
  {
9080
9230
  onClick: () => setIsDescriptionModalOpen(true),
9081
9231
  className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
9082
9232
  },
9083
9233
  "Adicionar descri\xE7\xE3o..."
9084
- ))), /* @__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) => {
9085
9235
  const isSelected = size === s;
9086
- return /* @__PURE__ */ import_react17.default.createElement(
9236
+ return /* @__PURE__ */ import_react18.default.createElement(
9087
9237
  "button",
9088
9238
  {
9089
9239
  key: s,
@@ -9091,10 +9241,10 @@ function NodeDetailsPanel({
9091
9241
  onClick: () => canEdit && handleSizeChange(s),
9092
9242
  className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}`
9093
9243
  },
9094
- /* @__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" })),
9095
- /* @__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)
9096
9246
  );
9097
- }))), /* @__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(
9098
9248
  "input",
9099
9249
  {
9100
9250
  type: "checkbox",
@@ -9102,14 +9252,14 @@ function NodeDetailsPanel({
9102
9252
  onChange: handleToggleImageMode,
9103
9253
  className: "hidden"
9104
9254
  }
9105
- ), /* @__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(
9106
9256
  ColorPicker,
9107
9257
  {
9108
9258
  color,
9109
9259
  onChange: handleColorChange,
9110
9260
  disabled: !canEdit || useImageAsTexture
9111
9261
  }
9112
- ), /* @__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(
9113
9263
  "input",
9114
9264
  {
9115
9265
  type: "range",
@@ -9122,7 +9272,7 @@ function NodeDetailsPanel({
9122
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"}`,
9123
9273
  title: `Intensidade do brilho: ${intensity}`
9124
9274
  }
9125
- ), /* @__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(
9126
9276
  CustomPropertyDisplay,
9127
9277
  {
9128
9278
  key: prop.id,
@@ -9137,7 +9287,7 @@ function NodeDetailsPanel({
9137
9287
  onUploadFile: canEdit ? onUploadFile : void 0,
9138
9288
  readOnly: !canEdit
9139
9289
  }
9140
- )), /* @__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(
9141
9291
  "button",
9142
9292
  {
9143
9293
  onClick: () => handleSave(false),
@@ -9146,10 +9296,10 @@ function NodeDetailsPanel({
9146
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"}
9147
9297
  `
9148
9298
  },
9149
- 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" }),
9150
9300
  isSaving ? "Salvando..." : "Salvar"
9151
9301
  )))
9152
- ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react17.default.createElement(
9302
+ ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react18.default.createElement(
9153
9303
  DescriptionEditModal,
9154
9304
  {
9155
9305
  isOpen: isDescriptionModalOpen,
@@ -9170,8 +9320,8 @@ function NodeDetailsPanel({
9170
9320
  }
9171
9321
 
9172
9322
  // src/components/QuestDetailsPanel.jsx
9173
- var import_react18 = __toESM(require("react"));
9174
- var import_fi16 = require("react-icons/fi");
9323
+ var import_react19 = __toESM(require("react"));
9324
+ var import_fi17 = require("react-icons/fi");
9175
9325
  var QUEST_STATUS_COLORS3 = {
9176
9326
  "Backlog": "#64748b",
9177
9327
  "In Progress": "#eab308",
@@ -9199,40 +9349,42 @@ function QuestDetailsPanel({
9199
9349
  }) {
9200
9350
  var _a;
9201
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) || "";
9202
- const [rawTitle, setRawTitle] = (0, import_react18.useState)(initialRawTitle);
9352
+ const [rawTitle, setRawTitle] = (0, import_react19.useState)(initialRawTitle);
9203
9353
  const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
9204
9354
  const questPrefix = prefixParts.length > 1 ? prefixParts[0] : "";
9205
9355
  const standardizedName = questPrefix ? `${questPrefix} - \xBB ${rawTitle || "Sem t\xEDtulo"}` : rawTitle;
9206
- const [types, setTypes] = (0, import_react18.useState)((node == null ? void 0 : node.type) ? Array.isArray(node.type) ? node.type : [node.type] : ["quest"]);
9207
- const [typeInput, setTypeInput] = (0, import_react18.useState)("");
9208
- const [status, setStatus] = (0, import_react18.useState)((node == null ? void 0 : node.status) ?? "Backlog");
9209
- const [size, setSize] = (0, import_react18.useState)((node == null ? void 0 : node.size) ?? "medium");
9210
- const [assigneeId, setAssigneeId] = (0, import_react18.useState)((node == null ? void 0 : node.assignee_id) || "");
9211
- const [description, setDescription] = (0, import_react18.useState)((node == null ? void 0 : node.description) ?? "");
9212
- const [intensity, setIntensity] = (0, import_react18.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9213
- const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react18.useState)(false);
9214
- const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react18.useState)(false);
9215
- const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react18.useState)("");
9216
- const [customProps, setCustomProps] = (0, import_react18.useState)(() => extractCustomPropsFromNode(node || {}));
9217
- const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react18.useState)(false);
9218
- const [filteredTypes, setFilteredTypes] = (0, import_react18.useState)([]);
9219
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react18.useState)(false);
9220
- const [isReadMode, setIsReadMode] = (0, import_react18.useState)(false);
9221
- const [existingSections, setExistingSections] = (0, import_react18.useState)((node == null ? void 0 : node.description_sections) || []);
9222
- const [isSaving, setIsSaving] = (0, import_react18.useState)(false);
9223
- const [isLinkCopied, setIsLinkCopied] = (0, import_react18.useState)(false);
9224
- 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);
9225
9377
  const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
9226
9378
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
9227
9379
  initialWidth: isReadMode ? 700 : 440,
9228
9380
  minWidth: 320,
9229
9381
  maxWidth: maxPanelW
9230
9382
  });
9231
- (0, import_react18.useEffect)(() => {
9383
+ (0, import_react19.useEffect)(() => {
9232
9384
  setWidth(isReadMode ? 700 : 440);
9233
9385
  }, [isReadMode, setWidth]);
9234
- const prevNodeIdRef = (0, import_react18.useRef)(null);
9235
- const propsEndRef = (0, import_react18.useRef)(null);
9386
+ const prevNodeIdRef = (0, import_react19.useRef)(null);
9387
+ const propsEndRef = (0, import_react19.useRef)(null);
9236
9388
  const canEdit = userRole !== "viewer";
9237
9389
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
9238
9390
  const handleImageClickFromText = (url, name) => {
@@ -9240,7 +9392,7 @@ function QuestDetailsPanel({
9240
9392
  onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
9241
9393
  }
9242
9394
  };
9243
- (0, import_react18.useEffect)(() => {
9395
+ (0, import_react19.useEffect)(() => {
9244
9396
  var _a2;
9245
9397
  if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
9246
9398
  prevNodeIdRef.current = node == null ? void 0 : node.id;
@@ -9254,10 +9406,12 @@ function QuestDetailsPanel({
9254
9406
  setIntensity((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9255
9407
  setExistingSections((node == null ? void 0 : node.description_sections) || []);
9256
9408
  setCustomProps(extractCustomPropsFromNode(node || {}));
9409
+ setReviewStack((node == null ? void 0 : node.reviewStack) || []);
9410
+ setTimeline((node == null ? void 0 : node.timeline) || []);
9257
9411
  setHasUnsavedChanges(false);
9258
9412
  }
9259
9413
  }, [node]);
9260
- (0, import_react18.useEffect)(() => {
9414
+ (0, import_react19.useEffect)(() => {
9261
9415
  const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
9262
9416
  if (typeInput.trim() === "") {
9263
9417
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
@@ -9369,6 +9523,8 @@ function QuestDetailsPanel({
9369
9523
  const currentAssigneeId = overrides.assigneeId !== void 0 ? overrides.assigneeId : assigneeId;
9370
9524
  const currentDescription = overrides.description !== void 0 ? overrides.description : description;
9371
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;
9372
9528
  const currentExistingSections = overrides.existingSections !== void 0 ? overrides.existingSections : existingSections;
9373
9529
  const currentStatus = overrides.status !== void 0 ? overrides.status : status;
9374
9530
  if (!keepOpen && !hasUnsavedChanges) {
@@ -9400,6 +9556,8 @@ function QuestDetailsPanel({
9400
9556
  textureImageUrl: null,
9401
9557
  intensity,
9402
9558
  is_quest: true,
9559
+ reviewStack: currentReviewStack,
9560
+ timeline: currentTimeline,
9403
9561
  ...extrasObj,
9404
9562
  version_node: node.version_node
9405
9563
  };
@@ -9427,7 +9585,7 @@ function QuestDetailsPanel({
9427
9585
  const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
9428
9586
  const assigneeMember = viewMembers.find((m) => m.id === assigneeId);
9429
9587
  const isAssigneeUndefined = assigneeId && !assigneeMember;
9430
- 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(
9431
9589
  "div",
9432
9590
  {
9433
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"}`,
@@ -9440,11 +9598,11 @@ function QuestDetailsPanel({
9440
9598
  onContextMenu: swallow,
9441
9599
  onDoubleClick: swallow
9442
9600
  },
9443
- /* @__PURE__ */ import_react18.default.createElement("div", { onPointerDown: (e) => {
9601
+ /* @__PURE__ */ import_react19.default.createElement("div", { onPointerDown: (e) => {
9444
9602
  e.stopPropagation();
9445
9603
  handleResize(e);
9446
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" }),
9447
- isReadMode ? /* @__PURE__ */ import_react18.default.createElement(
9605
+ isReadMode ? /* @__PURE__ */ import_react19.default.createElement(
9448
9606
  DescriptionReadModePanel,
9449
9607
  {
9450
9608
  title: standardizedName || (node == null ? void 0 : node.name),
@@ -9465,7 +9623,7 @@ function QuestDetailsPanel({
9465
9623
  onImageClick: handleImageClickFromText,
9466
9624
  onSaveDescription: handleSaveDescriptionInline
9467
9625
  }
9468
- ) : /* @__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(
9469
9627
  "input",
9470
9628
  {
9471
9629
  type: "text",
@@ -9474,7 +9632,7 @@ function QuestDetailsPanel({
9474
9632
  readOnly: !canEdit,
9475
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"}`
9476
9634
  }
9477
- ), /* @__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(
9478
9636
  "button",
9479
9637
  {
9480
9638
  type: "button",
@@ -9482,9 +9640,9 @@ function QuestDetailsPanel({
9482
9640
  disabled: !canEdit,
9483
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"}`
9484
9642
  },
9485
- /* @__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)),
9486
- canEdit && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
9487
- ), 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(
9488
9646
  "li",
9489
9647
  {
9490
9648
  key: s,
@@ -9494,21 +9652,21 @@ function QuestDetailsPanel({
9494
9652
  },
9495
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"}`
9496
9654
  },
9497
- /* @__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] } }),
9498
9656
  s
9499
- )))))), /* @__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(
9500
9658
  "button",
9501
9659
  {
9502
9660
  type: "button",
9503
9661
  onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
9504
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"
9505
9663
  },
9506
- /* @__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")),
9507
- /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
9508
- ), 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: () => {
9509
9667
  setIsAssigneeDropdownOpen(false);
9510
9668
  setAssigneeSearchQuery("");
9511
- } }), /* @__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(
9512
9670
  "input",
9513
9671
  {
9514
9672
  type: "text",
@@ -9519,11 +9677,19 @@ function QuestDetailsPanel({
9519
9677
  className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
9520
9678
  onClick: (e) => e.stopPropagation()
9521
9679
  }
9522
- )), /* @__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(
9523
9681
  "li",
9524
9682
  {
9525
9683
  onClick: () => {
9526
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);
9527
9693
  setHasUnsavedChanges(true);
9528
9694
  setIsAssigneeDropdownOpen(false);
9529
9695
  setAssigneeSearchQuery("");
@@ -9531,7 +9697,7 @@ function QuestDetailsPanel({
9531
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"}`
9532
9698
  },
9533
9699
  "Nenhum"
9534
- ), isAssigneeUndefined && /* @__PURE__ */ import_react18.default.createElement(
9700
+ ), isAssigneeUndefined && /* @__PURE__ */ import_react19.default.createElement(
9535
9701
  "li",
9536
9702
  {
9537
9703
  onClick: () => {
@@ -9544,12 +9710,20 @@ function QuestDetailsPanel({
9544
9710
  ), viewMembers.filter((member) => {
9545
9711
  const search = assigneeSearchQuery.toLowerCase();
9546
9712
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
9547
- }).map((member) => /* @__PURE__ */ import_react18.default.createElement(
9713
+ }).map((member) => /* @__PURE__ */ import_react19.default.createElement(
9548
9714
  "li",
9549
9715
  {
9550
9716
  key: member.id,
9551
9717
  onClick: () => {
9552
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);
9553
9727
  setHasUnsavedChanges(true);
9554
9728
  setIsAssigneeDropdownOpen(false);
9555
9729
  setAssigneeSearchQuery("");
@@ -9560,7 +9734,18 @@ function QuestDetailsPanel({
9560
9734
  )), viewMembers.filter((member) => {
9561
9735
  const search = assigneeSearchQuery.toLowerCase();
9562
9736
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
9563
- }).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(
9564
9749
  "input",
9565
9750
  {
9566
9751
  type: "text",
@@ -9581,14 +9766,18 @@ function QuestDetailsPanel({
9581
9766
  placeholder: "",
9582
9767
  autoComplete: "off"
9583
9768
  }
9584
- ), 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) => {
9585
9770
  e.preventDefault();
9586
9771
  handleAddType(suggestedType);
9587
- } }, 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) => {
9588
9773
  const isSelected = size === s;
9589
- 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));
9590
- }))), /* @__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")))
9591
- ), 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(
9592
9781
  DescriptionEditModal,
9593
9782
  {
9594
9783
  isOpen: isDescriptionModalOpen,
@@ -9608,7 +9797,7 @@ function QuestDetailsPanel({
9608
9797
  }
9609
9798
 
9610
9799
  // src/components/MultiNodeContextMenu.jsx
9611
- var import_react19 = __toESM(require("react"));
9800
+ var import_react20 = __toESM(require("react"));
9612
9801
  function MultiNodeContextMenu({
9613
9802
  data,
9614
9803
  userRole,
@@ -9617,12 +9806,12 @@ function MultiNodeContextMenu({
9617
9806
  onDismissOtherNodes,
9618
9807
  onDeleteNodes
9619
9808
  }) {
9620
- const menuRef = (0, import_react19.useRef)(null);
9621
- const [menuPos, setMenuPos] = (0, import_react19.useState)({ left: 0, top: 0 });
9622
- 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);
9623
9812
  const ability = defineAbilityFor(userRole);
9624
9813
  const canDelete = ability.can("delete", "Node");
9625
- (0, import_react19.useLayoutEffect)(() => {
9814
+ (0, import_react20.useLayoutEffect)(() => {
9626
9815
  if (!data.visible || !menuRef.current) return;
9627
9816
  const el = menuRef.current;
9628
9817
  const w = el.clientWidth;
@@ -9635,7 +9824,7 @@ function MultiNodeContextMenu({
9635
9824
  if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
9636
9825
  setMenuPos({ left, top });
9637
9826
  }, [data]);
9638
- (0, import_react19.useEffect)(() => {
9827
+ (0, import_react20.useEffect)(() => {
9639
9828
  if (data.visible) {
9640
9829
  setIsConfirmingDelete(false);
9641
9830
  }
@@ -9650,7 +9839,7 @@ function MultiNodeContextMenu({
9650
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";
9651
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";
9652
9841
  const nodeCount = data.nodeIds.size;
9653
- return /* @__PURE__ */ import_react19.default.createElement(
9842
+ return /* @__PURE__ */ import_react20.default.createElement(
9654
9843
  "div",
9655
9844
  {
9656
9845
  ref: menuRef,
@@ -9664,28 +9853,28 @@ function MultiNodeContextMenu({
9664
9853
  onContextMenu: swallow,
9665
9854
  onDoubleClick: swallow
9666
9855
  },
9667
- /* @__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" }),
9668
- /* @__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(
9669
9858
  "button",
9670
9859
  {
9671
9860
  onClick: () => setIsConfirmingDelete(false),
9672
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"
9673
9862
  },
9674
9863
  "Cancelar"
9675
- ), /* @__PURE__ */ import_react19.default.createElement(
9864
+ ), /* @__PURE__ */ import_react20.default.createElement(
9676
9865
  "button",
9677
9866
  {
9678
9867
  onClick: () => onDeleteNodes(data.nodeIds),
9679
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"
9680
9869
  },
9681
9870
  "Excluir"
9682
- ))) : /* @__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, ")"))))))
9683
9872
  );
9684
9873
  }
9685
9874
 
9686
9875
  // src/components/RelationshipDetailsPanel.jsx
9687
- var import_react20 = __toESM(require("react"));
9688
- var import_fi17 = require("react-icons/fi");
9876
+ var import_react21 = __toESM(require("react"));
9877
+ var import_fi18 = require("react-icons/fi");
9689
9878
  function RelationshipDetailsPanel({
9690
9879
  link,
9691
9880
  onClose,
@@ -9699,22 +9888,22 @@ function RelationshipDetailsPanel({
9699
9888
  onUploadFile,
9700
9889
  userRole
9701
9890
  }) {
9702
- const [name, setName] = (0, import_react20.useState)((link == null ? void 0 : link.name) ?? "");
9703
- const [description, setDescription] = (0, import_react20.useState)((link == null ? void 0 : link.description) ?? "");
9704
- const [customProps, setCustomProps] = (0, import_react20.useState)(() => extractCustomPropsFromNode(link || {}));
9705
- const [existingSections, setExistingSections] = (0, import_react20.useState)((link == null ? void 0 : link.description_sections) || []);
9706
- const [sourceLabel, setSourceLabel] = (0, import_react20.useState)((link == null ? void 0 : link.source_label) ?? "");
9707
- const [targetLabel, setTargetLabel] = (0, import_react20.useState)((link == null ? void 0 : link.target_label) ?? "");
9708
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react20.useState)(false);
9709
- const [isSaving, setIsSaving] = (0, import_react20.useState)(false);
9710
- const [isReadMode, setIsReadMode] = (0, import_react20.useState)(false);
9711
- const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react20.useState)(false);
9712
- const propsEndRef = (0, import_react20.useRef)(null);
9713
- 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)(() => {
9714
9903
  const ability = defineAbilityFor(userRole);
9715
9904
  return ability.can("update", "Connection");
9716
9905
  }, [userRole]);
9717
- (0, import_react20.useEffect)(() => {
9906
+ (0, import_react21.useEffect)(() => {
9718
9907
  setName((link == null ? void 0 : link.name) ?? "");
9719
9908
  setDescription((link == null ? void 0 : link.description) ?? "");
9720
9909
  setExistingSections((link == null ? void 0 : link.description_sections) || []);
@@ -9805,7 +9994,7 @@ function RelationshipDetailsPanel({
9805
9994
  onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
9806
9995
  }
9807
9996
  };
9808
- 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(
9809
9998
  "div",
9810
9999
  {
9811
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
@@ -9820,7 +10009,7 @@ function RelationshipDetailsPanel({
9820
10009
  onContextMenu: swallow,
9821
10010
  onDoubleClick: swallow
9822
10011
  },
9823
- isReadMode ? /* @__PURE__ */ import_react20.default.createElement(
10012
+ isReadMode ? /* @__PURE__ */ import_react21.default.createElement(
9824
10013
  DescriptionReadModePanel,
9825
10014
  {
9826
10015
  title: name || "Rela\xE7\xE3o",
@@ -9841,7 +10030,7 @@ function RelationshipDetailsPanel({
9841
10030
  onImageClick: handleImageClickFromText,
9842
10031
  onSaveDescription: handleSaveDescriptionInline
9843
10032
  }
9844
- ) : /* @__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(
9845
10034
  "input",
9846
10035
  {
9847
10036
  type: "text",
@@ -9856,7 +10045,7 @@ function RelationshipDetailsPanel({
9856
10045
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
9857
10046
  `
9858
10047
  }
9859
- )), /* @__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(
9860
10049
  "input",
9861
10050
  {
9862
10051
  type: "text",
@@ -9871,7 +10060,7 @@ function RelationshipDetailsPanel({
9871
10060
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
9872
10061
  `
9873
10062
  }
9874
- )), /* @__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(
9875
10064
  "input",
9876
10065
  {
9877
10066
  type: "text",
@@ -9886,7 +10075,7 @@ function RelationshipDetailsPanel({
9886
10075
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
9887
10076
  `
9888
10077
  }
9889
- )))), /* @__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(
9890
10079
  DescriptionDisplay,
9891
10080
  {
9892
10081
  description,
@@ -9898,7 +10087,7 @@ function RelationshipDetailsPanel({
9898
10087
  onImageClick: handleImageClickFromText,
9899
10088
  onSaveDescription: handleSaveDescriptionInline
9900
10089
  }
9901
- ), /* @__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(
9902
10091
  "button",
9903
10092
  {
9904
10093
  type: "button",
@@ -9906,8 +10095,8 @@ function RelationshipDetailsPanel({
9906
10095
  className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors border-r border-white/5",
9907
10096
  title: "Modo de Leitura"
9908
10097
  },
9909
- /* @__PURE__ */ import_react20.default.createElement(import_fi17.FiBookOpen, { size: 14 })
9910
- ), canEdit && /* @__PURE__ */ import_react20.default.createElement(
10098
+ /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiBookOpen, { size: 14 })
10099
+ ), canEdit && /* @__PURE__ */ import_react21.default.createElement(
9911
10100
  "button",
9912
10101
  {
9913
10102
  type: "button",
@@ -9915,15 +10104,15 @@ function RelationshipDetailsPanel({
9915
10104
  className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
9916
10105
  title: "Editar descri\xE7\xE3o"
9917
10106
  },
9918
- /* @__PURE__ */ import_react20.default.createElement(import_fi17.FiEdit2, { size: 14 })
9919
- )), !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(
9920
10109
  "div",
9921
10110
  {
9922
10111
  onClick: () => setIsDescriptionModalOpen(true),
9923
10112
  className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
9924
10113
  },
9925
10114
  "Adicionar descri\xE7\xE3o..."
9926
- ))), /* @__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(
9927
10116
  CustomPropertyDisplay,
9928
10117
  {
9929
10118
  key: prop.id,
@@ -9935,7 +10124,7 @@ function RelationshipDetailsPanel({
9935
10124
  onUploadFile,
9936
10125
  disabled: !canEdit
9937
10126
  }
9938
- )), /* @__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(
9939
10128
  "button",
9940
10129
  {
9941
10130
  onClick: () => handleSave(false),
@@ -9944,10 +10133,10 @@ function RelationshipDetailsPanel({
9944
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"}
9945
10134
  `
9946
10135
  },
9947
- 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" }),
9948
10137
  isSaving ? "Salvando..." : "Salvar"
9949
10138
  )))
9950
- ), isDescriptionModalOpen && /* @__PURE__ */ import_react20.default.createElement(
10139
+ ), isDescriptionModalOpen && /* @__PURE__ */ import_react21.default.createElement(
9951
10140
  DescriptionEditModal,
9952
10141
  {
9953
10142
  isOpen: isDescriptionModalOpen,
@@ -9969,7 +10158,7 @@ function RelationshipDetailsPanel({
9969
10158
  }
9970
10159
 
9971
10160
  // src/components/RelationshipContextMenu.jsx
9972
- var import_react21 = __toESM(require("react"));
10161
+ var import_react22 = __toESM(require("react"));
9973
10162
  function RelationshipContextMenu({
9974
10163
  data,
9975
10164
  userRole,
@@ -9979,25 +10168,25 @@ function RelationshipContextMenu({
9979
10168
  onDelete,
9980
10169
  onClose
9981
10170
  }) {
9982
- const menuRef = (0, import_react21.useRef)(null);
9983
- const [menuPos, setMenuPos] = (0, import_react21.useState)({ left: 0, top: 0 });
9984
- const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react21.useState)(false);
9985
- const ability = (0, import_react21.useMemo)(() => defineAbilityFor(userRole), [userRole]);
9986
- 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)(
9987
10176
  () => {
9988
10177
  var _a, _b, _c, _d;
9989
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)";
9990
10179
  },
9991
10180
  [data == null ? void 0 : data.linkObject]
9992
10181
  );
9993
- const targetName = (0, import_react21.useMemo)(
10182
+ const targetName = (0, import_react22.useMemo)(
9994
10183
  () => {
9995
10184
  var _a, _b, _c, _d;
9996
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)";
9997
10186
  },
9998
10187
  [data == null ? void 0 : data.linkObject]
9999
10188
  );
10000
- (0, import_react21.useLayoutEffect)(() => {
10189
+ (0, import_react22.useLayoutEffect)(() => {
10001
10190
  if (!data.visible || !menuRef.current) return;
10002
10191
  const el = menuRef.current;
10003
10192
  const w = el.clientWidth;
@@ -10010,7 +10199,7 @@ function RelationshipContextMenu({
10010
10199
  if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
10011
10200
  setMenuPos({ left, top });
10012
10201
  }, [data]);
10013
- (0, import_react21.useEffect)(() => {
10202
+ (0, import_react22.useEffect)(() => {
10014
10203
  if (data.visible) {
10015
10204
  setIsConfirmingDelete(false);
10016
10205
  }
@@ -10026,7 +10215,7 @@ function RelationshipContextMenu({
10026
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";
10027
10216
  const canUpdate = ability.can("update", "Connection");
10028
10217
  const canDelete = ability.can("delete", "Connection");
10029
- return /* @__PURE__ */ import_react21.default.createElement(
10218
+ return /* @__PURE__ */ import_react22.default.createElement(
10030
10219
  "div",
10031
10220
  {
10032
10221
  ref: menuRef,
@@ -10040,29 +10229,29 @@ function RelationshipContextMenu({
10040
10229
  onContextMenu: swallow,
10041
10230
  onDoubleClick: swallow
10042
10231
  },
10043
- /* @__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" }),
10044
- /* @__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(
10045
10234
  "button",
10046
10235
  {
10047
10236
  onClick: () => setIsConfirmingDelete(false),
10048
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"
10049
10238
  },
10050
10239
  "Cancelar"
10051
- ), /* @__PURE__ */ import_react21.default.createElement(
10240
+ ), /* @__PURE__ */ import_react22.default.createElement(
10052
10241
  "button",
10053
10242
  {
10054
10243
  onClick: () => onDelete == null ? void 0 : onDelete(data.linkObject),
10055
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"
10056
10245
  },
10057
10246
  "Excluir"
10058
- ))) : /* @__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(
10059
10248
  "button",
10060
10249
  {
10061
10250
  onClick: () => onRelinkSource == null ? void 0 : onRelinkSource(data.linkObject),
10062
10251
  className: baseButtonClass,
10063
10252
  title: "Desconectar ponta ligada ao Source"
10064
10253
  },
10065
- /* @__PURE__ */ import_react21.default.createElement(
10254
+ /* @__PURE__ */ import_react22.default.createElement(
10066
10255
  "svg",
10067
10256
  {
10068
10257
  xmlns: "http://www.w3.org/2000/svg",
@@ -10075,18 +10264,18 @@ function RelationshipContextMenu({
10075
10264
  strokeLinecap: "round",
10076
10265
  strokeLinejoin: "round"
10077
10266
  },
10078
- /* @__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" }),
10079
- /* @__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" })
10080
10269
  ),
10081
- /* @__PURE__ */ import_react21.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
10082
- ), /* @__PURE__ */ import_react21.default.createElement(
10270
+ /* @__PURE__ */ import_react22.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
10271
+ ), /* @__PURE__ */ import_react22.default.createElement(
10083
10272
  "button",
10084
10273
  {
10085
10274
  onClick: () => onRelinkTarget == null ? void 0 : onRelinkTarget(data.linkObject),
10086
10275
  className: baseButtonClass,
10087
10276
  title: "Desconectar ponta ligada ao Target"
10088
10277
  },
10089
- /* @__PURE__ */ import_react21.default.createElement(
10278
+ /* @__PURE__ */ import_react22.default.createElement(
10090
10279
  "svg",
10091
10280
  {
10092
10281
  xmlns: "http://www.w3.org/2000/svg",
@@ -10099,21 +10288,21 @@ function RelationshipContextMenu({
10099
10288
  strokeLinecap: "round",
10100
10289
  strokeLinejoin: "round"
10101
10290
  },
10102
- /* @__PURE__ */ import_react21.default.createElement("polyline", { points: "16 3 21 3 21 8" }),
10103
- /* @__PURE__ */ import_react21.default.createElement("line", { x1: "4", y1: "20", x2: "21", y2: "3" }),
10104
- /* @__PURE__ */ import_react21.default.createElement("polyline", { points: "21 16 21 21 16 21" }),
10105
- /* @__PURE__ */ import_react21.default.createElement("line", { x1: "15", y1: "15", x2: "21", y2: "21" }),
10106
- /* @__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" })
10107
10296
  ),
10108
- /* @__PURE__ */ import_react21.default.createElement("span", null, "Desconectar Target (", targetName, ")")
10109
- ), /* @__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(
10110
10299
  "button",
10111
10300
  {
10112
10301
  onClick: () => onOpenDetails == null ? void 0 : onOpenDetails(data.linkObject),
10113
10302
  className: baseButtonClass,
10114
10303
  title: "Abrir detalhes da rela\xE7\xE3o"
10115
10304
  },
10116
- /* @__PURE__ */ import_react21.default.createElement(
10305
+ /* @__PURE__ */ import_react22.default.createElement(
10117
10306
  "svg",
10118
10307
  {
10119
10308
  xmlns: "http://www.w3.org/2000/svg",
@@ -10126,19 +10315,19 @@ function RelationshipContextMenu({
10126
10315
  strokeLinecap: "round",
10127
10316
  strokeLinejoin: "round"
10128
10317
  },
10129
- /* @__PURE__ */ import_react21.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
10130
- /* @__PURE__ */ import_react21.default.createElement("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
10131
- /* @__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" })
10132
10321
  ),
10133
- /* @__PURE__ */ import_react21.default.createElement("span", null, "Abrir Detalhes")
10134
- ), 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(
10135
10324
  "button",
10136
10325
  {
10137
10326
  onClick: () => setIsConfirmingDelete(true),
10138
10327
  className: dangerButtonClass,
10139
10328
  title: "Excluir esta conex\xE3o"
10140
10329
  },
10141
- /* @__PURE__ */ import_react21.default.createElement(
10330
+ /* @__PURE__ */ import_react22.default.createElement(
10142
10331
  "svg",
10143
10332
  {
10144
10333
  xmlns: "http://www.w3.org/2000/svg",
@@ -10151,19 +10340,19 @@ function RelationshipContextMenu({
10151
10340
  strokeLinecap: "round",
10152
10341
  strokeLinejoin: "round"
10153
10342
  },
10154
- /* @__PURE__ */ import_react21.default.createElement("polyline", { points: "3 6 5 6 21 6" }),
10155
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
10156
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M10 11v6" }),
10157
- /* @__PURE__ */ import_react21.default.createElement("path", { d: "M14 11v6" }),
10158
- /* @__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" })
10159
10348
  ),
10160
- /* @__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, ")")
10161
10350
  )))))
10162
10351
  );
10163
10352
  }
10164
10353
 
10165
10354
  // src/components/LoadingScreen.jsx
10166
- var import_react22 = __toESM(require("react"));
10355
+ var import_react23 = __toESM(require("react"));
10167
10356
  var styles = {
10168
10357
  loadingOverlay: {
10169
10358
  position: "fixed",
@@ -10195,11 +10384,11 @@ var styles = {
10195
10384
  `
10196
10385
  };
10197
10386
  function LoadingScreen() {
10198
- 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 })));
10199
10388
  }
10200
10389
 
10201
10390
  // src/components/ImportParentFileModal.jsx
10202
- var import_react23 = __toESM(require("react"));
10391
+ var import_react24 = __toESM(require("react"));
10203
10392
  function ImportParentFileModal({
10204
10393
  isOpen,
10205
10394
  onClose,
@@ -10210,12 +10399,12 @@ function ImportParentFileModal({
10210
10399
  onFetchAvailableFiles,
10211
10400
  currentViewName
10212
10401
  }) {
10213
- const [activeTab, setActiveTab] = (0, import_react23.useState)("databases");
10214
- const [availableDbs, setAvailableDbs] = (0, import_react23.useState)([]);
10215
- const [availableViews, setAvailableViews] = (0, import_react23.useState)([]);
10216
- const [selectedItem, setSelectedItem] = (0, import_react23.useState)(null);
10217
- const [isLoading, setIsLoading] = (0, import_react23.useState)(false);
10218
- (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)(() => {
10219
10408
  if (isOpen && session && onFetchAvailableFiles) {
10220
10409
  const fetchData = async () => {
10221
10410
  setIsLoading(true);
@@ -10251,7 +10440,7 @@ function ImportParentFileModal({
10251
10440
  fetchData();
10252
10441
  }
10253
10442
  }, [isOpen, session, parentDbs, onFetchAvailableFiles, currentViewName]);
10254
- (0, import_react23.useEffect)(() => {
10443
+ (0, import_react24.useEffect)(() => {
10255
10444
  setSelectedItem(null);
10256
10445
  }, [activeTab]);
10257
10446
  if (!isOpen) {
@@ -10280,13 +10469,13 @@ function ImportParentFileModal({
10280
10469
  const swallow = (e) => e.stopPropagation();
10281
10470
  const currentList = activeTab === "databases" ? availableDbs : availableViews;
10282
10471
  const emptyMessage = activeTab === "databases" ? "Nenhum novo arquivo parent dispon\xEDvel." : "Nenhuma view dispon\xEDvel para importa\xE7\xE3o.";
10283
- return /* @__PURE__ */ import_react23.default.createElement(
10472
+ return /* @__PURE__ */ import_react24.default.createElement(
10284
10473
  "div",
10285
10474
  {
10286
10475
  className: "ui-overlay fixed inset-0 z-[1200] flex items-center justify-center bg-black/60 backdrop-blur-sm",
10287
10476
  onClick: onClose
10288
10477
  },
10289
- /* @__PURE__ */ import_react23.default.createElement(
10478
+ /* @__PURE__ */ import_react24.default.createElement(
10290
10479
  "div",
10291
10480
  {
10292
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]",
@@ -10298,14 +10487,14 @@ function ImportParentFileModal({
10298
10487
  onContextMenu: swallow,
10299
10488
  onDoubleClick: swallow
10300
10489
  },
10301
- /* @__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(
10302
10491
  "button",
10303
10492
  {
10304
10493
  onClick: onClose,
10305
10494
  className: "p-2 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
10306
10495
  title: "Fechar"
10307
10496
  },
10308
- /* @__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(
10309
10498
  "path",
10310
10499
  {
10311
10500
  fillRule: "evenodd",
@@ -10314,14 +10503,14 @@ function ImportParentFileModal({
10314
10503
  }
10315
10504
  ))
10316
10505
  )),
10317
- /* @__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(
10318
10507
  "button",
10319
10508
  {
10320
10509
  onClick: () => setActiveTab("databases"),
10321
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"}`
10322
10511
  },
10323
10512
  "Arquivos Parent"
10324
- ), /* @__PURE__ */ import_react23.default.createElement(
10513
+ ), /* @__PURE__ */ import_react24.default.createElement(
10325
10514
  "button",
10326
10515
  {
10327
10516
  onClick: () => setActiveTab("views"),
@@ -10329,24 +10518,24 @@ function ImportParentFileModal({
10329
10518
  },
10330
10519
  "Views (Ancestralidades)"
10331
10520
  )),
10332
- /* @__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(
10333
10522
  "div",
10334
10523
  {
10335
10524
  key: item.id,
10336
10525
  onClick: () => setSelectedItem(item),
10337
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"}`
10338
10527
  },
10339
- /* @__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")),
10340
- 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)
10341
- )) : /* @__PURE__ */ import_react23.default.createElement("p", { className: "text-slate-400 text-center py-10" }, emptyMessage))),
10342
- /* @__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(
10343
10532
  "button",
10344
10533
  {
10345
10534
  onClick: onClose,
10346
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"
10347
10536
  },
10348
10537
  "Cancelar"
10349
- ), /* @__PURE__ */ import_react23.default.createElement(
10538
+ ), /* @__PURE__ */ import_react24.default.createElement(
10350
10539
  "button",
10351
10540
  {
10352
10541
  onClick: handleConfirm,
@@ -10360,8 +10549,8 @@ function ImportParentFileModal({
10360
10549
  }
10361
10550
 
10362
10551
  // src/components/AncestryLinkDetailsPanel.jsx
10363
- var import_react24 = __toESM(require("react"));
10364
- var import_fi18 = require("react-icons/fi");
10552
+ var import_react25 = __toESM(require("react"));
10553
+ var import_fi19 = require("react-icons/fi");
10365
10554
  function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenReference, onMentionClick, onUploadFile }) {
10366
10555
  var _a, _b, _c, _d;
10367
10556
  const relationshipData = data.relationship || {};
@@ -10370,21 +10559,21 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10370
10559
  const customProps = extractCustomPropsFromNode(relationshipData);
10371
10560
  const sourceName = ((_b = (_a = data.sourceNode) == null ? void 0 : _a.userData) == null ? void 0 : _b.name) || "Origem";
10372
10561
  const targetName = ((_d = (_c = data.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) || "Destino";
10373
- const [isReadMode, setIsReadMode] = (0, import_react24.useState)(false);
10562
+ const [isReadMode, setIsReadMode] = (0, import_react25.useState)(false);
10374
10563
  const swallow = (e) => e.stopPropagation();
10375
10564
  const handleImageClickFromText = (url, name) => {
10376
10565
  if (onOpenImageViewer) {
10377
10566
  onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
10378
10567
  }
10379
10568
  };
10380
- return /* @__PURE__ */ import_react24.default.createElement(
10569
+ return /* @__PURE__ */ import_react25.default.createElement(
10381
10570
  "div",
10382
10571
  {
10383
10572
  className: "ui-overlay fixed inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-[1200]",
10384
10573
  onClick: onClose,
10385
10574
  onPointerDown: swallow
10386
10575
  },
10387
- /* @__PURE__ */ import_react24.default.createElement(
10576
+ /* @__PURE__ */ import_react25.default.createElement(
10388
10577
  "div",
10389
10578
  {
10390
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
@@ -10392,7 +10581,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10392
10581
  `,
10393
10582
  onClick: swallow
10394
10583
  },
10395
- isReadMode ? /* @__PURE__ */ import_react24.default.createElement(
10584
+ isReadMode ? /* @__PURE__ */ import_react25.default.createElement(
10396
10585
  DescriptionReadModePanel,
10397
10586
  {
10398
10587
  title: `${sourceName} \u2794 ${targetName}`,
@@ -10404,15 +10593,15 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10404
10593
  onMentionClick,
10405
10594
  onImageClick: handleImageClickFromText
10406
10595
  }
10407
- ) : /* @__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(
10408
10597
  "button",
10409
10598
  {
10410
10599
  onClick: () => setIsReadMode(true),
10411
10600
  className: "p-1 text-slate-400 hover:text-white transition-colors",
10412
10601
  title: "Modo de Leitura"
10413
10602
  },
10414
- /* @__PURE__ */ import_react24.default.createElement(import_fi18.FiBookOpen, { size: 14 })
10415
- )), /* @__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(
10416
10605
  DescriptionDisplay,
10417
10606
  {
10418
10607
  description,
@@ -10421,7 +10610,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10421
10610
  onMentionClick,
10422
10611
  onImageClick: handleImageClickFromText
10423
10612
  }
10424
- ))), 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(
10425
10614
  CustomPropertyDisplay,
10426
10615
  {
10427
10616
  key: prop.id,
@@ -10430,14 +10619,14 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10430
10619
  onOpenImageViewer,
10431
10620
  onUploadFile
10432
10621
  }
10433
- )))), !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".')))
10434
10623
  )
10435
10624
  );
10436
10625
  }
10437
10626
 
10438
10627
  // src/components/AncestryBoard.jsx
10439
- var import_react25 = __toESM(require("react"));
10440
- var import_fi19 = require("react-icons/fi");
10628
+ var import_react26 = __toESM(require("react"));
10629
+ var import_fi20 = require("react-icons/fi");
10441
10630
  var GroupItem = ({
10442
10631
  group,
10443
10632
  index,
@@ -10456,7 +10645,7 @@ var GroupItem = ({
10456
10645
  }) => {
10457
10646
  const canIndent = index > 0;
10458
10647
  const isPickingForThisGroup = pickingGroupId === group.id;
10459
- const textareaRef = (0, import_react25.useRef)(null);
10648
+ const textareaRef = (0, import_react26.useRef)(null);
10460
10649
  const adjustHeight = () => {
10461
10650
  const textarea = textareaRef.current;
10462
10651
  if (textarea) {
@@ -10464,10 +10653,10 @@ var GroupItem = ({
10464
10653
  textarea.style.height = `${textarea.scrollHeight}px`;
10465
10654
  }
10466
10655
  };
10467
- (0, import_react25.useEffect)(() => {
10656
+ (0, import_react26.useEffect)(() => {
10468
10657
  adjustHeight();
10469
10658
  }, [group.text]);
10470
- 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(
10471
10660
  "div",
10472
10661
  {
10473
10662
  className: `
@@ -10475,7 +10664,7 @@ var GroupItem = ({
10475
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"}
10476
10665
  `
10477
10666
  },
10478
- /* @__PURE__ */ import_react25.default.createElement(
10667
+ /* @__PURE__ */ import_react26.default.createElement(
10479
10668
  "textarea",
10480
10669
  {
10481
10670
  ref: textareaRef,
@@ -10493,9 +10682,9 @@ var GroupItem = ({
10493
10682
  }
10494
10683
  }
10495
10684
  ),
10496
- 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) => {
10497
10686
  const isValid = availableIds.has(String(anc.ancestry_id));
10498
- return /* @__PURE__ */ import_react25.default.createElement(
10687
+ return /* @__PURE__ */ import_react26.default.createElement(
10499
10688
  "div",
10500
10689
  {
10501
10690
  key: anc.ancestry_id,
@@ -10507,40 +10696,40 @@ var GroupItem = ({
10507
10696
  },
10508
10697
  isValid ? (
10509
10698
  // [MANTIDO] Botão Play visível para todos
10510
- /* @__PURE__ */ import_react25.default.createElement(
10699
+ /* @__PURE__ */ import_react26.default.createElement(
10511
10700
  "button",
10512
10701
  {
10513
10702
  onClick: () => onPlayAncestry(anc.ancestry_id),
10514
10703
  className: "text-indigo-400 hover:text-white hover:bg-indigo-500 p-1 rounded-full transition-colors",
10515
10704
  title: "Renderizar no cen\xE1rio"
10516
10705
  },
10517
- /* @__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" })
10518
10707
  )
10519
- ) : /* @__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 })),
10520
- /* @__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(
10521
10710
  "span",
10522
10711
  {
10523
10712
  className: `font-medium truncate max-w-[150px] ${!isValid && "line-through decoration-red-500/50"}`
10524
10713
  },
10525
10714
  anc.name
10526
10715
  ),
10527
- 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(
10528
10717
  "div",
10529
10718
  {
10530
10719
  className: `w-px h-3 mx-0.5 ${isValid ? "bg-white/10" : "bg-red-500/20"}`
10531
10720
  }
10532
- ), /* @__PURE__ */ import_react25.default.createElement(
10721
+ ), /* @__PURE__ */ import_react26.default.createElement(
10533
10722
  "button",
10534
10723
  {
10535
10724
  onClick: () => onRemoveAncestry(group.id, anc.ancestry_id),
10536
10725
  className: `${isValid ? "text-slate-500 hover:text-red-400" : "text-red-400 hover:text-red-200"} p-0.5 rounded transition-colors`,
10537
10726
  title: "Remover men\xE7\xE3o"
10538
10727
  },
10539
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiX, { size: 12 })
10728
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiX, { size: 12 })
10540
10729
  ))
10541
10730
  );
10542
10731
  })),
10543
- 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(
10544
10733
  "button",
10545
10734
  {
10546
10735
  onClick: () => onRequestPickAncestry(group.id),
@@ -10550,17 +10739,17 @@ var GroupItem = ({
10550
10739
  `,
10551
10740
  title: "Adicionar Ancestralidade a este grupo"
10552
10741
  },
10553
- 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 }),
10554
10743
  isPickingForThisGroup ? "Selecionando..." : "Adicionar"
10555
- ), /* @__PURE__ */ import_react25.default.createElement(
10744
+ ), /* @__PURE__ */ import_react26.default.createElement(
10556
10745
  "button",
10557
10746
  {
10558
10747
  onClick: () => onAddSubgroup(group.id),
10559
10748
  className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
10560
10749
  title: "Criar Subgrupo"
10561
10750
  },
10562
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiPlus, { size: 14 })
10563
- )), /* @__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(
10564
10753
  "button",
10565
10754
  {
10566
10755
  onClick: () => onIndent(group.id),
@@ -10568,25 +10757,25 @@ var GroupItem = ({
10568
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"}`,
10569
10758
  title: "Aninhar no grupo acima"
10570
10759
  },
10571
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiArrowRight, { size: 14 })
10572
- ), /* @__PURE__ */ import_react25.default.createElement(
10760
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiArrowRight, { size: 14 })
10761
+ ), /* @__PURE__ */ import_react26.default.createElement(
10573
10762
  "button",
10574
10763
  {
10575
10764
  onClick: () => onOutdent(group.id),
10576
10765
  className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
10577
10766
  title: "Desaninhar"
10578
10767
  },
10579
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiArrowLeft, { size: 14 })
10580
- ), /* @__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(
10581
10770
  "button",
10582
10771
  {
10583
10772
  onClick: () => onDelete(group.id),
10584
10773
  className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
10585
10774
  title: "Remover Grupo"
10586
10775
  },
10587
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiTrash2, { size: 14 })
10776
+ /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiTrash2, { size: 14 })
10588
10777
  )))
10589
- ), 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(
10590
10779
  GroupItem,
10591
10780
  {
10592
10781
  key: childGroup.id,
@@ -10618,21 +10807,21 @@ function AncestryBoard({
10618
10807
  userRole
10619
10808
  // [NOVO] Recebe a role do usuário
10620
10809
  }) {
10621
- const [searchTerm, setSearchTerm] = (0, import_react25.useState)("");
10622
- const [groups, setGroups] = (0, import_react25.useState)([]);
10623
- const [isLoaded, setIsLoaded] = (0, import_react25.useState)(false);
10624
- const [pickingGroupId, setPickingGroupId] = (0, import_react25.useState)(null);
10625
- const [saveStatus, setSaveStatus] = (0, import_react25.useState)("idle");
10626
- 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)(() => {
10627
10816
  return userRole !== "viewer";
10628
10817
  }, [userRole]);
10629
- (0, import_react25.useEffect)(() => {
10818
+ (0, import_react26.useEffect)(() => {
10630
10819
  if (initialGroups && !isLoaded) {
10631
10820
  setGroups(initialGroups);
10632
10821
  setIsLoaded(true);
10633
10822
  }
10634
10823
  }, [initialGroups, isLoaded]);
10635
- const nodeNamesMap = (0, import_react25.useMemo)(() => {
10824
+ const nodeNamesMap = (0, import_react26.useMemo)(() => {
10636
10825
  const map = /* @__PURE__ */ new Map();
10637
10826
  if (availableNodes && Array.isArray(availableNodes)) {
10638
10827
  availableNodes.forEach((node) => {
@@ -10643,7 +10832,7 @@ function AncestryBoard({
10643
10832
  }
10644
10833
  return map;
10645
10834
  }, [availableNodes]);
10646
- const availableIds = (0, import_react25.useMemo)(() => {
10835
+ const availableIds = (0, import_react26.useMemo)(() => {
10647
10836
  return new Set(availableAncestries.map((a) => String(a.ancestry_id)));
10648
10837
  }, [availableAncestries]);
10649
10838
  const sanitizeGroups = (groupList) => {
@@ -10657,7 +10846,7 @@ function AncestryBoard({
10657
10846
  children: sanitizeGroups(g.children || [])
10658
10847
  }));
10659
10848
  };
10660
- (0, import_react25.useEffect)(() => {
10849
+ (0, import_react26.useEffect)(() => {
10661
10850
  if (!isLoaded || !onSave) return;
10662
10851
  const timeoutId = setTimeout(async () => {
10663
10852
  setSaveStatus("saving");
@@ -10675,7 +10864,7 @@ function AncestryBoard({
10675
10864
  }, 3e3);
10676
10865
  return () => clearTimeout(timeoutId);
10677
10866
  }, [groups, isLoaded, onSave]);
10678
- (0, import_react25.useEffect)(() => {
10867
+ (0, import_react26.useEffect)(() => {
10679
10868
  if (!isOpen) return;
10680
10869
  const handleKeyDown = (e) => {
10681
10870
  if (e.key === "Escape") {
@@ -10691,7 +10880,7 @@ function AncestryBoard({
10691
10880
  window.addEventListener("keydown", handleKeyDown);
10692
10881
  return () => window.removeEventListener("keydown", handleKeyDown);
10693
10882
  }, [isOpen, onClose, pickingGroupId]);
10694
- const filtered = (0, import_react25.useMemo)(() => {
10883
+ const filtered = (0, import_react26.useMemo)(() => {
10695
10884
  const term = searchTerm.toLowerCase().trim();
10696
10885
  return availableAncestries.filter((a) => {
10697
10886
  if (!term) return true;
@@ -10841,33 +11030,33 @@ function AncestryBoard({
10841
11030
  });
10842
11031
  };
10843
11032
  if (!isOpen) return null;
10844
- return /* @__PURE__ */ import_react25.default.createElement(
11033
+ return /* @__PURE__ */ import_react26.default.createElement(
10845
11034
  "div",
10846
11035
  {
10847
11036
  className: "fixed inset-0 z-[2200] bg-black/80 backdrop-blur-sm flex items-center justify-center p-2",
10848
11037
  onClick: onClose
10849
11038
  },
10850
- /* @__PURE__ */ import_react25.default.createElement(
11039
+ /* @__PURE__ */ import_react26.default.createElement(
10851
11040
  "div",
10852
11041
  {
10853
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",
10854
11043
  onClick: (e) => e.stopPropagation()
10855
11044
  },
10856
- /* @__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(
10857
- 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,
10858
11047
  {
10859
11048
  className: "animate-spin text-indigo-400",
10860
11049
  size: 12
10861
11050
  }
10862
- ), /* @__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(
10863
11052
  "button",
10864
11053
  {
10865
11054
  onClick: handleAddRootGroup,
10866
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 "
10867
11056
  },
10868
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiPlus, { size: 14, className: "text-indigo-400" }),
10869
- /* @__PURE__ */ import_react25.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
10870
- ), /* @__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(
10871
11060
  "button",
10872
11061
  {
10873
11062
  onClick: onClose,
@@ -10875,7 +11064,7 @@ function AncestryBoard({
10875
11064
  },
10876
11065
  "\xD7"
10877
11066
  ))),
10878
- /* @__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(
10879
11068
  "div",
10880
11069
  {
10881
11070
  className: `
@@ -10884,12 +11073,12 @@ function AncestryBoard({
10884
11073
  min-w-[280px] max-w-[500px] bg-slate-900
10885
11074
  `
10886
11075
  },
10887
- /* @__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(
10888
- 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,
10889
11078
  {
10890
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"}`
10891
11080
  }
10892
- ), /* @__PURE__ */ import_react25.default.createElement(
11081
+ ), /* @__PURE__ */ import_react26.default.createElement(
10893
11082
  "input",
10894
11083
  {
10895
11084
  type: "text",
@@ -10903,10 +11092,10 @@ function AncestryBoard({
10903
11092
  autoFocus: !pickingGroupId
10904
11093
  }
10905
11094
  ))),
10906
- /* @__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) => {
10907
11096
  const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
10908
11097
  const isPicking = !!pickingGroupId;
10909
- return /* @__PURE__ */ import_react25.default.createElement(
11098
+ return /* @__PURE__ */ import_react26.default.createElement(
10910
11099
  "div",
10911
11100
  {
10912
11101
  key: anc.ancestry_id,
@@ -10918,7 +11107,7 @@ function AncestryBoard({
10918
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"}
10919
11108
  `
10920
11109
  },
10921
- /* @__PURE__ */ import_react25.default.createElement(
11110
+ /* @__PURE__ */ import_react26.default.createElement(
10922
11111
  "div",
10923
11112
  {
10924
11113
  className: `
@@ -10926,10 +11115,10 @@ function AncestryBoard({
10926
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"}
10927
11116
  `
10928
11117
  },
10929
- 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 })
10930
11119
  ),
10931
- /* @__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)),
10932
- !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(
10933
11122
  "button",
10934
11123
  {
10935
11124
  onClick: (e) => {
@@ -10939,11 +11128,11 @@ function AncestryBoard({
10939
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",
10940
11129
  title: "Renderizar Ancestralidade"
10941
11130
  },
10942
- /* @__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" }))
10943
11132
  )
10944
11133
  );
10945
11134
  }))
10946
- ), /* @__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(
10947
11136
  GroupItem,
10948
11137
  {
10949
11138
  key: group.id,
@@ -10963,7 +11152,7 @@ function AncestryBoard({
10963
11152
  canEdit
10964
11153
  }
10965
11154
  ))))),
10966
- /* @__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"))
10967
11156
  )
10968
11157
  );
10969
11158
  }
@@ -11047,12 +11236,12 @@ function XViewScene({
11047
11236
  get_view_members
11048
11237
  }) {
11049
11238
  var _a, _b, _c, _d, _e, _f, _g, _h;
11050
- const { data: session, status } = (0, import_react27.useSession)();
11239
+ const { data: session, status } = (0, import_react28.useSession)();
11051
11240
  const router = (0, import_navigation.useRouter)();
11052
11241
  const searchParams = (0, import_navigation.useSearchParams)();
11053
11242
  const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
11054
11243
  const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
11055
- const viewParams = (0, import_react26.useMemo)(() => {
11244
+ const viewParams = (0, import_react27.useMemo)(() => {
11056
11245
  if (encryptedConfig) {
11057
11246
  const data = decryptData(encryptedConfig);
11058
11247
  if (data) {
@@ -11061,7 +11250,7 @@ function XViewScene({
11061
11250
  }
11062
11251
  return null;
11063
11252
  }, [encryptedConfig, session]);
11064
- (0, import_react26.useEffect)(() => {
11253
+ (0, import_react27.useEffect)(() => {
11065
11254
  async function verifyPermission() {
11066
11255
  if (!viewParams || !session || !check_user_permission) return;
11067
11256
  const { id, type, owner_id } = viewParams;
@@ -11098,65 +11287,65 @@ function XViewScene({
11098
11287
  setIsLoading(false);
11099
11288
  }
11100
11289
  }, [viewParams, session, status, check_user_permission]);
11101
- const sceneConfigId = (0, import_react26.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
11102
- const ownerId = (0, import_react26.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
11103
- 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)(() => {
11104
11293
  if (ownerId && sceneConfigId) {
11105
11294
  return `x_view_dbs/${ownerId}/${sceneConfigId}`;
11106
11295
  }
11107
11296
  return null;
11108
11297
  }, [ownerId, sceneConfigId]);
11109
- const sceneSaveUrl = (0, import_react26.useMemo)(() => {
11298
+ const sceneSaveUrl = (0, import_react27.useMemo)(() => {
11110
11299
  if (ownerId && sceneConfigId) {
11111
11300
  return `x_view_scenes/${ownerId}/${sceneConfigId}`;
11112
11301
  }
11113
11302
  return null;
11114
11303
  }, [ownerId, sceneConfigId]);
11115
- const ancestry_save_url = (0, import_react26.useMemo)(() => {
11304
+ const ancestry_save_url = (0, import_react27.useMemo)(() => {
11116
11305
  if (ownerId && sceneConfigId) {
11117
11306
  return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
11118
11307
  }
11119
11308
  return null;
11120
11309
  }, [ownerId, sceneConfigId]);
11121
- const sceneDataRef = (0, import_react26.useRef)(null);
11122
- const parentDataRef = (0, import_react26.useRef)(null);
11123
- const ancestryDataRef = (0, import_react26.useRef)(null);
11124
- const [isLoading, setIsLoading] = (0, import_react26.useState)(true);
11125
- const [permissionStatus, setPermissionStatus] = (0, import_react26.useState)("loading");
11126
- const [userPermissionRole, setUserPermissionRole] = (0, import_react26.useState)(null);
11127
- const [viewMembers, setViewMembers] = (0, import_react26.useState)([]);
11128
- const [isInitialized, setIsInitialized] = (0, import_react26.useState)(false);
11129
- const [sceneVersion, setSceneVersion] = (0, import_react26.useState)(0);
11130
- 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)({
11131
11320
  visible: false,
11132
11321
  x: 0,
11133
11322
  y: 0,
11134
11323
  nodeData: null
11135
11324
  });
11136
- const [multiContextMenu, setMultiContextMenu] = (0, import_react26.useState)({
11325
+ const [multiContextMenu, setMultiContextMenu] = (0, import_react27.useState)({
11137
11326
  visible: false,
11138
11327
  x: 0,
11139
11328
  y: 0,
11140
11329
  nodeIds: null
11141
11330
  });
11142
- const [relationshipMenu, setRelationshipMenu] = (0, import_react26.useState)({
11331
+ const [relationshipMenu, setRelationshipMenu] = (0, import_react27.useState)({
11143
11332
  visible: false,
11144
11333
  x: 0,
11145
11334
  y: 0,
11146
11335
  linkObject: null
11147
11336
  });
11148
- const [creationMode, setCreationMode] = (0, import_react26.useState)({
11337
+ const [creationMode, setCreationMode] = (0, import_react27.useState)({
11149
11338
  isActive: false,
11150
11339
  sourceNodeData: null
11151
11340
  });
11152
- const [versionMode, setVersionMode] = (0, import_react26.useState)({
11341
+ const [versionMode, setVersionMode] = (0, import_react27.useState)({
11153
11342
  isActive: false,
11154
11343
  sourceNodeData: null
11155
11344
  });
11156
- const [questMode, setQuestMode] = (0, import_react26.useState)({ isActive: false });
11157
- const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react26.useState)(false);
11158
- const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react26.useState)(false);
11159
- 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)({
11160
11349
  isActive: false,
11161
11350
  tree: null,
11162
11351
  selectedParentId: null,
@@ -11167,41 +11356,41 @@ function XViewScene({
11167
11356
  ancestryDescriptionSections: [],
11168
11357
  isAddingNodes: false
11169
11358
  });
11170
- const [readingMode, setReadingMode] = (0, import_react26.useState)({
11359
+ const [readingMode, setReadingMode] = (0, import_react27.useState)({
11171
11360
  isActive: false,
11172
11361
  ancestry: null,
11173
11362
  branchStack: [],
11174
11363
  autoAbstraction: false
11175
11364
  });
11176
- const [formPosition, setFormPosition] = (0, import_react26.useState)({
11365
+ const [formPosition, setFormPosition] = (0, import_react27.useState)({
11177
11366
  left: 16,
11178
11367
  top: 16,
11179
11368
  opacity: 0
11180
11369
  });
11181
- const [detailsNode, setDetailsNode] = (0, import_react26.useState)(null);
11182
- const [detailsLink, setDetailsLink] = (0, import_react26.useState)(null);
11183
- const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react26.useState)(null);
11184
- 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)({
11185
11374
  visible: false,
11186
11375
  images: [],
11187
11376
  startIndex: 0
11188
11377
  });
11189
- const [editingAncestryRel, setEditingAncestryRel] = (0, import_react26.useState)({
11378
+ const [editingAncestryRel, setEditingAncestryRel] = (0, import_react27.useState)({
11190
11379
  visible: false,
11191
11380
  data: null,
11192
11381
  path: null
11193
11382
  });
11194
- const [isImportModalOpen, setIsImportModalOpen] = (0, import_react26.useState)(false);
11195
- const [importSuccessMessage, setImportSuccessMessage] = (0, import_react26.useState)("");
11196
- const [invalidTargetError, setInvalidTargetError] = (0, import_react26.useState)(null);
11197
- const [highlightedNodeId, setHighlightedNodeId] = (0, import_react26.useState)(null);
11198
- const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react26.useState)(false);
11199
- const [ancestryBoardData, setAncestryBoardData] = (0, import_react26.useState)([]);
11200
- const [isSidebarOpen, setIsSidebarOpen] = (0, import_react26.useState)(false);
11201
- const mountRef = (0, import_react26.useRef)(null);
11202
- const tooltipRef = (0, import_react26.useRef)(null);
11203
- const formRef = (0, import_react26.useRef)(null);
11204
- 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)({
11205
11394
  readMode: {
11206
11395
  currentMaxIndex: 0,
11207
11396
  progressMap: {}
@@ -11265,10 +11454,10 @@ function XViewScene({
11265
11454
  minWidth: 320,
11266
11455
  maxWidth: maxReadPanelW
11267
11456
  });
11268
- (0, import_react26.useEffect)(() => {
11457
+ (0, import_react27.useEffect)(() => {
11269
11458
  stateRef.current.ancestry = ancestryMode;
11270
11459
  }, [ancestryMode]);
11271
- (0, import_react26.useEffect)(() => {
11460
+ (0, import_react27.useEffect)(() => {
11272
11461
  var _a2;
11273
11462
  if (!isInitialized) return;
11274
11463
  const map = /* @__PURE__ */ new Map();
@@ -11291,10 +11480,10 @@ function XViewScene({
11291
11480
  }
11292
11481
  stateRef.current.nodeIdToParentFileMap = map;
11293
11482
  }, [isInitialized, sceneVersion]);
11294
- const handleNavigateBack = (0, import_react26.useCallback)(() => {
11483
+ const handleNavigateBack = (0, import_react27.useCallback)(() => {
11295
11484
  router.push("/dashboard/scenes");
11296
11485
  }, [router]);
11297
- const handleConfirmImport = (0, import_react26.useCallback)(
11486
+ const handleConfirmImport = (0, import_react27.useCallback)(
11298
11487
  async (importPayload) => {
11299
11488
  var _a2, _b2;
11300
11489
  let files = [];
@@ -11422,7 +11611,7 @@ function XViewScene({
11422
11611
  const handleOpenImageViewer = (images, startIndex) => {
11423
11612
  setImageViewer({ visible: true, images, startIndex });
11424
11613
  };
11425
- const tweenToTarget = (0, import_react26.useCallback)(
11614
+ const tweenToTarget = (0, import_react27.useCallback)(
11426
11615
  (target, zoomFactor = 1, forcedDirection = null) => {
11427
11616
  const { camera, controls, tweenGroup } = stateRef.current;
11428
11617
  if (!camera || !controls || !tweenGroup) return;
@@ -11448,7 +11637,7 @@ function XViewScene({
11448
11637
  if (!t || typeof t.closest !== "function") return false;
11449
11638
  return !!t.closest(".ui-overlay");
11450
11639
  };
11451
- const buildFullAncestryTree = (0, import_react26.useCallback)(
11640
+ const buildFullAncestryTree = (0, import_react27.useCallback)(
11452
11641
  (idTree, nodes, ancestries = []) => {
11453
11642
  if (!idTree) return null;
11454
11643
  const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
@@ -11533,7 +11722,7 @@ function XViewScene({
11533
11722
  },
11534
11723
  []
11535
11724
  );
11536
- const handleActivateTimeline = (0, import_react26.useCallback)(() => {
11725
+ const handleActivateTimeline = (0, import_react27.useCallback)(() => {
11537
11726
  const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
11538
11727
  if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
11539
11728
  while (timelineIntervalsGroup.children.length > 0) {
@@ -11693,7 +11882,7 @@ function XViewScene({
11693
11882
  }
11694
11883
  });
11695
11884
  }, []);
11696
- const handleVersionTimeline = (0, import_react26.useCallback)((sourceMesh, versionMeshes) => {
11885
+ const handleVersionTimeline = (0, import_react27.useCallback)((sourceMesh, versionMeshes) => {
11697
11886
  const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
11698
11887
  if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
11699
11888
  return;
@@ -11830,7 +12019,7 @@ function XViewScene({
11830
12019
  }
11831
12020
  });
11832
12021
  }, []);
11833
- (0, import_react26.useEffect)(() => {
12022
+ (0, import_react27.useEffect)(() => {
11834
12023
  async function fetchAllData(configPath, ownerId2) {
11835
12024
  var _a2, _b2;
11836
12025
  if (!get_scene_view_data) {
@@ -11932,12 +12121,12 @@ function XViewScene({
11932
12121
  focusNodeId,
11933
12122
  focusAncestryId
11934
12123
  ]);
11935
- const isNodeInView = (0, import_react26.useCallback)((id) => {
12124
+ const isNodeInView = (0, import_react27.useCallback)((id) => {
11936
12125
  const key = String(id);
11937
12126
  const objs = stateRef.current.nodeObjects || {};
11938
12127
  return !!objs[key];
11939
12128
  }, []);
11940
- const addOrUpdateNodeMesh = (0, import_react26.useCallback)(
12129
+ const addOrUpdateNodeMesh = (0, import_react27.useCallback)(
11941
12130
  (nodeData, position, suppressVersionUpdate = false) => {
11942
12131
  const {
11943
12132
  graphGroup,
@@ -11977,7 +12166,7 @@ function XViewScene({
11977
12166
  },
11978
12167
  []
11979
12168
  );
11980
- (0, import_react26.useEffect)(() => {
12169
+ (0, import_react27.useEffect)(() => {
11981
12170
  if (!isInitialized || !sceneDataRef.current) return;
11982
12171
  const currentMount = mountRef.current;
11983
12172
  if (!currentMount) return;
@@ -12733,7 +12922,7 @@ function XViewScene({
12733
12922
  get_scene_view_data,
12734
12923
  save_view_data
12735
12924
  ]);
12736
- const handleGhostNodeImageChange = (0, import_react26.useCallback)((useImage, imageUrl) => {
12925
+ const handleGhostNodeImageChange = (0, import_react27.useCallback)((useImage, imageUrl) => {
12737
12926
  const {
12738
12927
  node: ghostNode,
12739
12928
  line: ghostLine,
@@ -12781,7 +12970,7 @@ function XViewScene({
12781
12970
  aura: newGhostNode.getObjectByName("aura")
12782
12971
  };
12783
12972
  }, []);
12784
- const handleGhostNodeIntensityChange = (0, import_react26.useCallback)((newIntensity) => {
12973
+ const handleGhostNodeIntensityChange = (0, import_react27.useCallback)((newIntensity) => {
12785
12974
  const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
12786
12975
  if (!ghostNode) return;
12787
12976
  const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
@@ -12802,7 +12991,7 @@ function XViewScene({
12802
12991
  ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
12803
12992
  }
12804
12993
  }, []);
12805
- const handleDetailNodeIntensityChange = (0, import_react26.useCallback)(
12994
+ const handleDetailNodeIntensityChange = (0, import_react27.useCallback)(
12806
12995
  (nodeId, newIntensity) => {
12807
12996
  const mesh = stateRef.current.nodeObjects[String(nodeId)];
12808
12997
  if (!mesh) return;
@@ -12958,7 +13147,7 @@ function XViewScene({
12958
13147
  mountRef.current.style.cursor = "default";
12959
13148
  }
12960
13149
  };
12961
- const handleAncestryTreeUpdate = (0, import_react26.useCallback)((newTree, extraData = null) => {
13150
+ const handleAncestryTreeUpdate = (0, import_react27.useCallback)((newTree, extraData = null) => {
12962
13151
  setAncestryMode((prev) => {
12963
13152
  const prevTreeStr = JSON.stringify(prev.tree);
12964
13153
  const newTreeStr = JSON.stringify(newTree);
@@ -12981,7 +13170,7 @@ function XViewScene({
12981
13170
  };
12982
13171
  });
12983
13172
  }, []);
12984
- const actionHandlerContext = (0, import_react26.useMemo)(
13173
+ const actionHandlerContext = (0, import_react27.useMemo)(
12985
13174
  () => {
12986
13175
  var _a2;
12987
13176
  return {
@@ -13042,8 +13231,8 @@ function XViewScene({
13042
13231
  const handleStartVersioning = (nodeData) => {
13043
13232
  userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
13044
13233
  };
13045
- const handleStartQuestQuick = (0, import_react26.useCallback)((questNode) => {
13046
- var _a2;
13234
+ const handleStartQuestQuick = (0, import_react27.useCallback)((questNode) => {
13235
+ var _a2, _b2, _c2;
13047
13236
  if (!questNode || !actionHandlerContext) return;
13048
13237
  const {
13049
13238
  labelObject,
@@ -13054,17 +13243,103 @@ function XViewScene({
13054
13243
  timelineEndLabel,
13055
13244
  ...cleanQuestNode
13056
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
+ }];
13057
13252
  const updatedNode = {
13058
13253
  ...cleanQuestNode,
13059
13254
  status: "In Progress",
13060
13255
  color: "#eab308",
13061
- 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
13062
13258
  };
13063
13259
  if (userActionHandlers.handleSaveNodeDetails) {
13064
13260
  userActionHandlers.handleSaveNodeDetails(actionHandlerContext, updatedNode);
13065
13261
  }
13066
13262
  }, [session, actionHandlerContext]);
13067
- 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)(() => {
13068
13343
  const { graphGroup, ghostElements } = stateRef.current;
13069
13344
  if (ghostElements.node && graphGroup) {
13070
13345
  if (ghostElements.node.userData.labelObject) {
@@ -13215,7 +13490,7 @@ function XViewScene({
13215
13490
  }
13216
13491
  userActionHandlers.handleCancelConnection(context);
13217
13492
  };
13218
- const handleClearAncestryVisuals = (0, import_react26.useCallback)((ancestryId) => {
13493
+ const handleClearAncestryVisuals = (0, import_react27.useCallback)((ancestryId) => {
13219
13494
  const { renderedAncestries, ancestryGroup } = stateRef.current;
13220
13495
  const renderIndex = renderedAncestries.findIndex(
13221
13496
  (a) => String(a.id) === String(ancestryId)
@@ -13233,7 +13508,7 @@ function XViewScene({
13233
13508
  );
13234
13509
  }
13235
13510
  }, []);
13236
- const handleRenderAncestry = (0, import_react26.useCallback)(
13511
+ const handleRenderAncestry = (0, import_react27.useCallback)(
13237
13512
  async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
13238
13513
  setContextMenu(
13239
13514
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -13727,7 +14002,7 @@ function XViewScene({
13727
14002
  ancestryMode.isActive
13728
14003
  ]
13729
14004
  );
13730
- const handleRenderAbstractionTree = (0, import_react26.useCallback)(
14005
+ const handleRenderAbstractionTree = (0, import_react27.useCallback)(
13731
14006
  (ancestryObject, targetNodeId = null) => {
13732
14007
  setContextMenu(
13733
14008
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -13815,7 +14090,7 @@ function XViewScene({
13815
14090
  handleClearAncestryVisuals
13816
14091
  ]
13817
14092
  );
13818
- const handleReadModeBranchNav = (0, import_react26.useCallback)(
14093
+ const handleReadModeBranchNav = (0, import_react27.useCallback)(
13819
14094
  (nodeId, action, direction = "right") => {
13820
14095
  const { ancestry, branchStack } = readingMode;
13821
14096
  if (!ancestry || !ancestry.tree) return;
@@ -13993,13 +14268,13 @@ function XViewScene({
13993
14268
  },
13994
14269
  [readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
13995
14270
  );
13996
- const handleReadModeHighlight = (0, import_react26.useCallback)((nodeId) => {
14271
+ const handleReadModeHighlight = (0, import_react27.useCallback)((nodeId) => {
13997
14272
  if (stateRef.current.highlightedNodeId !== nodeId) {
13998
14273
  stateRef.current.highlightedNodeId = nodeId;
13999
14274
  }
14000
14275
  setHighlightedNodeId(nodeId);
14001
14276
  }, []);
14002
- const activeNodeBranches = (0, import_react26.useMemo)(() => {
14277
+ const activeNodeBranches = (0, import_react27.useMemo)(() => {
14003
14278
  if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
14004
14279
  return null;
14005
14280
  const fullTree = buildFullAncestryTree(
@@ -14043,7 +14318,7 @@ function XViewScene({
14043
14318
  readingMode.branchStack,
14044
14319
  ancestryDataRef.current
14045
14320
  ]);
14046
- const backNavigationInfo = (0, import_react26.useMemo)(() => {
14321
+ const backNavigationInfo = (0, import_react27.useMemo)(() => {
14047
14322
  const { branchStack } = readingMode;
14048
14323
  if (!branchStack || branchStack.length === 0) return null;
14049
14324
  const lastStep = branchStack[branchStack.length - 1];
@@ -14054,7 +14329,7 @@ function XViewScene({
14054
14329
  name: "Voltar para anterior"
14055
14330
  };
14056
14331
  }, [readingMode.branchStack]);
14057
- const getReadModeDisplayContext = (0, import_react26.useMemo)(() => {
14332
+ const getReadModeDisplayContext = (0, import_react27.useMemo)(() => {
14058
14333
  const { ancestry, branchStack } = readingMode;
14059
14334
  if (!ancestry) return null;
14060
14335
  if (branchStack.length === 0) {
@@ -14097,7 +14372,7 @@ function XViewScene({
14097
14372
  customProperties: branchProps
14098
14373
  };
14099
14374
  }, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
14100
- const readModeAbstractionTree = (0, import_react26.useMemo)(() => {
14375
+ const readModeAbstractionTree = (0, import_react27.useMemo)(() => {
14101
14376
  if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
14102
14377
  return null;
14103
14378
  }
@@ -14116,7 +14391,7 @@ function XViewScene({
14116
14391
  buildFullAncestryTree,
14117
14392
  sceneVersion
14118
14393
  ]);
14119
- const handleStartReadingAncestry = (0, import_react26.useCallback)(
14394
+ const handleStartReadingAncestry = (0, import_react27.useCallback)(
14120
14395
  async (ancestryObject, renderMode = "full") => {
14121
14396
  setContextMenu(
14122
14397
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -14159,7 +14434,7 @@ function XViewScene({
14159
14434
  },
14160
14435
  [handleRenderAncestry, handleRenderAbstractionTree]
14161
14436
  );
14162
- const handleReadModeSectionChange = (0, import_react26.useCallback)(
14437
+ const handleReadModeSectionChange = (0, import_react27.useCallback)(
14163
14438
  (activeSectionId) => {
14164
14439
  const { ancestry, branchStack } = readingMode;
14165
14440
  if (!ancestry || !readingMode.isActive) return;
@@ -14244,10 +14519,10 @@ function XViewScene({
14244
14519
  ancestryDataRef.current
14245
14520
  ]
14246
14521
  );
14247
- const handleCloseReadMode = (0, import_react26.useCallback)(() => {
14522
+ const handleCloseReadMode = (0, import_react27.useCallback)(() => {
14248
14523
  setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
14249
14524
  }, []);
14250
- const handleAncestrySectionChange = (0, import_react26.useCallback)(
14525
+ const handleAncestrySectionChange = (0, import_react27.useCallback)(
14251
14526
  (activeSectionId, ancestryOverride = null, rotation = 0) => {
14252
14527
  var _a2, _b2;
14253
14528
  const currentMode = stateRef.current.ancestry;
@@ -14309,7 +14584,7 @@ function XViewScene({
14309
14584
  },
14310
14585
  [handleRenderAncestry]
14311
14586
  );
14312
- const handleEditAncestry = (0, import_react26.useCallback)(
14587
+ const handleEditAncestry = (0, import_react27.useCallback)(
14313
14588
  async (ancestryObject) => {
14314
14589
  setContextMenu(
14315
14590
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -14364,7 +14639,7 @@ function XViewScene({
14364
14639
  const handleSelectAncestryParent = (nodeId) => {
14365
14640
  setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
14366
14641
  };
14367
- const handleRemoveFromAncestry = (0, import_react26.useCallback)((pathToRemove) => {
14642
+ const handleRemoveFromAncestry = (0, import_react27.useCallback)((pathToRemove) => {
14368
14643
  if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
14369
14644
  console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
14370
14645
  return;
@@ -14389,7 +14664,7 @@ function XViewScene({
14389
14664
  return { ...prev, tree: newTree };
14390
14665
  });
14391
14666
  }, []);
14392
- const handleSaveAncestry = (0, import_react26.useCallback)(
14667
+ const handleSaveAncestry = (0, import_react27.useCallback)(
14393
14668
  async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
14394
14669
  const treeToUse = treeOverride || ancestryMode.tree;
14395
14670
  const { isEditMode, currentAncestryId } = ancestryMode;
@@ -14625,7 +14900,7 @@ function XViewScene({
14625
14900
  });
14626
14901
  setEditingAncestryRel({ visible: false, data: null, path: null });
14627
14902
  };
14628
- const handleDeleteAncestry = (0, import_react26.useCallback)(
14903
+ const handleDeleteAncestry = (0, import_react27.useCallback)(
14629
14904
  async (ancestryIdToDelete) => {
14630
14905
  if (!ancestryIdToDelete) {
14631
14906
  alert("ID da ancestralidade n\xE3o encontrado.");
@@ -14707,10 +14982,10 @@ function XViewScene({
14707
14982
  },
14708
14983
  [save_view_data, delete_file_action]
14709
14984
  );
14710
- const handleOpenAncestryBoard = (0, import_react26.useCallback)(() => {
14985
+ const handleOpenAncestryBoard = (0, import_react27.useCallback)(() => {
14711
14986
  setIsAncestryBoardOpen(true);
14712
14987
  }, []);
14713
- const handleSelectAncestryFromBoard = (0, import_react26.useCallback)(
14988
+ const handleSelectAncestryFromBoard = (0, import_react27.useCallback)(
14714
14989
  (ancestry) => {
14715
14990
  setIsAncestryBoardOpen(false);
14716
14991
  setIsSidebarOpen(false);
@@ -14718,7 +14993,7 @@ function XViewScene({
14718
14993
  },
14719
14994
  [handleStartReadingAncestry]
14720
14995
  );
14721
- const handleSaveAncestryBoard = (0, import_react26.useCallback)(
14996
+ const handleSaveAncestryBoard = (0, import_react27.useCallback)(
14722
14997
  async (groups) => {
14723
14998
  if (!sceneConfigId || !viewParams || !session) return;
14724
14999
  const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
@@ -14732,7 +15007,7 @@ function XViewScene({
14732
15007
  },
14733
15008
  [sceneConfigId, viewParams, session, save_ancestry_board_action, ownerId]
14734
15009
  );
14735
- const existingNodeTypes = (0, import_react26.useMemo)(() => {
15010
+ const existingNodeTypes = (0, import_react27.useMemo)(() => {
14736
15011
  if (!parentDataRef.current) {
14737
15012
  return [];
14738
15013
  }
@@ -14744,7 +15019,7 @@ function XViewScene({
14744
15019
  ).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
14745
15020
  return [...new Set(allTypes)];
14746
15021
  }, [parentDataRef.current, sceneVersion]);
14747
- const searchableDbNodes = (0, import_react26.useMemo)(() => {
15022
+ const searchableDbNodes = (0, import_react27.useMemo)(() => {
14748
15023
  if (!parentDataRef.current) {
14749
15024
  return [];
14750
15025
  }
@@ -14759,7 +15034,7 @@ function XViewScene({
14759
15034
  return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
14760
15035
  });
14761
15036
  }, [parentDataRef.current, sceneVersion]);
14762
- const handleAddExistingNode = (0, import_react26.useCallback)(
15037
+ const handleAddExistingNode = (0, import_react27.useCallback)(
14763
15038
  (nodeId) => {
14764
15039
  return userActionHandlers.handleAddExistingNodeById(
14765
15040
  actionHandlerContext,
@@ -14768,7 +15043,7 @@ function XViewScene({
14768
15043
  },
14769
15044
  [actionHandlerContext]
14770
15045
  );
14771
- const handleSaveCurrentView = (0, import_react26.useCallback)(async () => {
15046
+ const handleSaveCurrentView = (0, import_react27.useCallback)(async () => {
14772
15047
  var _a2, _b2, _c2;
14773
15048
  const { nodeObjects, allLinks } = stateRef.current;
14774
15049
  if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
@@ -14809,16 +15084,16 @@ function XViewScene({
14809
15084
  console.error("Erro na chamada de save_view_data:", error);
14810
15085
  }
14811
15086
  }, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
14812
- const allAvailableNodes = (0, import_react26.useMemo)(() => {
15087
+ const allAvailableNodes = (0, import_react27.useMemo)(() => {
14813
15088
  if (!parentDataRef.current) return [];
14814
15089
  return Object.values(parentDataRef.current).flatMap(
14815
15090
  (fileData) => fileData.nodes || []
14816
15091
  );
14817
15092
  }, [sceneVersion, isInitialized]);
14818
- const allAvailableAncestries = (0, import_react26.useMemo)(() => {
15093
+ const allAvailableAncestries = (0, import_react27.useMemo)(() => {
14819
15094
  return ancestryDataRef.current || [];
14820
15095
  }, [sceneVersion, isInitialized]);
14821
- const handleOpenReference = (0, import_react26.useCallback)(
15096
+ const handleOpenReference = (0, import_react27.useCallback)(
14822
15097
  (referenceData) => {
14823
15098
  const { type, id } = referenceData;
14824
15099
  if (type === "node") {
@@ -14857,13 +15132,13 @@ function XViewScene({
14857
15132
  tweenToTarget
14858
15133
  ]
14859
15134
  );
14860
- const handleToggleAncestryAddMode = (0, import_react26.useCallback)(() => {
15135
+ const handleToggleAncestryAddMode = (0, import_react27.useCallback)(() => {
14861
15136
  setAncestryMode((prev) => ({
14862
15137
  ...prev,
14863
15138
  isAddingNodes: !prev.isAddingNodes
14864
15139
  }));
14865
15140
  }, []);
14866
- const handleFocusNode = (0, import_react26.useCallback)(
15141
+ const handleFocusNode = (0, import_react27.useCallback)(
14867
15142
  (nodeData) => {
14868
15143
  if (!nodeData) return;
14869
15144
  const nodeMesh = stateRef.current.nodeObjects[String(nodeData.id)];
@@ -14873,7 +15148,7 @@ function XViewScene({
14873
15148
  },
14874
15149
  [tweenToTarget]
14875
15150
  );
14876
- const availableDatasets = (0, import_react26.useMemo)(() => {
15151
+ const availableDatasets = (0, import_react27.useMemo)(() => {
14877
15152
  if (!sceneDataRef.current || !parentDataRef.current) return [];
14878
15153
  return sceneDataRef.current.parent_dbs.map((db) => {
14879
15154
  var _a2;
@@ -14887,7 +15162,7 @@ function XViewScene({
14887
15162
  String(creationMode.sourceNodeData.id)
14888
15163
  )) == null ? void 0 : _b.parentFileId : null;
14889
15164
  const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
14890
- (0, import_react26.useEffect)(() => {
15165
+ (0, import_react27.useEffect)(() => {
14891
15166
  if (isInitialized && focusNodeId && !hasFocusedInitial) {
14892
15167
  const nodeObjects = stateRef.current.nodeObjects || {};
14893
15168
  const targetMesh = nodeObjects[String(focusNodeId)];
@@ -14910,7 +15185,7 @@ function XViewScene({
14910
15185
  hasFocusedInitial,
14911
15186
  tweenToTarget
14912
15187
  ]);
14913
- (0, import_react26.useEffect)(() => {
15188
+ (0, import_react27.useEffect)(() => {
14914
15189
  if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
14915
15190
  const ancestries = ancestryDataRef.current || [];
14916
15191
  const targetAncestry = ancestries.find(
@@ -14935,7 +15210,7 @@ function XViewScene({
14935
15210
  hasOpenedInitialAncestry,
14936
15211
  handleStartReadingAncestry
14937
15212
  ]);
14938
- (0, import_react26.useEffect)(() => {
15213
+ (0, import_react27.useEffect)(() => {
14939
15214
  function handleKeyDown(event) {
14940
15215
  var _a2, _b2, _c2;
14941
15216
  const context = actionHandlerContext;
@@ -15058,10 +15333,10 @@ function XViewScene({
15058
15333
  // <-- handleCancelQuest adicionado aqui
15059
15334
  ]);
15060
15335
  if (isLoading || status === "loading" || permissionStatus === "loading") {
15061
- return /* @__PURE__ */ import_react26.default.createElement(LoadingScreen, null);
15336
+ return /* @__PURE__ */ import_react27.default.createElement(LoadingScreen, null);
15062
15337
  }
15063
15338
  if (permissionStatus === "denied") {
15064
- 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(
15065
15340
  "svg",
15066
15341
  {
15067
15342
  xmlns: "http://www.w3.org/2000/svg",
@@ -15071,7 +15346,7 @@ function XViewScene({
15071
15346
  stroke: "currentColor",
15072
15347
  className: "w-16 h-16 mx-auto"
15073
15348
  },
15074
- /* @__PURE__ */ import_react26.default.createElement(
15349
+ /* @__PURE__ */ import_react27.default.createElement(
15075
15350
  "path",
15076
15351
  {
15077
15352
  strokeLinecap: "round",
@@ -15079,13 +15354,13 @@ function XViewScene({
15079
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"
15080
15355
  }
15081
15356
  )
15082
- )), /* @__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(
15083
15358
  "button",
15084
15359
  {
15085
15360
  onClick: () => router.push("/dashboard/scenes"),
15086
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"
15087
15362
  },
15088
- /* @__PURE__ */ import_react26.default.createElement(
15363
+ /* @__PURE__ */ import_react27.default.createElement(
15089
15364
  "svg",
15090
15365
  {
15091
15366
  xmlns: "http://www.w3.org/2000/svg",
@@ -15095,7 +15370,7 @@ function XViewScene({
15095
15370
  stroke: "currentColor",
15096
15371
  className: "w-5 h-5"
15097
15372
  },
15098
- /* @__PURE__ */ import_react26.default.createElement(
15373
+ /* @__PURE__ */ import_react27.default.createElement(
15099
15374
  "path",
15100
15375
  {
15101
15376
  strokeLinecap: "round",
@@ -15107,7 +15382,7 @@ function XViewScene({
15107
15382
  "Voltar para Scenes"
15108
15383
  )));
15109
15384
  }
15110
- return /* @__PURE__ */ import_react26.default.createElement(
15385
+ return /* @__PURE__ */ import_react27.default.createElement(
15111
15386
  "div",
15112
15387
  {
15113
15388
  ref: mountRef,
@@ -15119,7 +15394,7 @@ function XViewScene({
15119
15394
  cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
15120
15395
  }
15121
15396
  },
15122
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react26.default.createElement(
15397
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react27.default.createElement(
15123
15398
  XViewSidebar,
15124
15399
  {
15125
15400
  dbNodes: searchableDbNodes,
@@ -15139,7 +15414,7 @@ function XViewScene({
15139
15414
  userRole: userPermissionRole
15140
15415
  }
15141
15416
  ),
15142
- creationMode.isActive && /* @__PURE__ */ import_react26.default.createElement(
15417
+ creationMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
15143
15418
  InSceneCreationForm,
15144
15419
  {
15145
15420
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -15171,7 +15446,7 @@ function XViewScene({
15171
15446
  availableAncestries: allAvailableAncestries
15172
15447
  }
15173
15448
  ),
15174
- versionMode.isActive && /* @__PURE__ */ import_react26.default.createElement(
15449
+ versionMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
15175
15450
  InSceneVersionForm,
15176
15451
  {
15177
15452
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -15197,7 +15472,7 @@ function XViewScene({
15197
15472
  availableAncestries: allAvailableAncestries
15198
15473
  }
15199
15474
  ),
15200
- questMode.isActive && /* @__PURE__ */ import_react26.default.createElement(
15475
+ questMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
15201
15476
  InSceneQuestForm,
15202
15477
  {
15203
15478
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -15223,7 +15498,7 @@ function XViewScene({
15223
15498
  viewMembers
15224
15499
  }
15225
15500
  ),
15226
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react26.default.createElement(
15501
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react27.default.createElement(
15227
15502
  "div",
15228
15503
  {
15229
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"}`,
@@ -15236,7 +15511,7 @@ function XViewScene({
15236
15511
  maxWidth: "92vw"
15237
15512
  }
15238
15513
  },
15239
- /* @__PURE__ */ import_react26.default.createElement(
15514
+ /* @__PURE__ */ import_react27.default.createElement(
15240
15515
  "div",
15241
15516
  {
15242
15517
  onPointerDown: (e) => {
@@ -15247,7 +15522,7 @@ function XViewScene({
15247
15522
  title: "Arraste para redimensionar"
15248
15523
  }
15249
15524
  ),
15250
- /* @__PURE__ */ import_react26.default.createElement(
15525
+ /* @__PURE__ */ import_react27.default.createElement(
15251
15526
  DescriptionReadModePanel,
15252
15527
  {
15253
15528
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -15282,7 +15557,7 @@ function XViewScene({
15282
15557
  }
15283
15558
  )
15284
15559
  ),
15285
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react26.default.createElement(
15560
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react27.default.createElement(
15286
15561
  CreateAncestryPanel,
15287
15562
  {
15288
15563
  ancestryMode,
@@ -15318,7 +15593,7 @@ function XViewScene({
15318
15593
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
15319
15594
  }
15320
15595
  ),
15321
- editingAncestryRel.visible && /* @__PURE__ */ import_react26.default.createElement(
15596
+ editingAncestryRel.visible && /* @__PURE__ */ import_react27.default.createElement(
15322
15597
  AncestryRelationshipPanel,
15323
15598
  {
15324
15599
  data: editingAncestryRel.data,
@@ -15332,7 +15607,7 @@ function XViewScene({
15332
15607
  onUploadFile: upload_file_action
15333
15608
  }
15334
15609
  ),
15335
- detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react26.default.createElement(
15610
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
15336
15611
  QuestDetailsPanel,
15337
15612
  {
15338
15613
  node: detailsNode,
@@ -15354,7 +15629,7 @@ function XViewScene({
15354
15629
  viewMembers
15355
15630
  }
15356
15631
  ),
15357
- detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react26.default.createElement(
15632
+ detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
15358
15633
  NodeDetailsPanel,
15359
15634
  {
15360
15635
  node: detailsNode,
@@ -15386,7 +15661,7 @@ function XViewScene({
15386
15661
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
15387
15662
  }
15388
15663
  ),
15389
- detailsLink && /* @__PURE__ */ import_react26.default.createElement(
15664
+ detailsLink && /* @__PURE__ */ import_react27.default.createElement(
15390
15665
  RelationshipDetailsPanel,
15391
15666
  {
15392
15667
  link: detailsLink,
@@ -15400,7 +15675,7 @@ function XViewScene({
15400
15675
  userRole: userPermissionRole
15401
15676
  }
15402
15677
  ),
15403
- ancestryLinkDetails && /* @__PURE__ */ import_react26.default.createElement(
15678
+ ancestryLinkDetails && /* @__PURE__ */ import_react27.default.createElement(
15404
15679
  AncestryLinkDetailsPanel,
15405
15680
  {
15406
15681
  data: ancestryLinkDetails,
@@ -15411,7 +15686,7 @@ function XViewScene({
15411
15686
  onUploadFile: upload_file_action
15412
15687
  }
15413
15688
  ),
15414
- /* @__PURE__ */ import_react26.default.createElement(
15689
+ /* @__PURE__ */ import_react27.default.createElement(
15415
15690
  "div",
15416
15691
  {
15417
15692
  ref: tooltipRef,
@@ -15438,7 +15713,7 @@ function XViewScene({
15438
15713
  }
15439
15714
  }
15440
15715
  ),
15441
- /* @__PURE__ */ import_react26.default.createElement(
15716
+ /* @__PURE__ */ import_react27.default.createElement(
15442
15717
  ContextMenu,
15443
15718
  {
15444
15719
  data: contextMenu,
@@ -15467,10 +15742,11 @@ function XViewScene({
15467
15742
  onFocusNode: handleFocusNode,
15468
15743
  viewMembers,
15469
15744
  currentUser: session == null ? void 0 : session.user,
15470
- onStartQuest: handleStartQuestQuick
15745
+ onStartQuest: handleStartQuestQuick,
15746
+ onFinishQuest: handleFinishQuestQuick
15471
15747
  }
15472
15748
  ),
15473
- /* @__PURE__ */ import_react26.default.createElement(
15749
+ /* @__PURE__ */ import_react27.default.createElement(
15474
15750
  MultiNodeContextMenu,
15475
15751
  {
15476
15752
  data: multiContextMenu,
@@ -15490,7 +15766,7 @@ function XViewScene({
15490
15766
  )
15491
15767
  }
15492
15768
  ),
15493
- /* @__PURE__ */ import_react26.default.createElement(
15769
+ /* @__PURE__ */ import_react27.default.createElement(
15494
15770
  RelationshipContextMenu,
15495
15771
  {
15496
15772
  data: relationshipMenu,
@@ -15508,14 +15784,14 @@ function XViewScene({
15508
15784
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
15509
15785
  }
15510
15786
  ),
15511
- /* @__PURE__ */ import_react26.default.createElement(
15787
+ /* @__PURE__ */ import_react27.default.createElement(
15512
15788
  ImageViewer,
15513
15789
  {
15514
15790
  data: imageViewer,
15515
15791
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
15516
15792
  }
15517
15793
  ),
15518
- /* @__PURE__ */ import_react26.default.createElement(
15794
+ /* @__PURE__ */ import_react27.default.createElement(
15519
15795
  AncestryBoard,
15520
15796
  {
15521
15797
  isOpen: isAncestryBoardOpen,
@@ -15528,7 +15804,7 @@ function XViewScene({
15528
15804
  userRole: userPermissionRole
15529
15805
  }
15530
15806
  ),
15531
- /* @__PURE__ */ import_react26.default.createElement(
15807
+ /* @__PURE__ */ import_react27.default.createElement(
15532
15808
  ImportParentFileModal,
15533
15809
  {
15534
15810
  isOpen: isImportModalOpen,
@@ -15541,7 +15817,7 @@ function XViewScene({
15541
15817
  currentAncestries: ancestryDataRef.current || []
15542
15818
  }
15543
15819
  ),
15544
- invalidTargetError && /* @__PURE__ */ import_react26.default.createElement(
15820
+ invalidTargetError && /* @__PURE__ */ import_react27.default.createElement(
15545
15821
  "div",
15546
15822
  {
15547
15823
  className: "ui-overlay",
@@ -15566,13 +15842,13 @@ function XViewScene({
15566
15842
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
15567
15843
  }
15568
15844
  },
15569
- /* @__PURE__ */ import_react26.default.createElement("style", null, `
15845
+ /* @__PURE__ */ import_react27.default.createElement("style", null, `
15570
15846
  @keyframes fadeInDown {
15571
15847
  from { opacity: 0; transform: translate(-50%, -20px); }
15572
15848
  to { opacity: 1; transform: translate(-50%, 0); }
15573
15849
  }
15574
15850
  `),
15575
- /* @__PURE__ */ import_react26.default.createElement(
15851
+ /* @__PURE__ */ import_react27.default.createElement(
15576
15852
  "svg",
15577
15853
  {
15578
15854
  width: "20",
@@ -15584,12 +15860,12 @@ function XViewScene({
15584
15860
  strokeLinecap: "round",
15585
15861
  strokeLinejoin: "round"
15586
15862
  },
15587
- /* @__PURE__ */ import_react26.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
15588
- /* @__PURE__ */ import_react26.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
15589
- /* @__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" })
15590
15866
  ),
15591
- /* @__PURE__ */ import_react26.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
15592
- /* @__PURE__ */ import_react26.default.createElement(
15867
+ /* @__PURE__ */ import_react27.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
15868
+ /* @__PURE__ */ import_react27.default.createElement(
15593
15869
  "button",
15594
15870
  {
15595
15871
  onClick: () => setInvalidTargetError(null),