@lv-x-software-house/x_view 1.2.5-dev.47 → 1.2.5-dev.49

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 +283 -223
  2. package/dist/index.mjs +213 -153
  3. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  // src/XViewScene.jsx
2
- import React27, {
2
+ import React28, {
3
3
  useCallback as useCallback4,
4
4
  useEffect as useEffect22,
5
5
  useRef as useRef19,
6
- useState as useState26,
6
+ useState as useState27,
7
7
  useMemo as useMemo12
8
8
  } from "react";
9
9
  import { useRouter, useSearchParams } from "next/navigation";
@@ -588,14 +588,13 @@ function XViewSidebar({
588
588
  onActivateQuestLens = () => {
589
589
  },
590
590
  milestones = [],
591
- onUpdateMilestones = () => {
591
+ onOpenMilestoneManager = () => {
592
592
  }
593
593
  }) {
594
594
  const [query, setQuery] = useState2("");
595
595
  const [showList, setShowList] = useState2(false);
596
596
  const [selectedNodeId, setSelectedNodeId] = useState2(null);
597
597
  const [isSaving, setIsSaving] = useState2(false);
598
- const [newMilestoneName, setNewMilestoneName] = useState2("");
599
598
  const [activeFilters, setActiveFilters] = useState2([]);
600
599
  const [isFilterMenuOpen, setIsFilterMenuOpen] = useState2(false);
601
600
  const [filterCategory, setFilterCategory] = useState2("Type");
@@ -807,28 +806,6 @@ function XViewSidebar({
807
806
  setIsTypeDropdownOpen(false);
808
807
  }
809
808
  };
810
- const handleAddMilestone = () => {
811
- if (!newMilestoneName.trim()) return;
812
- const newMilestone = {
813
- id: `ms_${Date.now()}`,
814
- name: newMilestoneName.trim(),
815
- status: "active"
816
- };
817
- onUpdateMilestones([...milestones, newMilestone]);
818
- setNewMilestoneName("");
819
- };
820
- const handleToggleMilestoneStatus = (id) => {
821
- const updated = milestones.map(
822
- (ms) => ms.id === id ? { ...ms, status: ms.status === "active" ? "inactive" : "active" } : ms
823
- );
824
- onUpdateMilestones(updated);
825
- };
826
- const handleRemoveMilestone = (id) => {
827
- var _a;
828
- if (!confirm(`Deseja remover o milestone "${(_a = milestones.find((m) => m.id === id)) == null ? void 0 : _a.name}"?`)) return;
829
- const updated = milestones.filter((ms) => ms.id !== id);
830
- onUpdateMilestones(updated);
831
- };
832
809
  const ToggleButton = /* @__PURE__ */ React2.createElement(
833
810
  "button",
834
811
  {
@@ -1020,25 +997,7 @@ function XViewSidebar({
1020
997
  },
1021
998
  /* @__PURE__ */ React2.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__ */ React2.createElement("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }), /* @__PURE__ */ React2.createElement("polyline", { points: "17 8 12 3 7 8" }), /* @__PURE__ */ React2.createElement("line", { x1: "12", y1: "3", x2: "12", y2: "15" })),
1022
999
  "Importar arquivo"
1023
- ), /* @__PURE__ */ React2.createElement("p", { className: "mt-1.5 text-xs text-slate-400 text-center px-1 leading-tight" }, "Importar datasets ou ancestralidades das views."), /* @__PURE__ */ React2.createElement("div", { className: "h-9 mt-1 flex items-center justify-center" }, importSuccessMessage && /* @__PURE__ */ React2.createElement("p", { className: "w-full text-center text-xs font-medium text-indigo-300 bg-indigo-500/10 border border-indigo-500/20 rounded-md py-1.5 px-2" }, importSuccessMessage)))), /* @__PURE__ */ React2.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ React2.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Lentes"), /* @__PURE__ */ React2.createElement(
1024
- "button",
1025
- {
1026
- onClick: onActivateTimeline,
1027
- className: buttonBaseClass,
1028
- title: "Ativar a visualiza\xE7\xE3o de Timeline"
1029
- },
1030
- /* @__PURE__ */ React2.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__ */ React2.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React2.createElement("polyline", { points: "12 6 12 12 16 14" })),
1031
- "Timeline"
1032
- ), /* @__PURE__ */ React2.createElement(
1033
- "button",
1034
- {
1035
- onClick: onOpenAncestryBoard,
1036
- className: buttonBaseClass,
1037
- title: "Abrir painel de Ancestralidades"
1038
- },
1039
- /* @__PURE__ */ React2.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__ */ React2.createElement("polygon", { points: "12 2 2 7 12 12 22 7 12 2" }), /* @__PURE__ */ React2.createElement("polyline", { points: "2 17 12 22 22 17" }), /* @__PURE__ */ React2.createElement("polyline", { points: "2 12 12 17 22 12" })),
1040
- "Ancestry Board"
1041
- ), /* @__PURE__ */ React2.createElement("div", { className: "relative", ref: questLensRef }, /* @__PURE__ */ React2.createElement(
1000
+ ), /* @__PURE__ */ React2.createElement("p", { className: "mt-1.5 text-xs text-slate-400 text-center px-1 leading-tight" }, "Importar datasets ou ancestralidades das views."), /* @__PURE__ */ React2.createElement("div", { className: "h-9 mt-1 flex items-center justify-center" }, importSuccessMessage && /* @__PURE__ */ React2.createElement("p", { className: "w-full text-center text-xs font-medium text-indigo-300 bg-indigo-500/10 border border-indigo-500/20 rounded-md py-1.5 px-2" }, importSuccessMessage)))), /* @__PURE__ */ React2.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ React2.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Lentes"), /* @__PURE__ */ React2.createElement("div", { className: "relative", ref: questLensRef }, /* @__PURE__ */ React2.createElement(
1042
1001
  "button",
