@lv-x-software-house/x_view 1.2.5-dev.26 → 1.2.5-dev.28

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 +609 -128
  2. package/dist/index.mjs +637 -131
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -347,13 +347,13 @@ function ContextMenu({
347
347
  });
348
348
  };
349
349
  const renderMainView = () => {
350
- var _a2, _b2, _c2, _d, _e;
350
+ var _a2, _b2, _c2, _d, _e, _f;
351
351
  const hasVersions = computedVersions.length > 0;
352
352
  const canCreateVersion = ability.can("create", "Versioning");
353
353
  const canReadVersion = ability.can("read", "Versioning");
354
354
  const shouldShowVersioningBtn = canCreateVersion || canReadVersion && hasVersions;
355
355
  const canStartQuest = isCurrentNodeQuest && (((_a2 = data.nodeData) == null ? void 0 : _a2.status) === "Backlog" || !((_b2 = data.nodeData) == null ? void 0 : _b2.status));
356
- const canFinishQuest = isCurrentNodeQuest && ((_c2 = data.nodeData) == null ? void 0 : _c2.assignee_id) === (currentUser == null ? void 0 : currentUser.id) && ((_d = data.nodeData) == null ? void 0 : _d.status) !== "Backlog";
356
+ const canFinishQuest = isCurrentNodeQuest && ((_c2 = data.nodeData) == null ? void 0 : _c2.assignee_id) === (currentUser == null ? void 0 : currentUser.id) && ((_d = data.nodeData) == null ? void 0 : _d.status) !== "Backlog" && ((_e = data.nodeData) == null ? void 0 : _e.status) !== "Done";
357
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(
358
358
  "button",
359
359
  {
@@ -374,11 +374,11 @@ function ContextMenu({
374
374
  onClose();
375
375
  },
376
376
  className: baseButtonClass,
377
- title: "Finalizar esta quest"
377
+ title: "Finalizar esta etapa e avan\xE7ar"
378
378
  },
379
379
  /* @__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: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }), /* @__PURE__ */ import_react.default.createElement("polyline", { points: "22 4 12 14.01 9 11.01" })),
380
- /* @__PURE__ */ import_react.default.createElement("span", null, "Finalizar Quest")
381
- ), (canStartQuest || canFinishQuest) && /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), 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") && !((_e = data.nodeData) == null ? void 0 : _e.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: () => {
380
+ /* @__PURE__ */ import_react.default.createElement("span", null, "Finalizar Etapa")
381
+ ), (canStartQuest || canFinishQuest) && /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), 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") && !((_f = data.nodeData) == null ? void 0 : _f.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: () => {
382
382
  onFocusNode == null ? void 0 : onFocusNode(data.nodeData);
383
383
  onClose();
384
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"))));
@@ -2500,7 +2500,8 @@ var userActionHandlers = {
2500
2500
  nodes: sceneDataRef.current.nodes,
2501
2501
  links: sceneDataRef.current.links,
2502
2502
  quest_nodes: specificParentData.nodes,
2503
- quest_links: specificParentData.links
2503
+ quest_links: specificParentData.links,
2504
+ quest_counter: sceneDataRef.current.quest_counter || 1
2504
2505
  };
