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

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 +581 -450
  2. package/dist/index.mjs +524 -381
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -44,9 +44,9 @@ __export(index_exports, {
44
44
  module.exports = __toCommonJS(index_exports);
45
45
 
46
46
  // src/XViewScene.jsx
47
- var import_react27 = __toESM(require("react"));
47
+ var import_react28 = __toESM(require("react"));
48
48
  var import_navigation = require("next/navigation");
49
- var import_react28 = require("next-auth/react");
49
+ var import_react29 = require("next-auth/react");
50
50
  var import_crypto_js = __toESM(require("crypto-js"));
51
51
  var THREE3 = __toESM(require("three"));
52
52
  var import_OrbitControls = require("three/examples/jsm/controls/OrbitControls.js");
@@ -3651,11 +3651,32 @@ function useResizablePanel({ initialWidth, minWidth, maxWidth }) {
3651
3651
  );
3652
3652
  return { width, isResizing, handlePointerDown, setWidth };
3653
3653
  }
3654
+ function createTimelineEntry(actorId, description, type = "comment", extras = {}) {
3655
+ const { links = [], images = [], metadata = {} } = extras;
3656
+ return {
3657
+ id: v4_default(),
3658
+ type,
3659
+ timestamp: Date.now(),
3660
+ actorId,
3661
+ description,
3662
+ links: links.map((l) => ({
3663
+ id: l.id || v4_default(),
3664
+ name: l.name || "",
3665
+ value: l.value || ""
3666
+ })),
3667
+ images: images.map((img) => ({
3668
+ id: img.id || v4_default(),
3669
+ name: img.name || "",
3670
+ value: img.value || ""
3671
+ })),
3672
+ metadata
3673
+ };
3674
+ }
3654
3675
 
3655
3676
  // src/components/CustomPropertyDisplay.jsx
3656
3677
  var import_react4 = __toESM(require("react"));
3657
3678
  var import_fi2 = require("react-icons/fi");
3658
- function CustomPropertyDisplay({
3679
+ function CustomPropertyDisplay2({
3659
3680
  prop,
3660
3681
  onUpdate,
3661
3682
  onRemove,
@@ -4426,7 +4447,7 @@ var normalizeText = (text) => {
4426
4447
  if (!text) return "";
4427
4448
  return text.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
4428
4449
  };
4429
- function DescriptionEditModal({
4450
+ function DescriptionEditModal2({
4430
4451
  isOpen,
4431
4452
  title,
4432
4453
  initialValue,
@@ -5110,7 +5131,7 @@ var formatLineContent2 = (line, availableNodes, onMentionClick, activeMentionInd
5110
5131
  }
5111
5132
  return /* @__PURE__ */ import_react7.default.createElement("span", { className: "break-words" }, processContent(line));
5112
5133
  };
5113
- function DescriptionDisplay({
5134
+ function DescriptionDisplay2({
5114
5135
  description,
5115
5136
  savedSections,
5116
5137
  availableNodes = [],
@@ -5651,7 +5672,7 @@ function DescriptionReadModePanel({
5651
5672
  targetRenderNodeId
5652
5673
  }
5653
5674
  ))) : showProperties ? /* @__PURE__ */ import_react8.default.createElement("div", { className: "space-y-4 animate-in fade-in slide-in-from-bottom-2 duration-300" }, customProperties.map((prop) => /* @__PURE__ */ import_react8.default.createElement(
5654
- CustomPropertyDisplay,
5675
+ CustomPropertyDisplay2,
5655
5676
  {
5656
5677
  key: prop.id,
5657
5678
  prop,
@@ -5663,7 +5684,7 @@ function DescriptionReadModePanel({
5663
5684
  onOpenImageViewer: null
5664
5685
  }
5665
5686
  ))) : /* @__PURE__ */ import_react8.default.createElement(
5666
- DescriptionDisplay,
5687
+ DescriptionDisplay2,
5667
5688
  {
5668
5689
  description,
5669
5690
  savedSections,
@@ -5812,7 +5833,7 @@ function AncestryRelationshipPanel({
5812
5833
  onSaveDescription: handleSaveDescriptionInline
5813
5834
  }
5814
5835
  ) : /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-cyan-400/0 via-cyan-400/70 to-cyan-400/0" }), /* @__PURE__ */ import_react9.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react9.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-cyan-400/80 shadow-[0_0_18px_2px_rgba(45,212,191,0.55)]" }), /* @__PURE__ */ import_react9.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o de Ancestralidade")), /* @__PURE__ */ import_react9.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Editar Rela\xE7\xE3o")), /* @__PURE__ */ import_react9.default.createElement("button", { onClick: onClose, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react9.default.createElement("div", { className: "px-6 pb-4 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react9.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o da Rela\xE7\xE3o"), /* @__PURE__ */ import_react9.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_react9.default.createElement(
5815
- DescriptionDisplay,
5836
+ DescriptionDisplay2,
5816
5837
  {
5817
5838
  description,
5818
5839
  savedSections: existingSections,
@@ -5849,7 +5870,7 @@ function AncestryRelationshipPanel({
5849
5870
  },
5850
5871
  "Adicionar descri\xE7\xE3o..."
5851
5872
  )), /* @__PURE__ */ import_react9.default.createElement("p", { className: "text-xs text-slate-400 italic" }, "Esta descri\xE7\xE3o aparecer\xE1 ao passar o mouse sobre a linha de conex\xE3o na cena 3D.")), /* @__PURE__ */ import_react9.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react9.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react9.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_react9.default.createElement(import_fi7.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex flex-col gap-3 p-3 rounded-lg bg-black/20 border border-white/5" }, customProps.length === 0 && /* @__PURE__ */ import_react9.default.createElement("p", { className: "text-center text-sm text-slate-400 py-4" }, "Nenhuma propriedade adicional."), customProps.map((prop, idx) => /* @__PURE__ */ import_react9.default.createElement(
5852
- CustomPropertyDisplay,
5873
+ CustomPropertyDisplay2,
5853
5874
  {
5854
5875
  key: prop.id,
5855
5876
  prop,
@@ -5862,7 +5883,7 @@ function AncestryRelationshipPanel({
5862
5883
  )), /* @__PURE__ */ import_react9.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react9.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_react9.default.createElement("button", { onClick: onClose, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm" }, "Cancelar"), /* @__PURE__ */ import_react9.default.createElement("button", { onClick: handleSave, className: "px-4 py-2 rounded-lg bg-gradient-to-tr from-cyan-600 to-cyan-400 hover:from-cyan-500 hover:to-cyan-300 transition-colors font-semibold text-sm shadow-[0_8px_24px_rgba(45,212,191,0.35)]" }, "Salvar Altera\xE7\xF5es")))
5863
5884
  )
5864
5885
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react9.default.createElement(
5865
- DescriptionEditModal,
5886
+ DescriptionEditModal2,
5866
5887
  {
5867
5888
  isOpen: isDescriptionModalOpen,
5868
5889
  title: "Editar Descri\xE7\xE3o da Rela\xE7\xE3o",
@@ -7335,7 +7356,7 @@ function CreateAncestryPanel({
7335
7356
  /* @__PURE__ */ import_react11.default.createElement("div", { className: "w-4 h-4 border border-slate-500 rounded flex items-center justify-center" }),
7336
7357
  "Usar Ancestralidade Existente como Branch"
7337
7358
  ))), isContextLinked ? /* @__PURE__ */ import_react11.default.createElement("div", { className: "text-center py-8 text-slate-500 text-sm border-t border-white/5" }, /* @__PURE__ */ import_react11.default.createElement("p", null, "O conte\xFAdo desta ramifica\xE7\xE3o \xE9 provido por outra ancestralidade."), /* @__PURE__ */ import_react11.default.createElement("p", { className: "mt-1 text-xs" }, "Para editar, navegue at\xE9 a ancestralidade original ou desvincule.")) : /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement("div", { className: "mb-4 space-y-1.5 relative" }, /* @__PURE__ */ import_react11.default.createElement("label", { className: "text-xs text-slate-400 font-medium ml-1" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react11.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react11.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 z-10" }, /* @__PURE__ */ import_react11.default.createElement(
7338
- DescriptionDisplay,
7359
+ DescriptionDisplay2,
7339
7360
  {
7340
7361
  key: branchStack.length > 0 ? branchStack[branchStack.length - 1].branchId : currentAncestryId || "root",
7341
7362
  description,
@@ -7414,7 +7435,7 @@ function CreateAncestryPanel({
7414
7435
  /* @__PURE__ */ import_react11.default.createElement(import_fi9.FiPlus, { size: 14 }),
7415
7436
  " Adicionar"
7416
7437
  )), /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react11.default.createElement(
7417
- CustomPropertyDisplay,
7438
+ CustomPropertyDisplay2,
7418
7439
  {
7419
7440
  key: prop.id,
7420
7441
  prop,
@@ -7554,7 +7575,7 @@ function CreateAncestryPanel({
7554
7575
  availableNodes
7555
7576
  }
7556
7577
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react11.default.createElement(
7557
- DescriptionEditModal,
7578
+ DescriptionEditModal2,
7558
7579
  {
7559
7580
  isOpen: isDescriptionModalOpen,
7560
7581
  title: branchStack.length > 0 ? "Editar Descri\xE7\xE3o da Ramifica\xE7\xE3o" : "Editar Descri\xE7\xE3o da Ancestralidade",
@@ -8116,7 +8137,7 @@ function InSceneCreationForm({
8116
8137
  },
8117
8138
  ds.name
8118
8139
  )))), /* @__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(
8119
- DescriptionDisplay,
8140
+ DescriptionDisplay2,
8120
8141
  {
8121
8142
  description,
8122
8143
  savedSections: [],
@@ -8222,7 +8243,7 @@ function InSceneCreationForm({
8222
8243
  /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiPlus, { size: 14 }),
8223
8244
  " Adicionar"
8224
8245
  )), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react14.default.createElement(
8225
- CustomPropertyDisplay,
8246
+ CustomPropertyDisplay2,
8226
8247
  {
8227
8248
  key: prop.id,
8228
8249
  prop,
@@ -8254,7 +8275,7 @@ function InSceneCreationForm({
8254
8275
  "Salvar"
8255
8276
  )))
8256
8277
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react14.default.createElement(
8257
- DescriptionEditModal,
8278
+ DescriptionEditModal2,
8258
8279
  {
8259
8280
  isOpen: isDescriptionModalOpen,
8260
8281
  title: "Editar Descri\xE7\xE3o do Node",
@@ -8443,7 +8464,7 @@ function InSceneVersionForm({
8443
8464
  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
8465
  }
8445
8466
  )), /* @__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(
8446
- DescriptionDisplay,
8467
+ DescriptionDisplay2,
8447
8468
  {
8448
8469
  description,
8449
8470
  savedSections: [],
@@ -8537,7 +8558,7 @@ function InSceneVersionForm({
8537
8558
  /* @__PURE__ */ import_react15.default.createElement(import_fi13.FiPlus, { size: 14 }),
8538
8559
  " Adicionar"
8539
8560
  )), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react15.default.createElement(
8540
- CustomPropertyDisplay,
8561
+ CustomPropertyDisplay2,
8541
8562
  {
8542
8563
  key: prop.id,
8543
8564
  prop,
@@ -8569,7 +8590,7 @@ function InSceneVersionForm({
8569
8590
  "Salvar"
8570
8591
  )))
8571
8592
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react15.default.createElement(
8572
- DescriptionEditModal,
8593
+ DescriptionEditModal2,
8573
8594
  {
8574
8595
  isOpen: isDescriptionModalOpen,
8575
8596
  title: "Editar Descri\xE7\xE3o da Vers\xE3o",
@@ -8833,22 +8854,19 @@ function InSceneQuestForm({
8833
8854
  );
8834
8855
  const processedSections = processDescriptionForSave(description, []);
8835
8856
  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
- }
8857
+ createTimelineEntry(
8858
+ ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
8859
+ `Quest criada por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`,
8860
+ "quest_created"
8861
+ )
8842
8862
  ];
8843
8863
  if (assigneeId) {
8844
- initialTimeline.push({
8845
- type: "assignee_changed",
8846
- timestamp: Date.now() + 1,
8847
- // Ensure sequential timestamp
8848
- actorId: ((_c = session == null ? void 0 : session.user) == null ? void 0 : _c.id) || "unknown",
8849
- to_assignee_id: assigneeId,
8850
- description: `Quest atribu\xEDda para ${((_d = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _d.name) || "respons\xE1vel"}.`
8851
- });
8864
+ initialTimeline.push(createTimelineEntry(
8865
+ ((_c = session == null ? void 0 : session.user) == null ? void 0 : _c.id) || "unknown",
8866
+ `Quest atribu\xEDda para ${((_d = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _d.name) || "respons\xE1vel"}.`,
8867
+ "assignee_changed",
8868
+ { metadata: { to_assignee_id: assigneeId } }
8869
+ ));
8852
8870
  }
8853
8871
  onSave({
8854
8872
  name: standardizedName,
@@ -9041,7 +9059,7 @@ function InSceneQuestForm({
9041
9059
  viewMembers
9042
9060
  }
9043
9061
  )), /* @__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(
9044
- DescriptionDisplay,
9062
+ DescriptionDisplay2,
9045
9063
  {
9046
9064
  description,
9047
9065
  savedSections: [],
@@ -9075,7 +9093,7 @@ function InSceneQuestForm({
9075
9093
  /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiPlus, { size: 14 }),
9076
9094
  " Adicionar"
9077
9095
  )), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react17.default.createElement(
9078
- CustomPropertyDisplay,
9096
+ CustomPropertyDisplay2,
9079
9097
  {
9080
9098
  key: prop.id,
9081
9099
  prop,
@@ -9158,7 +9176,7 @@ function InSceneQuestForm({
9158
9176
  "Salvar Quest"
9159
9177
  )))
9160
9178
  ), isDescriptionModalOpen && /* @__PURE__ */ import_react17.default.createElement(
9161
- DescriptionEditModal,
9179
+ DescriptionEditModal2,
9162
9180
  {
9163
9181
  isOpen: isDescriptionModalOpen,
9164
9182
  title: "Editar Descri\xE7\xE3o da Quest",
@@ -9562,7 +9580,7 @@ function NodeDetailsPanel({
9562
9580
  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"}`
9563
9581
  }
9564
9582
  )), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(
9565
- DescriptionDisplay,
9583
+ DescriptionDisplay2,
9566
9584
  {
9567
9585
  description,
9568
9586
  savedSections: existingSections,
@@ -9640,7 +9658,7 @@ function NodeDetailsPanel({
9640
9658
  title: `Intensidade do brilho: ${intensity}`
9641
9659
  }
9642
9660
  ), /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-xs text-slate-400 w-6 text-right" }, intensity)), /* @__PURE__ */ import_react18.default.createElement("span", { className: `text-xs block mt-1 transition-opacity ${useImageAsTexture ? "opacity-40" : "text-slate-400"}` }, useImageAsTexture ? "Cor da borda (definida pela imagem)" : "Ajuste a cor e a intensidade do brilho.")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react18.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react18.default.createElement(
9643
- CustomPropertyDisplay,
9661
+ CustomPropertyDisplay2,
9644
9662
  {
9645
9663
  key: prop.id,
9646
9664
  prop,
@@ -9667,7 +9685,7 @@ function NodeDetailsPanel({
9667
9685
  isSaving ? "Salvando..." : "Salvar"
9668
9686
  )))
9669
9687
  ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react18.default.createElement(
9670
- DescriptionEditModal,
9688
+ DescriptionEditModal2,
9671
9689
  {
9672
9690
  isOpen: isDescriptionModalOpen,
9673
9691
  title: "Editar Descri\xE7\xE3o do Node",
@@ -9687,8 +9705,73 @@ function NodeDetailsPanel({
9687
9705
  }
9688
9706
 
9689
9707
  // src/components/QuestDetailsPanel.jsx
9708
+ var import_react20 = __toESM(require("react"));
9709
+
9710
+ // src/components/QuestTimeline.jsx
9690
9711
  var import_react19 = __toESM(require("react"));
9691
9712
  var import_fi17 = require("react-icons/fi");
9713
+ var EVENT_ICONS = {
9714
+ "quest_created": { icon: import_fi17.FiPlusCircle, color: "text-sky-400", bg: "bg-sky-400/10" },
9715
+ "assignee_changed": { icon: import_fi17.FiUserPlus, color: "text-indigo-400", bg: "bg-indigo-400/10" },
9716
+ "status_changed": { icon: import_fi17.FiRotateCcw, color: "text-amber-400", bg: "bg-amber-400/10" },
9717
+ "review_cycle_started": { icon: import_fi17.FiSearch, color: "text-purple-400", bg: "bg-purple-400/10" },
9718
+ "review_completed": { icon: import_fi17.FiCheckSquare, color: "text-emerald-400", bg: "bg-emerald-400/10" },
9719
+ "comment": { icon: import_fi17.FiMessageSquare, color: "text-slate-400", bg: "bg-slate-400/10" },
9720
+ "quest_finished": { icon: import_fi17.FiTarget, color: "text-green-400", bg: "bg-green-400/10" },
9721
+ "default": { icon: import_fi17.FiGitCommit, color: "text-slate-500", bg: "bg-slate-500/10" }
9722
+ };
9723
+ function QuestTimeline({
9724
+ timeline = [],
9725
+ viewMembers = [],
9726
+ onOpenImageViewer
9727
+ }) {
9728
+ const sortedTimeline = [...timeline].sort((a, b) => b.timestamp - a.timestamp);
9729
+ const getMemberName = (userId) => {
9730
+ const member = viewMembers.find((m) => m.id === userId);
9731
+ return (member == null ? void 0 : member.name) || (member == null ? void 0 : member.email) || "Sistema";
9732
+ };
9733
+ const formatDate = (timestamp) => {
9734
+ const date = new Date(timestamp);
9735
+ return new Intl.DateTimeFormat("pt-BR", {
9736
+ day: "2-digit",
9737
+ month: "short",
9738
+ hour: "2-digit",
9739
+ minute: "2-digit"
9740
+ }).format(date);
9741
+ };
9742
+ if (timeline.length === 0) {
9743
+ return /* @__PURE__ */ import_react19.default.createElement("div", { className: "py-6 flex flex-col items-center justify-center gap-2 border border-white/5 bg-white/5 rounded-xl" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiAlertCircle, { className: "text-slate-600", size: 16 }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[10px] text-slate-500 font-light uppercase tracking-widest" }, "Nenhum hist\xF3rico dispon\xEDvel"));
9744
+ }
9745
+ return /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider flex items-center gap-2" }, "Hist\xF3rico (Timeline)"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative pl-6 space-y-6 before:content-[''] before:absolute before:left-[11px] before:top-2 before:bottom-2 before:w-[2px] before:bg-white/5" }, sortedTimeline.map((event, index) => {
9746
+ const config = EVENT_ICONS[event.type] || EVENT_ICONS.default;
9747
+ const Icon = config.icon;
9748
+ const actorName = getMemberName(event.actorId);
9749
+ return /* @__PURE__ */ import_react19.default.createElement("div", { key: index, className: "relative animate-in fade-in slide-in-from-left-2 duration-300", style: { animationDelay: `${index * 50}ms` } }, /* @__PURE__ */ import_react19.default.createElement("div", { className: `absolute -left-[27px] top-0 w-8 h-8 rounded-full ${config.bg} flex items-center justify-center ring-4 ring-slate-950 border border-white/5` }, /* @__PURE__ */ import_react19.default.createElement(Icon, { className: config.iconColor || config.color, size: 14 })), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between gap-4" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-xs font-semibold text-slate-200" }, actorName), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] text-slate-500 tabular-nums" }, formatDate(event.timestamp))), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-sm text-slate-400 leading-relaxed" }, event.description), (event.from_status || event.to_status) && /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-1.5 py-1 px-2 rounded-md bg-white/5 border border-white/5 w-fit mt-2" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] text-slate-500" }, event.from_status || "?"), /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiArrowRight, { size: 10, className: "text-slate-600" }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] text-indigo-300 font-bold" }, event.to_status || "?")), event.metadata && Object.keys(event.metadata).length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "mt-2 text-[10px] grid grid-cols-2 gap-2 p-2 bg-slate-900/50 rounded border border-white/5" }, Object.entries(event.metadata).map(([key, value]) => /* @__PURE__ */ import_react19.default.createElement("div", { key, className: "flex flex-col gap-0.5" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-500 capitalize" }, key.replace(/_/g, " ")), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-300 truncate font-mono" }, typeof value === "string" ? value : JSON.stringify(value))))), event.links && event.links.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-wrap gap-2 mt-2" }, event.links.map((link, lIdx) => /* @__PURE__ */ import_react19.default.createElement(
9750
+ "a",
9751
+ {
9752
+ key: lIdx,
9753
+ href: link.value,
9754
+ target: "_blank",
9755
+ rel: "noopener noreferrer",
9756
+ className: "flex items-center gap-1.5 px-2 py-1 rounded bg-white/5 border border-white/5 hover:bg-white/10 transition-colors text-[10px] text-sky-400 font-medium"
9757
+ },
9758
+ /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLink, { size: 10 }),
9759
+ link.name || "Link"
9760
+ ))), event.images && event.images.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-wrap gap-2 mt-2" }, event.images.map((img, iIdx) => /* @__PURE__ */ import_react19.default.createElement(
9761
+ "button",
9762
+ {
9763
+ key: iIdx,
9764
+ type: "button",
9765
+ onClick: () => onOpenImageViewer == null ? void 0 : onOpenImageViewer(event.images, iIdx),
9766
+ className: "relative w-12 h-12 rounded border border-white/10 overflow-hidden hover:border-sky-500/50 transition-colors group"
9767
+ },
9768
+ /* @__PURE__ */ import_react19.default.createElement("img", { src: img.value, alt: img.name, className: "w-full h-full object-cover" }),
9769
+ /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute inset-0 bg-slate-900/40 opacity-0 group-hover:opacity-100 flex items-center justify-center transition-opacity" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiSearch, { size: 12, className: "text-white" }))
9770
+ )))));
9771
+ })));
9772
+ }
9773
+
9774
+ // src/components/QuestDetailsPanel.jsx
9692
9775
  var QUEST_STATUS_COLORS3 = {
9693
9776
  "Backlog": "#64748b",
9694
9777
  "In Progress": "#eab308",
@@ -9717,45 +9800,47 @@ function QuestDetailsPanel({
9717
9800
  }) {
9718
9801
  var _a, _b;
9719
9802
  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) || "";
9720
- const [rawTitle, setRawTitle] = (0, import_react19.useState)(initialRawTitle);
9803
+ const [rawTitle, setRawTitle] = (0, import_react20.useState)(initialRawTitle);
9721
9804
  const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
9722
9805
  const questPrefix = prefixParts.length > 1 ? prefixParts[0] : "";
9723
9806
  const standardizedName = questPrefix ? `${questPrefix} - \xBB ${rawTitle || "Sem t\xEDtulo"}` : rawTitle;
9724
- const [types, setTypes] = (0, import_react19.useState)((node == null ? void 0 : node.type) ? Array.isArray(node.type) ? node.type : [node.type] : ["quest"]);
9725
- const [typeInput, setTypeInput] = (0, import_react19.useState)("");
9726
- const [status, setStatus] = (0, import_react19.useState)((node == null ? void 0 : node.status) ?? "Backlog");
9727
- const [size, setSize] = (0, import_react19.useState)((node == null ? void 0 : node.size) ?? "medium");
9728
- const [assigneeId, setAssigneeId] = (0, import_react19.useState)((node == null ? void 0 : node.assignee_id) || "");
9729
- const [description, setDescription] = (0, import_react19.useState)((node == null ? void 0 : node.description) ?? "");
9730
- const [intensity, setIntensity] = (0, import_react19.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9731
- const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react19.useState)(false);
9732
- const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react19.useState)(false);
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)("");
9737
- const [customProps, setCustomProps] = (0, import_react19.useState)(() => extractCustomPropsFromNode(node || {}));
9738
- const [reviewStack, setReviewStack] = (0, import_react19.useState)((node == null ? void 0 : node.reviewStack) || []);
9739
- const [timeline, setTimeline] = (0, import_react19.useState)((node == null ? void 0 : node.timeline) || []);
9740
- const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react19.useState)(false);
9741
- const [filteredTypes, setFilteredTypes] = (0, import_react19.useState)([]);
9742
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react19.useState)(false);
9743
- const [isReadMode, setIsReadMode] = (0, import_react19.useState)(false);
9744
- const [existingSections, setExistingSections] = (0, import_react19.useState)((node == null ? void 0 : node.description_sections) || []);
9745
- const [isSaving, setIsSaving] = (0, import_react19.useState)(false);
9746
- const [isLinkCopied, setIsLinkCopied] = (0, import_react19.useState)(false);
9747
- const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react19.useState)(false);
9807
+ const [types, setTypes] = (0, import_react20.useState)((node == null ? void 0 : node.type) ? Array.isArray(node.type) ? node.type : [node.type] : ["quest"]);
9808
+ const [typeInput, setTypeInput] = (0, import_react20.useState)("");
9809
+ const [status, setStatus] = (0, import_react20.useState)((node == null ? void 0 : node.status) ?? "Backlog");
9810
+ const [size, setSize] = (0, import_react20.useState)((node == null ? void 0 : node.size) ?? "medium");
9811
+ const [assigneeId, setAssigneeId] = (0, import_react20.useState)((node == null ? void 0 : node.assignee_id) || "");
9812
+ const [description, setDescription] = (0, import_react20.useState)((node == null ? void 0 : node.description) ?? "");
9813
+ const [intensity, setIntensity] = (0, import_react20.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9814
+ const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react20.useState)(false);
9815
+ const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react20.useState)(false);
9816
+ const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react20.useState)("");
9817
+ const [returnAssigneeId, setReturnAssigneeId] = (0, import_react20.useState)("");
9818
+ const [isReturnDropdownOpen, setIsReturnDropdownOpen] = (0, import_react20.useState)(false);
9819
+ const [returnSearchQuery, setReturnSearchQuery] = (0, import_react20.useState)("");
9820
+ const [customProps, setCustomProps] = (0, import_react20.useState)(() => extractCustomPropsFromNode(node || {}));
9821
+ const [reviewStack, setReviewStack] = (0, import_react20.useState)((node == null ? void 0 : node.reviewStack) || []);
9822
+ const [timeline, setTimeline] = (0, import_react20.useState)((node == null ? void 0 : node.timeline) || []);
9823
+ const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react20.useState)(false);
9824
+ const [filteredTypes, setFilteredTypes] = (0, import_react20.useState)([]);
9825
+ const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react20.useState)(false);
9826
+ const [isReadMode, setIsReadMode] = (0, import_react20.useState)(false);
9827
+ const [existingSections, setExistingSections] = (0, import_react20.useState)((node == null ? void 0 : node.description_sections) || []);
9828
+ const [isSaving, setIsSaving] = (0, import_react20.useState)(false);
9829
+ const [isLinkCopied, setIsLinkCopied] = (0, import_react20.useState)(false);
9830
+ const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react20.useState)(false);
9831
+ const [noteText, setNoteText] = (0, import_react20.useState)("");
9832
+ const [isNoteFormOpen, setIsNoteFormOpen] = (0, import_react20.useState)(false);
9748
9833
  const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
9749
9834
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
9750
9835
  initialWidth: isReadMode ? 700 : 440,
9751
9836
  minWidth: 320,
9752
9837
  maxWidth: maxPanelW
9753
9838
  });
9754
- (0, import_react19.useEffect)(() => {
9839
+ (0, import_react20.useEffect)(() => {
9755
9840
  setWidth(isReadMode ? 700 : 440);
9756
9841
  }, [isReadMode, setWidth]);
9757
- const prevNodeIdRef = (0, import_react19.useRef)(null);
9758
- const propsEndRef = (0, import_react19.useRef)(null);
9842
+ const prevNodeIdRef = (0, import_react20.useRef)(null);
9843
+ const propsEndRef = (0, import_react20.useRef)(null);
9759
9844
  const canEdit = userRole !== "viewer";
9760
9845
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
9761
9846
  const handleImageClickFromText = (url, name) => {
@@ -9763,7 +9848,7 @@ function QuestDetailsPanel({
9763
9848
  onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
9764
9849
  }
9765
9850
  };
9766
- (0, import_react19.useEffect)(() => {
9851
+ (0, import_react20.useEffect)(() => {
9767
9852
  var _a2;
9768
9853
  if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
9769
9854
  prevNodeIdRef.current = node == null ? void 0 : node.id;
@@ -9783,7 +9868,7 @@ function QuestDetailsPanel({
9783
9868
  setHasUnsavedChanges(false);
9784
9869
  }
9785
9870
  }, [node]);
9786
- (0, import_react19.useEffect)(() => {
9871
+ (0, import_react20.useEffect)(() => {
9787
9872
  const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
9788
9873
  if (typeInput.trim() === "") {
9789
9874
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
@@ -9875,6 +9960,28 @@ function QuestDetailsPanel({
9875
9960
  setIsSaving(false);
9876
9961
  }
9877
9962
  };
9963
+ const handleAddTimelineNote = async () => {
9964
+ if (!noteText.trim() || isSaving) return;
9965
+ setIsSaving(true);
9966
+ const actorId = (currentUser == null ? void 0 : currentUser.id) || "unknown";
9967
+ const newEntry = createTimelineEntry(actorId, noteText, "comment");
9968
+ const updatedTimeline = [...timeline, newEntry];
9969
+ try {
9970
+ const nodeToSave = {
9971
+ ...node,
9972
+ timeline: updatedTimeline
9973
+ };
9974
+ await onSave(nodeToSave, true);
9975
+ setTimeline(updatedTimeline);
9976
+ onDataUpdate(nodeToSave);
9977
+ setNoteText("");
9978
+ setIsNoteFormOpen(false);
9979
+ } catch (error) {
9980
+ console.error("Erro ao adicionar nota:", error);
9981
+ } finally {
9982
+ setIsSaving(false);
9983
+ }
9984
+ };
9878
9985
  const handleStatusChange = (newStatus) => {
9879
9986
  setStatus(newStatus);
9880
9987
  const newColor = QUEST_STATUS_COLORS3[newStatus];
@@ -10003,7 +10110,7 @@ function QuestDetailsPanel({
10003
10110
  const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
10004
10111
  const assigneeMember = viewMembers.find((m) => m.id === assigneeId);
10005
10112
  const isAssigneeUndefined = assigneeId && !assigneeMember;
10006
- return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(
10113
+ return /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement(
10007
10114
  "div",
10008
10115
  {
10009
10116
  className: `ui-overlay absolute group rounded-2xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white overflow-hidden flex flex-col ${isResizing ? "transition-none" : "transition-all duration-300 ease-out"}`,
@@ -10016,11 +10123,11 @@ function QuestDetailsPanel({
10016
10123
  onContextMenu: swallow,
10017
10124
  onDoubleClick: swallow
10018
10125
  },
10019
- /* @__PURE__ */ import_react19.default.createElement("div", { onPointerDown: (e) => {
10126
+ /* @__PURE__ */ import_react20.default.createElement("div", { onPointerDown: (e) => {
10020
10127
  e.stopPropagation();
10021
10128
  handleResize(e);
10022
10129
  }, className: "absolute left-0 top-0 bottom-0 w-2 cursor-col-resize hover:bg-indigo-500/50 z-[2000] transition-colors", title: "Arraste para redimensionar" }),
10023
- isReadMode ? /* @__PURE__ */ import_react19.default.createElement(
10130
+ isReadMode ? /* @__PURE__ */ import_react20.default.createElement(
10024
10131
  DescriptionReadModePanel,
10025
10132
  {
10026
10133
  title: standardizedName || (node == null ? void 0 : node.name),
@@ -10041,7 +10148,7 @@ function QuestDetailsPanel({
10041
10148
  onImageClick: handleImageClickFromText,
10042
10149
  onSaveDescription: handleSaveDescriptionInline
10043
10150
  }
10044
- ) : /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS3[status]}, transparent)` } }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Quest"), /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCopyLink, className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-sky-400"}`, title: isLinkCopied ? "Link Copiado!" : "Copiar link para esta Quest" }, isLinkCopied ? /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiCheck, { size: 12 }) : /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLink, { size: 12 }))), /* @__PURE__ */ import_react19.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, standardizedName || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Cancelar" }, "\xD7")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react19.default.createElement(
10151
+ ) : /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS3[status]}, transparent)` } }), /* @__PURE__ */ import_react20.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react20.default.createElement(FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Quest"), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: handleCopyLink, className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-sky-400"}`, title: isLinkCopied ? "Link Copiado!" : "Copiar link para esta Quest" }, isLinkCopied ? /* @__PURE__ */ import_react20.default.createElement(FiCheck, { size: 12 }) : /* @__PURE__ */ import_react20.default.createElement(FiLink, { size: 12 }))), /* @__PURE__ */ import_react20.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, standardizedName || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Cancelar" }, "\xD7")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react20.default.createElement(
10045
10152
  "input",
10046
10153
  {
10047
10154
  type: "text",
@@ -10050,7 +10157,7 @@ function QuestDetailsPanel({
10050
10157
  readOnly: !canEdit,
10051
10158
  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"}`
10052
10159
  }
10053
- ), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
10160
+ ), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
10054
10161
  "button",
10055
10162
  {
10056
10163
  type: "button",
@@ -10058,9 +10165,9 @@ function QuestDetailsPanel({
10058
10165
  disabled: !canEdit,
10059
10166
  className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 transition-colors flex items-center justify-between ${canEdit ? "hover:border-white/20 focus:ring-2 focus:ring-indigo-400/60 cursor-pointer" : "cursor-default opacity-80"}`
10060
10167
  },
10061
- /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]", style: { backgroundColor: QUEST_STATUS_COLORS3[status] } }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
10062
- canEdit && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
10063
- ), isStatusDropdownOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS3).map((s) => /* @__PURE__ */ import_react19.default.createElement(
10168
+ /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]", style: { backgroundColor: QUEST_STATUS_COLORS3[status] } }), /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
10169
+ canEdit && /* @__PURE__ */ import_react20.default.createElement(FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
10170
+ ), isStatusDropdownOpen && canEdit && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react20.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS3).map((s) => /* @__PURE__ */ import_react20.default.createElement(
10064
10171
  "li",
10065
10172
  {
10066
10173
  key: s,
@@ -10070,21 +10177,21 @@ function QuestDetailsPanel({
10070
10177
  },
10071
10178
  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"}`
10072
10179
  },
10073
- /* @__PURE__ */ import_react19.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
10180
+ /* @__PURE__ */ import_react20.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
10074
10181
  s
10075
- )))))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
10182
+ )))))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
10076
10183
  "button",
10077
10184
  {
10078
10185
  type: "button",
10079
10186
  onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
10080
10187
  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"
10081
10188
  },
10082
- /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, isAssigneeUndefined ? "Undefined" : (assigneeMember == null ? void 0 : assigneeMember.name) || (assigneeMember == null ? void 0 : assigneeMember.email) || "Nenhum")),
10083
- /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
10084
- ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
10189
+ /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-slate-200 font-medium" }, isAssigneeUndefined ? "Undefined" : (assigneeMember == null ? void 0 : assigneeMember.name) || (assigneeMember == null ? void 0 : assigneeMember.email) || "Nenhum")),
10190
+ /* @__PURE__ */ import_react20.default.createElement(FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
10191
+ ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
10085
10192
  setIsAssigneeDropdownOpen(false);
10086
10193
  setAssigneeSearchQuery("");
10087
- } }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react19.default.createElement(
10194
+ } }), /* @__PURE__ */ import_react20.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_react20.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react20.default.createElement(
10088
10195
  "input",
10089
10196
  {
10090
10197
  type: "text",
@@ -10095,7 +10202,7 @@ function QuestDetailsPanel({
10095
10202
  className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
10096
10203
  onClick: (e) => e.stopPropagation()
10097
10204
  }
10098
- )), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react19.default.createElement(
10205
+ )), /* @__PURE__ */ import_react20.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react20.default.createElement(
10099
10206
  "li",
10100
10207
  {
10101
10208
  onClick: () => {
@@ -10115,7 +10222,7 @@ function QuestDetailsPanel({
10115
10222
  className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${!assigneeId ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
10116
10223
  },
10117
10224
  "Nenhum"
10118
- ), isAssigneeUndefined && /* @__PURE__ */ import_react19.default.createElement(
10225
+ ), isAssigneeUndefined && /* @__PURE__ */ import_react20.default.createElement(
10119
10226
  "li",
10120
10227
  {
10121
10228
  onClick: () => {
@@ -10128,7 +10235,7 @@ function QuestDetailsPanel({
10128
10235
  ), viewMembers.filter((member) => {
10129
10236
  const search = assigneeSearchQuery.toLowerCase();
10130
10237
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10131
- }).map((member) => /* @__PURE__ */ import_react19.default.createElement(
10238
+ }).map((member) => /* @__PURE__ */ import_react20.default.createElement(
10132
10239
  "li",
10133
10240
  {
10134
10241
  key: member.id,
@@ -10152,7 +10259,7 @@ function QuestDetailsPanel({
10152
10259
  )), viewMembers.filter((member) => {
10153
10260
  const search = assigneeSearchQuery.toLowerCase();
10154
10261
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10155
- }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react19.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react19.default.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement(
10262
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react20.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react20.default.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement(
10156
10263
  QuestReviewStackEditor,
10157
10264
  {
10158
10265
  reviewStack,
@@ -10163,19 +10270,19 @@ function QuestDetailsPanel({
10163
10270
  viewMembers,
10164
10271
  readOnly: !canEdit
10165
10272
  }
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(
10273
+ )), status === "Review" && canEdit && /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "bg-slate-900/40 rounded-xl p-4 border border-white/5 space-y-3" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react20.default.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "A\xE7\xF5es de Review"), /* @__PURE__ */ import_react20.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_react20.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_react20.default.createElement("div", { className: "space-y-1.5 flex flex-col" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-[10px] text-slate-400 font-medium ml-0.5" }, "Retornar para:"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
10167
10274
  "button",
10168
10275
  {
10169
10276
  type: "button",
10170
10277
  onClick: () => setIsReturnDropdownOpen(!isReturnDropdownOpen),
10171
10278
  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
10279
  },
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: () => {
10280
+ /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiUser, { className: "text-slate-400", size: 12 }), /* @__PURE__ */ import_react20.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...")),
10281
+ /* @__PURE__ */ import_react20.default.createElement(FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isReturnDropdownOpen ? "rotate-180" : ""}`, size: 14 })
10282
+ ), isReturnDropdownOpen && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
10176
10283
  setIsReturnDropdownOpen(false);
10177
10284
  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(
10285
+ } }), /* @__PURE__ */ import_react20.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_react20.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiSearch, { className: "text-slate-500", size: 12 }), /* @__PURE__ */ import_react20.default.createElement(
10179
10286
  "input",
10180
10287
  {
10181
10288
  type: "text",
@@ -10186,10 +10293,10 @@ function QuestDetailsPanel({
10186
10293
  className: "bg-transparent border-none outline-none text-[10px] text-white placeholder-slate-500 w-full",
10187
10294
  onClick: (e) => e.stopPropagation()
10188
10295
  }
10189
- )), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar" }, viewMembers.filter((member) => {
10296
+ )), /* @__PURE__ */ import_react20.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar" }, viewMembers.filter((member) => {
10190
10297
  const search = returnSearchQuery.toLowerCase();
10191
10298
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10192
- }).map((member) => /* @__PURE__ */ import_react19.default.createElement(
10299
+ }).map((member) => /* @__PURE__ */ import_react20.default.createElement(
10193
10300
  "li",
10194
10301
  {
10195
10302
  key: member.id,
@@ -10204,7 +10311,7 @@ function QuestDetailsPanel({
10204
10311
  )), viewMembers.filter((member) => {
10205
10312
  const search = returnSearchQuery.toLowerCase();
10206
10313
  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(
10314
+ }).length === 0 && /* @__PURE__ */ import_react20.default.createElement("li", { className: "px-3 py-4 text-[10px] text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react20.default.createElement(
10208
10315
  "button",
10209
10316
  {
10210
10317
  type: "button",
@@ -10212,16 +10319,45 @@ function QuestDetailsPanel({
10212
10319
  disabled: isSaving || !returnAssigneeId,
10213
10320
  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
10321
  },
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" })),
10322
+ /* @__PURE__ */ import_react20.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_react20.default.createElement("path", { d: "M12 19V5M5 12l7 7 7-7" })),
10216
10323
  "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) => {
10324
+ ))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react20.default.createElement(DescriptionDisplay, { description, savedSections: existingSections, availableNodes, availableAncestries, onOpenReference, onMentionClick, onImageClick: handleImageClickFromText, onSaveDescription: handleSaveDescriptionInline }), /* @__PURE__ */ import_react20.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react20.default.createElement("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_react20.default.createElement(FiBookOpen, { size: 14 })), canEdit && /* @__PURE__ */ import_react20.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_react20.default.createElement(FiEdit2, { size: 14 }))), canEdit && !description && /* @__PURE__ */ import_react20.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_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react20.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react20.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react20.default.createElement(FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react20.default.createElement(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_react20.default.createElement("div", { ref: propsEndRef }))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-6 border-t border-white/10 mt-6" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between mb-4" }, /* @__PURE__ */ import_react20.default.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "Hist\xF3rico & Notas"), /* @__PURE__ */ import_react20.default.createElement(
10325
+ "button",
10326
+ {
10327
+ type: "button",
10328
+ onClick: () => setIsNoteFormOpen(!isNoteFormOpen),
10329
+ className: "flex items-center gap-1.5 px-2 py-1 text-[10px] rounded-md bg-white/5 hover:bg-white/10 border border-white/10 transition-colors text-slate-300"
10330
+ },
10331
+ isNoteFormOpen ? /* @__PURE__ */ import_react20.default.createElement(FiX, { size: 12 }) : /* @__PURE__ */ import_react20.default.createElement(FiPlus, { size: 12 }),
10332
+ isNoteFormOpen ? "Cancelar" : "Nova Nota"
10333
+ )), isNoteFormOpen && /* @__PURE__ */ import_react20.default.createElement("div", { className: "mb-6 p-4 rounded-xl bg-white/5 border border-white/5 space-y-3 animate-in fade-in slide-in-from-top-2" }, /* @__PURE__ */ import_react20.default.createElement(
10334
+ "textarea",
10335
+ {
10336
+ value: noteText,
10337
+ onChange: (e) => setNoteText(e.target.value),
10338
+ placeholder: "Escreva uma observa\xE7\xE3o no hist\xF3rico...",
10339
+ className: "w-full bg-slate-900/50 p-3 text-sm rounded-lg border border-white/10 focus:outline-none focus:ring-1 focus:ring-indigo-500/50 min-h-[80px] resize-none"
10340
+ }
10341
+ ), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex justify-end gap-2" }, /* @__PURE__ */ import_react20.default.createElement(
10342
+ "button",
10343
+ {
10344
+ type: "button",
10345
+ onClick: handleAddTimelineNote,
10346
+ disabled: !noteText.trim() || isSaving,
10347
+ className: "px-3 py-1.5 rounded-lg bg-indigo-600 hover:bg-indigo-500 text-white text-xs font-semibold transition-colors disabled:opacity-50"
10348
+ },
10349
+ "Adicionar ao Hist\xF3rico"
10350
+ ))), /* @__PURE__ */ import_react20.default.createElement(
10351
+ QuestTimeline,
10352
+ {
10353
+ timeline,
10354
+ viewMembers,
10355
+ onOpenImageViewer
10356
+ }
10357
+ )), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
10222
10358
  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(
10359
+ return /* @__PURE__ */ import_react20.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_react20.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_react20.default.createElement(FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react20.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s));
10360
+ }))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react20.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_react20.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_react20.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react20.default.createElement(FiX, { size: 12 })))), canEdit && /* @__PURE__ */ import_react20.default.createElement(
10225
10361
  "input",
10226
10362
  {
10227
10363
  type: "text",
@@ -10242,11 +10378,11 @@ function QuestDetailsPanel({
10242
10378
  placeholder: "",
10243
10379
  autoComplete: "off"
10244
10380
  }
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) => {
10381
+ ), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react20.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_react20.default.createElement("li", { key: index, className: "px-3 py-2 text-sm text-slate-200 cursor-pointer hover:bg-indigo-600/50", onMouseDown: (e) => {
10246
10382
  e.preventDefault();
10247
10383
  handleAddType(suggestedType);
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")))
10249
- ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(
10384
+ } }, suggestedType))))), currentDatasetName && /* @__PURE__ */ import_react20.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_react20.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react20.default.createElement("button", { onClick: 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_react20.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_react20.default.createElement(FiLoader, { className: "animate-spin" }), isSaving ? "Salvando..." : "Salvar Quest")))
10385
+ ), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react20.default.createElement(
10250
10386
  DescriptionEditModal,
10251
10387
  {
10252
10388
  isOpen: isDescriptionModalOpen,
@@ -10266,7 +10402,7 @@ function QuestDetailsPanel({
10266
10402
  }
10267
10403
 
10268
10404
  // src/components/MultiNodeContextMenu.jsx
10269
- var import_react20 = __toESM(require("react"));
10405
+ var import_react21 = __toESM(require("react"));
10270
10406
  function MultiNodeContextMenu({
10271
10407
  data,
10272
10408
  userRole,
@@ -10275,12 +10411,12 @@ function MultiNodeContextMenu({
10275
10411
  onDismissOtherNodes,
10276
10412
  onDeleteNodes
10277
10413
  }) {
10278
- const menuRef = (0, import_react20.useRef)(null);
10279
- const [menuPos, setMenuPos] = (0, import_react20.useState)({ left: 0, top: 0 });
10280
- const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react20.useState)(false);
10414
+ const menuRef = (0, import_react21.useRef)(null);
10415
+ const [menuPos, setMenuPos] = (0, import_react21.useState)({ left: 0, top: 0 });
10416
+ const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react21.useState)(false);
10281
10417
  const ability = defineAbilityFor(userRole);
10282
10418
  const canDelete = ability.can("delete", "Node");
10283
- (0, import_react20.useLayoutEffect)(() => {
10419
+ (0, import_react21.useLayoutEffect)(() => {
10284
10420
  if (!data.visible || !menuRef.current) return;
10285
10421
  const el = menuRef.current;
10286
10422
  const w = el.clientWidth;
@@ -10293,7 +10429,7 @@ function MultiNodeContextMenu({
10293
10429
  if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
10294
10430
  setMenuPos({ left, top });
10295
10431
  }, [data]);
10296
- (0, import_react20.useEffect)(() => {
10432
+ (0, import_react21.useEffect)(() => {
10297
10433
  if (data.visible) {
10298
10434
  setIsConfirmingDelete(false);
10299
10435
  }
@@ -10308,7 +10444,7 @@ function MultiNodeContextMenu({
10308
10444
  const baseButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-indigo-500/20 text-slate-200 hover:text-white transition-colors duration-150 truncate";
10309
10445
  const deleteButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-red-500/25 text-red-400 hover:text-red-300 transition-colors duration-150 truncate";
10310
10446
  const nodeCount = data.nodeIds.size;
10311
- return /* @__PURE__ */ import_react20.default.createElement(
10447
+ return /* @__PURE__ */ import_react21.default.createElement(
10312
10448
  "div",
10313
10449
  {
10314
10450
  ref: menuRef,
@@ -10322,27 +10458,27 @@ function MultiNodeContextMenu({
10322
10458
  onContextMenu: swallow,
10323
10459
  onDoubleClick: swallow
10324
10460
  },
10325
- /* @__PURE__ */ import_react20.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
10326
- /* @__PURE__ */ import_react20.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center text-red-400 mb-1" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir ", /* @__PURE__ */ import_react20.default.createElement("strong", null, nodeCount, " Nodes"), "?"), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight" }, "Esta a\xE7\xE3o \xE9 irrevers\xEDvel. Todas as conex\xF5es associadas a eles ser\xE3o apagadas.")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react20.default.createElement(
10461
+ /* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
10462
+ /* @__PURE__ */ import_react21.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center text-red-400 mb-1" }, /* @__PURE__ */ import_react21.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react21.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M19 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_react21.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir ", /* @__PURE__ */ import_react21.default.createElement("strong", null, nodeCount, " Nodes"), "?"), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight" }, "Esta a\xE7\xE3o \xE9 irrevers\xEDvel. Todas as conex\xF5es associadas a eles ser\xE3o apagadas.")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react21.default.createElement(
10327
10463
  "button",
10328
10464
  {
10329
10465
  onClick: () => setIsConfirmingDelete(false),
10330
10466
  className: "flex-1 px-2 py-2 text-xs font-medium bg-white/10 hover:bg-white/20 rounded-md text-white transition-colors"
10331
10467
  },
10332
10468
  "Cancelar"
10333
- ), /* @__PURE__ */ import_react20.default.createElement(
10469
+ ), /* @__PURE__ */ import_react21.default.createElement(
10334
10470
  "button",
10335
10471
  {
10336
10472
  onClick: () => onDeleteNodes(data.nodeIds),
10337
10473
  className: "flex-1 px-2 py-2 text-xs font-medium bg-red-500 hover:bg-red-600 rounded-md text-white transition-colors"
10338
10474
  },
10339
10475
  "Excluir"
10340
- ))) : /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_12px_1px_rgba(99,102,241,0.5)]" }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es em Grupo (", nodeCount, " Nodes)")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => onDismissNodes(data.nodeIds), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Dismiss (", nodeCount, ")")), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => onDismissOtherNodes(data.nodeIds), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Dismiss other nodes")), canDelete && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => setIsConfirmingDelete(true), className: deleteButtonClass, title: "Excluir Nodes" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Excluir Nodes (", nodeCount, ")"))))))
10476
+ ))) : /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react21.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_12px_1px_rgba(99,102,241,0.5)]" }), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es em Grupo (", nodeCount, " Nodes)")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react21.default.createElement("button", { onClick: () => onDismissNodes(data.nodeIds), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react21.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_react21.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react21.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_react21.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_react21.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react21.default.createElement("span", null, "Dismiss (", nodeCount, ")")), /* @__PURE__ */ import_react21.default.createElement("button", { onClick: () => onDismissOtherNodes(data.nodeIds), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react21.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_react21.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react21.default.createElement("span", null, "Dismiss other nodes")), canDelete && /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react21.default.createElement("button", { onClick: () => setIsConfirmingDelete(true), className: deleteButtonClass, title: "Excluir Nodes" }, /* @__PURE__ */ import_react21.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_react21.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react21.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_react21.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react21.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react21.default.createElement("span", null, "Excluir Nodes (", nodeCount, ")"))))))
10341
10477
  );
10342
10478
  }
10343
10479
 
10344
10480
  // src/components/RelationshipDetailsPanel.jsx
10345
- var import_react21 = __toESM(require("react"));
10481
+ var import_react22 = __toESM(require("react"));
10346
10482
  var import_fi18 = require("react-icons/fi");
10347
10483
  function RelationshipDetailsPanel({
10348
10484
  link,
@@ -10357,26 +10493,26 @@ function RelationshipDetailsPanel({
10357
10493
  onUploadFile,
10358
10494
  userRole
10359
10495
  }) {
10360
- const [name, setName] = (0, import_react21.useState)((link == null ? void 0 : link.name) ?? "");
10361
- const [description, setDescription] = (0, import_react21.useState)((link == null ? void 0 : link.description) ?? "");
10362
- const [customProps, setCustomProps] = (0, import_react21.useState)(
10496
+ const [name, setName] = (0, import_react22.useState)((link == null ? void 0 : link.name) ?? "");
10497
+ const [description, setDescription] = (0, import_react22.useState)((link == null ? void 0 : link.description) ?? "");
10498
+ const [customProps, setCustomProps] = (0, import_react22.useState)(
10363
10499
  () => extractCustomPropsFromNode(link || {})
10364
10500
  );
10365
- const [existingSections, setExistingSections] = (0, import_react21.useState)(
10501
+ const [existingSections, setExistingSections] = (0, import_react22.useState)(
10366
10502
  (link == null ? void 0 : link.description_sections) || []
10367
10503
  );
10368
- const [sourceLabel, setSourceLabel] = (0, import_react21.useState)((link == null ? void 0 : link.source_label) ?? "");
10369
- const [targetLabel, setTargetLabel] = (0, import_react21.useState)((link == null ? void 0 : link.target_label) ?? "");
10370
- const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react21.useState)(false);
10371
- const [isSaving, setIsSaving] = (0, import_react21.useState)(false);
10372
- const [isReadMode, setIsReadMode] = (0, import_react21.useState)(false);
10373
- const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react21.useState)(false);
10374
- const propsEndRef = (0, import_react21.useRef)(null);
10375
- const canEdit = (0, import_react21.useMemo)(() => {
10504
+ const [sourceLabel, setSourceLabel] = (0, import_react22.useState)((link == null ? void 0 : link.source_label) ?? "");
10505
+ const [targetLabel, setTargetLabel] = (0, import_react22.useState)((link == null ? void 0 : link.target_label) ?? "");
10506
+ const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react22.useState)(false);
10507
+ const [isSaving, setIsSaving] = (0, import_react22.useState)(false);
10508
+ const [isReadMode, setIsReadMode] = (0, import_react22.useState)(false);
10509
+ const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react22.useState)(false);
10510
+ const propsEndRef = (0, import_react22.useRef)(null);
10511
+ const canEdit = (0, import_react22.useMemo)(() => {
10376
10512
  const ability = defineAbilityFor(userRole);
10377
10513
  return ability.can("update", "Connection");
10378
10514
  }, [userRole]);
10379
- (0, import_react21.useEffect)(() => {
10515
+ (0, import_react22.useEffect)(() => {
10380
10516
  setName((link == null ? void 0 : link.name) ?? "");
10381
10517
  setDescription((link == null ? void 0 : link.description) ?? "");
10382
10518
  setExistingSections((link == null ? void 0 : link.description_sections) || []);
@@ -10477,7 +10613,7 @@ function RelationshipDetailsPanel({
10477
10613
  onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
10478
10614
  }
10479
10615
  };
10480
- return /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement(
10616
+ return /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement(
10481
10617
  "div",
10482
10618
  {
10483
10619
  className: `ui-overlay absolute group rounded-2xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white overflow-hidden transition-all duration-300 ease-out
@@ -10492,7 +10628,7 @@ function RelationshipDetailsPanel({
10492
10628
  onContextMenu: swallow,
10493
10629
  onDoubleClick: swallow
10494
10630
  },
10495
- isReadMode ? /* @__PURE__ */ import_react21.default.createElement(
10631
+ isReadMode ? /* @__PURE__ */ import_react22.default.createElement(
10496
10632
  DescriptionReadModePanel,
10497
10633
  {
10498
10634
  title: name || "Rela\xE7\xE3o",
@@ -10513,7 +10649,7 @@ function RelationshipDetailsPanel({
10513
10649
  onImageClick: handleImageClickFromText,
10514
10650
  onSaveDescription: handleSaveDescriptionInline
10515
10651
  }
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(
10652
+ ) : /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }), /* @__PURE__ */ import_react22.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react22.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_react22.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o")), /* @__PURE__ */ import_react22.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || "Rela\xE7\xE3o")), /* @__PURE__ */ import_react22.default.createElement(
10517
10653
  "button",
10518
10654
  {
10519
10655
  onClick: onClose,
@@ -10522,7 +10658,7 @@ function RelationshipDetailsPanel({
10522
10658
  title: "Fechar"
10523
10659
  },
10524
10660
  "\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(
10661
+ )), /* @__PURE__ */ import_react22.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react22.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome da Rela\xE7\xE3o"), /* @__PURE__ */ import_react22.default.createElement(
10526
10662
  "input",
10527
10663
  {
10528
10664
  type: "text",
@@ -10537,7 +10673,7 @@ function RelationshipDetailsPanel({
10537
10673
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
10538
10674
  `
10539
10675
  }
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(
10676
+ )), /* @__PURE__ */ import_react22.default.createElement("div", { className: "rounded-xl border border-white/8 bg-slate-800/30 p-3 space-y-3" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react22.default.createElement(
10541
10677
  "svg",
10542
10678
  {
10543
10679
  xmlns: "http://www.w3.org/2000/svg",
@@ -10551,9 +10687,9 @@ function RelationshipDetailsPanel({
10551
10687
  strokeLinejoin: "round",
10552
10688
  className: "text-violet-400 flex-shrink-0"
10553
10689
  },
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(
10690
+ /* @__PURE__ */ import_react22.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" }),
10691
+ /* @__PURE__ */ import_react22.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })
10692
+ ), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-xs font-medium text-violet-300/80 uppercase tracking-wider" }, "Labels de Agrupamento")), /* @__PURE__ */ import_react22.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_react22.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react22.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Source"), /* @__PURE__ */ import_react22.default.createElement(
10557
10693
  "input",
10558
10694
  {
10559
10695
  type: "text",
@@ -10568,7 +10704,7 @@ function RelationshipDetailsPanel({
10568
10704
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
10569
10705
  `
10570
10706
  }
10571
- )), /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Target"), /* @__PURE__ */ import_react21.default.createElement(
10707
+ )), /* @__PURE__ */ import_react22.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react22.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Target"), /* @__PURE__ */ import_react22.default.createElement(
10572
10708
  "input",
10573
10709
  {
10574
10710
  type: "text",
@@ -10583,8 +10719,8 @@ function RelationshipDetailsPanel({
10583
10719
  ${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
10584
10720
  `
10585
10721
  }
10586
- )))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react21.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react21.default.createElement(
10587
- DescriptionDisplay,
10722
+ )))), /* @__PURE__ */ import_react22.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react22.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react22.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_react22.default.createElement(
10723
+ DescriptionDisplay2,
10588
10724
  {
10589
10725
  description,
10590
10726
  savedSections: existingSections,
@@ -10595,7 +10731,7 @@ function RelationshipDetailsPanel({
10595
10731
  onImageClick: handleImageClickFromText,
10596
10732
  onSaveDescription: handleSaveDescriptionInline
10597
10733
  }
10598
- ), /* @__PURE__ */ import_react21.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react21.default.createElement(
10734
+ ), /* @__PURE__ */ import_react22.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_react22.default.createElement(
10599
10735
  "button",
10600
10736
  {
10601
10737
  type: "button",
@@ -10603,8 +10739,8 @@ function RelationshipDetailsPanel({
10603
10739
  className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors border-r border-white/5",
10604
10740
  title: "Modo de Leitura"
10605
10741
  },
10606
- /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiBookOpen, { size: 14 })
10607
- ), canEdit && /* @__PURE__ */ import_react21.default.createElement(
10742
+ /* @__PURE__ */ import_react22.default.createElement(import_fi18.FiBookOpen, { size: 14 })
10743
+ ), canEdit && /* @__PURE__ */ import_react22.default.createElement(
10608
10744
  "button",
10609
10745
  {
10610
10746
  type: "button",
@@ -10612,25 +10748,25 @@ function RelationshipDetailsPanel({
10612
10748
  className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
10613
10749
  title: "Editar descri\xE7\xE3o"
10614
10750
  },
10615
- /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiEdit2, { size: 14 })
10616
- )), !description && canEdit && /* @__PURE__ */ import_react21.default.createElement(
10751
+ /* @__PURE__ */ import_react22.default.createElement(import_fi18.FiEdit2, { size: 14 })
10752
+ )), !description && canEdit && /* @__PURE__ */ import_react22.default.createElement(
10617
10753
  "div",
10618
10754
  {
10619
10755
  onClick: () => setIsDescriptionModalOpen(true),
10620
10756
  className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
10621
10757
  },
10622
10758
  "Adicionar descri\xE7\xE3o..."
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(
10759
+ ))), /* @__PURE__ */ import_react22.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react22.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react22.default.createElement(
10624
10760
  "button",
10625
10761
  {
10626
10762
  type: "button",
10627
10763
  onClick: handleAddProp,
10628
10764
  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
10765
  },
10630
- /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiPlus, { size: 14 }),
10766
+ /* @__PURE__ */ import_react22.default.createElement(import_fi18.FiPlus, { size: 14 }),
10631
10767
  " Adicionar"
10632
- )), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react21.default.createElement(
10633
- CustomPropertyDisplay,
10768
+ )), /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react22.default.createElement(
10769
+ CustomPropertyDisplay2,
10634
10770
  {
10635
10771
  key: prop.id,
10636
10772
  prop,
@@ -10643,7 +10779,7 @@ function RelationshipDetailsPanel({
10643
10779
  onUploadFile,
10644
10780
  disabled: !canEdit
10645
10781
  }
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(
10782
+ )), /* @__PURE__ */ import_react22.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react22.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_react22.default.createElement(
10647
10783
  "button",
10648
10784
  {
10649
10785
  onClick: onClose,
@@ -10651,7 +10787,7 @@ function RelationshipDetailsPanel({
10651
10787
  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
10788
  },
10653
10789
  canEdit ? "Cancelar" : "Fechar"
10654
- ), canEdit && /* @__PURE__ */ import_react21.default.createElement(
10790
+ ), canEdit && /* @__PURE__ */ import_react22.default.createElement(
10655
10791
  "button",
10656
10792
  {
10657
10793
  onClick: () => handleSave(false),
@@ -10660,11 +10796,11 @@ function RelationshipDetailsPanel({
10660
10796
  ${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-teal-600 to-teal-400 hover:from-teal-500 hover:to-teal-300 text-white"}
10661
10797
  `
10662
10798
  },
10663
- isSaving && /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiLoader, { className: "animate-spin" }),
10799
+ isSaving && /* @__PURE__ */ import_react22.default.createElement(import_fi18.FiLoader, { className: "animate-spin" }),
10664
10800
  isSaving ? "Salvando..." : "Salvar"
10665
10801
  )))
10666
- ), isDescriptionModalOpen && /* @__PURE__ */ import_react21.default.createElement(
10667
- DescriptionEditModal,
10802
+ ), isDescriptionModalOpen && /* @__PURE__ */ import_react22.default.createElement(
10803
+ DescriptionEditModal2,
10668
10804
  {
10669
10805
  isOpen: isDescriptionModalOpen,
10670
10806
  title: "Editar Descri\xE7\xE3o da Rela\xE7\xE3o",
@@ -10685,7 +10821,7 @@ function RelationshipDetailsPanel({
10685
10821
  }
10686
10822
 
10687
10823
  // src/components/RelationshipContextMenu.jsx
10688
- var import_react22 = __toESM(require("react"));
10824
+ var import_react23 = __toESM(require("react"));
10689
10825
  function RelationshipContextMenu({
10690
10826
  data,
10691
10827
  userRole,
@@ -10695,25 +10831,25 @@ function RelationshipContextMenu({
10695
10831
  onDelete,
10696
10832
  onClose
10697
10833
  }) {
10698
- const menuRef = (0, import_react22.useRef)(null);
10699
- const [menuPos, setMenuPos] = (0, import_react22.useState)({ left: 0, top: 0 });
10700
- const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react22.useState)(false);
10701
- const ability = (0, import_react22.useMemo)(() => defineAbilityFor(userRole), [userRole]);
10702
- const sourceName = (0, import_react22.useMemo)(
10834
+ const menuRef = (0, import_react23.useRef)(null);
10835
+ const [menuPos, setMenuPos] = (0, import_react23.useState)({ left: 0, top: 0 });
10836
+ const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react23.useState)(false);
10837
+ const ability = (0, import_react23.useMemo)(() => defineAbilityFor(userRole), [userRole]);
10838
+ const sourceName = (0, import_react23.useMemo)(
10703
10839
  () => {
10704
10840
  var _a, _b, _c, _d;
10705
10841
  return ((_d = (_c = (_b = (_a = data == null ? void 0 : data.linkObject) == null ? void 0 : _a.userData) == null ? void 0 : _b.sourceNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) ?? "(sem nome)";
10706
10842
  },
10707
10843
  [data == null ? void 0 : data.linkObject]
10708
10844
  );
10709
- const targetName = (0, import_react22.useMemo)(
10845
+ const targetName = (0, import_react23.useMemo)(
10710
10846
  () => {
10711
10847
  var _a, _b, _c, _d;
10712
10848
  return ((_d = (_c = (_b = (_a = data == null ? void 0 : data.linkObject) == null ? void 0 : _a.userData) == null ? void 0 : _b.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) ?? "(sem nome)";
10713
10849
  },
10714
10850
  [data == null ? void 0 : data.linkObject]
10715
10851
  );
10716
- (0, import_react22.useLayoutEffect)(() => {
10852
+ (0, import_react23.useLayoutEffect)(() => {
10717
10853
  if (!data.visible || !menuRef.current) return;
10718
10854
  const el = menuRef.current;
10719
10855
  const w = el.clientWidth;
@@ -10726,7 +10862,7 @@ function RelationshipContextMenu({
10726
10862
  if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
10727
10863
  setMenuPos({ left, top });
10728
10864
  }, [data]);
10729
- (0, import_react22.useEffect)(() => {
10865
+ (0, import_react23.useEffect)(() => {
10730
10866
  if (data.visible) {
10731
10867
  setIsConfirmingDelete(false);
10732
10868
  }
@@ -10742,7 +10878,7 @@ function RelationshipContextMenu({
10742
10878
  const dangerButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-rose-500/20 text-rose-300 hover:text-rose-100 transition-colors duration-150 truncate";
10743
10879
  const canUpdate = ability.can("update", "Connection");
10744
10880
  const canDelete = ability.can("delete", "Connection");
10745
- return /* @__PURE__ */ import_react22.default.createElement(
10881
+ return /* @__PURE__ */ import_react23.default.createElement(
10746
10882
  "div",
10747
10883
  {
10748
10884
  ref: menuRef,
@@ -10756,29 +10892,29 @@ function RelationshipContextMenu({
10756
10892
  onContextMenu: swallow,
10757
10893
  onDoubleClick: swallow
10758
10894
  },
10759
- /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }),
10760
- /* @__PURE__ */ import_react22.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "w-10 h-10 rounded-full bg-rose-500/20 flex items-center justify-center text-rose-400 mb-1" }, /* @__PURE__ */ import_react22.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 11v6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11v6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir rela\xE7\xE3o?"), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight break-words" }, "Desconectar ", /* @__PURE__ */ import_react22.default.createElement("strong", null, sourceName), " de ", /* @__PURE__ */ import_react22.default.createElement("strong", null, targetName), ".")), /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react22.default.createElement(
10895
+ /* @__PURE__ */ import_react23.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }),
10896
+ /* @__PURE__ */ import_react23.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react23.default.createElement("div", { className: "w-10 h-10 rounded-full bg-rose-500/20 flex items-center justify-center text-rose-400 mb-1" }, /* @__PURE__ */ import_react23.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react23.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react23.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }), /* @__PURE__ */ import_react23.default.createElement("path", { d: "M10 11v6" }), /* @__PURE__ */ import_react23.default.createElement("path", { d: "M14 11v6" }), /* @__PURE__ */ import_react23.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react23.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir rela\xE7\xE3o?"), /* @__PURE__ */ import_react23.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight break-words" }, "Desconectar ", /* @__PURE__ */ import_react23.default.createElement("strong", null, sourceName), " de ", /* @__PURE__ */ import_react23.default.createElement("strong", null, targetName), ".")), /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react23.default.createElement(
10761
10897
  "button",
10762
10898
  {
10763
10899
  onClick: () => setIsConfirmingDelete(false),
10764
10900
  className: "flex-1 px-2 py-2 text-xs font-medium bg-white/10 hover:bg-white/20 rounded-md text-white transition-colors"
10765
10901
  },
10766
10902
  "Cancelar"
10767
- ), /* @__PURE__ */ import_react22.default.createElement(
10903
+ ), /* @__PURE__ */ import_react23.default.createElement(
10768
10904
  "button",
10769
10905
  {
10770
10906
  onClick: () => onDelete == null ? void 0 : onDelete(data.linkObject),
10771
10907
  className: "flex-1 px-2 py-2 text-xs font-medium bg-rose-600 hover:bg-rose-500 rounded-md text-white transition-colors"
10772
10908
  },
10773
10909
  "Excluir"
10774
- ))) : /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react22.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-teal-400/80 shadow-[0_0_12px_1px_rgba(45,212,191,0.5)]" }), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Rela\xE7\xE3o")), /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col gap-1" }, canUpdate && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement(
10910
+ ))) : /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react23.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-teal-400/80 shadow-[0_0_12px_1px_rgba(45,212,191,0.5)]" }), /* @__PURE__ */ import_react23.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Rela\xE7\xE3o")), /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex flex-col gap-1" }, canUpdate && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement(
10775
10911
  "button",
10776
10912
  {
10777
10913
  onClick: () => onRelinkSource == null ? void 0 : onRelinkSource(data.linkObject),
10778
10914
  className: baseButtonClass,
10779
10915
  title: "Desconectar ponta ligada ao Source"
10780
10916
  },
10781
- /* @__PURE__ */ import_react22.default.createElement(
10917
+ /* @__PURE__ */ import_react23.default.createElement(
10782
10918
  "svg",
10783
10919
  {
10784
10920
  xmlns: "http://www.w3.org/2000/svg",
@@ -10791,18 +10927,18 @@ function RelationshipContextMenu({
10791
10927
  strokeLinecap: "round",
10792
10928
  strokeLinejoin: "round"
10793
10929
  },
10794
- /* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }),
10795
- /* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })
10930
+ /* @__PURE__ */ import_react23.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" }),
10931
+ /* @__PURE__ */ import_react23.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" })
10796
10932
  ),
10797
- /* @__PURE__ */ import_react22.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
10798
- ), /* @__PURE__ */ import_react22.default.createElement(
10933
+ /* @__PURE__ */ import_react23.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
10934
+ ), /* @__PURE__ */ import_react23.default.createElement(
10799
10935
  "button",
10800
10936
  {
10801
10937
  onClick: () => onRelinkTarget == null ? void 0 : onRelinkTarget(data.linkObject),
10802
10938
  className: baseButtonClass,
10803
10939
  title: "Desconectar ponta ligada ao Target"
10804
10940
  },
10805
- /* @__PURE__ */ import_react22.default.createElement(
10941
+ /* @__PURE__ */ import_react23.default.createElement(
10806
10942
  "svg",
10807
10943
  {
10808
10944
  xmlns: "http://www.w3.org/2000/svg",
@@ -10815,21 +10951,21 @@ function RelationshipContextMenu({
10815
10951
  strokeLinecap: "round",
10816
10952
  strokeLinejoin: "round"
10817
10953
  },
10818
- /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "16 3 21 3 21 8" }),
10819
- /* @__PURE__ */ import_react22.default.createElement("line", { x1: "4", y1: "20", x2: "21", y2: "3" }),
10820
- /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "21 16 21 21 16 21" }),
10821
- /* @__PURE__ */ import_react22.default.createElement("line", { x1: "15", y1: "15", x2: "21", y2: "21" }),
10822
- /* @__PURE__ */ import_react22.default.createElement("line", { x1: "4", y1: "4", x2: "9", y2: "9" })
10954
+ /* @__PURE__ */ import_react23.default.createElement("polyline", { points: "16 3 21 3 21 8" }),
10955
+ /* @__PURE__ */ import_react23.default.createElement("line", { x1: "4", y1: "20", x2: "21", y2: "3" }),
10956
+ /* @__PURE__ */ import_react23.default.createElement("polyline", { points: "21 16 21 21 16 21" }),
10957
+ /* @__PURE__ */ import_react23.default.createElement("line", { x1: "15", y1: "15", x2: "21", y2: "21" }),
10958
+ /* @__PURE__ */ import_react23.default.createElement("line", { x1: "4", y1: "4", x2: "9", y2: "9" })
10823
10959
  ),
10824
- /* @__PURE__ */ import_react22.default.createElement("span", null, "Desconectar Target (", targetName, ")")
10825
- ), /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" })), /* @__PURE__ */ import_react22.default.createElement(
10960
+ /* @__PURE__ */ import_react23.default.createElement("span", null, "Desconectar Target (", targetName, ")")
10961
+ ), /* @__PURE__ */ import_react23.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" })), /* @__PURE__ */ import_react23.default.createElement(
10826
10962
  "button",
10827
10963
  {
10828
10964
  onClick: () => onOpenDetails == null ? void 0 : onOpenDetails(data.linkObject),
10829
10965
  className: baseButtonClass,
10830
10966
  title: "Abrir detalhes da rela\xE7\xE3o"
10831
10967
  },
10832
- /* @__PURE__ */ import_react22.default.createElement(
10968
+ /* @__PURE__ */ import_react23.default.createElement(
10833
10969
  "svg",
10834
10970
  {
10835
10971
  xmlns: "http://www.w3.org/2000/svg",
@@ -10842,19 +10978,19 @@ function RelationshipContextMenu({
10842
10978
  strokeLinecap: "round",
10843
10979
  strokeLinejoin: "round"
10844
10980
  },
10845
- /* @__PURE__ */ import_react22.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
10846
- /* @__PURE__ */ import_react22.default.createElement("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
10847
- /* @__PURE__ */ import_react22.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "8" })
10981
+ /* @__PURE__ */ import_react23.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
10982
+ /* @__PURE__ */ import_react23.default.createElement("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
10983
+ /* @__PURE__ */ import_react23.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "8" })
10848
10984
  ),
10849
- /* @__PURE__ */ import_react22.default.createElement("span", null, "Abrir Detalhes")
10850
- ), canDelete && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" }), /* @__PURE__ */ import_react22.default.createElement(
10985
+ /* @__PURE__ */ import_react23.default.createElement("span", null, "Abrir Detalhes")
10986
+ ), canDelete && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" }), /* @__PURE__ */ import_react23.default.createElement(
10851
10987
  "button",
10852
10988
  {
10853
10989
  onClick: () => setIsConfirmingDelete(true),
10854
10990
  className: dangerButtonClass,
10855
10991
  title: "Excluir esta conex\xE3o"
10856
10992
  },
10857
- /* @__PURE__ */ import_react22.default.createElement(
10993
+ /* @__PURE__ */ import_react23.default.createElement(
10858
10994
  "svg",
10859
10995
  {
10860
10996
  xmlns: "http://www.w3.org/2000/svg",
@@ -10867,19 +11003,19 @@ function RelationshipContextMenu({
10867
11003
  strokeLinecap: "round",
10868
11004
  strokeLinejoin: "round"
10869
11005
  },
10870
- /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "3 6 5 6 21 6" }),
10871
- /* @__PURE__ */ import_react22.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
10872
- /* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 11v6" }),
10873
- /* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11v6" }),
10874
- /* @__PURE__ */ import_react22.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" })
11006
+ /* @__PURE__ */ import_react23.default.createElement("polyline", { points: "3 6 5 6 21 6" }),
11007
+ /* @__PURE__ */ import_react23.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
11008
+ /* @__PURE__ */ import_react23.default.createElement("path", { d: "M10 11v6" }),
11009
+ /* @__PURE__ */ import_react23.default.createElement("path", { d: "M14 11v6" }),
11010
+ /* @__PURE__ */ import_react23.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" })
10875
11011
  ),
10876
- /* @__PURE__ */ import_react22.default.createElement("span", null, "Excluir conex\xE3o (", sourceName, " \u2192 ", targetName, ")")
11012
+ /* @__PURE__ */ import_react23.default.createElement("span", null, "Excluir conex\xE3o (", sourceName, " \u2192 ", targetName, ")")
10877
11013
  )))))
10878
11014
  );
10879
11015
  }
10880
11016
 
10881
11017
  // src/components/LoadingScreen.jsx
10882
- var import_react23 = __toESM(require("react"));
11018
+ var import_react24 = __toESM(require("react"));
10883
11019
  var styles = {
10884
11020
  loadingOverlay: {
10885
11021
  position: "fixed",
@@ -10911,11 +11047,11 @@ var styles = {
10911
11047
  `
10912
11048
  };
10913
11049
  function LoadingScreen() {
10914
- return /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("style", null, styles.keyframes), /* @__PURE__ */ import_react23.default.createElement("div", { style: styles.loadingOverlay }, /* @__PURE__ */ import_react23.default.createElement("div", { style: styles.spinner })));
11050
+ return /* @__PURE__ */ import_react24.default.createElement(import_react24.default.Fragment, null, /* @__PURE__ */ import_react24.default.createElement("style", null, styles.keyframes), /* @__PURE__ */ import_react24.default.createElement("div", { style: styles.loadingOverlay }, /* @__PURE__ */ import_react24.default.createElement("div", { style: styles.spinner })));
10915
11051
  }
10916
11052
 
10917
11053
  // src/components/ImportParentFileModal.jsx
10918
- var import_react24 = __toESM(require("react"));
11054
+ var import_react25 = __toESM(require("react"));
10919
11055
  function ImportParentFileModal({
10920
11056
  isOpen,
10921
11057
  onClose,
@@ -10926,12 +11062,12 @@ function ImportParentFileModal({
10926
11062
  onFetchAvailableFiles,
10927
11063
  currentViewName
10928
11064
  }) {
10929
- const [activeTab, setActiveTab] = (0, import_react24.useState)("databases");
10930
- const [availableDbs, setAvailableDbs] = (0, import_react24.useState)([]);
10931
- const [availableViews, setAvailableViews] = (0, import_react24.useState)([]);
10932
- const [selectedItem, setSelectedItem] = (0, import_react24.useState)(null);
10933
- const [isLoading, setIsLoading] = (0, import_react24.useState)(false);
10934
- (0, import_react24.useEffect)(() => {
11065
+ const [activeTab, setActiveTab] = (0, import_react25.useState)("databases");
11066
+ const [availableDbs, setAvailableDbs] = (0, import_react25.useState)([]);
11067
+ const [availableViews, setAvailableViews] = (0, import_react25.useState)([]);
11068
+ const [selectedItem, setSelectedItem] = (0, import_react25.useState)(null);
11069
+ const [isLoading, setIsLoading] = (0, import_react25.useState)(false);
11070
+ (0, import_react25.useEffect)(() => {
10935
11071
  if (isOpen && session && onFetchAvailableFiles) {
10936
11072
  const fetchData = async () => {
10937
11073
  setIsLoading(true);
@@ -10967,7 +11103,7 @@ function ImportParentFileModal({
10967
11103
  fetchData();
10968
11104
  }
10969
11105
  }, [isOpen, session, parentDbs, onFetchAvailableFiles, currentViewName]);
10970
- (0, import_react24.useEffect)(() => {
11106
+ (0, import_react25.useEffect)(() => {
10971
11107
  setSelectedItem(null);
10972
11108
  }, [activeTab]);
10973
11109
  if (!isOpen) {
@@ -10996,13 +11132,13 @@ function ImportParentFileModal({
10996
11132
  const swallow = (e) => e.stopPropagation();
10997
11133
  const currentList = activeTab === "databases" ? availableDbs : availableViews;
10998
11134
  const emptyMessage = activeTab === "databases" ? "Nenhum novo arquivo parent dispon\xEDvel." : "Nenhuma view dispon\xEDvel para importa\xE7\xE3o.";
10999
- return /* @__PURE__ */ import_react24.default.createElement(
11135
+ return /* @__PURE__ */ import_react25.default.createElement(
11000
11136
  "div",
11001
11137
  {
11002
11138
  className: "ui-overlay fixed inset-0 z-[1200] flex items-center justify-center bg-black/60 backdrop-blur-sm",
11003
11139
  onClick: onClose
11004
11140
  },
11005
- /* @__PURE__ */ import_react24.default.createElement(
11141
+ /* @__PURE__ */ import_react25.default.createElement(
11006
11142
  "div",
11007
11143
  {
11008
11144
  className: "ui-overlay relative rounded-2xl border border-white/10 bg-slate-950/80 shadow-[0_20px_80px_rgba(0,0,0,0.6)] text-white w-[min(92vw,500px)] flex flex-col max-h-[85vh]",
@@ -11014,14 +11150,14 @@ function ImportParentFileModal({
11014
11150
  onContextMenu: swallow,
11015
11151
  onDoubleClick: swallow
11016
11152
  },
11017
- /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-between px-6 py-4 border-b border-white/10 flex-shrink-0" }, /* @__PURE__ */ import_react24.default.createElement("h2", { className: "text-lg font-semibold" }, "Importar"), /* @__PURE__ */ import_react24.default.createElement(
11153
+ /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between px-6 py-4 border-b border-white/10 flex-shrink-0" }, /* @__PURE__ */ import_react25.default.createElement("h2", { className: "text-lg font-semibold" }, "Importar"), /* @__PURE__ */ import_react25.default.createElement(
11018
11154
  "button",
11019
11155
  {
11020
11156
  onClick: onClose,
11021
11157
  className: "p-2 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
11022
11158
  title: "Fechar"
11023
11159
  },
11024
- /* @__PURE__ */ import_react24.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react24.default.createElement(
11160
+ /* @__PURE__ */ import_react25.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react25.default.createElement(
11025
11161
  "path",
11026
11162
  {
11027
11163
  fillRule: "evenodd",
@@ -11030,14 +11166,14 @@ function ImportParentFileModal({
11030
11166
  }
11031
11167
  ))
11032
11168
  )),
11033
- /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex px-6 border-b border-white/10 bg-white/5 flex-shrink-0" }, /* @__PURE__ */ import_react24.default.createElement(
11169
+ /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex px-6 border-b border-white/10 bg-white/5 flex-shrink-0" }, /* @__PURE__ */ import_react25.default.createElement(
11034
11170
  "button",
11035
11171
  {
11036
11172
  onClick: () => setActiveTab("databases"),
11037
11173
  className: `flex-1 py-3 text-sm font-medium border-b-2 transition-colors ${activeTab === "databases" ? "border-indigo-500 text-white" : "border-transparent text-slate-400 hover:text-slate-200"}`
11038
11174
  },
11039
11175
  "Arquivos Parent"
11040
- ), /* @__PURE__ */ import_react24.default.createElement(
11176
+ ), /* @__PURE__ */ import_react25.default.createElement(
11041
11177
  "button",
11042
11178
  {
11043
11179
  onClick: () => setActiveTab("views"),
@@ -11045,24 +11181,24 @@ function ImportParentFileModal({
11045
11181
  },
11046
11182
  "Views (Ancestralidades)"
11047
11183
  )),
11048
- /* @__PURE__ */ import_react24.default.createElement("div", { className: "p-6 overflow-y-auto custom-scrollbar flex-grow min-h-[200px]" }, isLoading ? /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-center h-40" }, /* @__PURE__ */ import_react24.default.createElement("div", { className: "w-8 h-8 border-4 border-t-indigo-500 border-slate-700 rounded-full animate-spin" })) : /* @__PURE__ */ import_react24.default.createElement("div", { className: "space-y-2" }, currentList.length > 0 ? currentList.map((item) => /* @__PURE__ */ import_react24.default.createElement(
11184
+ /* @__PURE__ */ import_react25.default.createElement("div", { className: "p-6 overflow-y-auto custom-scrollbar flex-grow min-h-[200px]" }, isLoading ? /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-center h-40" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "w-8 h-8 border-4 border-t-indigo-500 border-slate-700 rounded-full animate-spin" })) : /* @__PURE__ */ import_react25.default.createElement("div", { className: "space-y-2" }, currentList.length > 0 ? currentList.map((item) => /* @__PURE__ */ import_react25.default.createElement(
11049
11185
  "div",
11050
11186
  {
11051
11187
  key: item.id,
11052
11188
  onClick: () => setSelectedItem(item),
11053
11189
  className: `px-4 py-3 rounded-lg border cursor-pointer transition-all duration-150 flex flex-col gap-1 ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "bg-indigo-600 border-indigo-500 shadow-lg" : "bg-slate-800/60 border-white/10 hover:border-white/20 hover:bg-slate-800"}`
11054
11190
  },
11055
- /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react24.default.createElement("span", { className: "font-medium text-slate-100" }, item.name), activeTab === "views" && /* @__PURE__ */ import_react24.default.createElement("span", { className: "text-[10px] px-1.5 py-0.5 rounded bg-black/30 text-indigo-300 border border-indigo-500/30" }, "VIEW")),
11056
- item.description && /* @__PURE__ */ import_react24.default.createElement("p", { className: `text-xs ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "text-indigo-200" : "text-slate-400"}` }, item.description)
11057
- )) : /* @__PURE__ */ import_react24.default.createElement("p", { className: "text-slate-400 text-center py-10" }, emptyMessage))),
11058
- /* @__PURE__ */ import_react24.default.createElement("div", { className: "px-6 py-4 border-t border-white/10 flex justify-end gap-3 flex-shrink-0 bg-slate-900/50" }, /* @__PURE__ */ import_react24.default.createElement(
11191
+ /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "font-medium text-slate-100" }, item.name), activeTab === "views" && /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-[10px] px-1.5 py-0.5 rounded bg-black/30 text-indigo-300 border border-indigo-500/30" }, "VIEW")),
11192
+ item.description && /* @__PURE__ */ import_react25.default.createElement("p", { className: `text-xs ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "text-indigo-200" : "text-slate-400"}` }, item.description)
11193
+ )) : /* @__PURE__ */ import_react25.default.createElement("p", { className: "text-slate-400 text-center py-10" }, emptyMessage))),
11194
+ /* @__PURE__ */ import_react25.default.createElement("div", { className: "px-6 py-4 border-t border-white/10 flex justify-end gap-3 flex-shrink-0 bg-slate-900/50" }, /* @__PURE__ */ import_react25.default.createElement(
11059
11195
  "button",
11060
11196
  {
11061
11197
  onClick: onClose,
11062
11198
  className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm text-slate-300"
11063
11199
  },
11064
11200
  "Cancelar"
11065
- ), /* @__PURE__ */ import_react24.default.createElement(
11201
+ ), /* @__PURE__ */ import_react25.default.createElement(
11066
11202
  "button",
11067
11203
  {
11068
11204
  onClick: handleConfirm,
@@ -11076,7 +11212,7 @@ function ImportParentFileModal({
11076
11212
  }
11077
11213
 
11078
11214
  // src/components/AncestryLinkDetailsPanel.jsx
11079
- var import_react25 = __toESM(require("react"));
11215
+ var import_react26 = __toESM(require("react"));
11080
11216
  var import_fi19 = require("react-icons/fi");
11081
11217
  function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenReference, onMentionClick, onUploadFile }) {
11082
11218
  var _a, _b, _c, _d;
@@ -11086,21 +11222,21 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
11086
11222
  const customProps = extractCustomPropsFromNode(relationshipData);
11087
11223
  const sourceName = ((_b = (_a = data.sourceNode) == null ? void 0 : _a.userData) == null ? void 0 : _b.name) || "Origem";
11088
11224
  const targetName = ((_d = (_c = data.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) || "Destino";
11089
- const [isReadMode, setIsReadMode] = (0, import_react25.useState)(false);
11225
+ const [isReadMode, setIsReadMode] = (0, import_react26.useState)(false);
11090
11226
  const swallow = (e) => e.stopPropagation();
11091
11227
  const handleImageClickFromText = (url, name) => {
11092
11228
  if (onOpenImageViewer) {
11093
11229
  onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
11094
11230
  }
11095
11231
  };
11096
- return /* @__PURE__ */ import_react25.default.createElement(
11232
+ return /* @__PURE__ */ import_react26.default.createElement(
11097
11233
  "div",
11098
11234
  {
11099
11235
  className: "ui-overlay fixed inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-[1200]",
11100
11236
  onClick: onClose,
11101
11237
  onPointerDown: swallow
11102
11238
  },
11103
- /* @__PURE__ */ import_react25.default.createElement(
11239
+ /* @__PURE__ */ import_react26.default.createElement(
11104
11240
  "div",
11105
11241
  {
11106
11242
  className: `relative group rounded-2xl border border-white/10 bg-slate-950/80 shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white overflow-hidden flex flex-col max-h-[calc(100vh-4rem)] transition-all duration-300 ease-out
@@ -11108,7 +11244,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
11108
11244
  `,
11109
11245
  onClick: swallow
11110
11246
  },
11111
- isReadMode ? /* @__PURE__ */ import_react25.default.createElement(
11247
+ isReadMode ? /* @__PURE__ */ import_react26.default.createElement(
11112
11248
  DescriptionReadModePanel,
11113
11249
  {
11114
11250
  title: `${sourceName} \u2794 ${targetName}`,
@@ -11120,16 +11256,16 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
11120
11256
  onMentionClick,
11121
11257
  onImageClick: handleImageClickFromText
11122
11258
  }
11123
- ) : /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, /* @__PURE__ */ import_react25.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-blue-500/0 via-blue-500/70 to-blue-500/0" }), /* @__PURE__ */ import_react25.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-blue-500/80 shadow-[0_0_18px_2px_rgba(59,130,246,0.55)]" }), /* @__PURE__ */ import_react25.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Ancestralidade")), /* @__PURE__ */ import_react25.default.createElement("h2", { className: "text-lg font-semibold tracking-tight flex items-center gap-2" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "truncate max-w-[150px]" }, sourceName), /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-slate-500 text-sm" }, "\u2794"), /* @__PURE__ */ import_react25.default.createElement("span", { className: "truncate max-w-[150px]" }, targetName))), /* @__PURE__ */ import_react25.default.createElement("button", { onClick: onClose, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react25.default.createElement("div", { className: "px-6 pb-6 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, description && /* @__PURE__ */ import_react25.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react25.default.createElement("label", { className: "text-xs text-slate-300 font-medium" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react25.default.createElement(
11259
+ ) : /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-blue-500/0 via-blue-500/70 to-blue-500/0" }), /* @__PURE__ */ import_react26.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react26.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-blue-500/80 shadow-[0_0_18px_2px_rgba(59,130,246,0.55)]" }), /* @__PURE__ */ import_react26.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Ancestralidade")), /* @__PURE__ */ import_react26.default.createElement("h2", { className: "text-lg font-semibold tracking-tight flex items-center gap-2" }, /* @__PURE__ */ import_react26.default.createElement("span", { className: "truncate max-w-[150px]" }, sourceName), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-slate-500 text-sm" }, "\u2794"), /* @__PURE__ */ import_react26.default.createElement("span", { className: "truncate max-w-[150px]" }, targetName))), /* @__PURE__ */ import_react26.default.createElement("button", { onClick: onClose, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react26.default.createElement("div", { className: "px-6 pb-6 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, description && /* @__PURE__ */ import_react26.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react26.default.createElement("label", { className: "text-xs text-slate-300 font-medium" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react26.default.createElement(
11124
11260
  "button",
11125
11261
  {
11126
11262
  onClick: () => setIsReadMode(true),
11127
11263
  className: "p-1 text-slate-400 hover:text-white transition-colors",
11128
11264
  title: "Modo de Leitura"
11129
11265
  },
11130
- /* @__PURE__ */ import_react25.default.createElement(import_fi19.FiBookOpen, { size: 14 })
11131
- )), /* @__PURE__ */ import_react25.default.createElement("div", { className: "bg-slate-800/40 rounded-lg border border-white/10 p-1 relative group" }, /* @__PURE__ */ import_react25.default.createElement(
11132
- DescriptionDisplay,
11266
+ /* @__PURE__ */ import_react26.default.createElement(import_fi19.FiBookOpen, { size: 14 })
11267
+ )), /* @__PURE__ */ import_react26.default.createElement("div", { className: "bg-slate-800/40 rounded-lg border border-white/10 p-1 relative group" }, /* @__PURE__ */ import_react26.default.createElement(
11268
+ DescriptionDisplay2,
11133
11269
  {
11134
11270
  description,
11135
11271
  savedSections,
@@ -11137,8 +11273,8 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
11137
11273
  onMentionClick,
11138
11274
  onImageClick: handleImageClickFromText
11139
11275
  }
11140
- ))), customProps.length > 0 && /* @__PURE__ */ import_react25.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react25.default.createElement("label", { className: "text-xs text-slate-300 font-medium mb-2 block" }, "Propriedades"), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop) => /* @__PURE__ */ import_react25.default.createElement(
11141
- CustomPropertyDisplay,
11276
+ ))), customProps.length > 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react26.default.createElement("label", { className: "text-xs text-slate-300 font-medium mb-2 block" }, "Propriedades"), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop) => /* @__PURE__ */ import_react26.default.createElement(
11277
+ CustomPropertyDisplay2,
11142
11278
  {
11143
11279
  key: prop.id,
11144
11280
  prop,
@@ -11146,13 +11282,13 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
11146
11282
  onOpenImageViewer,
11147
11283
  onUploadFile
11148
11284
  }
11149
- )))), !description && customProps.length === 0 && /* @__PURE__ */ import_react25.default.createElement("div", { className: "py-8 text-center text-slate-500 text-sm italic border border-dashed border-white/10 rounded-lg" }, "Nenhum detalhe adicional dispon\xEDvel para esta conex\xE3o."), /* @__PURE__ */ import_react25.default.createElement("div", { className: "mt-4 p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg text-xs text-blue-200/80 text-center" }, 'Para editar esta conex\xE3o, utilize o menu "Editar Ancestralidade".')))
11285
+ )))), !description && customProps.length === 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "py-8 text-center text-slate-500 text-sm italic border border-dashed border-white/10 rounded-lg" }, "Nenhum detalhe adicional dispon\xEDvel para esta conex\xE3o."), /* @__PURE__ */ import_react26.default.createElement("div", { className: "mt-4 p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg text-xs text-blue-200/80 text-center" }, 'Para editar esta conex\xE3o, utilize o menu "Editar Ancestralidade".')))
11150
11286
  )
11151
11287
  );
11152
11288
  }
11153
11289
 
11154
11290
  // src/components/AncestryBoard.jsx
11155
- var import_react26 = __toESM(require("react"));
11291
+ var import_react27 = __toESM(require("react"));
11156
11292
  var import_fi20 = require("react-icons/fi");
11157
11293
  var GroupItem = ({
11158
11294
  group,
@@ -11172,7 +11308,7 @@ var GroupItem = ({
11172
11308
  }) => {
11173
11309
  const canIndent = index > 0;
11174
11310
  const isPickingForThisGroup = pickingGroupId === group.id;
11175
- const textareaRef = (0, import_react26.useRef)(null);
11311
+ const textareaRef = (0, import_react27.useRef)(null);
11176
11312
  const adjustHeight = () => {
11177
11313
  const textarea = textareaRef.current;
11178
11314
  if (textarea) {
@@ -11180,10 +11316,10 @@ var GroupItem = ({
11180
11316
  textarea.style.height = `${textarea.scrollHeight}px`;
11181
11317
  }
11182
11318
  };
11183
- (0, import_react26.useEffect)(() => {
11319
+ (0, import_react27.useEffect)(() => {
11184
11320
  adjustHeight();
11185
11321
  }, [group.text]);
11186
- return /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col gap-2 mb-3 pl-3 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react26.default.createElement(
11322
+ return /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col gap-2 mb-3 pl-3 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react27.default.createElement(
11187
11323
  "div",
11188
11324
  {
11189
11325
  className: `
@@ -11191,7 +11327,7 @@ var GroupItem = ({
11191
11327
  ${isPickingForThisGroup ? "bg-indigo-500/10 border-l-2 border-indigo-500" : "hover:bg-white/5 border-l-2 border-transparent hover:border-white/20"}
11192
11328
  `
11193
11329
  },
11194
- /* @__PURE__ */ import_react26.default.createElement(
11330
+ /* @__PURE__ */ import_react27.default.createElement(
11195
11331
  "textarea",
11196
11332
  {
11197
11333
  ref: textareaRef,
@@ -11209,9 +11345,9 @@ var GroupItem = ({
11209
11345
  }
11210
11346
  }
11211
11347
  ),
11212
- group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-wrap gap-2 mt-1" }, group.ancestries.map((anc) => {
11348
+ group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-wrap gap-2 mt-1" }, group.ancestries.map((anc) => {
11213
11349
  const isValid = availableIds.has(String(anc.ancestry_id));
11214
- return /* @__PURE__ */ import_react26.default.createElement(
11350
+ return /* @__PURE__ */ import_react27.default.createElement(
11215
11351
  "div",
11216
11352
  {
11217
11353
  key: anc.ancestry_id,
@@ -11223,40 +11359,40 @@ var GroupItem = ({
11223
11359
  },
11224
11360
  isValid ? (
11225
11361
  // [MANTIDO] Botão Play visível para todos
11226
- /* @__PURE__ */ import_react26.default.createElement(
11362
+ /* @__PURE__ */ import_react27.default.createElement(
11227
11363
  "button",
11228
11364
  {
11229
11365
  onClick: () => onPlayAncestry(anc.ancestry_id),
11230
11366
  className: "text-indigo-400 hover:text-white hover:bg-indigo-500 p-1 rounded-full transition-colors",
11231
11367
  title: "Renderizar no cen\xE1rio"
11232
11368
  },
11233
- /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
11369
+ /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
11234
11370
  )
11235
- ) : /* @__PURE__ */ import_react26.default.createElement("div", { className: "p-1 text-red-500 cursor-not-allowed" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiAlertTriangle, { size: 10 })),
11236
- /* @__PURE__ */ import_react26.default.createElement(
11371
+ ) : /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-1 text-red-500 cursor-not-allowed" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiAlertTriangle, { size: 10 })),
11372
+ /* @__PURE__ */ import_react27.default.createElement(
11237
11373
  "span",
11238
11374
  {
11239
11375
  className: `font-medium truncate max-w-[150px] ${!isValid && "line-through decoration-red-500/50"}`
11240
11376
  },
11241
11377
  anc.name
11242
11378
  ),
11243
- canEdit && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(
11379
+ canEdit && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(
11244
11380
  "div",
11245
11381
  {
11246
11382
  className: `w-px h-3 mx-0.5 ${isValid ? "bg-white/10" : "bg-red-500/20"}`
11247
11383
  }
11248
- ), /* @__PURE__ */ import_react26.default.createElement(
11384
+ ), /* @__PURE__ */ import_react27.default.createElement(
11249
11385
  "button",
11250
11386
  {
11251
11387
  onClick: () => onRemoveAncestry(group.id, anc.ancestry_id),
11252
11388
  className: `${isValid ? "text-slate-500 hover:text-red-400" : "text-red-400 hover:text-red-200"} p-0.5 rounded transition-colors`,
11253
11389
  title: "Remover men\xE7\xE3o"
11254
11390
  },
11255
- /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiX, { size: 12 })
11391
+ /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiX, { size: 12 })
11256
11392
  ))
11257
11393
  );
11258
11394
  })),
11259
- canEdit && /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react26.default.createElement(
11395
+ canEdit && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react27.default.createElement(
11260
11396
  "button",
11261
11397
  {
11262
11398
  onClick: () => onRequestPickAncestry(group.id),
@@ -11266,17 +11402,17 @@ var GroupItem = ({
11266
11402
  `,
11267
11403
  title: "Adicionar Ancestralidade a este grupo"
11268
11404
  },
11269
- isPickingForThisGroup ? /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiSearch, { size: 12 }),
11405
+ isPickingForThisGroup ? /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiSearch, { size: 12 }),
11270
11406
  isPickingForThisGroup ? "Selecionando..." : "Adicionar"
11271
- ), /* @__PURE__ */ import_react26.default.createElement(
11407
+ ), /* @__PURE__ */ import_react27.default.createElement(
11272
11408
  "button",
11273
11409
  {
11274
11410
  onClick: () => onAddSubgroup(group.id),
11275
11411
  className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
11276
11412
  title: "Criar Subgrupo"
11277
11413
  },
11278
- /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 14 })
11279
- )), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react26.default.createElement(
11414
+ /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlus, { size: 14 })
11415
+ )), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react27.default.createElement(
11280
11416
  "button",
11281
11417
  {
11282
11418
  onClick: () => onIndent(group.id),
@@ -11284,25 +11420,25 @@ var GroupItem = ({
11284
11420
  className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
11285
11421
  title: "Aninhar no grupo acima"
11286
11422
  },
11287
- /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiArrowRight, { size: 14 })
11288
- ), /* @__PURE__ */ import_react26.default.createElement(
11423
+ /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiArrowRight, { size: 14 })
11424
+ ), /* @__PURE__ */ import_react27.default.createElement(
11289
11425
  "button",
11290
11426
  {
11291
11427
  onClick: () => onOutdent(group.id),
11292
11428
  className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
11293
11429
  title: "Desaninhar"
11294
11430
  },
11295
- /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiArrowLeft, { size: 14 })
11296
- ), /* @__PURE__ */ import_react26.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react26.default.createElement(
11431
+ /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiArrowLeft, { size: 14 })
11432
+ ), /* @__PURE__ */ import_react27.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react27.default.createElement(
11297
11433
  "button",
11298
11434
  {
11299
11435
  onClick: () => onDelete(group.id),
11300
11436
  className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
11301
11437
  title: "Remover Grupo"
11302
11438
  },
11303
- /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiTrash2, { size: 14 })
11439
+ /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiTrash2, { size: 14 })
11304
11440
  )))