1043
1002
  {
1044
1003
  onClick: () => setIsQuestLensMenuOpen(!isQuestLensMenuOpen),
@@ -1090,54 +1049,35 @@ function XViewSidebar({
1090
1049
  className: "flex-[2] py-2 bg-indigo-600 hover:bg-indigo-500 text-white text-[11px] font-bold rounded-lg shadow-lg shadow-indigo-500/20 transition-all hover:scale-[1.02] active:scale-95"
1091
1050
  },
1092
1051
  "Aplicar Lente"
1093
- ))))), /* @__PURE__ */ React2.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ React2.createElement("section", { className: "space-y-3" }, /* @__PURE__ */ React2.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Milestones")), /* @__PURE__ */ React2.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React2.createElement(
1094
- "input",
1052
+ )))), /* @__PURE__ */ React2.createElement(
1053
+ "button",
1095
1054
  {
1096
- type: "text",
1097
- value: newMilestoneName,
1098
- onChange: (e) => setNewMilestoneName(e.target.value),
1099
- onKeyDown: (e) => e.key === "Enter" && handleAddMilestone(),
1100
- placeholder: "Novo Milestone...",
1101
- className: "flex-1 bg-slate-900/50 border border-white/10 rounded-md px-2 py-1.5 text-xs text-slate-100 placeholder:text-slate-600 focus:outline-none focus:border-indigo-500/50"
1102
- }
1055
+ onClick: onActivateTimeline,
1056
+ className: buttonBaseClass,
1057
+ title: "Ativar a visualiza\xE7\xE3o de Timeline"
1058
+ },
1059
+ /* @__PURE__ */ React2.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__ */ React2.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React2.createElement("polyline", { points: "12 6 12 12 16 14" })),
1060
+ "Timeline"
1103
1061
  ), /* @__PURE__ */ React2.createElement(
1104
1062
  "button",
1105
1063
  {
1106
- onClick: handleAddMilestone,
1107
- disabled: !newMilestoneName.trim(),
1108
- className: "p-1.5 rounded-md bg-indigo-500/10 hover:bg-indigo-500/20 border border-indigo-500/30 text-indigo-300 disabled:opacity-30 transition-colors"
1064
+ onClick: onOpenAncestryBoard,
1065
+ className: buttonBaseClass,
1066
+ title: "Abrir painel de Ancestralidades"
1109
1067
  },
1110
- /* @__PURE__ */ React2.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__ */ React2.createElement("line", { x1: "12", y1: "5", x2: "12", y2: "19" }), /* @__PURE__ */ React2.createElement("line", { x1: "5", y1: "12", x2: "19", y2: "12" }))
1111
- )), /* @__PURE__ */ React2.createElement("div", { className: "space-y-1.5 max-h-[200px] overflow-y-auto custom-scrollbar pr-1" }, milestones.length > 0 ? milestones.map((ms) => /* @__PURE__ */ React2.createElement(
1112
- "div",
1068
+ /* @__PURE__ */ React2.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__ */ React2.createElement("polygon", { points: "12 2 2 7 12 12 22 7 12 2" }), /* @__PURE__ */ React2.createElement("polyline", { points: "2 17 12 22 22 17" }), /* @__PURE__ */ React2.createElement("polyline", { points: "2 12 12 17 22 12" })),
1069
+ "Ancestry Board"
1070
+ )), /* @__PURE__ */ React2.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ React2.createElement("section", { className: "space-y-3" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Milestones"), /* @__PURE__ */ React2.createElement(
1071
+ "button",
1113
1072
  {
1114
- key: ms.id,
1115
- className: `group flex items-center justify-between px-2.5 py-2 rounded-lg border transition-all ${ms.status === "active" ? "bg-indigo-500/5 border-indigo-500/20" : "bg-slate-900/30 border-white/5 opacity-60"}`
1073
+ onClick: onOpenMilestoneManager,
1074
+ className: buttonBaseClass,
1075
+ title: "Gerenciar os milestones deste cen\xE1rio"
1116
1076
  },
1117
- /* @__PURE__ */ React2.createElement("div", { className: "flex items-center gap-2 min-w-0" }, /* @__PURE__ */ React2.createElement(
1118
- "div",
1119
- {
1120
- className: `w-1.5 h-1.5 rounded-full shrink-0 ${ms.status === "active" ? "bg-indigo-400 shadow-[0_0_8px_rgba(129,140,248,0.5)]" : "bg-slate-600"}`
1121
- }
1122
- ), /* @__PURE__ */ React2.createElement("span", { className: `text-[11px] truncate font-medium ${ms.status === "active" ? "text-slate-100" : "text-slate-500 line-through"}` }, ms.name)),
1123
- /* @__PURE__ */ React2.createElement("div", { className: "flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity" }, /* @__PURE__ */ React2.createElement(
1124
- "button",
1125
- {
1126
- onClick: () => handleToggleMilestoneStatus(ms.id),
1127
- className: `p-1 rounded hover:bg-white/10 transition-colors ${ms.status === "active" ? "text-slate-400" : "text-indigo-400"}`,
1128
- title: ms.status === "active" ? "Inativar" : "Ativar"
1129
- },
1130
- ms.status === "active" ? /* @__PURE__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ React2.createElement("rect", { x: "6", y: "4", width: "4", height: "16" }), /* @__PURE__ */ React2.createElement("rect", { x: "14", y: "4", width: "4", height: "16" })) : /* @__PURE__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ React2.createElement("polygon", { points: "5 3 19 12 5 21 5 3" }))
1131
- ), /* @__PURE__ */ React2.createElement(
1132
- "button",
1133
- {
1134
- onClick: () => handleRemoveMilestone(ms.id),
1135
- className: "p-1 rounded hover:bg-red-500/20 text-slate-500 hover:text-red-400 transition-colors",
1136
- title: "Remover"
1137
- },
1138
- /* @__PURE__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ React2.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ React2.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__ */ React2.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ React2.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" }))
1139
- ))
1140
- )) : /* @__PURE__ */ React2.createElement("p", { className: "text-[10px] text-slate-600 text-center py-2 italic font-light italic" }, "Nenhum milestone definido")))), /* @__PURE__ */ React2.createElement("div", { className: "px-4 py-3 border-t border-white/10 bg-slate-900/30" }, /* @__PURE__ */ React2.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ React2.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Navega\xE7\xE3o")), ability.can("update", "Scene") && /* @__PURE__ */ React2.createElement(
1077
+ /* @__PURE__ */ React2.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__ */ React2.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React2.createElement("circle", { cx: "12", cy: "12", r: "6" }), /* @__PURE__ */ React2.createElement("circle", { cx: "12", cy: "12", r: "2" })),
1078
+ "Gerenciar Milestones",
1079
+ milestones.length > 0 && /* @__PURE__ */ React2.createElement("span", { className: "ml-1.5 px-1.5 py-0.5 rounded-full bg-indigo-500/30 text-[10px] font-bold border border-indigo-400/30" }, milestones.length)
1080
+ ))), /* @__PURE__ */ React2.createElement("div", { className: "px-4 py-3 border-t border-white/10 bg-slate-900/30" }, /* @__PURE__ */ React2.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ React2.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Navega\xE7\xE3o")), ability.can("update", "Scene") && /* @__PURE__ */ React2.createElement(
1141
1081
  "button",
1142
1082
  {
1143
1083
  onClick: handleSaveClick,
@@ -13295,6 +13235,116 @@ function AncestryBoard({
13295
13235
  );
13296
13236
  }
13297
13237
 
13238
+ // src/components/MilestoneManager.jsx
13239
+ import React27, { useState as useState26 } from "react";
13240
+ import { FiTarget as FiTarget4, FiPlus as FiPlus11, FiTrash2 as FiTrash24, FiX as FiX9, FiCheck as FiCheck12, FiPauseCircle, FiPlayCircle } from "react-icons/fi";
13241
+ function MilestoneManager({
13242
+ isOpen,
13243
+ onClose,
13244
+ milestones = [],
13245
+ onUpdateMilestones = () => {
13246
+ }
13247
+ }) {
13248
+ const [newMilestoneName, setNewMilestoneName] = useState26("");
13249
+ const handleAddMilestone = () => {
13250
+ if (!newMilestoneName.trim()) return;
13251
+ const newMilestone = {
13252
+ id: `ms_${Date.now()}`,
13253
+ name: newMilestoneName.trim(),
13254
+ status: "active"
13255
+ };
13256
+ onUpdateMilestones([...milestones, newMilestone]);
13257
+ setNewMilestoneName("");
13258
+ };
13259
+ const handleToggleMilestoneStatus = (id) => {
13260
+ const updated = milestones.map(
13261
+ (ms) => ms.id === id ? { ...ms, status: ms.status === "active" ? "inactive" : "active" } : ms
13262
+ );
13263
+ onUpdateMilestones(updated);
13264
+ };
13265
+ const handleRemoveMilestone = (id) => {
13266
+ var _a;
13267
+ if (!confirm(`Deseja remover o milestone "${(_a = milestones.find((m) => m.id === id)) == null ? void 0 : _a.name}"?`)) return;
13268
+ const updated = milestones.filter((ms) => ms.id !== id);
13269
+ onUpdateMilestones(updated);
13270
+ };
13271
+ if (!isOpen) return null;
13272
+ const swallow = (e) => e.stopPropagation();
13273
+ return /* @__PURE__ */ React27.createElement(
13274
+ "div",
13275
+ {
13276
+ className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-slate-950/40 backdrop-blur-sm animate-in fade-in duration-300",
13277
+ onClick: onClose
13278
+ },
13279
+ /* @__PURE__ */ React27.createElement(
13280
+ "div",
13281
+ {
13282
+ className: "w-full max-w-lg bg-slate-900/90 backdrop-blur-xl border border-white/10 rounded-2xl shadow-2xl flex flex-col max-h-[85vh] animate-in zoom-in-95 duration-300",
13283
+ onClick: swallow
13284
+ },
13285
+ /* @__PURE__ */ React27.createElement("div", { className: "px-6 py-4 border-b border-white/10 flex items-center justify-between" }, /* @__PURE__ */ React27.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React27.createElement("div", { className: "p-2 rounded-lg bg-indigo-500/20 text-indigo-400" }, /* @__PURE__ */ React27.createElement(FiTarget4, { size: 20 })), /* @__PURE__ */ React27.createElement("div", null, /* @__PURE__ */ React27.createElement("h2", { className: "text-lg font-semibold text-slate-100" }, "Milestones"), /* @__PURE__ */ React27.createElement("p", { className: "text-xs text-slate-400" }, "Gerencie os marcos do seu cen\xE1rio"))), /* @__PURE__ */ React27.createElement(
13286
+ "button",
13287
+ {
13288
+ onClick: onClose,
13289
+ className: "p-2 rounded-full hover:bg-white/10 text-slate-400 hover:text-white transition-colors"
13290
+ },
13291
+ /* @__PURE__ */ React27.createElement(FiX9, { size: 20 })
13292
+ )),
13293
+ /* @__PURE__ */ React27.createElement("div", { className: "px-6 py-5 bg-white/5 border-b border-white/5" }, /* @__PURE__ */ React27.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React27.createElement(
13294
+ "input",
13295
+ {
13296
+ type: "text",
13297
+ value: newMilestoneName,
13298
+ onChange: (e) => setNewMilestoneName(e.target.value),
13299
+ onKeyDown: (e) => e.key === "Enter" && handleAddMilestone(),
13300
+ placeholder: "Adicionar novo milestone...",
13301
+ className: "flex-1 bg-slate-800/50 border border-white/10 rounded-xl px-4 py-2.5 text-sm text-slate-100 placeholder:text-slate-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 focus:border-indigo-500/50 transition-all shadow-inner"
13302
+ }
13303
+ ), /* @__PURE__ */ React27.createElement(
13304
+ "button",
13305
+ {
13306
+ onClick: handleAddMilestone,
13307
+ disabled: !newMilestoneName.trim(),
13308
+ className: "px-4 py-2.5 rounded-xl bg-indigo-600 hover:bg-indigo-500 disabled:opacity-30 disabled:cursor-not-allowed text-white text-sm font-medium transition-all flex items-center gap-2 shadow-lg shadow-indigo-500/20 active:scale-95"
13309
+ },
13310
+ /* @__PURE__ */ React27.createElement(FiPlus11, { size: 18 }),
13311
+ "Adicionar"
13312
+ ))),
13313
+ /* @__PURE__ */ React27.createElement("div", { className: "flex-1 overflow-y-auto px-6 py-4 custom-scrollbar" }, milestones.length > 0 ? /* @__PURE__ */ React27.createElement("div", { className: "space-y-3" }, milestones.map((ms) => /* @__PURE__ */ React27.createElement(
13314
+ "div",
13315
+ {
13316
+ key: ms.id,
13317
+ className: `group flex items-center justify-between p-4 rounded-xl border transition-all duration-200 ${ms.status === "active" ? "bg-slate-800/40 border-indigo-500/20 hover:border-indigo-500/40" : "bg-slate-900/40 border-white/5 opacity-60 grayscale-[0.3]"}`
13318
+ },
13319
+ /* @__PURE__ */ React27.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ React27.createElement(
13320
+ "div",
13321
+ {
13322
+ className: `w-2 h-2 rounded-full shrink-0 ${ms.status === "active" ? "bg-indigo-400 shadow-[0_0_8px_rgba(129,140,248,0.6)]" : "bg-slate-600"}`
13323
+ }
13324
+ ), /* @__PURE__ */ React27.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React27.createElement("span", { className: `text-sm font-medium truncate ${ms.status === "active" ? "text-slate-100" : "text-slate-400 line-through"}` }, ms.name), /* @__PURE__ */ React27.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-wider" }, ms.status === "active" ? "Ativo" : "Inativo"))),
13325
+ /* @__PURE__ */ React27.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React27.createElement(
13326
+ "button",
13327
+ {
13328
+ onClick: () => handleToggleMilestoneStatus(ms.id),
13329
+ className: `p-2 rounded-lg transition-all ${ms.status === "active" ? "hover:bg-slate-700 text-slate-400" : "hover:bg-indigo-500/20 text-indigo-400"}`,
13330
+ title: ms.status === "active" ? "Inativar" : "Ativar"
13331
+ },
13332
+ ms.status === "active" ? /* @__PURE__ */ React27.createElement(FiPauseCircle, { size: 18 }) : /* @__PURE__ */ React27.createElement(FiPlayCircle, { size: 18 })
13333
+ ), /* @__PURE__ */ React27.createElement(
13334
+ "button",
13335
+ {
13336
+ onClick: () => handleRemoveMilestone(ms.id),
13337
+ className: "p-2 rounded-lg hover:bg-red-500/20 text-slate-500 hover:text-red-400 transition-all",
13338
+ title: "Remover"
13339
+ },
13340
+ /* @__PURE__ */ React27.createElement(FiTrash24, { size: 18 })
13341
+ ))
13342
+ ))) : /* @__PURE__ */ React27.createElement("div", { className: "flex flex-col items-center justify-center py-12 text-center" }, /* @__PURE__ */ React27.createElement("div", { className: "p-4 rounded-full bg-slate-800/30 text-slate-600 mb-4" }, /* @__PURE__ */ React27.createElement(FiTarget4, { size: 40 })), /* @__PURE__ */ React27.createElement("h3", { className: "text-slate-400 font-medium" }, "Nenhum milestone definido"), /* @__PURE__ */ React27.createElement("p", { className: "text-xs text-slate-600 max-w-[200px] mt-1 italic" }, "Defina marcos importantes para orientar o progresso do projeto."))),
13343
+ /* @__PURE__ */ React27.createElement("div", { className: "px-6 py-4 border-t border-white/5 bg-slate-900/50 flex items-center justify-between rounded-b-2xl" }, /* @__PURE__ */ React27.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ React27.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ React27.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-widest" }, "Total:"), /* @__PURE__ */ React27.createElement("span", { className: "text-xs font-bold text-slate-300" }, milestones.length)), /* @__PURE__ */ React27.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ React27.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-widest" }, "Ativos:"), /* @__PURE__ */ React27.createElement("span", { className: "text-xs font-bold text-indigo-400" }, milestones.filter((m) => m.status === "active").length))))
13344
+ )
13345
+ );
13346
+ }
13347
+
13298
13348
  // src/XViewScene.jsx