2505
2506
  } else {
2506
2507
  filenameToSave = `x_view_dbs/${ownerId}/${parentFileId}`;
@@ -2697,7 +2698,8 @@ var userActionHandlers = {
2697
2698
  nodes: sceneDataRef.current.nodes,
2698
2699
  links: sceneDataRef.current.links,
2699
2700
  quest_nodes: originalData.nodes,
2700
- quest_links: originalData.links
2701
+ quest_links: originalData.links,
2702
+ quest_counter: sceneDataRef.current.quest_counter || 1
2701
2703
  };
2702
2704
  } else {
2703
2705
  filenameToSave = `x_view_dbs/${ownerId}/${parentFileId}`;
@@ -2762,7 +2764,8 @@ var userActionHandlers = {
2762
2764
  nodes: newVisualNodes,
2763
2765
  links: newVisualLinks,
2764
2766
  quest_nodes: specificParentData.nodes,
2765
- quest_links: specificParentData.links
2767
+ quest_links: specificParentData.links,
2768
+ quest_counter: sceneDataRef.current.quest_counter || 1
2766
2769
  };
2767
2770
  } else {
2768
2771
  filenameToSave = `x_view_dbs/${ownerId}/${parentFileId}`;
@@ -2823,7 +2826,8 @@ var userActionHandlers = {
2823
2826
  nodes: sceneDataRef.current.nodes,
2824
2827
  links: sceneDataRef.current.links,
2825
2828
  quest_nodes: specificParentData.nodes,
2826
- quest_links: specificParentData.links
2829
+ quest_links: specificParentData.links,
2830
+ quest_counter: sceneDataRef.current.quest_counter || 1
2827
2831
  };
2828
2832
  await context.actions.save_view_data(context.sceneSaveUrl, viewFilePayload);
2829
2833
  } else {
@@ -2870,7 +2874,8 @@ var userActionHandlers = {
2870
2874
  nodes: sceneDataRef.current.nodes,
2871
2875
  links: sceneDataRef.current.links,
2872
2876
  quest_nodes: specificParentData.nodes,
2873
- quest_links: specificParentData.links
2877
+ quest_links: specificParentData.links,
2878
+ quest_counter: sceneDataRef.current.quest_counter || 1
2874
2879
  };
2875
2880
  await context.actions.save_view_data(context.sceneSaveUrl, viewFilePayload);
2876
2881
  } else {
@@ -7826,7 +7831,9 @@ function InSceneCreationForm({
7826
7831
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react14.useState)(false);
7827
7832
  const [useImageAsTexture, setUseImageAsTexture] = (0, import_react14.useState)(false);
7828
7833
  const [selectedImageUrl, setSelectedImageUrl] = (0, import_react14.useState)(null);
7829
- const [targetDatasetId, setTargetDatasetId] = (0, import_react14.useState)(sourceNodeDatasetId || "");
7834
+ const [targetDatasetId, setTargetDatasetId] = (0, import_react14.useState)(
7835
+ sourceNodeDatasetId || ""
7836
+ );
7830
7837
  const [isDatasetDropdownOpen, setIsDatasetDropdownOpen] = (0, import_react14.useState)(false);
7831
7838
  const datasetDropdownRef = (0, import_react14.useRef)(null);
7832
7839
  (0, import_react14.useEffect)(() => {
@@ -7846,7 +7853,9 @@ function InSceneCreationForm({
7846
7853
  };
7847
7854
  }, [isDatasetDropdownOpen]);
7848
7855
  const propsEndRef = (0, import_react14.useRef)(null);
7849
- const hasImages = customProps.some((p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value));
7856
+ const hasImages = customProps.some(
7857
+ (p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value)
7858
+ );
7850
7859
  (0, import_react14.useEffect)(() => {
7851
7860
  if (!hasImages && useImageAsTexture) {
7852
7861
  setUseImageAsTexture(false);
@@ -7856,7 +7865,9 @@ function InSceneCreationForm({
7856
7865
  }, [hasImages, useImageAsTexture, onImageChange]);
7857
7866
  (0, import_react14.useEffect)(() => {
7858
7867
  let result = [];
7859
- const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
7868
+ const validExistingTypes = existingTypes.filter(
7869
+ (t) => t && typeof t === "string" && t.trim() !== ""
7870
+ );
7860
7871
  if (typeInput.trim() === "") {
7861
7872
  result = validExistingTypes.filter((t) => !types.includes(t));
7862
7873
  } else {
@@ -7865,13 +7876,20 @@ function InSceneCreationForm({
7865
7876
  const lowercasedInput = typeInput.toLowerCase();
7866
7877
  result = validExistingTypes.filter((t) => {
7867
7878
  if (!t) {
7868
- console.warn("InSceneCreationForm: Tipo encontrado como undefined/null durante filtragem");
7879
+ console.warn(
7880
+ "InSceneCreationForm: Tipo encontrado como undefined/null durante filtragem"
7881
+ );
7869
7882
  return false;
7870
7883
  }
7871
7884
  return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
7872
7885
  });
7873
7886
  } catch (err) {
7874
- console.error("InSceneCreationForm: Erro ao filtrar tipos:", err, "typeInput:", typeInput);
7887
+ console.error(
7888
+ "InSceneCreationForm: Erro ao filtrar tipos:",
7889
+ err,
7890
+ "typeInput:",
7891
+ typeInput
7892
+ );
7875
7893
  }
7876
7894
  }
7877
7895
  if (sourceTypes) {
@@ -7901,7 +7919,10 @@ function InSceneCreationForm({
7901
7919
  setCustomProps([...customProps, newProp]);
7902
7920
  setTimeout(() => {
7903
7921
  var _a2;
7904
- (_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({ behavior: "smooth", block: "center" });
7922
+ (_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
7923
+ behavior: "smooth",
7924
+ block: "center"
7925
+ });
7905
7926
  }, 100);
7906
7927
  };
7907
7928
  const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
@@ -8010,15 +8031,23 @@ function InSceneCreationForm({
8010
8031
  },
8011
8032
  /* @__PURE__ */ import_react14.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
8012
8033
  /* @__PURE__ */ import_react14.default.createElement("div", { className: "px-6 pt-5 pb-3" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react14.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_react14.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Criar & Conectar")), /* @__PURE__ */ import_react14.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Novo Node")),
8013
- /* @__PURE__ */ import_react14.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipo(s) do Node"), /* @__PURE__ */ import_react14.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_react14.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, /* @__PURE__ */ import_react14.default.createElement(
8014
- "button",
8034
+ /* @__PURE__ */ import_react14.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipo(s) do Node"), /* @__PURE__ */ import_react14.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_react14.default.createElement(
8035
+ "span",
8015
8036
  {
8016
- type: "button",
8017
- onClick: () => handleRemoveType(index),
8018
- className: "hover:text-white transition-colors"
8037
+ key: index,
8038
+ 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"
8019
8039
  },
8020
- /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiX, { size: 12 })
8021
- ))), /* @__PURE__ */ import_react14.default.createElement(
8040
+ t,
8041
+ /* @__PURE__ */ import_react14.default.createElement(
8042
+ "button",
8043
+ {
8044
+ type: "button",
8045
+ onClick: () => handleRemoveType(index),
8046
+ className: "hover:text-white transition-colors"
8047
+ },
8048
+ /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiX, { size: 12 })
8049
+ )
8050
+ )), /* @__PURE__ */ import_react14.default.createElement(
8022
8051
  "input",
8023
8052
  {
8024
8053
  type: "text",
@@ -8051,7 +8080,17 @@ function InSceneCreationForm({
8051
8080
  }
8052
8081
  },
8053
8082
  suggestedType
8054
- ))))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome do Node"), /* @__PURE__ */ import_react14.default.createElement("input", { required: true, type: "text", placeholder: "Ex.: Cliente XPTO", value: name, onChange: handleNameInputChange, 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" })), viewType === "view" && availableDatasets.length > 0 && /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5 relative", ref: datasetDropdownRef }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Criar Node no Dataset:"), /* @__PURE__ */ import_react14.default.createElement(
8083
+ ))))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome do Node"), /* @__PURE__ */ import_react14.default.createElement(
8084
+ "input",
8085
+ {
8086
+ required: true,
8087
+ type: "text",
8088
+ placeholder: "Ex.: Cliente XPTO",
8089
+ value: name,
8090
+ onChange: handleNameInputChange,
8091
+ 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"
8092
+ }
8093
+ )), viewType === "view" && availableDatasets.length > 0 && /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5 relative", ref: datasetDropdownRef }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Criar Node no Dataset:"), /* @__PURE__ */ import_react14.default.createElement(
8055
8094
  "button",
8056
8095
  {
8057
8096
  type: "button",
@@ -8059,7 +8098,12 @@ function InSceneCreationForm({
8059
8098
  className: "w-full flex items-center justify-between 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 hover:bg-slate-700/70 transition-colors text-slate-200 text-left"
8060
8099
  },
8061
8100
  /* @__PURE__ */ import_react14.default.createElement("span", { className: "truncate pr-2" }, selectedDatasetName),
8062
- /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiChevronDown, { className: `flex-shrink-0 text-slate-400 transition-transform ${isDatasetDropdownOpen ? "rotate-180" : ""}` })
8101
+ /* @__PURE__ */ import_react14.default.createElement(
8102
+ import_fi12.FiChevronDown,
8103
+ {
8104
+ className: `flex-shrink-0 text-slate-400 transition-transform ${isDatasetDropdownOpen ? "rotate-180" : ""}`
8105
+ }
8106
+ )
8063
8107
  ), isDatasetDropdownOpen && /* @__PURE__ */ import_react14.default.createElement("ul", { className: "custom-scrollbar absolute top-[66px] left-0 z-20 w-full max-h-48 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-xl py-1" }, availableDatasets.map((ds) => /* @__PURE__ */ import_react14.default.createElement(
8064
8108
  "li",
8065
8109
  {
@@ -8071,7 +8115,7 @@ function InSceneCreationForm({
8071
8115
  className: `px-3 py-2 text-sm cursor-pointer transition-colors ${targetDatasetId === ds.id ? "bg-indigo-600/40 text-indigo-200 font-medium" : "text-slate-300 hover:bg-white/5"}`
8072
8116
  },
8073
8117
  ds.name
8074
- )))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react14.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_react14.default.createElement(
8118
+ )))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react14.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_react14.default.createElement(
8075
8119
  DescriptionDisplay,
8076
8120
  {
8077
8121
  description,
@@ -8108,10 +8152,28 @@ function InSceneCreationForm({
8108
8152
  onClick: () => handleSizeChange(s),
8109
8153
  className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
8110
8154
  },
8111
- /* @__PURE__ */ import_react14.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 group-hover:border-slate-500"}` }, isSelected && /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiCheck, { size: 12, className: "text-white" })),
8112
- /* @__PURE__ */ import_react14.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}` }, s)
8155
+ /* @__PURE__ */ import_react14.default.createElement(
8156
+ "div",
8157
+ {
8158
+ 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 group-hover:border-slate-500"}`
8159
+ },
8160
+ isSelected && /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiCheck, { size: 12, className: "text-white" })
8161
+ ),
8162
+ /* @__PURE__ */ import_react14.default.createElement(
8163
+ "span",
8164
+ {
8165
+ className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}`
8166
+ },
8167
+ s
8168
+ )
8113
8169
  );
8114
- }))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor e Brilho"), hasImages && /* @__PURE__ */ import_react14.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react14.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_react14.default.createElement(import_fi12.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react14.default.createElement(
8170
+ }))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor e Brilho"), hasImages && /* @__PURE__ */ import_react14.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react14.default.createElement(
8171
+ "div",
8172
+ {
8173
+ 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"}`
8174
+ },
8175
+ useImageAsTexture && /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiCheck, { size: 12, className: "text-white" })
8176
+ ), /* @__PURE__ */ import_react14.default.createElement(
8115
8177
  "input",
8116
8178
  {
8117
8179
  type: "checkbox",
@@ -8119,7 +8181,13 @@ function InSceneCreationForm({
8119
8181
  onChange: handleToggleImageMode,
8120
8182
  className: "hidden"
8121
8183
  }
8122
- ), /* @__PURE__ */ import_react14.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_react14.default.createElement(
8184
+ ), /* @__PURE__ */ import_react14.default.createElement(
8185
+ "span",
8186
+ {
8187
+ className: `text-xs ${useImageAsTexture ? "text-indigo-300" : "text-slate-400 group-hover:text-slate-300"}`
8188
+ },
8189
+ "Usar imagem para representar o node"
8190
+ ))), /* @__PURE__ */ import_react14.default.createElement(
8123
8191
  ColorPicker,
8124
8192
  {
8125
8193
  color,
@@ -8138,7 +8206,22 @@ function InSceneCreationForm({
8138
8206
  className: "w-full h-1.5 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-indigo-500 hover:accent-indigo-400",
8139
8207
  title: `Intensidade do brilho: ${intensity}`
8140
8208
  }
8141
- ), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs text-slate-400 w-6 text-right" }, intensity)), /* @__PURE__ */ import_react14.default.createElement("span", { className: `text-xs block mt-1 transition-opacity ${useImageAsTexture ? "opacity-40" : "text-slate-400"}` }, useImageAsTexture ? "Cor da borda (definida pela imagem)" : "Selecione a cor e ajuste o brilho.")), /* @__PURE__ */ import_react14.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react14.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react14.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_react14.default.createElement(import_fi12.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react14.default.createElement(
8209
+ ), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs text-slate-400 w-6 text-right" }, intensity)), /* @__PURE__ */ import_react14.default.createElement(
8210
+ "span",
8211
+ {
8212
+ className: `text-xs block mt-1 transition-opacity ${useImageAsTexture ? "opacity-40" : "text-slate-400"}`
8213
+ },
8214
+ useImageAsTexture ? "Cor da borda (definida pela imagem)" : "Selecione a cor e ajuste o brilho."
8215
+ )), /* @__PURE__ */ import_react14.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react14.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react14.default.createElement(
8216
+ "button",
8217
+ {
8218
+ type: "button",
8219
+ onClick: handleAddProp,
8220
+ 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"
8221
+ },
8222
+ /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiPlus, { size: 14 }),
8223
+ " Adicionar"
8224
+ )), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react14.default.createElement(
8142
8225
  CustomPropertyDisplay,
8143
8226
  {
8144
8227
  key: prop.id,
@@ -8146,13 +8229,30 @@ function InSceneCreationForm({
8146
8229
  onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
8147
8230
  onRemove: () => handleRemoveProp(index),
8148
8231
  onOpenImageViewer,
8149
- unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
8232
+ unavailableTypes: currentUsedTypes.filter(
8233
+ (t) => t !== prop.type
8234
+ ),
8150
8235
  isTextureMode: useImageAsTexture,
8151
8236
  selectedImageUrl,
8152
8237
  onSelectTexture: handleSelectTexture,
8153
8238
  onUploadFile
8154
8239
  }
8155
- )), /* @__PURE__ */ import_react14.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react14.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_react14.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_react14.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")))
8240
+ )), /* @__PURE__ */ import_react14.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react14.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_react14.default.createElement(
8241
+ "button",
8242
+ {
8243
+ type: "button",
8244
+ onClick: onCancel,
8245
+ className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm"
8246
+ },
8247
+ "Cancelar"
8248
+ ), /* @__PURE__ */ import_react14.default.createElement(
8249
+ "button",
8250
+ {
8251
+ type: "submit",
8252
+ 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)]"
8253
+ },
8254
+ "Salvar"
8255
+ )))
8156
8256
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react14.default.createElement(
8157
8257
  DescriptionEditModal,
8158
8258
  {
@@ -8192,12 +8292,22 @@ function InSceneVersionForm({
8192
8292
  const [name, setName] = (0, import_react15.useState)("");
8193
8293
  const [size, setSize] = (0, import_react15.useState)("medium");
8194
8294
  const [description, setDescription] = (0, import_react15.useState)("");
8195
- const [customProps, setCustomProps] = (0, import_react15.useState)([{ id: v4_default(), key: "Date", type: "date", value: { type: "Data", value: "" }, isEditing: true }]);
8295
+ const [customProps, setCustomProps] = (0, import_react15.useState)([
8296
+ {
8297
+ id: v4_default(),
8298
+ key: "Date",
8299
+ type: "date",
8300
+ value: { type: "Data", value: "" },
8301
+ isEditing: true
8302
+ }
8303
+ ]);
8196
8304
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react15.useState)(false);
8197
8305
  const propsEndRef = (0, import_react15.useRef)(null);
8198
8306
  const [useImageAsTexture, setUseImageAsTexture] = (0, import_react15.useState)(false);
8199
8307
  const [selectedImageUrl, setSelectedImageUrl] = (0, import_react15.useState)(null);
8200
- const hasImages = customProps.some((p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value));
8308
+ const hasImages = customProps.some(
8309
+ (p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value)
8310
+ );
8201
8311
  (0, import_react15.useEffect)(() => {
8202
8312
  if (!hasImages && useImageAsTexture) {
8203
8313
  setUseImageAsTexture(false);
@@ -8214,7 +8324,10 @@ function InSceneVersionForm({
8214
8324
  setCustomProps([...customProps, newProp]);
8215
8325
  setTimeout(() => {
8216
8326
  var _a;
8217
- (_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth", block: "center" });
8327
+ (_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
8328
+ behavior: "smooth",
8329
+ block: "center"
8330
+ });
8218
8331
  }, 100);
8219
8332
  };
8220
8333
  const handleRemoveProp = (index) => {
@@ -8258,7 +8371,9 @@ function InSceneVersionForm({
8258
8371
  alert("O campo 'Nome' \xE9 obrigat\xF3rio.");
8259
8372
  return;
8260
8373
  }
8261
- const hasDate = customProps.some((prop) => prop.key === "Date" && !prop.isEditing);
8374
+ const hasDate = customProps.some(
8375
+ (prop) => prop.key === "Date" && !prop.isEditing
8376
+ );
8262
8377
  if (!hasDate) {
8263
8378
  alert("A propriedade 'Date' \xE9 obrigat\xF3ria.");
8264
8379
  return;
@@ -8309,7 +8424,25 @@ function InSceneVersionForm({
8309
8424
  },
8310
8425
  /* @__PURE__ */ import_react15.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
8311
8426
  /* @__PURE__ */ import_react15.default.createElement("div", { className: "px-6 pt-5 pb-3" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react15.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_react15.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Criar Versionamento")), /* @__PURE__ */ import_react15.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Nova Vers\xE3o")),
8312
- /* @__PURE__ */ import_react15.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipo do Node (Fixo)"), /* @__PURE__ */ import_react15.default.createElement("input", { type: "text", value: displayType, disabled: true, className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 cursor-not-allowed" })), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome do Node"), /* @__PURE__ */ import_react15.default.createElement("input", { required: true, type: "text", placeholder: "Ex.: Vers\xE3o 2.0", value: name, onChange: handleNameInputChange, 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" })), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react15.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_react15.default.createElement(
8427
+ /* @__PURE__ */ import_react15.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipo do Node (Fixo)"), /* @__PURE__ */ import_react15.default.createElement(
8428
+ "input",
8429
+ {
8430
+ type: "text",
8431
+ value: displayType,
8432
+ disabled: true,
8433
+ className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 cursor-not-allowed"
8434
+ }
8435
+ )), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome do Node"), /* @__PURE__ */ import_react15.default.createElement(
8436
+ "input",
8437
+ {
8438
+ required: true,
8439
+ type: "text",
8440
+ placeholder: "Ex.: Vers\xE3o 2.0",
8441
+ value: name,
8442
+ onChange: handleNameInputChange,
8443
+ 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"
8444
+ }
8445
+ )), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react15.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_react15.default.createElement(
8313
8446
  DescriptionDisplay,
8314
8447
  {
8315
8448
  description,
@@ -8346,10 +8479,28 @@ function InSceneVersionForm({
8346
8479
  onClick: () => handleSizeChange(s),
8347
8480
  className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
8348
8481
  },
8349
- /* @__PURE__ */ import_react15.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 group-hover:border-slate-500"}` }, isSelected && /* @__PURE__ */ import_react15.default.createElement(import_fi13.FiCheck, { size: 12, className: "text-white" })),
8350
- /* @__PURE__ */ import_react15.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}` }, s)
8482
+ /* @__PURE__ */ import_react15.default.createElement(
8483
+ "div",
8484
+ {
8485
+ 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 group-hover:border-slate-500"}`
8486
+ },
8487
+ isSelected && /* @__PURE__ */ import_react15.default.createElement(import_fi13.FiCheck, { size: 12, className: "text-white" })
8488
+ ),
8489
+ /* @__PURE__ */ import_react15.default.createElement(
8490
+ "span",
8491
+ {
8492
+ className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}`
8493
+ },
8494
+ s
8495
+ )
8351
8496
  );
8352
- }))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor do Node (Fixa)"), hasImages && /* @__PURE__ */ import_react15.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react15.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_react15.default.createElement(import_fi13.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react15.default.createElement(
8497
+ }))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor do Node (Fixa)"), hasImages && /* @__PURE__ */ import_react15.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react15.default.createElement(
8498
+ "div",
8499
+ {
8500
+ 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"}`
8501
+ },
8502
+ useImageAsTexture && /* @__PURE__ */ import_react15.default.createElement(import_fi13.FiCheck, { size: 12, className: "text-white" })
8503
+ ), /* @__PURE__ */ import_react15.default.createElement(
8353
8504
  "input",
8354
8505
  {
8355
8506
  type: "checkbox",
@@ -8357,7 +8508,35 @@ function InSceneVersionForm({
8357
8508
  onChange: handleToggleImageMode,
8358
8509
  className: "hidden"
8359
8510
  }
8360
- ), /* @__PURE__ */ import_react15.default.createElement("span", { className: `text-xs ${useImageAsTexture ? "text-indigo-300" : "text-slate-400 group-hover:text-slate-300"}` }, "Usar imagem"))), /* @__PURE__ */ import_react15.default.createElement("div", { className: `flex items-center gap-3 bg-slate-900/60 p-2.5 rounded-lg border border-white/10 transition-opacity duration-200 ${useImageAsTexture ? "opacity-40 pointer-events-none grayscale" : "opacity-100"}` }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "h-8 w-12 rounded-md border border-white/10", style: { backgroundColor: fixedColor } }), /* @__PURE__ */ import_react15.default.createElement("span", { className: "text-xs text-slate-300" }, useImageAsTexture ? "Cor definida pela imagem." : "Cor herdada do node original."))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react15.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais (*Date obrigat\xF3rio)"), /* @__PURE__ */ import_react15.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_react15.default.createElement(import_fi13.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react15.default.createElement(
8511
+ ), /* @__PURE__ */ import_react15.default.createElement(
8512
+ "span",
8513
+ {
8514
+ className: `text-xs ${useImageAsTexture ? "text-indigo-300" : "text-slate-400 group-hover:text-slate-300"}`
8515
+ },
8516
+ "Usar imagem"
8517
+ ))), /* @__PURE__ */ import_react15.default.createElement(
8518
+ "div",
8519
+ {
8520
+ className: `flex items-center gap-3 bg-slate-900/60 p-2.5 rounded-lg border border-white/10 transition-opacity duration-200 ${useImageAsTexture ? "opacity-40 pointer-events-none grayscale" : "opacity-100"}`
8521
+ },
8522
+ /* @__PURE__ */ import_react15.default.createElement(
8523
+ "div",
8524
+ {
8525
+ className: "h-8 w-12 rounded-md border border-white/10",
8526
+ style: { backgroundColor: fixedColor }
8527
+ }
8528
+ ),
8529
+ /* @__PURE__ */ import_react15.default.createElement("span", { className: "text-xs text-slate-300" }, useImageAsTexture ? "Cor definida pela imagem." : "Cor herdada do node original.")
8530
+ )), /* @__PURE__ */ import_react15.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react15.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais (*Date obrigat\xF3rio)"), /* @__PURE__ */ import_react15.default.createElement(
8531
+ "button",
8532
+ {
8533
+ type: "button",
8534
+ onClick: handleAddProp,
8535
+ 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"
8536
+ },
8537
+ /* @__PURE__ */ import_react15.default.createElement(import_fi13.FiPlus, { size: 14 }),
8538
+ " Adicionar"
8539
+ )), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react15.default.createElement(
8361
8540
  CustomPropertyDisplay,
8362
8541
  {
8363
8542
  key: prop.id,
@@ -8365,13 +8544,30 @@ function InSceneVersionForm({
8365
8544
  onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
8366
8545
  onRemove: () => handleRemoveProp(index),
8367
8546
  onOpenImageViewer,
8368
- unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
8547
+ unavailableTypes: currentUsedTypes.filter(
8548
+ (t) => t !== prop.type
8549
+ ),
8369
8550
  isTextureMode: useImageAsTexture,
8370
8551
  selectedImageUrl,
8371
8552
  onSelectTexture: handleSelectTexture,
8372
8553
  onUploadFile
8373
8554
  }
8374
- )), /* @__PURE__ */ import_react15.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react15.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_react15.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_react15.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")))
8555
+ )), /* @__PURE__ */ import_react15.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react15.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_react15.default.createElement(
8556
+ "button",
8557
+ {
8558
+ type: "button",
8559
+ onClick: onCancel,
8560
+ className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm"
8561
+ },
8562
+ "Cancelar"
8563
+ ), /* @__PURE__ */ import_react15.default.createElement(
8564
+ "button",
8565
+ {
8566
+ type: "submit",
8567
+ 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)]"
8568
+ },
8569
+ "Salvar"
8570
+ )))
8375
8571
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react15.default.createElement(
8376
8572
  DescriptionEditModal,
8377
8573
  {
@@ -8405,7 +8601,10 @@ function QuestReviewStackEditor({
8405
8601
  const [isAdding, setIsAdding] = (0, import_react16.useState)(false);
8406
8602
  const [searchQuery, setSearchQuery] = (0, import_react16.useState)("");
8407
8603
  const handleAddReviewer = (userId) => {
8408
- const newStack = [...reviewStack, { userId, status: "pending", mandatory: false }];
8604
+ const newStack = [
8605
+ ...reviewStack,
8606
+ { userId, status: "pending", mandatory: true }
8607
+ ];
8409
8608
  onChange(newStack);
8410
8609
  setIsAdding(false);
8411
8610
  setSearchQuery("");
@@ -8416,21 +8615,27 @@ function QuestReviewStackEditor({
8416
8615
  };
8417
8616
  const handleToggleMandatory = (index) => {
8418
8617
  const newStack = [...reviewStack];
8419
- newStack[index] = { ...newStack[index], mandatory: !newStack[index].mandatory };
8618
+ newStack[index] = {
8619
+ ...newStack[index],
8620
+ mandatory: !newStack[index].mandatory
8621
+ };
8420
8622
  onChange(newStack);
8421
8623
  };
8422
8624
  const handleMove = (index, direction) => {
8423
8625
  const newStack = [...reviewStack];
8424
8626
  const targetIndex = index + direction;
8425
8627
  if (targetIndex < 0 || targetIndex >= newStack.length) return;
8426
- [newStack[index], newStack[targetIndex]] = [newStack[targetIndex], newStack[index]];
8628
+ [newStack[index], newStack[targetIndex]] = [
8629
+ newStack[targetIndex],
8630
+ newStack[index]
8631
+ ];
8427
8632
  onChange(newStack);
8428
8633
  };
8429
8634
  const filteredMembers = viewMembers.filter((m) => {
8430
8635
  const search = searchQuery.toLowerCase();
8431
8636
  return (m.name || "").toLowerCase().includes(search) || (m.email || "").toLowerCase().includes(search);
8432
8637
  });
8433
- 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(
8638
+ 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"), !readOnly && !isAdding && /* @__PURE__ */ import_react16.default.createElement(
8434
8639
  "button",
8435
8640
  {
8436
8641
  type: "button",
@@ -8439,7 +8644,13 @@ function QuestReviewStackEditor({
8439
8644
  },
8440
8645
  /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiPlus, { size: 10 }),
8441
8646
  " Adicionar Camada"
8442
- )), 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(
8647
+ )), 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(
8648
+ import_fi14.FiSearch,
8649
+ {
8650
+ className: "absolute left-2 top-1/2 -translate-y-1/2 text-slate-500",
8651
+ size: 12
8652
+ }
8653
+ ), /* @__PURE__ */ import_react16.default.createElement(
8443
8654
  "input",
8444
8655
  {
8445
8656
  autoFocus: true,
@@ -8449,7 +8660,14 @@ function QuestReviewStackEditor({
8449
8660
  onChange: (e) => setSearchQuery(e.target.value),
8450
8661
  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"
8451
8662
  }
8452
- ), /* @__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(
8663
+ ), /* @__PURE__ */ import_react16.default.createElement(
8664
+ "button",
8665
+ {
8666
+ onClick: () => setIsAdding(false),
8667
+ className: "absolute right-2 top-1/2 -translate-y-1/2 text-slate-500 hover:text-white"
8668
+ },
8669
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 14 })
8670
+ )), /* @__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(
8453
8671
  "li",
8454
8672
  {
8455
8673
  key: m.id,
@@ -8467,8 +8685,32 @@ function QuestReviewStackEditor({
8467
8685
  key: index,
8468
8686
  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`
8469
8687
  },
8470
- /* @__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 })))),
8471
- /* @__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")),
8688
+ /* @__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(
8689
+ "button",
8690
+ {
8691
+ type: "button",
8692
+ onClick: () => handleMove(index, -1),
8693
+ disabled: index === 0,
8694
+ className: "hover:text-sky-400 disabled:opacity-20"
8695
+ },
8696
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronUp, { size: 12 })
8697
+ ), /* @__PURE__ */ import_react16.default.createElement(
8698
+ "button",
8699
+ {
8700
+ type: "button",
8701
+ onClick: () => handleMove(index, 1),
8702
+ disabled: index === reviewStack.length - 1,
8703
+ className: "hover:text-sky-400 disabled:opacity-20"
8704
+ },
8705
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { size: 12 })
8706
+ ))),
8707
+ /* @__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(
8708
+ "span",
8709
+ {
8710
+ className: `truncate text-sm font-medium ${isCompleted ? "text-green-300" : "text-slate-200"}`
8711
+ },
8712
+ (member == null ? void 0 : member.name) || (member == null ? void 0 : member.email) || "Unknown User"
8713
+ ), 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")),
8472
8714
  !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(
8473
8715
  "button",
8474
8716
  {
@@ -8477,7 +8719,7 @@ function QuestReviewStackEditor({
8477
8719
  title: item.mandatory ? "Remover obrigatoriedade" : "Tornar obrigat\xF3rio",
8478
8720
  className: `p-1.5 rounded hover:bg-white/10 transition-colors ${item.mandatory ? "text-amber-400" : "text-slate-500"}`
8479
8721
  },
8480
- /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiAlertCircle, { size: 14 })
8722
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiStar, { size: 14 })
8481
8723
  ), /* @__PURE__ */ import_react16.default.createElement(
8482
8724
  "button",
8483
8725
  {
@@ -8501,10 +8743,10 @@ function QuestReviewStackEditor({
8501
8743
 
8502
8744
  // src/components/InSceneQuestForm.jsx
8503
8745
  var QUEST_STATUS_COLORS2 = {
8504
- "Backlog": "#64748b",
8746
+ Backlog: "#64748b",
8505
8747
  "In Progress": "#eab308",
8506
- "Review": "#a855f7",
8507
- "Done": "#22c55e"
8748
+ Review: "#a855f7",
8749
+ Done: "#22c55e"
8508
8750
  };
8509
8751
  function InSceneQuestForm({
8510
8752
  onSave,
@@ -8548,7 +8790,10 @@ function InSceneQuestForm({
8548
8790
  setCustomProps([...customProps, newProp]);
8549
8791
  setTimeout(() => {
8550
8792
  var _a2;
8551
- (_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({ behavior: "smooth", block: "center" });
8793
+ (_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
8794
+ behavior: "smooth",
8795
+ block: "center"
8796
+ });
8552
8797
  }, 100);
8553
8798
  };
8554
8799
  const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
@@ -8587,12 +8832,14 @@ function InSceneQuestForm({
8587
8832
  customProps.filter((prop) => prop.key.trim() && !prop.isEditing)
8588
8833
  );
8589
8834
  const processedSections = processDescriptionForSave(description, []);
8590
- const initialTimeline = [{
8591
- type: "quest_created",
8592
- timestamp: Date.now(),
8593
- actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
8594
- description: `Quest criada por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
8595
- }];
8835
+ const initialTimeline = [
8836
+ {
8837
+ type: "quest_created",
8838
+ timestamp: Date.now(),
8839
+ actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
8840
+ description: `Quest criada por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
8841
+ }
8842
+ ];
8596
8843
  if (assigneeId) {
8597
8844
  initialTimeline.push({
8598
8845
  type: "assignee_changed",
@@ -8638,7 +8885,15 @@ function InSceneQuestForm({
8638
8885
  onContextMenu: swallow,
8639
8886
  onDoubleClick: swallow
8640
8887
  },
8641
- /* @__PURE__ */ import_react17.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS2[status]}, transparent)` } }),
8888
+ /* @__PURE__ */ import_react17.default.createElement(
8889
+ "div",
8890
+ {
8891
+ className: "h-[2px]",
8892
+ style: {
8893
+ background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS2[status]}, transparent)`
8894
+ }
8895
+ }
8896
+ ),
8642
8897
  /* @__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(
8643
8898
  "button",
8644
8899
  {
@@ -8663,16 +8918,40 @@ function InSceneQuestForm({
8663
8918
  },
8664
8919
  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"
8665
8920
  }
8666
- ), /* @__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(
8921
+ ), /* @__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(
8922
+ "p",
8923
+ {
8924
+ className: "text-xs text-indigo-300 font-medium truncate",
8925
+ title: standardizedName
8926
+ },
8927
+ standardizedName
8928
+ ))), /* @__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(
8667
8929
  "button",
8668
8930
  {
8669
8931
  type: "button",
8670
8932
  onClick: () => setIsStatusDropdownOpen(!isStatusDropdownOpen),
8671
8933
  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"
8672
8934
  },
8673
- /* @__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)),
8674
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
8675
- ), 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(
8935
+ /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(
8936
+ "span",
8937
+ {
8938
+ className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]",
8939
+ style: { backgroundColor: QUEST_STATUS_COLORS2[status] }
8940
+ }
8941
+ ), /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
8942
+ /* @__PURE__ */ import_react17.default.createElement(
8943
+ import_fi15.FiChevronDown,
8944
+ {
8945
+ className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}`
8946
+ }
8947
+ )
8948
+ ), isStatusDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
8949
+ "div",
8950
+ {
8951
+ className: "fixed inset-0 z-40",
8952
+ onClick: () => setIsStatusDropdownOpen(false)
8953
+ }
8954
+ ), /* @__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(
8676
8955
  "li",
8677
8956
  {
8678
8957
  key: s,
@@ -8683,7 +8962,13 @@ function InSceneQuestForm({
8683
8962
  },
8684
8963
  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"}`
8685
8964
  },
8686
- /* @__PURE__ */ import_react17.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS2[s] } }),
8965
+ /* @__PURE__ */ import_react17.default.createElement(
8966
+ "span",
8967
+ {
8968
+ className: "w-3 h-3 rounded-full",
8969
+ style: { backgroundColor: QUEST_STATUS_COLORS2[s] }
8970
+ }
8971
+ ),
8687
8972
  s
8688
8973
  )))))), /* @__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(
8689
8974
  "button",
@@ -8693,11 +8978,22 @@ function InSceneQuestForm({
8693
8978
  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"
8694
8979
  },
8695
8980
  /* @__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")),
8696
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
8697
- ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
8698
- setIsAssigneeDropdownOpen(false);
8699
- setAssigneeSearchQuery("");
8700
- } }), /* @__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(
8981
+ /* @__PURE__ */ import_react17.default.createElement(
8982
+ import_fi15.FiChevronDown,
8983
+ {
8984
+ className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}`
8985
+ }
8986
+ )
8987
+ ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
8988
+ "div",
8989
+ {
8990
+ className: "fixed inset-0 z-40",
8991
+ onClick: () => {
8992
+ setIsAssigneeDropdownOpen(false);
8993
+ setAssigneeSearchQuery("");
8994
+ }
8995
+ }
8996
+ ), /* @__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(
8701
8997
  "input",
8702
8998
  {
8703
8999
  type: "text",
@@ -8744,20 +9040,7 @@ function InSceneQuestForm({
8744
9040
  onChange: setReviewStack,
8745
9041
  viewMembers
8746
9042
  }
8747
- )), /* @__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(
8748
- "input",
8749
- {
8750
- type: "text",
8751
- value: typeInput,
8752
- onChange: (e) => setTypeInput(e.target.value),
8753
- onKeyDown: handleTypeInputKeyDown,
8754
- onBlur: () => {
8755
- if (typeInput.trim()) handleAddType(typeInput);
8756
- },
8757
- className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
8758
- autoComplete: "off"
8759
- }
8760
- ))), /* @__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(
9043
+ )), /* @__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" }, "Descri\xE7\xE3o"), /* @__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(
8761
9044
  DescriptionDisplay,
8762
9045
  {
8763
9046
  description,
@@ -8767,20 +9050,31 @@ function InSceneQuestForm({
8767
9050
  onMentionClick,
8768
9051
  onSaveDescription: (newDesc) => setDescription(newDesc)
8769
9052
  }
8770
- ), /* @__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(
9053
+ ), /* @__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(
8771
9054
  "button",
8772
9055
  {
8773
- key: s,
8774
9056
  type: "button",
8775
- onClick: () => {
8776
- setSize(s);
8777
- onSizeChange == null ? void 0 : onSizeChange(s);
8778
- },
8779
- className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
9057
+ onClick: () => setIsDescriptionModalOpen(true),
9058
+ className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors"
9059
+ },
9060
+ /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiEdit2, { size: 14 })
9061
+ )), !description && /* @__PURE__ */ import_react17.default.createElement(
9062
+ "div",
9063
+ {
9064
+ onClick: () => setIsDescriptionModalOpen(true),
9065
+ className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
9066
+ },
9067
+ "Adicionar descri\xE7\xE3o..."
9068
+ ))), /* @__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(
9069
+ "button",
9070
+ {
9071
+ type: "button",
9072
+ onClick: handleAddProp,
9073
+ 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"
8780
9074
  },
8781
- /* @__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" })),
8782
- /* @__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)
8783
- )))), /* @__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(
9075
+ /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiPlus, { size: 14 }),
9076
+ " Adicionar"
9077
+ )), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react17.default.createElement(
8784
9078
  CustomPropertyDisplay,
8785
9079
  {
8786
9080
  key: prop.id,
@@ -8788,10 +9082,81 @@ function InSceneQuestForm({
8788
9082
  onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
8789
9083
  onRemove: () => handleRemoveProp(index),
8790
9084
  onOpenImageViewer,
8791
- unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
9085
+ unavailableTypes: currentUsedTypes.filter(
9086
+ (t) => t !== prop.type
9087
+ ),
8792
9088
  onUploadFile
8793
9089
  }
8794
- )), /* @__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")))
9090
+ )), /* @__PURE__ */ import_react17.default.createElement("div", { ref: propsEndRef }))), /* @__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(
9091
+ "button",
9092
+ {
9093
+ key: s,
9094
+ type: "button",
9095
+ onClick: () => {
9096
+ setSize(s);
9097
+ onSizeChange == null ? void 0 : onSizeChange(s);
9098
+ },
9099
+ className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
9100
+ },
9101
+ /* @__PURE__ */ import_react17.default.createElement(
9102
+ "div",
9103
+ {
9104
+ 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"}`
9105
+ },
9106
+ size === s && /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiCheck, { size: 12, className: "text-white" })
9107
+ ),
9108
+ /* @__PURE__ */ import_react17.default.createElement(
9109
+ "span",
9110
+ {
9111
+ className: `text-sm capitalize transition-colors ${size === s ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}`
9112
+ },
9113
+ s
9114
+ )
9115
+ )))), /* @__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(
9116
+ "span",
9117
+ {
9118
+ key: index,
9119
+ 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"}`
9120
+ },
9121
+ t,
9122
+ t !== "quest" && /* @__PURE__ */ import_react17.default.createElement(
9123
+ "button",
9124
+ {
9125
+ type: "button",
9126
+ onClick: () => handleRemoveType(index),
9127
+ className: "hover:text-white transition-colors"
9128
+ },
9129
+ /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiX, { size: 12 })
9130
+ )
9131
+ )), /* @__PURE__ */ import_react17.default.createElement(
9132
+ "input",
9133
+ {
9134
+ type: "text",
9135
+ value: typeInput,
9136
+ onChange: (e) => setTypeInput(e.target.value),
9137
+ onKeyDown: handleTypeInputKeyDown,
9138
+ onBlur: () => {
9139
+ if (typeInput.trim()) handleAddType(typeInput);
9140
+ },
9141
+ className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
9142
+ autoComplete: "off"
9143
+ }
9144
+ )))), /* @__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(
9145
+ "button",
9146
+ {
9147
+ type: "button",
9148
+ onClick: onCancel,
9149
+ className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm"
9150
+ },
9151
+ "Cancelar"
9152
+ ), /* @__PURE__ */ import_react17.default.createElement(
9153
+ "button",
9154
+ {
9155
+ type: "submit",
9156
+ 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)]"
9157
+ },
9158
+ "Salvar Quest"
9159
+ )))
8795
9160
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react17.default.createElement(
8796
9161
  DescriptionEditModal,
8797
9162
  {
@@ -9347,7 +9712,8 @@ function QuestDetailsPanel({
9347
9712
  onUploadFile,
9348
9713
  userRole,
9349
9714
  currentDatasetName,
9350
- viewMembers = []
9715
+ viewMembers = [],
9716
+ currentUser
9351
9717
  }) {
9352
9718
  var _a;
9353
9719
  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) || "";
@@ -9447,8 +9813,7 @@ function QuestDetailsPanel({
9447
9813
  });
9448
9814
  };
9449
9815
  const swallow = (e) => e.stopPropagation();
9450
- const handleNameChange = (e) => {
9451
- const val = e.target.value;
9816
+ const handleNameChange = (val) => {
9452
9817
  setRawTitle(val);
9453
9818
  const newStandardName = questPrefix ? `${questPrefix} - \xBB ${val || "Sem t\xEDtulo"}` : val;
9454
9819
  onNameChange == null ? void 0 : onNameChange(node.id, newStandardName, val);
@@ -9459,6 +9824,51 @@ function QuestDetailsPanel({
9459
9824
  onSizeChange == null ? void 0 : onSizeChange(node.id, newSize);
9460
9825
  setHasUnsavedChanges(true);
9461
9826
  };
9827
+ const handleReturnToOperation = async () => {
9828
+ if (isSaving) return;
9829
+ setIsSaving(true);
9830
+ const actorId = (currentUser == null ? void 0 : currentUser.id) || "unknown";
9831
+ const actorName = (currentUser == null ? void 0 : currentUser.name) || "Revisor";
9832
+ const targetMember = viewMembers.find((m) => String(m.id) === String(assigneeId));
9833
+ const targetName = (targetMember == null ? void 0 : targetMember.name) || "executor";
9834
+ const newEvent = {
9835
+ type: "review_returned",
9836
+ timestamp: Date.now(),
9837
+ actorId,
9838
+ description: `Review finalizada com retorno para opera\xE7\xE3o por ${actorName}. Novo respons\xE1vel: ${targetName}.`
9839
+ };
9840
+ const updatedTimeline = [...timeline, newEvent];
9841
+ const updatedStatus = "In Progress";
9842
+ const updatedColor = "#eab308";
9843
+ const nodeToSave = {
9844
+ ...node,
9845
+ name: standardizedName,
9846
+ raw_title: rawTitle,
9847
+ description,
9848
+ status: updatedStatus,
9849
+ color: updatedColor,
9850
+ assignee_id: assigneeId,
9851
+ reviewStack,
9852
+ timeline: updatedTimeline,
9853
+ size,
9854
+ types: types.includes("quest") ? types : [...types, "quest"],
9855
+ intensity: intensity || 0,
9856
+ useImageAsTexture: node.useImageAsTexture || false,
9857
+ textureImageUrl: node.textureImageUrl || null
9858
+ };
9859
+ try {
9860
+ await onSave(nodeToSave, false);
9861
+ setTimeline(updatedTimeline);
9862
+ setStatus(updatedStatus);
9863
+ onDataUpdate(nodeToSave);
9864
+ setHasUnsavedChanges(false);
9865
+ } catch (error) {
9866
+ console.error("Erro ao retornar para opera\xE7\xE3o:", error);
9867
+ alert("Erro ao realizar o retorno para opera\xE7\xE3o.");
9868
+ } finally {
9869
+ setIsSaving(false);
9870
+ }
9871
+ };
9462
9872
  const handleStatusChange = (newStatus) => {
9463
9873
  setStatus(newStatus);
9464
9874
  const newColor = QUEST_STATUS_COLORS3[newStatus];
@@ -9630,7 +10040,7 @@ function QuestDetailsPanel({
9630
10040
  {
9631
10041
  type: "text",
9632
10042
  value: rawTitle,
9633
- onChange: handleNameChange,
10043
+ onChange: (e) => handleNameChange(e.target.value),
9634
10044
  readOnly: !canEdit,
9635
10045
  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"}`
9636
10046
  }
@@ -9747,7 +10157,24 @@ function QuestDetailsPanel({
9747
10157
  viewMembers,
9748
10158
  readOnly: !canEdit
9749
10159
  }
9750
- )), /* @__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(
10160
+ )), status === "Review" && canEdit && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "bg-slate-900/40 rounded-xl p-4 border border-white/5 space-y-3" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "A\xE7\xF5es de Review"), /* @__PURE__ */ import_react19.default.createElement("span", { className: "px-2 py-0.5 rounded-full bg-purple-500/10 text-purple-300 text-[10px] font-medium border border-purple-500/20" }, "Em Revis\xE3o")), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs text-slate-400 leading-relaxed" }, "Se algo precisar de ajuste, selecione o respons\xE1vel acima e clique para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ import_react19.default.createElement(
10161
+ "button",
10162
+ {
10163
+ type: "button",
10164
+ onClick: handleReturnToOperation,
10165
+ disabled: isSaving,
10166
+ className: "w-full h-10 flex items-center justify-center gap-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-200 text-xs font-semibold border border-white/10 transition-all hover:border-white/20 active:scale-[0.98] disabled:opacity-50 disabled:cursor-wait"
10167
+ },
10168
+ /* @__PURE__ */ import_react19.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react19.default.createElement("path", { d: "M12 19V5M5 12l7 7 7-7" })),
10169
+ "Retornar para Opera\xE7\xE3o"
10170
+ ))), /* @__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: "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) => {
10171
+ const dateObj = new Date(event.timestamp);
10172
+ const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
10173
+ 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));
10174
+ }))), /* @__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) => {
10175
+ const isSelected = size === s;
10176
+ 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));
10177
+ }))), /* @__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(
9751
10178
  "input",
9752
10179
  {
9753
10180
  type: "text",
@@ -9771,14 +10198,7 @@ function QuestDetailsPanel({
9771
10198
  ), 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) => {
9772
10199
  e.preventDefault();
9773
10200
  handleAddType(suggestedType);
9774
- } }, 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) => {
9775
- const isSelected = size === s;
9776
- 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));
9777
- }))), /* @__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) => {
9778
- const dateObj = new Date(event.timestamp);
9779
- const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
9780
- 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));
9781
- }))), 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")))
10201
+ } }, suggestedType))))), 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")))
9782
10202
  ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(
9783
10203
  DescriptionEditModal,
9784
10204
  {
@@ -9892,8 +10312,12 @@ function RelationshipDetailsPanel({
9892
10312
  }) {
9893
10313
  const [name, setName] = (0, import_react21.useState)((link == null ? void 0 : link.name) ?? "");
9894
10314
  const [description, setDescription] = (0, import_react21.useState)((link == null ? void 0 : link.description) ?? "");
9895
- const [customProps, setCustomProps] = (0, import_react21.useState)(() => extractCustomPropsFromNode(link || {}));
9896
- const [existingSections, setExistingSections] = (0, import_react21.useState)((link == null ? void 0 : link.description_sections) || []);
10315
+ const [customProps, setCustomProps] = (0, import_react21.useState)(
10316
+ () => extractCustomPropsFromNode(link || {})
10317
+ );
10318
+ const [existingSections, setExistingSections] = (0, import_react21.useState)(
10319
+ (link == null ? void 0 : link.description_sections) || []
10320
+ );
9897
10321
  const [sourceLabel, setSourceLabel] = (0, import_react21.useState)((link == null ? void 0 : link.source_label) ?? "");
9898
10322
  const [targetLabel, setTargetLabel] = (0, import_react21.useState)((link == null ? void 0 : link.target_label) ?? "");
9899
10323
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react21.useState)(false);
@@ -9922,7 +10346,10 @@ function RelationshipDetailsPanel({
9922
10346
  setHasUnsavedChanges(true);
9923
10347
  setTimeout(() => {
9924
10348
  var _a;
9925
- (_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth", block: "center" });
10349
+ (_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
10350
+ behavior: "smooth",
10351
+ block: "center"
10352
+ });
9926
10353
  }, 100);
9927
10354
  };
9928
10355
  const handleSave = async (keepOpen = false, overrides = {}) => {
@@ -9939,8 +10366,13 @@ function RelationshipDetailsPanel({
9939
10366
  }
9940
10367
  setIsSaving(true);
9941
10368
  try {
9942
- const extrasObj = toObjectFromCustomProps(currentCustomProps.filter((p) => !p.isEditing));
9943
- const processedSections = processDescriptionForSave(currentDescription, currentExistingSections);
10369
+ const extrasObj = toObjectFromCustomProps(
10370
+ currentCustomProps.filter((p) => !p.isEditing)
10371
+ );
10372
+ const processedSections = processDescriptionForSave(
10373
+ currentDescription,
10374
+ currentExistingSections
10375
+ );
9944
10376
  const dataToSave = {
9945
10377
  id: link.id,
9946
10378
  source: link.source,
@@ -9952,8 +10384,10 @@ function RelationshipDetailsPanel({
9952
10384
  isCurved: link.isCurved,
9953
10385
  curveOffset: link.curveOffset
9954
10386
  };
9955
- if (currentSourceLabel.trim()) dataToSave.source_label = currentSourceLabel.trim();
9956
- if (currentTargetLabel.trim()) dataToSave.target_label = currentTargetLabel.trim();
10387
+ if (currentSourceLabel.trim())
10388
+ dataToSave.source_label = currentSourceLabel.trim();
10389
+ if (currentTargetLabel.trim())
10390
+ dataToSave.target_label = currentTargetLabel.trim();
9957
10391
  await onSave(dataToSave, keepOpen);
9958
10392
  onDataUpdate(dataToSave);
9959
10393
  setHasUnsavedChanges(false);
@@ -10032,7 +10466,16 @@ function RelationshipDetailsPanel({
10032
10466
  onImageClick: handleImageClickFromText,
10033
10467
  onSaveDescription: handleSaveDescriptionInline
10034
10468
  }
10035
- ) : /* @__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(
10469
+ ) : /* @__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(
10470
+ "button",
10471
+ {
10472
+ onClick: onClose,
10473
+ disabled: isSaving,
10474
+ 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",
10475
+ title: "Fechar"
10476
+ },
10477
+ "\xD7"
10478
+ )), /* @__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"), /* @__PURE__ */ import_react21.default.createElement(
10036
10479
  "input",
10037
10480
  {
10038
10481
  type: "text",
@@ -10047,7 +10490,23 @@ function RelationshipDetailsPanel({
10047
10490
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
10048
10491
  `
10049
10492
  }
10050
- )), /* @__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(
10493
+ )), /* @__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(
10494
+ "svg",
10495
+ {
10496
+ xmlns: "http://www.w3.org/2000/svg",
10497
+ width: "13",
10498
+ height: "13",
10499
+ viewBox: "0 0 24 24",
10500
+ fill: "none",
10501
+ stroke: "currentColor",
10502
+ strokeWidth: "2",
10503
+ strokeLinecap: "round",
10504
+ strokeLinejoin: "round",
10505
+ className: "text-violet-400 flex-shrink-0"
10506
+ },
10507
+ /* @__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" }),
10508
+ /* @__PURE__ */ import_react21.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })
10509
+ ), /* @__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(
10051
10510
  "input",
10052
10511
  {
10053
10512
  type: "text",
@@ -10114,7 +10573,16 @@ function RelationshipDetailsPanel({
10114
10573
  className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
10115
10574
  },
10116
10575
  "Adicionar descri\xE7\xE3o..."
10117
- ))), /* @__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(
10576
+ ))), /* @__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(
10577
+ "button",
10578
+ {
10579
+ type: "button",
10580
+ onClick: handleAddProp,
10581
+ 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"
10582
+ },
10583
+ /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiPlus, { size: 14 }),
10584
+ " Adicionar"
10585
+ )), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react21.default.createElement(
10118
10586
  CustomPropertyDisplay,
10119
10587
  {
10120
10588
  key: prop.id,
@@ -10122,11 +10590,21 @@ function RelationshipDetailsPanel({
10122
10590
  onUpdate: (updatedProp) => handleUpdateProp(idx, updatedProp),
10123
10591
  onRemove: () => handleRemoveProp(idx),
10124
10592
  onOpenImageViewer,
10125
- unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
10593
+ unavailableTypes: currentUsedTypes.filter(
10594
+ (t) => t !== prop.type
10595
+ ),
10126
10596
  onUploadFile,
10127
10597
  disabled: !canEdit
10128
10598
  }
10129
- )), /* @__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(
10599
+ )), /* @__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(
10600
+ "button",
10601
+ {
10602
+ onClick: onClose,
10603
+ disabled: isSaving,
10604
+ className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50"
10605
+ },
10606
+ canEdit ? "Cancelar" : "Fechar"
10607
+ ), canEdit && /* @__PURE__ */ import_react21.default.createElement(
10130
10608
  "button",
10131
10609
  {
10132
10610
  onClick: () => handleSave(false),
@@ -13474,7 +13952,8 @@ function XViewScene({
13474
13952
  nodes: sceneDataRef2.current.nodes,
13475
13953
  links: sceneDataRef2.current.links,
13476
13954
  quest_nodes: specificParentData.nodes,
13477
- quest_links: specificParentData.links
13955
+ quest_links: specificParentData.links,
13956
+ quest_counter: sceneDataRef2.current.quest_counter || 1
13478
13957
  };
13479
13958
  await context.actions.save_view_data(sceneSaveUrl2, viewFilePayload);
13480
13959
  } else {
@@ -15082,7 +15561,8 @@ function XViewScene({
15082
15561
  nodes: currentNodes,
15083
15562
  links: currentLinks,
15084
15563
  quest_nodes: isView ? ((_b2 = parentDataRef.current[sceneConfigId]) == null ? void 0 : _b2.nodes) || [] : sceneDataRef.current.quest_nodes || [],
15085
- quest_links: isView ? ((_c2 = parentDataRef.current[sceneConfigId]) == null ? void 0 : _c2.links) || [] : sceneDataRef.current.quest_links || []
15564
+ quest_links: isView ? ((_c2 = parentDataRef.current[sceneConfigId]) == null ? void 0 : _c2.links) || [] : sceneDataRef.current.quest_links || [],
15565
+ quest_counter: sceneDataRef.current.quest_counter || 1
15086
15566
  };
15087
15567
  try {
15088
15568
  await save_view_data(sceneSaveUrl, sceneFileData);
@@ -15632,7 +16112,8 @@ function XViewScene({
15632
16112
  onUploadFile: upload_file_action,
15633
16113
  userRole: userPermissionRole,
15634
16114
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
15635
- viewMembers
16115
+ viewMembers,
16116
+ currentUser: session == null ? void 0 : session.user
15636
16117
  }
15637
16118
  ),
15638
16119
  detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(