@lv-x-software-house/x_view 1.2.5-dev.27 → 1.2.5-dev.29

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 +642 -121
  2. package/dist/index.mjs +670 -124
  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"))));
@@ -7831,7 +7831,9 @@ function InSceneCreationForm({
7831
7831
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react14.useState)(false);
7832
7832
  const [useImageAsTexture, setUseImageAsTexture] = (0, import_react14.useState)(false);
7833
7833
  const [selectedImageUrl, setSelectedImageUrl] = (0, import_react14.useState)(null);
7834
- const [targetDatasetId, setTargetDatasetId] = (0, import_react14.useState)(sourceNodeDatasetId || "");
7834
+ const [targetDatasetId, setTargetDatasetId] = (0, import_react14.useState)(
7835
+ sourceNodeDatasetId || ""
7836
+ );
7835
7837
  const [isDatasetDropdownOpen, setIsDatasetDropdownOpen] = (0, import_react14.useState)(false);
7836
7838
  const datasetDropdownRef = (0, import_react14.useRef)(null);
7837
7839
  (0, import_react14.useEffect)(() => {
@@ -7851,7 +7853,9 @@ function InSceneCreationForm({
7851
7853
  };
7852
7854
  }, [isDatasetDropdownOpen]);
7853
7855
  const propsEndRef = (0, import_react14.useRef)(null);
7854
- 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
+ );
7855
7859
  (0, import_react14.useEffect)(() => {
7856
7860
  if (!hasImages && useImageAsTexture) {
7857
7861
  setUseImageAsTexture(false);
@@ -7861,7 +7865,9 @@ function InSceneCreationForm({
7861
7865
  }, [hasImages, useImageAsTexture, onImageChange]);
7862
7866
  (0, import_react14.useEffect)(() => {
7863
7867
  let result = [];
7864
- 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
+ );
7865
7871
  if (typeInput.trim() === "") {
7866
7872
  result = validExistingTypes.filter((t) => !types.includes(t));
7867
7873
  } else {
@@ -7870,13 +7876,20 @@ function InSceneCreationForm({
7870
7876
  const lowercasedInput = typeInput.toLowerCase();
7871
7877
  result = validExistingTypes.filter((t) => {
7872
7878
  if (!t) {
7873
- console.warn("InSceneCreationForm: Tipo encontrado como undefined/null durante filtragem");
7879
+ console.warn(
7880
+ "InSceneCreationForm: Tipo encontrado como undefined/null durante filtragem"
7881
+ );
7874
7882
  return false;
7875
7883
  }
7876
7884
  return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
7877
7885
  });
7878
7886
  } catch (err) {
7879
- 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
+ );
7880
7893
  }
7881
7894
  }
7882
7895
  if (sourceTypes) {
@@ -7906,7 +7919,10 @@ function InSceneCreationForm({
7906
7919
  setCustomProps([...customProps, newProp]);
7907
7920
  setTimeout(() => {
7908
7921
  var _a2;
7909
- (_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
+ });
7910
7926
  }, 100);
7911
7927
  };
7912
7928
  const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
@@ -8015,15 +8031,23 @@ function InSceneCreationForm({
8015
8031
  },
8016
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" }),
8017
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")),
8018
- /* @__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(
8019
- "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",
8020
8036
  {
8021
- type: "button",
8022
- onClick: () => handleRemoveType(index),
8023
- 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"
8024
8039
  },
8025
- /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiX, { size: 12 })
8026
- ))), /* @__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(
8027
8051
  "input",
8028
8052
  {
8029
8053
  type: "text",
@@ -8056,7 +8080,17 @@ function InSceneCreationForm({
8056
8080
  }
8057
8081
  },
8058
8082
  suggestedType
8059
- ))))), /* @__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(
8060
8094
  "button",
8061
8095
  {
8062
8096
  type: "button",
@@ -8064,7 +8098,12 @@ function InSceneCreationForm({
8064
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"
8065
8099
  },
8066
8100
  /* @__PURE__ */ import_react14.default.createElement("span", { className: "truncate pr-2" }, selectedDatasetName),
8067
- /* @__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
+ )
8068
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(
8069
8108
  "li",
8070
8109
  {
@@ -8076,7 +8115,7 @@ function InSceneCreationForm({
8076
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"}`
8077
8116
  },
8078
8117
  ds.name
8079
- )))), /* @__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(
8080
8119
  DescriptionDisplay,
8081
8120
  {
8082
8121
  description,
@@ -8113,10 +8152,28 @@ function InSceneCreationForm({
8113
8152
  onClick: () => handleSizeChange(s),
8114
8153
  className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
8115
8154
  },
8116
- /* @__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" })),
8117
- /* @__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
+ )
8118
8169
  );
8119
- }))), /* @__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(
8120
8177
  "input",
8121
8178
  {
8122
8179
  type: "checkbox",
@@ -8124,7 +8181,13 @@ function InSceneCreationForm({
8124
8181
  onChange: handleToggleImageMode,
8125
8182
  className: "hidden"
8126
8183
  }
8127
- ), /* @__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(
8128
8191
  ColorPicker,
8129
8192
  {
8130
8193
  color,
@@ -8143,7 +8206,22 @@ function InSceneCreationForm({
8143
8206
  className: "w-full h-1.5 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-indigo-500 hover:accent-indigo-400",
8144
8207
  title: `Intensidade do brilho: ${intensity}`
8145
8208
  }
8146
- ), /* @__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(
8147
8225
  CustomPropertyDisplay,
8148
8226
  {
8149
8227
  key: prop.id,
@@ -8151,13 +8229,30 @@ function InSceneCreationForm({
8151
8229
  onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
8152
8230
  onRemove: () => handleRemoveProp(index),
8153
8231
  onOpenImageViewer,
8154
- unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
8232
+ unavailableTypes: currentUsedTypes.filter(
8233
+ (t) => t !== prop.type
8234
+ ),
8155
8235
  isTextureMode: useImageAsTexture,
8156
8236
  selectedImageUrl,
8157
8237
  onSelectTexture: handleSelectTexture,
8158
8238
  onUploadFile
8159
8239
  }
8160
- )), /* @__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
+ )))
8161
8256
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react14.default.createElement(
8162
8257
  DescriptionEditModal,
8163
8258
  {
@@ -8197,12 +8292,22 @@ function InSceneVersionForm({
8197
8292
  const [name, setName] = (0, import_react15.useState)("");
8198
8293
  const [size, setSize] = (0, import_react15.useState)("medium");
8199
8294
  const [description, setDescription] = (0, import_react15.useState)("");
8200
- 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
+ ]);
8201
8304
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react15.useState)(false);
8202
8305
  const propsEndRef = (0, import_react15.useRef)(null);
8203
8306
  const [useImageAsTexture, setUseImageAsTexture] = (0, import_react15.useState)(false);
8204
8307
  const [selectedImageUrl, setSelectedImageUrl] = (0, import_react15.useState)(null);
8205
- 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
+ );
8206
8311
  (0, import_react15.useEffect)(() => {
8207
8312
  if (!hasImages && useImageAsTexture) {
8208
8313
  setUseImageAsTexture(false);
@@ -8219,7 +8324,10 @@ function InSceneVersionForm({
8219
8324
  setCustomProps([...customProps, newProp]);
8220
8325
  setTimeout(() => {
8221
8326
  var _a;
8222
- (_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
+ });
8223
8331
  }, 100);
8224
8332
  };
8225
8333
  const handleRemoveProp = (index) => {
@@ -8263,7 +8371,9 @@ function InSceneVersionForm({
8263
8371
  alert("O campo 'Nome' \xE9 obrigat\xF3rio.");
8264
8372
  return;
8265
8373
  }
8266
- const hasDate = customProps.some((prop) => prop.key === "Date" && !prop.isEditing);
8374
+ const hasDate = customProps.some(
8375
+ (prop) => prop.key === "Date" && !prop.isEditing
8376
+ );
8267
8377
  if (!hasDate) {
8268
8378
  alert("A propriedade 'Date' \xE9 obrigat\xF3ria.");
8269
8379
  return;
@@ -8314,7 +8424,25 @@ function InSceneVersionForm({
8314
8424
  },
8315
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" }),
8316
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")),
8317
- /* @__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(
8318
8446
  DescriptionDisplay,
8319
8447
  {
8320
8448
  description,
@@ -8351,10 +8479,28 @@ function InSceneVersionForm({
8351
8479
  onClick: () => handleSizeChange(s),
8352
8480
  className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
8353
8481
  },
8354
- /* @__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" })),
8355
- /* @__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
+ )
8356
8496
  );
8357
- }))), /* @__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(
8358
8504
  "input",
8359
8505
  {
8360
8506
  type: "checkbox",
@@ -8362,7 +8508,35 @@ function InSceneVersionForm({
8362
8508
  onChange: handleToggleImageMode,
8363
8509
  className: "hidden"
8364
8510
  }
8365
- ), /* @__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(
8366
8540
  CustomPropertyDisplay,
8367
8541
  {
8368
8542
  key: prop.id,
@@ -8370,13 +8544,30 @@ function InSceneVersionForm({
8370
8544
  onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
8371
8545
  onRemove: () => handleRemoveProp(index),
8372
8546
  onOpenImageViewer,
8373
- unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
8547
+ unavailableTypes: currentUsedTypes.filter(
8548
+ (t) => t !== prop.type
8549
+ ),
8374
8550
  isTextureMode: useImageAsTexture,
8375
8551
  selectedImageUrl,
8376
8552
  onSelectTexture: handleSelectTexture,
8377
8553
  onUploadFile
8378
8554
  }
8379
- )), /* @__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
+ )))
8380
8571
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react15.default.createElement(
8381
8572
  DescriptionEditModal,
8382
8573
  {
@@ -8410,7 +8601,10 @@ function QuestReviewStackEditor({
8410
8601
  const [isAdding, setIsAdding] = (0, import_react16.useState)(false);
8411
8602
  const [searchQuery, setSearchQuery] = (0, import_react16.useState)("");
8412
8603
  const handleAddReviewer = (userId) => {
8413
- const newStack = [...reviewStack, { userId, status: "pending", mandatory: true }];
8604
+ const newStack = [
8605
+ ...reviewStack,
8606
+ { userId, status: "pending", mandatory: true }
8607
+ ];
8414
8608
  onChange(newStack);
8415
8609
  setIsAdding(false);
8416
8610
  setSearchQuery("");
@@ -8421,21 +8615,27 @@ function QuestReviewStackEditor({
8421
8615
  };
8422
8616
  const handleToggleMandatory = (index) => {
8423
8617
  const newStack = [...reviewStack];
8424
- newStack[index] = { ...newStack[index], mandatory: !newStack[index].mandatory };
8618
+ newStack[index] = {
8619
+ ...newStack[index],
8620
+ mandatory: !newStack[index].mandatory
8621
+ };
8425
8622
  onChange(newStack);
8426
8623
  };
8427
8624
  const handleMove = (index, direction) => {
8428
8625
  const newStack = [...reviewStack];
8429
8626
  const targetIndex = index + direction;
8430
8627
  if (targetIndex < 0 || targetIndex >= newStack.length) return;
8431
- [newStack[index], newStack[targetIndex]] = [newStack[targetIndex], newStack[index]];
8628
+ [newStack[index], newStack[targetIndex]] = [
8629
+ newStack[targetIndex],
8630
+ newStack[index]
8631
+ ];
8432
8632
  onChange(newStack);
8433
8633
  };
8434
8634
  const filteredMembers = viewMembers.filter((m) => {
8435
8635
  const search = searchQuery.toLowerCase();
8436
8636
  return (m.name || "").toLowerCase().includes(search) || (m.email || "").toLowerCase().includes(search);
8437
8637
  });
8438
- 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(
8439
8639
  "button",
8440
8640
  {
8441
8641
  type: "button",
@@ -8444,7 +8644,13 @@ function QuestReviewStackEditor({
8444
8644
  },
8445
8645
  /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiPlus, { size: 10 }),
8446
8646
  " Adicionar Camada"
8447
- )), 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(
8448
8654
  "input",
8449
8655
  {
8450
8656
  autoFocus: true,
@@ -8454,7 +8660,14 @@ function QuestReviewStackEditor({
8454
8660
  onChange: (e) => setSearchQuery(e.target.value),
8455
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"
8456
8662
  }
8457
- ), /* @__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(
8458
8671
  "li",
8459
8672
  {
8460
8673
  key: m.id,
@@ -8472,8 +8685,32 @@ function QuestReviewStackEditor({
8472
8685
  key: index,
8473
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`
8474
8687
  },
8475
- /* @__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 })))),
8476
- /* @__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")),
8477
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(
8478
8715
  "button",
8479
8716
  {
@@ -8506,10 +8743,10 @@ function QuestReviewStackEditor({
8506
8743
 
8507
8744
  // src/components/InSceneQuestForm.jsx
8508
8745
  var QUEST_STATUS_COLORS2 = {
8509
- "Backlog": "#64748b",
8746
+ Backlog: "#64748b",
8510
8747
  "In Progress": "#eab308",
8511
- "Review": "#a855f7",
8512
- "Done": "#22c55e"
8748
+ Review: "#a855f7",
8749
+ Done: "#22c55e"
8513
8750
  };
8514
8751
  function InSceneQuestForm({
8515
8752
  onSave,
@@ -8553,7 +8790,10 @@ function InSceneQuestForm({
8553
8790
  setCustomProps([...customProps, newProp]);
8554
8791
  setTimeout(() => {
8555
8792
  var _a2;
8556
- (_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
+ });
8557
8797
  }, 100);
8558
8798
  };
8559
8799
  const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
@@ -8592,12 +8832,14 @@ function InSceneQuestForm({
8592
8832
  customProps.filter((prop) => prop.key.trim() && !prop.isEditing)
8593
8833
  );
8594
8834
  const processedSections = processDescriptionForSave(description, []);
8595
- const initialTimeline = [{
8596
- type: "quest_created",
8597
- timestamp: Date.now(),
8598
- actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
8599
- description: `Quest criada por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
8600
- }];
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
+ ];
8601
8843
  if (assigneeId) {
8602
8844
  initialTimeline.push({
8603
8845
  type: "assignee_changed",
@@ -8643,7 +8885,15 @@ function InSceneQuestForm({
8643
8885
  onContextMenu: swallow,
8644
8886
  onDoubleClick: swallow
8645
8887
  },
8646
- /* @__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
+ ),
8647
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(
8648
8898
  "button",
8649
8899
  {
@@ -8668,16 +8918,40 @@ function InSceneQuestForm({
8668
8918
  },
8669
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"
8670
8920
  }
8671
- ), /* @__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(
8672
8929
  "button",
8673
8930
  {
8674
8931
  type: "button",
8675
8932
  onClick: () => setIsStatusDropdownOpen(!isStatusDropdownOpen),
8676
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"
8677
8934
  },
8678
- /* @__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)),
8679
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
8680
- ), 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(
8681
8955
  "li",
8682
8956
  {
8683
8957
  key: s,
@@ -8688,7 +8962,13 @@ function InSceneQuestForm({
8688
8962
  },
8689
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"}`
8690
8964
  },
8691
- /* @__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
+ ),
8692
8972
  s
8693
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(
8694
8974
  "button",
@@ -8698,11 +8978,22 @@ function InSceneQuestForm({
8698
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"
8699
8979
  },
8700
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")),
8701
- /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
8702
- ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
8703
- setIsAssigneeDropdownOpen(false);
8704
- setAssigneeSearchQuery("");
8705
- } }), /* @__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(
8706
8997
  "input",
8707
8998
  {
8708
8999
  type: "text",
@@ -8749,20 +9040,7 @@ function InSceneQuestForm({
8749
9040
  onChange: setReviewStack,
8750
9041
  viewMembers
8751
9042
  }
8752
- )), /* @__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(
8753
- "input",
8754
- {
8755
- type: "text",
8756
- value: typeInput,
8757
- onChange: (e) => setTypeInput(e.target.value),
8758
- onKeyDown: handleTypeInputKeyDown,
8759
- onBlur: () => {
8760
- if (typeInput.trim()) handleAddType(typeInput);
8761
- },
8762
- className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
8763
- autoComplete: "off"
8764
- }
8765
- ))), /* @__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(
8766
9044
  DescriptionDisplay,
8767
9045
  {
8768
9046
  description,
@@ -8772,20 +9050,31 @@ function InSceneQuestForm({
8772
9050
  onMentionClick,
8773
9051
  onSaveDescription: (newDesc) => setDescription(newDesc)
8774
9052
  }
8775
- ), /* @__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(
8776
9054
  "button",
8777
9055
  {
8778
- key: s,
8779
9056
  type: "button",
8780
- onClick: () => {
8781
- setSize(s);
8782
- onSizeChange == null ? void 0 : onSizeChange(s);
8783
- },
8784
- 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"
8785
9074
  },
8786
- /* @__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" })),
8787
- /* @__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)
8788
- )))), /* @__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(
8789
9078
  CustomPropertyDisplay,
8790
9079
  {
8791
9080
  key: prop.id,
@@ -8793,10 +9082,81 @@ function InSceneQuestForm({
8793
9082
  onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
8794
9083
  onRemove: () => handleRemoveProp(index),
8795
9084
  onOpenImageViewer,
8796
- unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
9085
+ unavailableTypes: currentUsedTypes.filter(
9086
+ (t) => t !== prop.type
9087
+ ),
8797
9088
  onUploadFile
8798
9089
  }
8799
- )), /* @__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
+ )))
8800
9160
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react17.default.createElement(
8801
9161
  DescriptionEditModal,
8802
9162
  {
@@ -9352,9 +9712,10 @@ function QuestDetailsPanel({
9352
9712
  onUploadFile,
9353
9713
  userRole,
9354
9714
  currentDatasetName,
9355
- viewMembers = []
9715
+ viewMembers = [],
9716
+ currentUser
9356
9717
  }) {
9357
- var _a;
9718
+ var _a, _b;
9358
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) || "";
9359
9720
  const [rawTitle, setRawTitle] = (0, import_react19.useState)(initialRawTitle);
9360
9721
  const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
@@ -9370,6 +9731,9 @@ function QuestDetailsPanel({
9370
9731
  const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react19.useState)(false);
9371
9732
  const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react19.useState)(false);
9372
9733
  const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react19.useState)("");
9734
+ const [returnAssigneeId, setReturnAssigneeId] = (0, import_react19.useState)("");
9735
+ const [isReturnDropdownOpen, setIsReturnDropdownOpen] = (0, import_react19.useState)(false);
9736
+ const [returnSearchQuery, setReturnSearchQuery] = (0, import_react19.useState)("");
9373
9737
  const [customProps, setCustomProps] = (0, import_react19.useState)(() => extractCustomPropsFromNode(node || {}));
9374
9738
  const [reviewStack, setReviewStack] = (0, import_react19.useState)((node == null ? void 0 : node.reviewStack) || []);
9375
9739
  const [timeline, setTimeline] = (0, import_react19.useState)((node == null ? void 0 : node.timeline) || []);
@@ -9409,6 +9773,7 @@ function QuestDetailsPanel({
9409
9773
  setStatus((node == null ? void 0 : node.status) ?? "Backlog");
9410
9774
  setSize((node == null ? void 0 : node.size) ?? "medium");
9411
9775
  setAssigneeId((node == null ? void 0 : node.assignee_id) || "");
9776
+ setReturnAssigneeId("");
9412
9777
  setDescription((node == null ? void 0 : node.description) ?? "");
9413
9778
  setIntensity((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9414
9779
  setExistingSections((node == null ? void 0 : node.description_sections) || []);
@@ -9452,8 +9817,7 @@ function QuestDetailsPanel({
9452
9817
  });
9453
9818
  };
9454
9819
  const swallow = (e) => e.stopPropagation();
9455
- const handleNameChange = (e) => {
9456
- const val = e.target.value;
9820
+ const handleNameChange = (val) => {
9457
9821
  setRawTitle(val);
9458
9822
  const newStandardName = questPrefix ? `${questPrefix} - \xBB ${val || "Sem t\xEDtulo"}` : val;
9459
9823
  onNameChange == null ? void 0 : onNameChange(node.id, newStandardName, val);
@@ -9464,6 +9828,53 @@ function QuestDetailsPanel({
9464
9828
  onSizeChange == null ? void 0 : onSizeChange(node.id, newSize);
9465
9829
  setHasUnsavedChanges(true);
9466
9830
  };
9831
+ const handleReturnToOperation = async () => {
9832
+ if (isSaving) return;
9833
+ setIsSaving(true);
9834
+ const actorId = (currentUser == null ? void 0 : currentUser.id) || "unknown";
9835
+ const actorName = (currentUser == null ? void 0 : currentUser.name) || "Revisor";
9836
+ const targetMember = viewMembers.find((m) => String(m.id) === String(returnAssigneeId));
9837
+ const targetName = (targetMember == null ? void 0 : targetMember.name) || "executor";
9838
+ const newEvent = {
9839
+ type: "review_returned",
9840
+ timestamp: Date.now(),
9841
+ actorId,
9842
+ description: `Review finalizada com retorno para opera\xE7\xE3o por ${actorName}. Novo respons\xE1vel: ${targetName}.`
9843
+ };
9844
+ const updatedTimeline = [...timeline, newEvent];
9845
+ const updatedStatus = "In Progress";
9846
+ const updatedColor = "#eab308";
9847
+ const nodeToSave = {
9848
+ ...node,
9849
+ name: standardizedName,
9850
+ raw_title: rawTitle,
9851
+ description,
9852
+ status: updatedStatus,
9853
+ color: updatedColor,
9854
+ assignee_id: returnAssigneeId,
9855
+ reviewStack,
9856
+ timeline: updatedTimeline,
9857
+ size,
9858
+ types: types.includes("quest") ? types : [...types, "quest"],
9859
+ intensity: intensity || 0,
9860
+ useImageAsTexture: node.useImageAsTexture || false,
9861
+ textureImageUrl: node.textureImageUrl || null
9862
+ };
9863
+ try {
9864
+ await onSave(nodeToSave, false);
9865
+ setTimeline(updatedTimeline);
9866
+ setStatus(updatedStatus);
9867
+ setAssigneeId(returnAssigneeId);
9868
+ setReturnAssigneeId("");
9869
+ onDataUpdate(nodeToSave);
9870
+ setHasUnsavedChanges(false);
9871
+ } catch (error) {
9872
+ console.error("Erro ao retornar para opera\xE7\xE3o:", error);
9873
+ alert("Erro ao realizar o retorno para opera\xE7\xE3o.");
9874
+ } finally {
9875
+ setIsSaving(false);
9876
+ }
9877
+ };
9467
9878
  const handleStatusChange = (newStatus) => {
9468
9879
  setStatus(newStatus);
9469
9880
  const newColor = QUEST_STATUS_COLORS3[newStatus];
@@ -9635,7 +10046,7 @@ function QuestDetailsPanel({
9635
10046
  {
9636
10047
  type: "text",
9637
10048
  value: rawTitle,
9638
- onChange: handleNameChange,
10049
+ onChange: (e) => handleNameChange(e.target.value),
9639
10050
  readOnly: !canEdit,
9640
10051
  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"}`
9641
10052
  }
@@ -9752,7 +10163,65 @@ function QuestDetailsPanel({
9752
10163
  viewMembers,
9753
10164
  readOnly: !canEdit
9754
10165
  }
9755
- )), /* @__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(
10166
+ )), 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" }, "Selecione o respons\xE1vel abaixo para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-[10px] text-slate-400 font-medium ml-0.5" }, "Retornar para:"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
10167
+ "button",
10168
+ {
10169
+ type: "button",
10170
+ onClick: () => setIsReturnDropdownOpen(!isReturnDropdownOpen),
10171
+ className: "w-full bg-slate-800/80 p-2 text-xs rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-1 focus:ring-purple-400/50 transition-colors flex items-center justify-between"
10172
+ },
10173
+ /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "text-slate-400", size: 12 }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_b = viewMembers.find((m) => String(m.id) === String(returnAssigneeId))) == null ? void 0 : _b.name) || "Selecionar respons\xE1vel...")),
10174
+ /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isReturnDropdownOpen ? "rotate-180" : ""}`, size: 14 })
10175
+ ), isReturnDropdownOpen && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
10176
+ setIsReturnDropdownOpen(false);
10177
+ setReturnSearchQuery("");
10178
+ } }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute bottom-full left-0 mb-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiSearch, { className: "text-slate-500", size: 12 }), /* @__PURE__ */ import_react19.default.createElement(
10179
+ "input",
10180
+ {
10181
+ type: "text",
10182
+ autoFocus: true,
10183
+ placeholder: "Buscar membro...",
10184
+ value: returnSearchQuery,
10185
+ onChange: (e) => setReturnSearchQuery(e.target.value),
10186
+ className: "bg-transparent border-none outline-none text-[10px] text-white placeholder-slate-500 w-full",
10187
+ onClick: (e) => e.stopPropagation()
10188
+ }
10189
+ )), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar" }, viewMembers.filter((member) => {
10190
+ const search = returnSearchQuery.toLowerCase();
10191
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10192
+ }).map((member) => /* @__PURE__ */ import_react19.default.createElement(
10193
+ "li",
10194
+ {
10195
+ key: member.id,
10196
+ onClick: () => {
10197
+ setReturnAssigneeId(member.id);
10198
+ setIsReturnDropdownOpen(false);
10199
+ setReturnSearchQuery("");
10200
+ },
10201
+ className: `px-3 py-2 text-[11px] cursor-pointer transition-colors flex items-center gap-2 ${returnAssigneeId === member.id ? "bg-purple-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
10202
+ },
10203
+ member.name || member.email
10204
+ )), viewMembers.filter((member) => {
10205
+ const search = returnSearchQuery.toLowerCase();
10206
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10207
+ }).length === 0 && /* @__PURE__ */ import_react19.default.createElement("li", { className: "px-3 py-4 text-[10px] text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react19.default.createElement(
10208
+ "button",
10209
+ {
10210
+ type: "button",
10211
+ onClick: handleReturnToOperation,
10212
+ disabled: isSaving || !returnAssigneeId,
10213
+ className: `w-full h-10 flex items-center justify-center gap-2 rounded-lg text-xs font-semibold border transition-all active:scale-[0.98] disabled:opacity-40 disabled:grayscale-[0.5] disabled:cursor-not-allowed ${!returnAssigneeId ? "bg-slate-800 text-slate-500 border-white/5" : "bg-slate-800 hover:bg-slate-700 text-purple-300 border-purple-500/20 hover:border-purple-500/40"}`
10214
+ },
10215
+ /* @__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" })),
10216
+ "Retornar para Opera\xE7\xE3o"
10217
+ ))), /* @__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) => {
10218
+ const dateObj = new Date(event.timestamp);
10219
+ const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
10220
+ 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));
10221
+ }))), /* @__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) => {
10222
+ const isSelected = size === s;
10223
+ 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));
10224
+ }))), /* @__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(
9756
10225
  "input",
9757
10226
  {
9758
10227
  type: "text",
@@ -9776,14 +10245,7 @@ function QuestDetailsPanel({
9776
10245
  ), 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) => {
9777
10246
  e.preventDefault();
9778
10247
  handleAddType(suggestedType);
9779
- } }, 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) => {
9780
- const isSelected = size === s;
9781
- 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));
9782
- }))), /* @__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) => {
9783
- const dateObj = new Date(event.timestamp);
9784
- const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
9785
- 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));
9786
- }))), 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")))
10248
+ } }, 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")))
9787
10249
  ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(
9788
10250
  DescriptionEditModal,
9789
10251
  {
@@ -9897,8 +10359,12 @@ function RelationshipDetailsPanel({
9897
10359
  }) {
9898
10360
  const [name, setName] = (0, import_react21.useState)((link == null ? void 0 : link.name) ?? "");
9899
10361
  const [description, setDescription] = (0, import_react21.useState)((link == null ? void 0 : link.description) ?? "");
9900
- const [customProps, setCustomProps] = (0, import_react21.useState)(() => extractCustomPropsFromNode(link || {}));
9901
- const [existingSections, setExistingSections] = (0, import_react21.useState)((link == null ? void 0 : link.description_sections) || []);
10362
+ const [customProps, setCustomProps] = (0, import_react21.useState)(
10363
+ () => extractCustomPropsFromNode(link || {})
10364
+ );
10365
+ const [existingSections, setExistingSections] = (0, import_react21.useState)(
10366
+ (link == null ? void 0 : link.description_sections) || []
10367
+ );
9902
10368
  const [sourceLabel, setSourceLabel] = (0, import_react21.useState)((link == null ? void 0 : link.source_label) ?? "");
9903
10369
  const [targetLabel, setTargetLabel] = (0, import_react21.useState)((link == null ? void 0 : link.target_label) ?? "");
9904
10370
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react21.useState)(false);
@@ -9927,7 +10393,10 @@ function RelationshipDetailsPanel({
9927
10393
  setHasUnsavedChanges(true);
9928
10394
  setTimeout(() => {
9929
10395
  var _a;
9930
- (_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth", block: "center" });
10396
+ (_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
10397
+ behavior: "smooth",
10398
+ block: "center"
10399
+ });
9931
10400
  }, 100);
9932
10401
  };
9933
10402
  const handleSave = async (keepOpen = false, overrides = {}) => {
@@ -9944,8 +10413,13 @@ function RelationshipDetailsPanel({
9944
10413
  }
9945
10414
  setIsSaving(true);
9946
10415
  try {
9947
- const extrasObj = toObjectFromCustomProps(currentCustomProps.filter((p) => !p.isEditing));
9948
- const processedSections = processDescriptionForSave(currentDescription, currentExistingSections);
10416
+ const extrasObj = toObjectFromCustomProps(
10417
+ currentCustomProps.filter((p) => !p.isEditing)
10418
+ );
10419
+ const processedSections = processDescriptionForSave(
10420
+ currentDescription,
10421
+ currentExistingSections
10422
+ );
9949
10423
  const dataToSave = {
9950
10424
  id: link.id,
9951
10425
  source: link.source,
@@ -9957,8 +10431,10 @@ function RelationshipDetailsPanel({
9957
10431
  isCurved: link.isCurved,
9958
10432
  curveOffset: link.curveOffset
9959
10433
  };
9960
- if (currentSourceLabel.trim()) dataToSave.source_label = currentSourceLabel.trim();
9961
- if (currentTargetLabel.trim()) dataToSave.target_label = currentTargetLabel.trim();
10434
+ if (currentSourceLabel.trim())
10435
+ dataToSave.source_label = currentSourceLabel.trim();
10436
+ if (currentTargetLabel.trim())
10437
+ dataToSave.target_label = currentTargetLabel.trim();
9962
10438
  await onSave(dataToSave, keepOpen);
9963
10439
  onDataUpdate(dataToSave);
9964
10440
  setHasUnsavedChanges(false);
@@ -10037,7 +10513,16 @@ function RelationshipDetailsPanel({
10037
10513
  onImageClick: handleImageClickFromText,
10038
10514
  onSaveDescription: handleSaveDescriptionInline
10039
10515
  }
10040
- ) : /* @__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(
10516
+ ) : /* @__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(
10517
+ "button",
10518
+ {
10519
+ onClick: onClose,
10520
+ disabled: isSaving,
10521
+ 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",
10522
+ title: "Fechar"
10523
+ },
10524
+ "\xD7"
10525
+ )), /* @__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(
10041
10526
  "input",
10042
10527
  {
10043
10528
  type: "text",
@@ -10052,7 +10537,23 @@ function RelationshipDetailsPanel({
10052
10537
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
10053
10538
  `
10054
10539
  }
10055
- )), /* @__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(
10540
+ )), /* @__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(
10541
+ "svg",
10542
+ {
10543
+ xmlns: "http://www.w3.org/2000/svg",
10544
+ width: "13",
10545
+ height: "13",
10546
+ viewBox: "0 0 24 24",
10547
+ fill: "none",
10548
+ stroke: "currentColor",
10549
+ strokeWidth: "2",
10550
+ strokeLinecap: "round",
10551
+ strokeLinejoin: "round",
10552
+ className: "text-violet-400 flex-shrink-0"
10553
+ },
10554
+ /* @__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" }),
10555
+ /* @__PURE__ */ import_react21.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })
10556
+ ), /* @__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(
10056
10557
  "input",
10057
10558
  {
10058
10559
  type: "text",
@@ -10119,7 +10620,16 @@ function RelationshipDetailsPanel({
10119
10620
  className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
10120
10621
  },
10121
10622
  "Adicionar descri\xE7\xE3o..."
10122
- ))), /* @__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(
10623
+ ))), /* @__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(
10624
+ "button",
10625
+ {
10626
+ type: "button",
10627
+ onClick: handleAddProp,
10628
+ 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"
10629
+ },
10630
+ /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiPlus, { size: 14 }),
10631
+ " Adicionar"
10632
+ )), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react21.default.createElement(
10123
10633
  CustomPropertyDisplay,
10124
10634
  {
10125
10635
  key: prop.id,
@@ -10127,11 +10637,21 @@ function RelationshipDetailsPanel({
10127
10637
  onUpdate: (updatedProp) => handleUpdateProp(idx, updatedProp),
10128
10638
  onRemove: () => handleRemoveProp(idx),
10129
10639
  onOpenImageViewer,
10130
- unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
10640
+ unavailableTypes: currentUsedTypes.filter(
10641
+ (t) => t !== prop.type
10642
+ ),
10131
10643
  onUploadFile,
10132
10644
  disabled: !canEdit
10133
10645
  }
10134
- )), /* @__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(
10646
+ )), /* @__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(
10647
+ "button",
10648
+ {
10649
+ onClick: onClose,
10650
+ disabled: isSaving,
10651
+ className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50"
10652
+ },
10653
+ canEdit ? "Cancelar" : "Fechar"
10654
+ ), canEdit && /* @__PURE__ */ import_react21.default.createElement(
10135
10655
  "button",
10136
10656
  {
10137
10657
  onClick: () => handleSave(false),
@@ -15639,7 +16159,8 @@ function XViewScene({
15639
16159
  onUploadFile: upload_file_action,
15640
16160
  userRole: userPermissionRole,
15641
16161
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
15642
- viewMembers
16162
+ viewMembers,
16163
+ currentUser: session == null ? void 0 : session.user
15643
16164
  }
15644
16165
  ),
15645
16166
  detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(