13299
13349
  import short2 from "short-uuid";
13300
13350
  var secretKey = process.env.NEXT_PUBLIC_CRYPTO_KEY;
@@ -13376,7 +13426,7 @@ function XViewScene({
13376
13426
  check_user_permission,
13377
13427
  get_view_members
13378
13428
  }) {
13379
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
13429
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
13380
13430
  const { data: session, status } = useSession();
13381
13431
  const router = useRouter();
13382
13432
  const searchParams = useSearchParams();
@@ -13451,42 +13501,42 @@ function XViewScene({
13451
13501
  const sceneDataRef = useRef19(null);
13452
13502
  const parentDataRef = useRef19(null);
13453
13503
  const ancestryDataRef = useRef19(null);
13454
- const [isLoading, setIsLoading] = useState26(true);
13455
- const [permissionStatus, setPermissionStatus] = useState26("loading");
13456
- const [userPermissionRole, setUserPermissionRole] = useState26(null);
13457
- const [viewMembers, setViewMembers] = useState26([]);
13458
- const [isInitialized, setIsInitialized] = useState26(false);
13459
- const [sceneVersion, setSceneVersion] = useState26(0);
13460
- const [contextMenu, setContextMenu] = useState26({
13504
+ const [isLoading, setIsLoading] = useState27(true);
13505
+ const [permissionStatus, setPermissionStatus] = useState27("loading");
13506
+ const [userPermissionRole, setUserPermissionRole] = useState27(null);
13507
+ const [viewMembers, setViewMembers] = useState27([]);
13508
+ const [isInitialized, setIsInitialized] = useState27(false);
13509
+ const [sceneVersion, setSceneVersion] = useState27(0);
13510
+ const [contextMenu, setContextMenu] = useState27({
13461
13511
  visible: false,
13462
13512
  x: 0,
13463
13513
  y: 0,
13464
13514
  nodeData: null
13465
13515
  });
13466
- const [multiContextMenu, setMultiContextMenu] = useState26({
13516
+ const [multiContextMenu, setMultiContextMenu] = useState27({
13467
13517
  visible: false,
13468
13518
  x: 0,
13469
13519
  y: 0,
13470
13520
  nodeIds: null
13471
13521
  });
13472
- const [relationshipMenu, setRelationshipMenu] = useState26({
13522
+ const [relationshipMenu, setRelationshipMenu] = useState27({
13473
13523
  visible: false,
13474
13524
  x: 0,
13475
13525
  y: 0,
13476
13526
  linkObject: null
13477
13527
  });
13478
- const [creationMode, setCreationMode] = useState26({
13528
+ const [creationMode, setCreationMode] = useState27({
13479
13529
  isActive: false,
13480
13530
  sourceNodeData: null
13481
13531
  });
13482
- const [versionMode, setVersionMode] = useState26({
13532
+ const [versionMode, setVersionMode] = useState27({
13483
13533
  isActive: false,
13484
13534
  sourceNodeData: null
13485
13535
  });
13486
- const [questMode, setQuestMode] = useState26({ isActive: false });
13487
- const [hasFocusedInitial, setHasFocusedInitial] = useState26(false);
13488
- const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = useState26(false);
13489
- const [ancestryMode, setAncestryMode] = useState26({
13536
+ const [questMode, setQuestMode] = useState27({ isActive: false });
13537
+ const [hasFocusedInitial, setHasFocusedInitial] = useState27(false);
13538
+ const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = useState27(false);
13539
+ const [ancestryMode, setAncestryMode] = useState27({
13490
13540
  isActive: false,
13491
13541
  tree: null,
13492
13542
  selectedParentId: null,
@@ -13497,37 +13547,38 @@ function XViewScene({
13497
13547
  ancestryDescriptionSections: [],
13498
13548
  isAddingNodes: false
13499
13549
  });
13500
- const [readingMode, setReadingMode] = useState26({
13550
+ const [readingMode, setReadingMode] = useState27({
13501
13551
  isActive: false,
13502
13552
  ancestry: null,
13503
13553
  branchStack: [],
13504
13554
  autoAbstraction: false
13505
13555
  });
13506
- const [formPosition, setFormPosition] = useState26({
13556
+ const [formPosition, setFormPosition] = useState27({
13507
13557
  left: 16,
13508
13558
  top: 16,
13509
13559
  opacity: 0
13510
13560
  });
13511
- const [detailsNode, setDetailsNode] = useState26(null);
13512
- const [detailsLink, setDetailsLink] = useState26(null);
13513
- const [ancestryLinkDetails, setAncestryLinkDetails] = useState26(null);
13514
- const [imageViewer, setImageViewer] = useState26({
13561
+ const [detailsNode, setDetailsNode] = useState27(null);
13562
+ const [detailsLink, setDetailsLink] = useState27(null);
13563
+ const [ancestryLinkDetails, setAncestryLinkDetails] = useState27(null);
13564
+ const [imageViewer, setImageViewer] = useState27({
13515
13565
  visible: false,
13516
13566
  images: [],
13517
13567
  startIndex: 0
13518
13568
  });
13519
- const [editingAncestryRel, setEditingAncestryRel] = useState26({
13569
+ const [editingAncestryRel, setEditingAncestryRel] = useState27({
13520
13570
  visible: false,
13521
13571
  data: null,
13522
13572
  path: null
13523
13573
  });
13524
- const [isImportModalOpen, setIsImportModalOpen] = useState26(false);
13525
- const [importSuccessMessage, setImportSuccessMessage] = useState26("");
13526
- const [invalidTargetError, setInvalidTargetError] = useState26(null);
13527
- const [highlightedNodeId, setHighlightedNodeId] = useState26(null);
13528
- const [isAncestryBoardOpen, setIsAncestryBoardOpen] = useState26(false);
13529
- const [ancestryBoardData, setAncestryBoardData] = useState26([]);
13530
- const [isSidebarOpen, setIsSidebarOpen] = useState26(false);
13574
+ const [isImportModalOpen, setIsImportModalOpen] = useState27(false);
13575
+ const [importSuccessMessage, setImportSuccessMessage] = useState27("");
13576
+ const [invalidTargetError, setInvalidTargetError] = useState27(null);
13577
+ const [highlightedNodeId, setHighlightedNodeId] = useState27(null);
13578
+ const [isAncestryBoardOpen, setIsAncestryBoardOpen] = useState27(false);
13579
+ const [ancestryBoardData, setAncestryBoardData] = useState27([]);
13580
+ const [isSidebarOpen, setIsSidebarOpen] = useState27(false);
13581
+ const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = useState27(false);
13531
13582
  const mountRef = useRef19(null);
13532
13583
  const tooltipRef = useRef19(null);
13533
13584
  const formRef = useRef19(null);
@@ -17735,10 +17786,10 @@ function XViewScene({
17735
17786
  // <-- handleCancelQuest adicionado aqui
17736
17787
  ]);
17737
17788
  if (isLoading || status === "loading" || permissionStatus === "loading") {
17738
- return /* @__PURE__ */ React27.createElement(LoadingScreen, null);
17789
+ return /* @__PURE__ */ React28.createElement(LoadingScreen, null);
17739
17790
  }
17740
17791
  if (permissionStatus === "denied") {
17741
- return /* @__PURE__ */ React27.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ React27.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ React27.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ React27.createElement(
17792
+ return /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ React28.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ React28.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ React28.createElement(
17742
17793
  "svg",
17743
17794
  {
17744
17795
  xmlns: "http://www.w3.org/2000/svg",
@@ -17748,7 +17799,7 @@ function XViewScene({
17748
17799
  stroke: "currentColor",
17749
17800
  className: "w-16 h-16 mx-auto"
17750
17801
  },
17751
- /* @__PURE__ */ React27.createElement(
17802
+ /* @__PURE__ */ React28.createElement(
17752
17803
  "path",
17753
17804
  {
17754
17805
  strokeLinecap: "round",
@@ -17756,13 +17807,13 @@ function XViewScene({
17756
17807
  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"
17757
17808
  }
17758
17809
  )
17759
- )), /* @__PURE__ */ React27.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ React27.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__ */ React27.createElement(
17810
+ )), /* @__PURE__ */ React28.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ React28.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__ */ React28.createElement(
17760
17811
  "button",
17761
17812
  {
17762
17813
  onClick: () => router.push("/dashboard/scenes"),
17763
17814
  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"
17764
17815
  },
17765
- /* @__PURE__ */ React27.createElement(
17816
+ /* @__PURE__ */ React28.createElement(
17766
17817
  "svg",
17767
17818
  {
17768
17819
  xmlns: "http://www.w3.org/2000/svg",
@@ -17772,7 +17823,7 @@ function XViewScene({
17772
17823
  stroke: "currentColor",
17773
17824
  className: "w-5 h-5"
17774
17825
  },
17775
- /* @__PURE__ */ React27.createElement(
17826
+ /* @__PURE__ */ React28.createElement(
17776
17827
  "path",
17777
17828
  {
17778
17829
  strokeLinecap: "round",
@@ -17784,7 +17835,7 @@ function XViewScene({
17784
17835
  "Voltar para Scenes"
17785
17836
  )));
17786
17837
  }
17787
- return /* @__PURE__ */ React27.createElement(
17838
+ return /* @__PURE__ */ React28.createElement(
17788
17839
  "div",
17789
17840
  {
17790
17841
  ref: mountRef,
@@ -17796,7 +17847,7 @@ function XViewScene({
17796
17847
  cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
17797
17848
  }
17798
17849
  },
17799
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ React27.createElement(
17850
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ React28.createElement(
17800
17851
  XViewSidebar,
17801
17852
  {
17802
17853
  dbNodes: searchableDbNodes,
@@ -17817,10 +17868,10 @@ function XViewScene({
17817
17868
  userRole: userPermissionRole,
17818
17869
  viewMembers,
17819
17870
  milestones: ((_c = sceneDataRef.current) == null ? void 0 : _c.milestones) || [],
17820
- onUpdateMilestones: handleUpdateMilestones
17871
+ onOpenMilestoneManager: () => setIsMilestoneManagerOpen(true)
17821
17872
  }
17822
17873
  ),
17823
- creationMode.isActive && /* @__PURE__ */ React27.createElement(
17874
+ creationMode.isActive && /* @__PURE__ */ React28.createElement(
17824
17875
  InSceneCreationForm,
17825
17876
  {
17826
17877
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -17852,7 +17903,7 @@ function XViewScene({
17852
17903
  availableAncestries: allAvailableAncestries
17853
17904
  }
17854
17905
  ),
17855
- versionMode.isActive && /* @__PURE__ */ React27.createElement(
17906
+ versionMode.isActive && /* @__PURE__ */ React28.createElement(
17856
17907
  InSceneVersionForm,
17857
17908
  {
17858
17909
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -17878,7 +17929,7 @@ function XViewScene({
17878
17929
  availableAncestries: allAvailableAncestries
17879
17930
  }
17880
17931
  ),
17881
- questMode.isActive && /* @__PURE__ */ React27.createElement(
17932
+ questMode.isActive && /* @__PURE__ */ React28.createElement(
17882
17933
  InSceneQuestForm,
17883
17934
  {
17884
17935
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -17906,7 +17957,7 @@ function XViewScene({
17906
17957
  onUpdateMilestones: handleUpdateMilestones
17907
17958
  }
17908
17959
  ),
17909
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ React27.createElement(
17960
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ React28.createElement(
17910
17961
  "div",
17911
17962
  {
17912
17963
  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"}`,
@@ -17919,7 +17970,7 @@ function XViewScene({
17919
17970
  maxWidth: "92vw"
17920
17971
  }
17921
17972
  },
17922
- /* @__PURE__ */ React27.createElement(
17973
+ /* @__PURE__ */ React28.createElement(
17923
17974
  "div",
17924
17975
  {
17925
17976
  onPointerDown: (e) => {
@@ -17930,7 +17981,7 @@ function XViewScene({
17930
17981
  title: "Arraste para redimensionar"
17931
17982
  }
17932
17983
  ),
17933
- /* @__PURE__ */ React27.createElement(
17984
+ /* @__PURE__ */ React28.createElement(
17934
17985
  DescriptionReadModePanel,
17935
17986
  {
17936
17987
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -17965,7 +18016,7 @@ function XViewScene({
17965
18016
  }
17966
18017
  )
17967
18018
  ),
17968
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ React27.createElement(
18019
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ React28.createElement(
17969
18020
  CreateAncestryPanel,
17970
18021
  {
17971
18022
  ancestryMode,
@@ -18001,7 +18052,7 @@ function XViewScene({
18001
18052
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
18002
18053
  }
18003
18054
  ),
18004
- editingAncestryRel.visible && /* @__PURE__ */ React27.createElement(
18055
+ editingAncestryRel.visible && /* @__PURE__ */ React28.createElement(
18005
18056
  AncestryRelationshipPanel,
18006
18057
  {
18007
18058
  data: editingAncestryRel.data,
@@ -18015,7 +18066,7 @@ function XViewScene({
18015
18066
  onUploadFile: upload_file_action
18016
18067
  }
18017
18068
  ),
18018
- detailsNode && detailsNode.is_quest && /* @__PURE__ */ React27.createElement(
18069
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ React28.createElement(
18019
18070
  QuestDetailsPanel,
18020
18071
  {
18021
18072
  node: detailsNode,
@@ -18040,7 +18091,7 @@ function XViewScene({
18040
18091
  onUpdateMilestones: handleUpdateMilestones
18041
18092
  }
18042
18093
  ),
18043
- detailsNode && !detailsNode.is_quest && /* @__PURE__ */ React27.createElement(
18094
+ detailsNode && !detailsNode.is_quest && /* @__PURE__ */ React28.createElement(
18044
18095
  NodeDetailsPanel,
18045
18096
  {
18046
18097
  node: detailsNode,
@@ -18072,7 +18123,7 @@ function XViewScene({
18072
18123
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
18073
18124
  }
18074
18125
  ),
18075
- detailsLink && /* @__PURE__ */ React27.createElement(
18126
+ detailsLink && /* @__PURE__ */ React28.createElement(
18076
18127
  RelationshipDetailsPanel,
18077
18128
  {
18078
18129
  link: detailsLink,
@@ -18086,7 +18137,7 @@ function XViewScene({
18086
18137
  userRole: userPermissionRole
18087
18138
  }
18088
18139
  ),
18089
- ancestryLinkDetails && /* @__PURE__ */ React27.createElement(
18140
+ ancestryLinkDetails && /* @__PURE__ */ React28.createElement(
18090
18141
  AncestryLinkDetailsPanel,
18091
18142
  {
18092
18143
  data: ancestryLinkDetails,
@@ -18097,7 +18148,7 @@ function XViewScene({
18097
18148
  onUploadFile: upload_file_action
18098
18149
  }
18099
18150
  ),
18100
- /* @__PURE__ */ React27.createElement(
18151
+ /* @__PURE__ */ React28.createElement(
18101
18152
  "div",
18102
18153
  {
18103
18154
  ref: tooltipRef,
@@ -18124,7 +18175,7 @@ function XViewScene({
18124
18175
  }
18125
18176
  }
18126
18177
  ),
18127
- /* @__PURE__ */ React27.createElement(
18178
+ /* @__PURE__ */ React28.createElement(
18128
18179
  ContextMenu,
18129
18180
  {
18130
18181
  data: contextMenu,
@@ -18157,7 +18208,7 @@ function XViewScene({
18157
18208
  onFinishQuest: handleFinishQuestQuick
18158
18209
  }
18159
18210
  ),
18160
- /* @__PURE__ */ React27.createElement(
18211
+ /* @__PURE__ */ React28.createElement(
18161
18212
  MultiNodeContextMenu,
18162
18213
  {
18163
18214
  data: multiContextMenu,
@@ -18177,7 +18228,7 @@ function XViewScene({
18177
18228
  )
18178
18229
  }
18179
18230
  ),
18180
- /* @__PURE__ */ React27.createElement(
18231
+ /* @__PURE__ */ React28.createElement(
18181
18232
  RelationshipContextMenu,
18182
18233
  {
18183
18234
  data: relationshipMenu,
@@ -18195,14 +18246,14 @@ function XViewScene({
18195
18246
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
18196
18247
  }
18197
18248
  ),
18198
- /* @__PURE__ */ React27.createElement(
18249
+ /* @__PURE__ */ React28.createElement(
18199
18250
  ImageViewer,
18200
18251
  {
18201
18252
  data: imageViewer,
18202
18253
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
18203
18254
  }
18204
18255
  ),
18205
- /* @__PURE__ */ React27.createElement(
18256
+ /* @__PURE__ */ React28.createElement(
18206
18257
  AncestryBoard,
18207
18258
  {
18208
18259
  isOpen: isAncestryBoardOpen,
@@ -18215,20 +18266,29 @@ function XViewScene({
18215
18266
  userRole: userPermissionRole
18216
18267
  }
18217
18268
  ),
18218
- /* @__PURE__ */ React27.createElement(
18269
+ /* @__PURE__ */ React28.createElement(
18270
+ MilestoneManager,
18271
+ {
18272
+ isOpen: isMilestoneManagerOpen,
18273
+ onClose: () => setIsMilestoneManagerOpen(false),
18274
+ milestones: ((_k = sceneDataRef.current) == null ? void 0 : _k.milestones) || [],
18275
+ onUpdateMilestones: handleUpdateMilestones
18276
+ }
18277
+ ),
18278
+ /* @__PURE__ */ React28.createElement(
18219
18279
  ImportParentFileModal,
18220
18280
  {
18221
18281
  isOpen: isImportModalOpen,
18222
18282
  onClose: () => setIsImportModalOpen(false),
18223
18283
  onConfirm: handleConfirmImport,
18224
18284
  session,
18225
- parentDbs: ((_k = sceneDataRef.current) == null ? void 0 : _k.parent_dbs) || [],
18285
+ parentDbs: ((_l = sceneDataRef.current) == null ? void 0 : _l.parent_dbs) || [],
18226
18286
  onFetchAvailableFiles: import_parent_file_modal_get,
18227
18287
  currentViewName: viewParams == null ? void 0 : viewParams.name,
18228
18288
  currentAncestries: ancestryDataRef.current || []
18229
18289
  }
18230
18290
  ),
18231
- invalidTargetError && /* @__PURE__ */ React27.createElement(
18291
+ invalidTargetError && /* @__PURE__ */ React28.createElement(
18232
18292
  "div",
18233
18293
  {
18234
18294
  className: "ui-overlay",
@@ -18253,13 +18313,13 @@ function XViewScene({
18253
18313
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
18254
18314
  }
18255
18315
  },
18256
- /* @__PURE__ */ React27.createElement("style", null, `
18316
+ /* @__PURE__ */ React28.createElement("style", null, `
18257
18317
  @keyframes fadeInDown {
18258
18318
  from { opacity: 0; transform: translate(-50%, -20px); }
18259
18319
  to { opacity: 1; transform: translate(-50%, 0); }
18260
18320
  }
18261
18321
  `),
18262
- /* @__PURE__ */ React27.createElement(
18322
+ /* @__PURE__ */ React28.createElement(
18263
18323
  "svg",
18264
18324
  {
18265
18325
  width: "20",
@@ -18271,12 +18331,12 @@ function XViewScene({
18271
18331
  strokeLinecap: "round",
18272
18332
  strokeLinejoin: "round"
18273
18333
  },
18274
- /* @__PURE__ */ React27.createElement("circle", { cx: "12", cy: "12", r: "10" }),
18275
- /* @__PURE__ */ React27.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
18276
- /* @__PURE__ */ React27.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
18334
+ /* @__PURE__ */ React28.createElement("circle", { cx: "12", cy: "12", r: "10" }),
18335
+ /* @__PURE__ */ React28.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
18336
+ /* @__PURE__ */ React28.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
18277
18337
  ),
18278
- /* @__PURE__ */ React27.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
18279
- /* @__PURE__ */ React27.createElement(
18338
+ /* @__PURE__ */ React28.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
18339
+ /* @__PURE__ */ React28.createElement(
18280
18340
  "button",
18281
18341
  {
18282
18342
  onClick: () => setInvalidTargetError(null),