11305
- ), group.children && group.children.length > 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "ml-2" }, group.children.map((childGroup, idx) => /* @__PURE__ */ import_react26.default.createElement(
11441
+ ), group.children && group.children.length > 0 && /* @__PURE__ */ import_react27.default.createElement("div", { className: "ml-2" }, group.children.map((childGroup, idx) => /* @__PURE__ */ import_react27.default.createElement(
11306
11442
  GroupItem,
11307
11443
  {
11308
11444
  key: childGroup.id,
@@ -11334,21 +11470,21 @@ function AncestryBoard({
11334
11470
  userRole
11335
11471
  // [NOVO] Recebe a role do usuário
11336
11472
  }) {
11337
- const [searchTerm, setSearchTerm] = (0, import_react26.useState)("");
11338
- const [groups, setGroups] = (0, import_react26.useState)([]);
11339
- const [isLoaded, setIsLoaded] = (0, import_react26.useState)(false);
11340
- const [pickingGroupId, setPickingGroupId] = (0, import_react26.useState)(null);
11341
- const [saveStatus, setSaveStatus] = (0, import_react26.useState)("idle");
11342
- const canEdit = (0, import_react26.useMemo)(() => {
11473
+ const [searchTerm, setSearchTerm] = (0, import_react27.useState)("");
11474
+ const [groups, setGroups] = (0, import_react27.useState)([]);
11475
+ const [isLoaded, setIsLoaded] = (0, import_react27.useState)(false);
11476
+ const [pickingGroupId, setPickingGroupId] = (0, import_react27.useState)(null);
11477
+ const [saveStatus, setSaveStatus] = (0, import_react27.useState)("idle");
11478
+ const canEdit = (0, import_react27.useMemo)(() => {
11343
11479
  return userRole !== "viewer";
11344
11480
  }, [userRole]);
11345
- (0, import_react26.useEffect)(() => {
11481
+ (0, import_react27.useEffect)(() => {
11346
11482
  if (initialGroups && !isLoaded) {
11347
11483
  setGroups(initialGroups);
11348
11484
  setIsLoaded(true);
11349
11485
  }
11350
11486
  }, [initialGroups, isLoaded]);
11351
- const nodeNamesMap = (0, import_react26.useMemo)(() => {
11487
+ const nodeNamesMap = (0, import_react27.useMemo)(() => {
11352
11488
  const map = /* @__PURE__ */ new Map();
11353
11489
  if (availableNodes && Array.isArray(availableNodes)) {
11354
11490
  availableNodes.forEach((node) => {
@@ -11359,7 +11495,7 @@ function AncestryBoard({
11359
11495
  }
11360
11496
  return map;
11361
11497
  }, [availableNodes]);
11362
- const availableIds = (0, import_react26.useMemo)(() => {
11498
+ const availableIds = (0, import_react27.useMemo)(() => {
11363
11499
  return new Set(availableAncestries.map((a) => String(a.ancestry_id)));
11364
11500
  }, [availableAncestries]);
11365
11501
  const sanitizeGroups = (groupList) => {
@@ -11373,7 +11509,7 @@ function AncestryBoard({
11373
11509
  children: sanitizeGroups(g.children || [])
11374
11510
  }));
11375
11511
  };
11376
- (0, import_react26.useEffect)(() => {
11512
+ (0, import_react27.useEffect)(() => {
11377
11513
  if (!isLoaded || !onSave) return;
11378
11514
  const timeoutId = setTimeout(async () => {
11379
11515
  setSaveStatus("saving");
@@ -11391,7 +11527,7 @@ function AncestryBoard({
11391
11527
  }, 3e3);
11392
11528
  return () => clearTimeout(timeoutId);
11393
11529
  }, [groups, isLoaded, onSave]);
11394
- (0, import_react26.useEffect)(() => {
11530
+ (0, import_react27.useEffect)(() => {
11395
11531
  if (!isOpen) return;
11396
11532
  const handleKeyDown = (e) => {
11397
11533
  if (e.key === "Escape") {
@@ -11407,7 +11543,7 @@ function AncestryBoard({
11407
11543
  window.addEventListener("keydown", handleKeyDown);
11408
11544
  return () => window.removeEventListener("keydown", handleKeyDown);
11409
11545
  }, [isOpen, onClose, pickingGroupId]);
11410
- const filtered = (0, import_react26.useMemo)(() => {
11546
+ const filtered = (0, import_react27.useMemo)(() => {
11411
11547
  const term = searchTerm.toLowerCase().trim();
11412
11548
  return availableAncestries.filter((a) => {
11413
11549
  if (!term) return true;
@@ -11557,33 +11693,33 @@ function AncestryBoard({
11557
11693
  });
11558
11694
  };
11559
11695
  if (!isOpen) return null;
11560
- return /* @__PURE__ */ import_react26.default.createElement(
11696
+ return /* @__PURE__ */ import_react27.default.createElement(
11561
11697
  "div",
11562
11698
  {
11563
11699
  className: "fixed inset-0 z-[2200] bg-black/80 backdrop-blur-sm flex items-center justify-center p-2",
11564
11700
  onClick: onClose
11565
11701
  },
11566
- /* @__PURE__ */ import_react26.default.createElement(
11702
+ /* @__PURE__ */ import_react27.default.createElement(
11567
11703
  "div",
11568
11704
  {
11569
11705
  className: "bg-slate-950 border border-white/10 rounded-xl w-[98vw] h-[97vh] flex flex-col shadow-2xl overflow-hidden animate-in fade-in zoom-in-95 duration-200",
11570
11706
  onClick: (e) => e.stopPropagation()
11571
11707
  },
11572
- /* @__PURE__ */ import_react26.default.createElement("div", { className: "h-14 px-4 border-b border-white/10 bg-slate-900/90 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react26.default.createElement("h3", { className: "text-base font-semibold text-white flex items-center gap-2 whitespace-nowrap" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { className: "text-indigo-400" }), "Ancestry Board"), saveStatus !== "idle" && /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "w-px h-4 bg-white/10 mx-1" }), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-slate-900/50 border border-white/5" }, saveStatus === "saving" && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(
11708
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "h-14 px-4 border-b border-white/10 bg-slate-900/90 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react27.default.createElement("h3", { className: "text-base font-semibold text-white flex items-center gap-2 whitespace-nowrap" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiLayers, { className: "text-indigo-400" }), "Ancestry Board"), saveStatus !== "idle" && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "w-px h-4 bg-white/10 mx-1" }), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-slate-900/50 border border-white/5" }, saveStatus === "saving" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(
11573
11709
  import_fi20.FiLoader,
11574
11710
  {
11575
11711
  className: "animate-spin text-indigo-400",
11576
11712
  size: 12
11577
11713
  }
11578
- ), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-indigo-300" }, "Salvando")), saveStatus === "saved" && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCheckCircle, { className: "text-emerald-400", size: 12 }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-slate-400" }, "Salvo")), saveStatus === "error" && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement("span", { className: "w-2 h-2 rounded-full bg-red-500" }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-red-400" }, "Erro"))))), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-3" }, pickingGroupId && /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-xs text-indigo-300 font-medium animate-pulse hidden sm:inline-block mr-2" }, "Selecione na lateral..."), canEdit && /* @__PURE__ */ import_react26.default.createElement(
11714
+ ), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-indigo-300" }, "Salvando")), saveStatus === "saved" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiCheckCircle, { className: "text-emerald-400", size: 12 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-slate-400" }, "Salvo")), saveStatus === "error" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement("span", { className: "w-2 h-2 rounded-full bg-red-500" }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-red-400" }, "Erro"))))), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-3" }, pickingGroupId && /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-xs text-indigo-300 font-medium animate-pulse hidden sm:inline-block mr-2" }, "Selecione na lateral..."), canEdit && /* @__PURE__ */ import_react27.default.createElement(
11579
11715
  "button",
11580
11716
  {
11581
11717
  onClick: handleAddRootGroup,
11582
11718
  className: "\n flex items-center gap-2 px-3 py-1.5 \n bg-white/5 hover:bg-white/10 \n border border-white/10 hover:border-white/20\n backdrop-blur-sm\n text-slate-200 hover:text-white\n rounded-md transition-all duration-200\n text-xs font-medium shadow-sm\n "
11583
11719
  },
11584
- /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 14, className: "text-indigo-400" }),
11585
- /* @__PURE__ */ import_react26.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
11586
- ), /* @__PURE__ */ import_react26.default.createElement(
11720
+ /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlus, { size: 14, className: "text-indigo-400" }),
11721
+ /* @__PURE__ */ import_react27.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
11722
+ ), /* @__PURE__ */ import_react27.default.createElement(
11587
11723
  "button",
11588
11724
  {
11589
11725
  onClick: onClose,
@@ -11591,7 +11727,7 @@ function AncestryBoard({
11591
11727
  },
11592
11728
  "\xD7"
11593
11729
  ))),
11594
- /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react26.default.createElement(
11730
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react27.default.createElement(
11595
11731
  "div",
11596
11732
  {
11597
11733
  className: `
@@ -11600,12 +11736,12 @@ function AncestryBoard({
11600
11736
  min-w-[280px] max-w-[500px] bg-slate-900
11601
11737
  `
11602
11738
  },
11603
- /* @__PURE__ */ import_react26.default.createElement("div", { className: "p-3 border-b border-white/5 bg-slate-900/50" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "relative group" }, /* @__PURE__ */ import_react26.default.createElement(
11739
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-3 border-b border-white/5 bg-slate-900/50" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "relative group" }, /* @__PURE__ */ import_react27.default.createElement(
11604
11740
  import_fi20.FiSearch,
11605
11741
  {
11606
11742
  className: `absolute left-3 top-1/2 -translate-y-1/2 transition-colors ${pickingGroupId ? "text-indigo-400" : "text-slate-500 group-focus-within:text-indigo-400"}`
11607
11743
  }
11608
- ), /* @__PURE__ */ import_react26.default.createElement(
11744
+ ), /* @__PURE__ */ import_react27.default.createElement(
11609
11745
  "input",
11610
11746
  {
11611
11747
  type: "text",
@@ -11619,10 +11755,10 @@ function AncestryBoard({
11619
11755
  autoFocus: !pickingGroupId
11620
11756
  }
11621
11757
  ))),
11622
- /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
11758
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
11623
11759
  const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
11624
11760
  const isPicking = !!pickingGroupId;
11625
- return /* @__PURE__ */ import_react26.default.createElement(
11761
+ return /* @__PURE__ */ import_react27.default.createElement(
11626
11762
  "div",
11627
11763
  {
11628
11764
  key: anc.ancestry_id,
@@ -11634,7 +11770,7 @@ function AncestryBoard({
11634
11770
  ${isPicking ? "border-indigo-500/30 bg-indigo-500/5 hover:bg-indigo-500/20 hover:border-indigo-400 cursor-pointer" : "border-white/5 bg-slate-800/40 hover:bg-indigo-600/10 hover:border-indigo-500/30 cursor-default"}
11635
11771
  `
11636
11772
  },
11637
- /* @__PURE__ */ import_react26.default.createElement(
11773
+ /* @__PURE__ */ import_react27.default.createElement(
11638
11774
  "div",
11639
11775
  {
11640
11776
  className: `
@@ -11642,10 +11778,10 @@ function AncestryBoard({
11642
11778
  ${isPicking ? "bg-indigo-500 text-white border-indigo-400" : "bg-slate-800 text-indigo-400 border-white/5 group-hover:bg-indigo-500 group-hover:text-white"}
11643
11779
  `
11644
11780
  },
11645
- isPicking ? /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 16 }) : /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { size: 14 })
11781
+ isPicking ? /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlus, { size: 16 }) : /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiLayers, { size: 14 })
11646
11782
  ),
11647
- /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react26.default.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.name || "Sem Nome"), anc.is_private && /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[9px] px-1 py-0.5 rounded bg-amber-500/10 text-amber-300 border border-amber-500/20" }, "Priv")), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1.5 mt-0.5 text-[11px] text-slate-500 group-hover:text-indigo-200/70 transition-colors" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.description && /* @__PURE__ */ import_react26.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.description)),
11648
- !isPicking && /* @__PURE__ */ import_react26.default.createElement(
11783
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react27.default.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.name || "Sem Nome"), anc.is_private && /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[9px] px-1 py-0.5 rounded bg-amber-500/10 text-amber-300 border border-amber-500/20" }, "Priv")), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1.5 mt-0.5 text-[11px] text-slate-500 group-hover:text-indigo-200/70 transition-colors" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.description && /* @__PURE__ */ import_react27.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.description)),
11784
+ !isPicking && /* @__PURE__ */ import_react27.default.createElement(
11649
11785
  "button",
11650
11786
  {
11651
11787
  onClick: (e) => {
@@ -11655,11 +11791,11 @@ function AncestryBoard({
11655
11791
  className: "absolute right-2 bottom-2 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0 z-10",
11656
11792
  title: "Renderizar Ancestralidade"
11657
11793
  },
11658
- /* @__PURE__ */ import_react26.default.createElement("div", { className: "bg-indigo-500 text-white p-2 rounded-full shadow-lg hover:bg-indigo-400 hover:scale-110 transition-all" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlay, { size: 14, className: "ml-0.5" }))
11794
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "bg-indigo-500 text-white p-2 rounded-full shadow-lg hover:bg-indigo-400 hover:scale-110 transition-all" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlay, { size: 14, className: "ml-0.5" }))
11659
11795
  )
11660
11796
  );
11661
11797
  }))
11662
- ), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react26.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react26.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react26.default.createElement(
11798
+ ), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react27.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react27.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react27.default.createElement(
11663
11799
  GroupItem,
11664
11800
  {
11665
11801
  key: group.id,
@@ -11679,7 +11815,7 @@ function AncestryBoard({
11679
11815
  canEdit
11680
11816
  }
11681
11817
  ))))),
11682
- /* @__PURE__ */ import_react26.default.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-between flex-shrink-0" }, /* @__PURE__ */ import_react26.default.createElement("span", null, filtered.length, " itens encontrados"), /* @__PURE__ */ import_react26.default.createElement("span", null, groups.length, " grupos raiz"))
11818
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-between flex-shrink-0" }, /* @__PURE__ */ import_react27.default.createElement("span", null, filtered.length, " itens encontrados"), /* @__PURE__ */ import_react27.default.createElement("span", null, groups.length, " grupos raiz"))
11683
11819
  )
11684
11820
  );
11685
11821
  }
@@ -11763,12 +11899,12 @@ function XViewScene({
11763
11899
  get_view_members
11764
11900
  }) {
11765
11901
  var _a, _b, _c, _d, _e, _f, _g, _h;
11766
- const { data: session, status } = (0, import_react28.useSession)();
11902
+ const { data: session, status } = (0, import_react29.useSession)();
11767
11903
  const router = (0, import_navigation.useRouter)();
11768
11904
  const searchParams = (0, import_navigation.useSearchParams)();
11769
11905
  const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
11770
11906
  const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
11771
- const viewParams = (0, import_react27.useMemo)(() => {
11907
+ const viewParams = (0, import_react28.useMemo)(() => {
11772
11908
  if (encryptedConfig) {
11773
11909
  const data = decryptData(encryptedConfig);
11774
11910
  if (data) {
@@ -11777,7 +11913,7 @@ function XViewScene({
11777
11913
  }
11778
11914
  return null;
11779
11915
  }, [encryptedConfig, session]);
11780
- (0, import_react27.useEffect)(() => {
11916
+ (0, import_react28.useEffect)(() => {
11781
11917
  async function verifyPermission() {
11782
11918
  if (!viewParams || !session || !check_user_permission) return;
11783
11919
  const { id, type, owner_id } = viewParams;
@@ -11814,65 +11950,65 @@ function XViewScene({
11814
11950
  setIsLoading(false);
11815
11951
  }
11816
11952
  }, [viewParams, session, status, check_user_permission]);
11817
- const sceneConfigId = (0, import_react27.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
11818
- const ownerId = (0, import_react27.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
11819
- const dbSaveUrl = (0, import_react27.useMemo)(() => {
11953
+ const sceneConfigId = (0, import_react28.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
11954
+ const ownerId = (0, import_react28.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
11955
+ const dbSaveUrl = (0, import_react28.useMemo)(() => {
11820
11956
  if (ownerId && sceneConfigId) {
11821
11957
  return `x_view_dbs/${ownerId}/${sceneConfigId}`;
11822
11958
  }
11823
11959
  return null;
11824
11960
  }, [ownerId, sceneConfigId]);
11825
- const sceneSaveUrl = (0, import_react27.useMemo)(() => {
11961
+ const sceneSaveUrl = (0, import_react28.useMemo)(() => {
11826
11962
  if (ownerId && sceneConfigId) {
11827
11963
  return `x_view_scenes/${ownerId}/${sceneConfigId}`;
11828
11964
  }
11829
11965
  return null;
11830
11966
  }, [ownerId, sceneConfigId]);
11831
- const ancestry_save_url = (0, import_react27.useMemo)(() => {
11967
+ const ancestry_save_url = (0, import_react28.useMemo)(() => {
11832
11968
  if (ownerId && sceneConfigId) {
11833
11969
  return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
11834
11970
  }
11835
11971
  return null;
11836
11972
  }, [ownerId, sceneConfigId]);
11837
- const sceneDataRef = (0, import_react27.useRef)(null);
11838
- const parentDataRef = (0, import_react27.useRef)(null);
11839
- const ancestryDataRef = (0, import_react27.useRef)(null);
11840
- const [isLoading, setIsLoading] = (0, import_react27.useState)(true);
11841
- const [permissionStatus, setPermissionStatus] = (0, import_react27.useState)("loading");
11842
- const [userPermissionRole, setUserPermissionRole] = (0, import_react27.useState)(null);
11843
- const [viewMembers, setViewMembers] = (0, import_react27.useState)([]);
11844
- const [isInitialized, setIsInitialized] = (0, import_react27.useState)(false);
11845
- const [sceneVersion, setSceneVersion] = (0, import_react27.useState)(0);
11846
- const [contextMenu, setContextMenu] = (0, import_react27.useState)({
11973
+ const sceneDataRef = (0, import_react28.useRef)(null);
11974
+ const parentDataRef = (0, import_react28.useRef)(null);
11975
+ const ancestryDataRef = (0, import_react28.useRef)(null);
11976
+ const [isLoading, setIsLoading] = (0, import_react28.useState)(true);
11977
+ const [permissionStatus, setPermissionStatus] = (0, import_react28.useState)("loading");
11978
+ const [userPermissionRole, setUserPermissionRole] = (0, import_react28.useState)(null);
11979
+ const [viewMembers, setViewMembers] = (0, import_react28.useState)([]);
11980
+ const [isInitialized, setIsInitialized] = (0, import_react28.useState)(false);
11981
+ const [sceneVersion, setSceneVersion] = (0, import_react28.useState)(0);
11982
+ const [contextMenu, setContextMenu] = (0, import_react28.useState)({
11847
11983
  visible: false,
11848
11984
  x: 0,
11849
11985
  y: 0,
11850
11986
  nodeData: null
11851
11987
  });
11852
- const [multiContextMenu, setMultiContextMenu] = (0, import_react27.useState)({
11988
+ const [multiContextMenu, setMultiContextMenu] = (0, import_react28.useState)({
11853
11989
  visible: false,
11854
11990
  x: 0,
11855
11991
  y: 0,
11856
11992
  nodeIds: null
11857
11993
  });
11858
- const [relationshipMenu, setRelationshipMenu] = (0, import_react27.useState)({
11994
+ const [relationshipMenu, setRelationshipMenu] = (0, import_react28.useState)({
11859
11995
  visible: false,
11860
11996
  x: 0,
11861
11997
  y: 0,
11862
11998
  linkObject: null
11863
11999
  });
11864
- const [creationMode, setCreationMode] = (0, import_react27.useState)({
12000
+ const [creationMode, setCreationMode] = (0, import_react28.useState)({
11865
12001
  isActive: false,
11866
12002
  sourceNodeData: null
11867
12003
  });
11868
- const [versionMode, setVersionMode] = (0, import_react27.useState)({
12004
+ const [versionMode, setVersionMode] = (0, import_react28.useState)({
11869
12005
  isActive: false,
11870
12006
  sourceNodeData: null
11871
12007
  });
11872
- const [questMode, setQuestMode] = (0, import_react27.useState)({ isActive: false });
11873
- const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react27.useState)(false);
11874
- const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react27.useState)(false);
11875
- const [ancestryMode, setAncestryMode] = (0, import_react27.useState)({
12008
+ const [questMode, setQuestMode] = (0, import_react28.useState)({ isActive: false });
12009
+ const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react28.useState)(false);
12010
+ const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react28.useState)(false);
12011
+ const [ancestryMode, setAncestryMode] = (0, import_react28.useState)({
11876
12012
  isActive: false,
11877
12013
  tree: null,
11878
12014
  selectedParentId: null,
@@ -11883,41 +12019,41 @@ function XViewScene({
11883
12019
  ancestryDescriptionSections: [],
11884
12020
  isAddingNodes: false
11885
12021
  });
11886
- const [readingMode, setReadingMode] = (0, import_react27.useState)({
12022
+ const [readingMode, setReadingMode] = (0, import_react28.useState)({
11887
12023
  isActive: false,
11888
12024
  ancestry: null,
11889
12025
  branchStack: [],
11890
12026
  autoAbstraction: false
11891
12027
  });
11892
- const [formPosition, setFormPosition] = (0, import_react27.useState)({
12028
+ const [formPosition, setFormPosition] = (0, import_react28.useState)({
11893
12029
  left: 16,
11894
12030
  top: 16,
11895
12031
  opacity: 0
11896
12032
  });
11897
- const [detailsNode, setDetailsNode] = (0, import_react27.useState)(null);
11898
- const [detailsLink, setDetailsLink] = (0, import_react27.useState)(null);
11899
- const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react27.useState)(null);
11900
- const [imageViewer, setImageViewer] = (0, import_react27.useState)({
12033
+ const [detailsNode, setDetailsNode] = (0, import_react28.useState)(null);
12034
+ const [detailsLink, setDetailsLink] = (0, import_react28.useState)(null);
12035
+ const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react28.useState)(null);
12036
+ const [imageViewer, setImageViewer] = (0, import_react28.useState)({
11901
12037
  visible: false,
11902
12038
  images: [],
11903
12039
  startIndex: 0
11904
12040
  });
11905
- const [editingAncestryRel, setEditingAncestryRel] = (0, import_react27.useState)({
12041
+ const [editingAncestryRel, setEditingAncestryRel] = (0, import_react28.useState)({
11906
12042
  visible: false,
11907
12043
  data: null,
11908
12044
  path: null
11909
12045
  });
11910
- const [isImportModalOpen, setIsImportModalOpen] = (0, import_react27.useState)(false);
11911
- const [importSuccessMessage, setImportSuccessMessage] = (0, import_react27.useState)("");
11912
- const [invalidTargetError, setInvalidTargetError] = (0, import_react27.useState)(null);
11913
- const [highlightedNodeId, setHighlightedNodeId] = (0, import_react27.useState)(null);
11914
- const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react27.useState)(false);
11915
- const [ancestryBoardData, setAncestryBoardData] = (0, import_react27.useState)([]);
11916
- const [isSidebarOpen, setIsSidebarOpen] = (0, import_react27.useState)(false);
11917
- const mountRef = (0, import_react27.useRef)(null);
11918
- const tooltipRef = (0, import_react27.useRef)(null);
11919
- const formRef = (0, import_react27.useRef)(null);
11920
- const stateRef = (0, import_react27.useRef)({
12046
+ const [isImportModalOpen, setIsImportModalOpen] = (0, import_react28.useState)(false);
12047
+ const [importSuccessMessage, setImportSuccessMessage] = (0, import_react28.useState)("");
12048
+ const [invalidTargetError, setInvalidTargetError] = (0, import_react28.useState)(null);
12049
+ const [highlightedNodeId, setHighlightedNodeId] = (0, import_react28.useState)(null);
12050
+ const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react28.useState)(false);
12051
+ const [ancestryBoardData, setAncestryBoardData] = (0, import_react28.useState)([]);
12052
+ const [isSidebarOpen, setIsSidebarOpen] = (0, import_react28.useState)(false);
12053
+ const mountRef = (0, import_react28.useRef)(null);
12054
+ const tooltipRef = (0, import_react28.useRef)(null);
12055
+ const formRef = (0, import_react28.useRef)(null);
12056
+ const stateRef = (0, import_react28.useRef)({
11921
12057
  readMode: {
11922
12058
  currentMaxIndex: 0,
11923
12059
  progressMap: {}
@@ -11981,10 +12117,10 @@ function XViewScene({
11981
12117
  minWidth: 320,
11982
12118
  maxWidth: maxReadPanelW
11983
12119
  });
11984
- (0, import_react27.useEffect)(() => {
12120
+ (0, import_react28.useEffect)(() => {
11985
12121
  stateRef.current.ancestry = ancestryMode;
11986
12122
  }, [ancestryMode]);
11987
- (0, import_react27.useEffect)(() => {
12123
+ (0, import_react28.useEffect)(() => {
11988
12124
  var _a2;
11989
12125
  if (!isInitialized) return;
11990
12126
  const map = /* @__PURE__ */ new Map();
@@ -12007,10 +12143,10 @@ function XViewScene({
12007
12143
  }
12008
12144
  stateRef.current.nodeIdToParentFileMap = map;
12009
12145
  }, [isInitialized, sceneVersion]);
12010
- const handleNavigateBack = (0, import_react27.useCallback)(() => {
12146
+ const handleNavigateBack = (0, import_react28.useCallback)(() => {
12011
12147
  router.push("/dashboard/scenes");
12012
12148
  }, [router]);
12013
- const handleConfirmImport = (0, import_react27.useCallback)(
12149
+ const handleConfirmImport = (0, import_react28.useCallback)(
12014
12150
  async (importPayload) => {
12015
12151
  var _a2, _b2;
12016
12152
  let files = [];
@@ -12138,7 +12274,7 @@ function XViewScene({
12138
12274
  const handleOpenImageViewer = (images, startIndex) => {
12139
12275
  setImageViewer({ visible: true, images, startIndex });
12140
12276
  };
12141
- const tweenToTarget = (0, import_react27.useCallback)(
12277
+ const tweenToTarget = (0, import_react28.useCallback)(
12142
12278
  (target, zoomFactor = 1, forcedDirection = null) => {
12143
12279
  const { camera, controls, tweenGroup } = stateRef.current;
12144
12280
  if (!camera || !controls || !tweenGroup) return;
@@ -12164,7 +12300,7 @@ function XViewScene({
12164
12300
  if (!t || typeof t.closest !== "function") return false;
12165
12301
  return !!t.closest(".ui-overlay");
12166
12302
  };
12167
- const buildFullAncestryTree = (0, import_react27.useCallback)(
12303
+ const buildFullAncestryTree = (0, import_react28.useCallback)(
12168
12304
  (idTree, nodes, ancestries = []) => {
12169
12305
  if (!idTree) return null;
12170
12306
  const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
@@ -12249,7 +12385,7 @@ function XViewScene({
12249
12385
  },
12250
12386
  []
12251
12387
  );
12252
- const handleActivateTimeline = (0, import_react27.useCallback)(() => {
12388
+ const handleActivateTimeline = (0, import_react28.useCallback)(() => {
12253
12389
  const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
12254
12390
  if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
12255
12391
  while (timelineIntervalsGroup.children.length > 0) {
@@ -12409,7 +12545,7 @@ function XViewScene({
12409
12545
  }
12410
12546
  });
12411
12547
  }, []);
12412
- const handleVersionTimeline = (0, import_react27.useCallback)((sourceMesh, versionMeshes) => {
12548
+ const handleVersionTimeline = (0, import_react28.useCallback)((sourceMesh, versionMeshes) => {
12413
12549
  const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
12414
12550
  if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
12415
12551
  return;
@@ -12546,7 +12682,7 @@ function XViewScene({
12546
12682
  }
12547
12683
  });
12548
12684
  }, []);
12549
- (0, import_react27.useEffect)(() => {
12685
+ (0, import_react28.useEffect)(() => {
12550
12686
  async function fetchAllData(configPath, ownerId2) {
12551
12687
  var _a2, _b2;
12552
12688
  if (!get_scene_view_data) {
@@ -12648,12 +12784,12 @@ function XViewScene({
12648
12784
  focusNodeId,
12649
12785
  focusAncestryId
12650
12786
  ]);
12651
- const isNodeInView = (0, import_react27.useCallback)((id) => {
12787
+ const isNodeInView = (0, import_react28.useCallback)((id) => {
12652
12788
  const key = String(id);
12653
12789
  const objs = stateRef.current.nodeObjects || {};
12654
12790
  return !!objs[key];
12655
12791
  }, []);
12656
- const addOrUpdateNodeMesh = (0, import_react27.useCallback)(
12792
+ const addOrUpdateNodeMesh = (0, import_react28.useCallback)(
12657
12793
  (nodeData, position, suppressVersionUpdate = false) => {
12658
12794
  const {
12659
12795
  graphGroup,
@@ -12693,7 +12829,7 @@ function XViewScene({
12693
12829
  },
12694
12830
  []
12695
12831
  );
12696
- (0, import_react27.useEffect)(() => {
12832
+ (0, import_react28.useEffect)(() => {
12697
12833
  if (!isInitialized || !sceneDataRef.current) return;
12698
12834
  const currentMount = mountRef.current;
12699
12835
  if (!currentMount) return;
@@ -13449,7 +13585,7 @@ function XViewScene({
13449
13585
  get_scene_view_data,
13450
13586
  save_view_data
13451
13587
  ]);
13452
- const handleGhostNodeImageChange = (0, import_react27.useCallback)((useImage, imageUrl) => {
13588
+ const handleGhostNodeImageChange = (0, import_react28.useCallback)((useImage, imageUrl) => {
13453
13589
  const {
13454
13590
  node: ghostNode,
13455
13591
  line: ghostLine,
@@ -13497,7 +13633,7 @@ function XViewScene({
13497
13633
  aura: newGhostNode.getObjectByName("aura")
13498
13634
  };
13499
13635
  }, []);
13500
- const handleGhostNodeIntensityChange = (0, import_react27.useCallback)((newIntensity) => {
13636
+ const handleGhostNodeIntensityChange = (0, import_react28.useCallback)((newIntensity) => {
13501
13637
  const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
13502
13638
  if (!ghostNode) return;
13503
13639
  const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
@@ -13518,7 +13654,7 @@ function XViewScene({
13518
13654
  ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
13519
13655
  }
13520
13656
  }, []);
13521
- const handleDetailNodeIntensityChange = (0, import_react27.useCallback)(
13657
+ const handleDetailNodeIntensityChange = (0, import_react28.useCallback)(
13522
13658
  (nodeId, newIntensity) => {
13523
13659
  const mesh = stateRef.current.nodeObjects[String(nodeId)];
13524
13660
  if (!mesh) return;
@@ -13674,7 +13810,7 @@ function XViewScene({
13674
13810
  mountRef.current.style.cursor = "default";
13675
13811
  }
13676
13812
  };
13677
- const handleAncestryTreeUpdate = (0, import_react27.useCallback)((newTree, extraData = null) => {
13813
+ const handleAncestryTreeUpdate = (0, import_react28.useCallback)((newTree, extraData = null) => {
13678
13814
  setAncestryMode((prev) => {
13679
13815
  const prevTreeStr = JSON.stringify(prev.tree);
13680
13816
  const newTreeStr = JSON.stringify(newTree);
@@ -13697,7 +13833,7 @@ function XViewScene({
13697
13833
  };
13698
13834
  });
13699
13835
  }, []);
13700
- const actionHandlerContext = (0, import_react27.useMemo)(
13836
+ const actionHandlerContext = (0, import_react28.useMemo)(
13701
13837
  () => {
13702
13838
  var _a2;
13703
13839
  return {
@@ -13758,7 +13894,7 @@ function XViewScene({
13758
13894
  const handleStartVersioning = (nodeData) => {
13759
13895
  userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
13760
13896
  };
13761
- const handleStartQuestQuick = (0, import_react27.useCallback)((questNode) => {
13897
+ const handleStartQuestQuick = (0, import_react28.useCallback)((questNode) => {
13762
13898
  var _a2, _b2, _c2;
13763
13899
  if (!questNode || !actionHandlerContext) return;
13764
13900
  const {
@@ -13770,12 +13906,11 @@ function XViewScene({
13770
13906
  timelineEndLabel,
13771
13907
  ...cleanQuestNode
13772
13908
  } = questNode;
13773
- const newTimeline = [...cleanQuestNode.timeline || [], {
13774
- type: "status_changed",
13775
- timestamp: Date.now(),
13776
- actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
13777
- description: `Quest iniciada ("In Progress") por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
13778
- }];
13909
+ const newTimeline = [...cleanQuestNode.timeline || [], createTimelineEntry(
13910
+ ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
13911
+ `Quest iniciada ("In Progress") por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`,
13912
+ "status_changed"
13913
+ )];
13779
13914
  const updatedNode = {
13780
13915
  ...cleanQuestNode,
13781
13916
  status: "In Progress",
@@ -13788,8 +13923,8 @@ function XViewScene({
13788
13923
  }
13789
13924
  setDetailsNode(updatedNode);
13790
13925
  }, [session, actionHandlerContext]);
13791
- const handleFinishQuestQuick = (0, import_react27.useCallback)((questNode) => {
13792
- var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2;
13926
+ const handleFinishQuestQuick = (0, import_react28.useCallback)((questNode) => {
13927
+ var _a2, _b2, _c2, _d2, _e2, _f2;
13793
13928
  if (!questNode || !actionHandlerContext) return;
13794
13929
  const {
13795
13930
  labelObject,
@@ -13809,20 +13944,18 @@ function XViewScene({
13809
13944
  if (currentReviewerIdx !== -1 && reviewStack[currentReviewerIdx].userId === cleanQuestNode.assignee_id) {
13810
13945
  reviewStack[currentReviewerIdx].status = "completed";
13811
13946
  nextIdxToAssign = currentReviewerIdx + 1;
13812
- newTimeline.push({
13813
- type: "review_completed",
13814
- timestamp: Date.now(),
13815
- actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || cleanQuestNode.assignee_id,
13816
- description: `Review conclu\xEDda por ${((_b2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _b2.name) || "revisor"}.`
13817
- });
13947
+ newTimeline.push(createTimelineEntry(
13948
+ ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || cleanQuestNode.assignee_id,
13949
+ `Review conclu\xEDda por ${((_b2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _b2.name) || "revisor"}.`,
13950
+ "review_completed"
13951
+ ));
13818
13952
  } else {
13819
13953
  nextIdxToAssign = currentReviewerIdx !== -1 ? currentReviewerIdx : reviewStack.length;
13820
- newTimeline.push({
13821
- type: "task_completed",
13822
- timestamp: Date.now(),
13823
- actorId: ((_c2 = session == null ? void 0 : session.user) == null ? void 0 : _c2.id) || cleanQuestNode.assignee_id,
13824
- description: `Tarefa principal entregue por ${((_d2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _d2.name) || ((_e2 = session == null ? void 0 : session.user) == null ? void 0 : _e2.name) || "respons\xE1vel"}.`
13825
- });
13954
+ newTimeline.push(createTimelineEntry(
13955
+ ((_c2 = session == null ? void 0 : session.user) == null ? void 0 : _c2.id) || cleanQuestNode.assignee_id,
13956
+ `Tarefa principal entregue por ${((_d2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _d2.name) || ((_e2 = session == null ? void 0 : session.user) == null ? void 0 : _e2.name) || "respons\xE1vel"}.`,
13957
+ "task_completed"
13958
+ ));
13826
13959
  }
13827
13960
  if (nextIdxToAssign < reviewStack.length) {
13828
13961
  const remainingMandatory = reviewStack.slice(nextIdxToAssign).some((r) => r.mandatory);
@@ -13831,13 +13964,12 @@ function XViewScene({
13831
13964
  const nextReviewer = reviewStack[nextIdxToAssign];
13832
13965
  nextAssigneeId = nextReviewer.userId;
13833
13966
  nextStatus = "Review";
13834
- newTimeline.push({
13835
- type: "assignee_changed",
13836
- timestamp: Date.now() + 1,
13837
- actorId: ((_f2 = session == null ? void 0 : session.user) == null ? void 0 : _f2.id) || "system",
13838
- to_assignee_id: nextAssigneeId,
13839
- description: `Quest atribu\xEDda para revis\xE3o a ${((_g2 = viewMembers.find((m) => m.id === nextAssigneeId)) == null ? void 0 : _g2.name) || "revisor"}.`
13840
- });
13967
+ newTimeline.push(createTimelineEntry(
13968
+ "system",
13969
+ `Quest atribu\xEDda para revis\xE3o a ${((_f2 = viewMembers.find((m) => m.id === nextAssigneeId)) == null ? void 0 : _f2.name) || "revisor"}.`,
13970
+ "assignee_changed",
13971
+ { metadata: { to_assignee_id: nextAssigneeId } }
13972
+ ));
13841
13973
  } else {
13842
13974
  nextStatus = "Done";
13843
13975
  for (let i = nextIdxToAssign; i < reviewStack.length; i++) {
@@ -13848,12 +13980,11 @@ function XViewScene({
13848
13980
  nextStatus = "Done";
13849
13981
  }
13850
13982
  if (nextStatus === "Done") {
13851
- newTimeline.push({
13852
- type: "quest_finished",
13853
- timestamp: Date.now() + 2,
13854
- actorId: ((_h2 = session == null ? void 0 : session.user) == null ? void 0 : _h2.id) || "system",
13855
- description: `Quest finalizada!`
13856
- });
13983
+ newTimeline.push(createTimelineEntry(
13984
+ "system",
13985
+ `Quest finalizada!`,
13986
+ "quest_finished"
13987
+ ));
13857
13988
  }
13858
13989
  const updatedNode = {
13859
13990
  ...cleanQuestNode,
@@ -13870,7 +14001,7 @@ function XViewScene({
13870
14001
  setDetailsNode(null);
13871
14002
  }
13872
14003
  }, [session, actionHandlerContext, viewMembers, detailsNode]);
13873
- const handleCancelQuest = (0, import_react27.useCallback)(() => {
14004
+ const handleCancelQuest = (0, import_react28.useCallback)(() => {
13874
14005
  const { graphGroup, ghostElements } = stateRef.current;
13875
14006
  if (ghostElements.node && graphGroup) {
13876
14007
  if (ghostElements.node.userData.labelObject) {
@@ -14022,7 +14153,7 @@ function XViewScene({
14022
14153
  }
14023
14154
  userActionHandlers.handleCancelConnection(context);
14024
14155
  };
14025
- const handleClearAncestryVisuals = (0, import_react27.useCallback)((ancestryId) => {
14156
+ const handleClearAncestryVisuals = (0, import_react28.useCallback)((ancestryId) => {
14026
14157
  const { renderedAncestries, ancestryGroup } = stateRef.current;
14027
14158
  const renderIndex = renderedAncestries.findIndex(
14028
14159
  (a) => String(a.id) === String(ancestryId)
@@ -14040,7 +14171,7 @@ function XViewScene({
14040
14171
  );
14041
14172
  }
14042
14173
  }, []);
14043
- const handleRenderAncestry = (0, import_react27.useCallback)(
14174
+ const handleRenderAncestry = (0, import_react28.useCallback)(
14044
14175
  async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
14045
14176
  setContextMenu(
14046
14177
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -14534,7 +14665,7 @@ function XViewScene({
14534
14665
  ancestryMode.isActive
14535
14666
  ]
14536
14667
  );
14537
- const handleRenderAbstractionTree = (0, import_react27.useCallback)(
14668
+ const handleRenderAbstractionTree = (0, import_react28.useCallback)(
14538
14669
  (ancestryObject, targetNodeId = null) => {
14539
14670
  setContextMenu(
14540
14671
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -14622,7 +14753,7 @@ function XViewScene({
14622
14753
  handleClearAncestryVisuals
14623
14754
  ]
14624
14755
  );
14625
- const handleReadModeBranchNav = (0, import_react27.useCallback)(
14756
+ const handleReadModeBranchNav = (0, import_react28.useCallback)(
14626
14757
  (nodeId, action, direction = "right") => {
14627
14758
  const { ancestry, branchStack } = readingMode;
14628
14759
  if (!ancestry || !ancestry.tree) return;
@@ -14800,13 +14931,13 @@ function XViewScene({
14800
14931
  },
14801
14932
  [readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
14802
14933
  );
14803
- const handleReadModeHighlight = (0, import_react27.useCallback)((nodeId) => {
14934
+ const handleReadModeHighlight = (0, import_react28.useCallback)((nodeId) => {
14804
14935
  if (stateRef.current.highlightedNodeId !== nodeId) {
14805
14936
  stateRef.current.highlightedNodeId = nodeId;
14806
14937
  }
14807
14938
  setHighlightedNodeId(nodeId);
14808
14939
  }, []);
14809
- const activeNodeBranches = (0, import_react27.useMemo)(() => {
14940
+ const activeNodeBranches = (0, import_react28.useMemo)(() => {
14810
14941
  if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
14811
14942
  return null;
14812
14943
  const fullTree = buildFullAncestryTree(
@@ -14850,7 +14981,7 @@ function XViewScene({
14850
14981
  readingMode.branchStack,
14851
14982
  ancestryDataRef.current
14852
14983
  ]);
14853
- const backNavigationInfo = (0, import_react27.useMemo)(() => {
14984
+ const backNavigationInfo = (0, import_react28.useMemo)(() => {
14854
14985
  const { branchStack } = readingMode;
14855
14986
  if (!branchStack || branchStack.length === 0) return null;
14856
14987
  const lastStep = branchStack[branchStack.length - 1];
@@ -14861,7 +14992,7 @@ function XViewScene({
14861
14992
  name: "Voltar para anterior"
14862
14993
  };
14863
14994
  }, [readingMode.branchStack]);
14864
- const getReadModeDisplayContext = (0, import_react27.useMemo)(() => {
14995
+ const getReadModeDisplayContext = (0, import_react28.useMemo)(() => {
14865
14996
  const { ancestry, branchStack } = readingMode;
14866
14997
  if (!ancestry) return null;
14867
14998
  if (branchStack.length === 0) {
@@ -14904,7 +15035,7 @@ function XViewScene({
14904
15035
  customProperties: branchProps
14905
15036
  };
14906
15037
  }, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
14907
- const readModeAbstractionTree = (0, import_react27.useMemo)(() => {
15038
+ const readModeAbstractionTree = (0, import_react28.useMemo)(() => {
14908
15039
  if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
14909
15040
  return null;
14910
15041
  }
@@ -14923,7 +15054,7 @@ function XViewScene({
14923
15054
  buildFullAncestryTree,
14924
15055
  sceneVersion
14925
15056
  ]);
14926
- const handleStartReadingAncestry = (0, import_react27.useCallback)(
15057
+ const handleStartReadingAncestry = (0, import_react28.useCallback)(
14927
15058
  async (ancestryObject, renderMode = "full") => {
14928
15059
  setContextMenu(
14929
15060
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -14966,7 +15097,7 @@ function XViewScene({
14966
15097
  },
14967
15098
  [handleRenderAncestry, handleRenderAbstractionTree]
14968
15099
  );
14969
- const handleReadModeSectionChange = (0, import_react27.useCallback)(
15100
+ const handleReadModeSectionChange = (0, import_react28.useCallback)(
14970
15101
  (activeSectionId) => {
14971
15102
  const { ancestry, branchStack } = readingMode;
14972
15103
  if (!ancestry || !readingMode.isActive) return;
@@ -15051,10 +15182,10 @@ function XViewScene({
15051
15182
  ancestryDataRef.current
15052
15183
  ]
15053
15184
  );
15054
- const handleCloseReadMode = (0, import_react27.useCallback)(() => {
15185
+ const handleCloseReadMode = (0, import_react28.useCallback)(() => {
15055
15186
  setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
15056
15187
  }, []);
15057
- const handleAncestrySectionChange = (0, import_react27.useCallback)(
15188
+ const handleAncestrySectionChange = (0, import_react28.useCallback)(
15058
15189
  (activeSectionId, ancestryOverride = null, rotation = 0) => {
15059
15190
  var _a2, _b2;
15060
15191
  const currentMode = stateRef.current.ancestry;
@@ -15116,7 +15247,7 @@ function XViewScene({
15116
15247
  },
15117
15248
  [handleRenderAncestry]
15118
15249
  );
15119
- const handleEditAncestry = (0, import_react27.useCallback)(
15250
+ const handleEditAncestry = (0, import_react28.useCallback)(
15120
15251
  async (ancestryObject) => {
15121
15252
  setContextMenu(
15122
15253
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -15171,7 +15302,7 @@ function XViewScene({
15171
15302
  const handleSelectAncestryParent = (nodeId) => {
15172
15303
  setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
15173
15304
  };
15174
- const handleRemoveFromAncestry = (0, import_react27.useCallback)((pathToRemove) => {
15305
+ const handleRemoveFromAncestry = (0, import_react28.useCallback)((pathToRemove) => {
15175
15306
  if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
15176
15307
  console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
15177
15308
  return;
@@ -15196,7 +15327,7 @@ function XViewScene({
15196
15327
  return { ...prev, tree: newTree };
15197
15328
  });
15198
15329
  }, []);
15199
- const handleSaveAncestry = (0, import_react27.useCallback)(
15330
+ const handleSaveAncestry = (0, import_react28.useCallback)(
15200
15331
  async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
15201
15332
  const treeToUse = treeOverride || ancestryMode.tree;
15202
15333
  const { isEditMode, currentAncestryId } = ancestryMode;
@@ -15432,7 +15563,7 @@ function XViewScene({
15432
15563
  });
15433
15564
  setEditingAncestryRel({ visible: false, data: null, path: null });
15434
15565
  };
15435
- const handleDeleteAncestry = (0, import_react27.useCallback)(
15566
+ const handleDeleteAncestry = (0, import_react28.useCallback)(
15436
15567
  async (ancestryIdToDelete) => {
15437
15568
  if (!ancestryIdToDelete) {
15438
15569
  alert("ID da ancestralidade n\xE3o encontrado.");
@@ -15514,10 +15645,10 @@ function XViewScene({
15514
15645
  },
15515
15646
  [save_view_data, delete_file_action]
15516
15647
  );
15517
- const handleOpenAncestryBoard = (0, import_react27.useCallback)(() => {
15648
+ const handleOpenAncestryBoard = (0, import_react28.useCallback)(() => {
15518
15649
  setIsAncestryBoardOpen(true);
15519
15650
  }, []);
15520
- const handleSelectAncestryFromBoard = (0, import_react27.useCallback)(
15651
+ const handleSelectAncestryFromBoard = (0, import_react28.useCallback)(
15521
15652
  (ancestry) => {
15522
15653
  setIsAncestryBoardOpen(false);
15523
15654
  setIsSidebarOpen(false);
@@ -15525,7 +15656,7 @@ function XViewScene({
15525
15656
  },
15526
15657
  [handleStartReadingAncestry]
15527
15658
  );
15528
- const handleSaveAncestryBoard = (0, import_react27.useCallback)(
15659
+ const handleSaveAncestryBoard = (0, import_react28.useCallback)(
15529
15660
  async (groups) => {
15530
15661
  if (!sceneConfigId || !viewParams || !session) return;
15531
15662
  const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
@@ -15539,7 +15670,7 @@ function XViewScene({
15539
15670
  },
15540
15671
  [sceneConfigId, viewParams, session, save_ancestry_board_action, ownerId]
15541
15672
  );
15542
- const existingNodeTypes = (0, import_react27.useMemo)(() => {
15673
+ const existingNodeTypes = (0, import_react28.useMemo)(() => {
15543
15674
  if (!parentDataRef.current) {
15544
15675
  return [];
15545
15676
  }
@@ -15551,7 +15682,7 @@ function XViewScene({
15551
15682
  ).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
15552
15683
  return [...new Set(allTypes)];
15553
15684
  }, [parentDataRef.current, sceneVersion]);
15554
- const searchableDbNodes = (0, import_react27.useMemo)(() => {
15685
+ const searchableDbNodes = (0, import_react28.useMemo)(() => {
15555
15686
  if (!parentDataRef.current) {
15556
15687
  return [];
15557
15688
  }
@@ -15566,7 +15697,7 @@ function XViewScene({
15566
15697
  return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
15567
15698
  });
15568
15699
  }, [parentDataRef.current, sceneVersion]);
15569
- const handleAddExistingNode = (0, import_react27.useCallback)(
15700
+ const handleAddExistingNode = (0, import_react28.useCallback)(
15570
15701
  (nodeId) => {
15571
15702
  return userActionHandlers.handleAddExistingNodeById(
15572
15703
  actionHandlerContext,
@@ -15575,7 +15706,7 @@ function XViewScene({
15575
15706
  },
15576
15707
  [actionHandlerContext]
15577
15708
  );
15578
- const handleSaveCurrentView = (0, import_react27.useCallback)(async () => {
15709
+ const handleSaveCurrentView = (0, import_react28.useCallback)(async () => {
15579
15710
  var _a2, _b2, _c2;
15580
15711
  const { nodeObjects, allLinks } = stateRef.current;
15581
15712
  if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
@@ -15617,16 +15748,16 @@ function XViewScene({
15617
15748
  console.error("Erro na chamada de save_view_data:", error);
15618
15749
  }
15619
15750
  }, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
15620
- const allAvailableNodes = (0, import_react27.useMemo)(() => {
15751
+ const allAvailableNodes = (0, import_react28.useMemo)(() => {
15621
15752
  if (!parentDataRef.current) return [];
15622
15753
  return Object.values(parentDataRef.current).flatMap(
15623
15754
  (fileData) => fileData.nodes || []
15624
15755
  );
15625
15756
  }, [sceneVersion, isInitialized]);
15626
- const allAvailableAncestries = (0, import_react27.useMemo)(() => {
15757
+ const allAvailableAncestries = (0, import_react28.useMemo)(() => {
15627
15758
  return ancestryDataRef.current || [];
15628
15759
  }, [sceneVersion, isInitialized]);
15629
- const handleOpenReference = (0, import_react27.useCallback)(
15760
+ const handleOpenReference = (0, import_react28.useCallback)(
15630
15761
  (referenceData) => {
15631
15762
  const { type, id } = referenceData;
15632
15763
  if (type === "node") {
@@ -15665,13 +15796,13 @@ function XViewScene({
15665
15796
  tweenToTarget
15666
15797
  ]
15667
15798
  );
15668
- const handleToggleAncestryAddMode = (0, import_react27.useCallback)(() => {
15799
+ const handleToggleAncestryAddMode = (0, import_react28.useCallback)(() => {
15669
15800
  setAncestryMode((prev) => ({
15670
15801
  ...prev,
15671
15802
  isAddingNodes: !prev.isAddingNodes
15672
15803
  }));
15673
15804
  }, []);
15674
- const handleFocusNode = (0, import_react27.useCallback)(
15805
+ const handleFocusNode = (0, import_react28.useCallback)(
15675
15806
  (nodeData) => {
15676
15807
  if (!nodeData) return;
15677
15808
  const nodeMesh = stateRef.current.nodeObjects[String(nodeData.id)];
@@ -15681,7 +15812,7 @@ function XViewScene({
15681
15812
  },
15682
15813
  [tweenToTarget]
15683
15814
  );
15684
- const availableDatasets = (0, import_react27.useMemo)(() => {
15815
+ const availableDatasets = (0, import_react28.useMemo)(() => {
15685
15816
  if (!sceneDataRef.current || !parentDataRef.current) return [];
15686
15817
  return sceneDataRef.current.parent_dbs.map((db) => {
15687
15818
  var _a2;
@@ -15695,7 +15826,7 @@ function XViewScene({
15695
15826
  String(creationMode.sourceNodeData.id)
15696
15827
  )) == null ? void 0 : _b.parentFileId : null;
15697
15828
  const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
15698
- (0, import_react27.useEffect)(() => {
15829
+ (0, import_react28.useEffect)(() => {
15699
15830
  if (isInitialized && focusNodeId && !hasFocusedInitial) {
15700
15831
  const nodeObjects = stateRef.current.nodeObjects || {};
15701
15832
  const targetMesh = nodeObjects[String(focusNodeId)];
@@ -15718,7 +15849,7 @@ function XViewScene({
15718
15849
  hasFocusedInitial,
15719
15850
  tweenToTarget
15720
15851
  ]);
15721
- (0, import_react27.useEffect)(() => {
15852
+ (0, import_react28.useEffect)(() => {
15722
15853
  if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
15723
15854
  const ancestries = ancestryDataRef.current || [];
15724
15855
  const targetAncestry = ancestries.find(
@@ -15743,7 +15874,7 @@ function XViewScene({
15743
15874
  hasOpenedInitialAncestry,
15744
15875
  handleStartReadingAncestry
15745
15876
  ]);
15746
- (0, import_react27.useEffect)(() => {
15877
+ (0, import_react28.useEffect)(() => {
15747
15878
  function handleKeyDown(event) {
15748
15879
  var _a2, _b2, _c2;
15749
15880
  const context = actionHandlerContext;
@@ -15866,10 +15997,10 @@ function XViewScene({
15866
15997
  // <-- handleCancelQuest adicionado aqui
15867
15998
  ]);
15868
15999
  if (isLoading || status === "loading" || permissionStatus === "loading") {
15869
- return /* @__PURE__ */ import_react27.default.createElement(LoadingScreen, null);
16000
+ return /* @__PURE__ */ import_react28.default.createElement(LoadingScreen, null);
15870
16001
  }
15871
16002
  if (permissionStatus === "denied") {
15872
- return /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react27.default.createElement(
16003
+ return /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react28.default.createElement(
15873
16004
  "svg",
15874
16005
  {
15875
16006
  xmlns: "http://www.w3.org/2000/svg",
@@ -15879,7 +16010,7 @@ function XViewScene({
15879
16010
  stroke: "currentColor",
15880
16011
  className: "w-16 h-16 mx-auto"
15881
16012
  },
15882
- /* @__PURE__ */ import_react27.default.createElement(
16013
+ /* @__PURE__ */ import_react28.default.createElement(
15883
16014
  "path",
15884
16015
  {
15885
16016
  strokeLinecap: "round",
@@ -15887,13 +16018,13 @@ function XViewScene({
15887
16018
  d: "M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
15888
16019
  }
15889
16020
  )
15890
- )), /* @__PURE__ */ import_react27.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react27.default.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ import_react27.default.createElement(
16021
+ )), /* @__PURE__ */ import_react28.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react28.default.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ import_react28.default.createElement(
15891
16022
  "button",
15892
16023
  {
15893
16024
  onClick: () => router.push("/dashboard/scenes"),
15894
16025
  className: "flex items-center justify-center gap-2 w-full py-3 px-4 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors font-medium"
15895
16026
  },
15896
- /* @__PURE__ */ import_react27.default.createElement(
16027
+ /* @__PURE__ */ import_react28.default.createElement(
15897
16028
  "svg",
15898
16029
  {
15899
16030
  xmlns: "http://www.w3.org/2000/svg",
@@ -15903,7 +16034,7 @@ function XViewScene({
15903
16034
  stroke: "currentColor",
15904
16035
  className: "w-5 h-5"
15905
16036
  },
15906
- /* @__PURE__ */ import_react27.default.createElement(
16037
+ /* @__PURE__ */ import_react28.default.createElement(
15907
16038
  "path",
15908
16039
  {
15909
16040
  strokeLinecap: "round",
@@ -15915,7 +16046,7 @@ function XViewScene({
15915
16046
  "Voltar para Scenes"
15916
16047
  )));
15917
16048
  }
15918
- return /* @__PURE__ */ import_react27.default.createElement(
16049
+ return /* @__PURE__ */ import_react28.default.createElement(
15919
16050
  "div",
15920
16051
  {
15921
16052
  ref: mountRef,
@@ -15927,7 +16058,7 @@ function XViewScene({
15927
16058
  cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
15928
16059
  }
15929
16060
  },
15930
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react27.default.createElement(
16061
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react28.default.createElement(
15931
16062
  XViewSidebar,
15932
16063
  {
15933
16064
  dbNodes: searchableDbNodes,
@@ -15947,7 +16078,7 @@ function XViewScene({
15947
16078
  userRole: userPermissionRole
15948
16079
  }
15949
16080
  ),
15950
- creationMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
16081
+ creationMode.isActive && /* @__PURE__ */ import_react28.default.createElement(
15951
16082
  InSceneCreationForm,
15952
16083
  {
15953
16084
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -15979,7 +16110,7 @@ function XViewScene({
15979
16110
  availableAncestries: allAvailableAncestries
15980
16111
  }
15981
16112
  ),
15982
- versionMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
16113
+ versionMode.isActive && /* @__PURE__ */ import_react28.default.createElement(
15983
16114
  InSceneVersionForm,
15984
16115
  {
15985
16116
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -16005,7 +16136,7 @@ function XViewScene({
16005
16136
  availableAncestries: allAvailableAncestries
16006
16137
  }
16007
16138
  ),
16008
- questMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
16139
+ questMode.isActive && /* @__PURE__ */ import_react28.default.createElement(
16009
16140
  InSceneQuestForm,
16010
16141
  {
16011
16142
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -16031,7 +16162,7 @@ function XViewScene({
16031
16162
  viewMembers
16032
16163
  }
16033
16164
  ),
16034
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react27.default.createElement(
16165
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react28.default.createElement(
16035
16166
  "div",
16036
16167
  {
16037
16168
  className: `ui-overlay absolute group rounded-2xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white overflow-hidden flex flex-col ${isReadModeResizing ? "transition-none" : "transition-all duration-300 ease-out"}`,
@@ -16044,7 +16175,7 @@ function XViewScene({
16044
16175
  maxWidth: "92vw"
16045
16176
  }
16046
16177
  },
16047
- /* @__PURE__ */ import_react27.default.createElement(
16178
+ /* @__PURE__ */ import_react28.default.createElement(
16048
16179
  "div",
16049
16180
  {
16050
16181
  onPointerDown: (e) => {
@@ -16055,7 +16186,7 @@ function XViewScene({
16055
16186
  title: "Arraste para redimensionar"
16056
16187
  }
16057
16188
  ),
16058
- /* @__PURE__ */ import_react27.default.createElement(
16189
+ /* @__PURE__ */ import_react28.default.createElement(
16059
16190
  DescriptionReadModePanel,
16060
16191
  {
16061
16192
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -16090,7 +16221,7 @@ function XViewScene({
16090
16221
  }
16091
16222
  )
16092
16223
  ),
16093
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react27.default.createElement(
16224
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react28.default.createElement(
16094
16225
  CreateAncestryPanel,
16095
16226
  {
16096
16227
  ancestryMode,
@@ -16126,7 +16257,7 @@ function XViewScene({
16126
16257
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
16127
16258
  }
16128
16259
  ),
16129
- editingAncestryRel.visible && /* @__PURE__ */ import_react27.default.createElement(
16260
+ editingAncestryRel.visible && /* @__PURE__ */ import_react28.default.createElement(
16130
16261
  AncestryRelationshipPanel,
16131
16262
  {
16132
16263
  data: editingAncestryRel.data,
@@ -16140,7 +16271,7 @@ function XViewScene({
16140
16271
  onUploadFile: upload_file_action
16141
16272
  }
16142
16273
  ),
16143
- detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
16274
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react28.default.createElement(
16144
16275
  QuestDetailsPanel,
16145
16276
  {
16146
16277
  node: detailsNode,
@@ -16163,7 +16294,7 @@ function XViewScene({
16163
16294
  currentUser: session == null ? void 0 : session.user
16164
16295
  }
16165
16296
  ),
16166
- detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
16297
+ detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react28.default.createElement(
16167
16298
  NodeDetailsPanel,
16168
16299
  {
16169
16300
  node: detailsNode,
@@ -16195,7 +16326,7 @@ function XViewScene({
16195
16326
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
16196
16327
  }
16197
16328
  ),
16198
- detailsLink && /* @__PURE__ */ import_react27.default.createElement(
16329
+ detailsLink && /* @__PURE__ */ import_react28.default.createElement(
16199
16330
  RelationshipDetailsPanel,
16200
16331
  {
16201
16332
  link: detailsLink,
@@ -16209,7 +16340,7 @@ function XViewScene({
16209
16340
  userRole: userPermissionRole
16210
16341
  }
16211
16342
  ),
16212
- ancestryLinkDetails && /* @__PURE__ */ import_react27.default.createElement(
16343
+ ancestryLinkDetails && /* @__PURE__ */ import_react28.default.createElement(
16213
16344
  AncestryLinkDetailsPanel,
16214
16345
  {
16215
16346
  data: ancestryLinkDetails,
@@ -16220,7 +16351,7 @@ function XViewScene({
16220
16351
  onUploadFile: upload_file_action
16221
16352
  }
16222
16353
  ),
16223
- /* @__PURE__ */ import_react27.default.createElement(
16354
+ /* @__PURE__ */ import_react28.default.createElement(
16224
16355
  "div",
16225
16356
  {
16226
16357
  ref: tooltipRef,
@@ -16247,7 +16378,7 @@ function XViewScene({
16247
16378
  }
16248
16379
  }
16249
16380
  ),
16250
- /* @__PURE__ */ import_react27.default.createElement(
16381
+ /* @__PURE__ */ import_react28.default.createElement(
16251
16382
  ContextMenu,
16252
16383
  {
16253
16384
  data: contextMenu,
@@ -16280,7 +16411,7 @@ function XViewScene({
16280
16411
  onFinishQuest: handleFinishQuestQuick
16281
16412
  }
16282
16413
  ),
16283
- /* @__PURE__ */ import_react27.default.createElement(
16414
+ /* @__PURE__ */ import_react28.default.createElement(
16284
16415
  MultiNodeContextMenu,
16285
16416
  {
16286
16417
  data: multiContextMenu,
@@ -16300,7 +16431,7 @@ function XViewScene({
16300
16431
  )
16301
16432
  }
16302
16433
  ),
16303
- /* @__PURE__ */ import_react27.default.createElement(
16434
+ /* @__PURE__ */ import_react28.default.createElement(
16304
16435
  RelationshipContextMenu,
16305
16436
  {
16306
16437
  data: relationshipMenu,
@@ -16318,14 +16449,14 @@ function XViewScene({
16318
16449
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
16319
16450
  }
16320
16451
  ),
16321
- /* @__PURE__ */ import_react27.default.createElement(
16452
+ /* @__PURE__ */ import_react28.default.createElement(
16322
16453
  ImageViewer,
16323
16454
  {
16324
16455
  data: imageViewer,
16325
16456
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
16326
16457
  }
16327
16458
  ),
16328
- /* @__PURE__ */ import_react27.default.createElement(
16459
+ /* @__PURE__ */ import_react28.default.createElement(
16329
16460
  AncestryBoard,
16330
16461
  {
16331
16462
  isOpen: isAncestryBoardOpen,
@@ -16338,7 +16469,7 @@ function XViewScene({
16338
16469
  userRole: userPermissionRole
16339
16470
  }
16340
16471
  ),
16341
- /* @__PURE__ */ import_react27.default.createElement(
16472
+ /* @__PURE__ */ import_react28.default.createElement(
16342
16473
  ImportParentFileModal,
16343
16474
  {
16344
16475
  isOpen: isImportModalOpen,
@@ -16351,7 +16482,7 @@ function XViewScene({
16351
16482
  currentAncestries: ancestryDataRef.current || []
16352
16483
  }
16353
16484
  ),
16354
- invalidTargetError && /* @__PURE__ */ import_react27.default.createElement(
16485
+ invalidTargetError && /* @__PURE__ */ import_react28.default.createElement(
16355
16486
  "div",
16356
16487
  {
16357
16488
  className: "ui-overlay",
@@ -16376,13 +16507,13 @@ function XViewScene({
16376
16507
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
16377
16508
  }
16378
16509
  },
16379
- /* @__PURE__ */ import_react27.default.createElement("style", null, `
16510
+ /* @__PURE__ */ import_react28.default.createElement("style", null, `
16380
16511
  @keyframes fadeInDown {
16381
16512
  from { opacity: 0; transform: translate(-50%, -20px); }
16382
16513
  to { opacity: 1; transform: translate(-50%, 0); }
16383
16514
  }
16384
16515
  `),
16385
- /* @__PURE__ */ import_react27.default.createElement(
16516
+ /* @__PURE__ */ import_react28.default.createElement(
16386
16517
  "svg",
16387
16518
  {
16388
16519
  width: "20",
@@ -16394,12 +16525,12 @@ function XViewScene({
16394
16525
  strokeLinecap: "round",
16395
16526
  strokeLinejoin: "round"
16396
16527
  },
16397
- /* @__PURE__ */ import_react27.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
16398
- /* @__PURE__ */ import_react27.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
16399
- /* @__PURE__ */ import_react27.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
16528
+ /* @__PURE__ */ import_react28.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
16529
+ /* @__PURE__ */ import_react28.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
16530
+ /* @__PURE__ */ import_react28.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
16400
16531
  ),
16401
- /* @__PURE__ */ import_react27.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
16402
- /* @__PURE__ */ import_react27.default.createElement(
16532
+ /* @__PURE__ */ import_react28.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
16533
+ /* @__PURE__ */ import_react28.default.createElement(
16403
16534
  "button",
16404
16535
  {
16405
16536
  onClick: () => setInvalidTargetError(null),