@lv-x-software-house/x_view 1.2.6-dev.2 → 1.2.6-dev.7

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.
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_react32 = __toESM(require("react"));
47
+ var import_react29 = __toESM(require("react"));
48
48
  var import_navigation = require("next/navigation");
49
- var import_react33 = require("next-auth/react");
49
+ var import_react30 = 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");
@@ -1092,6 +1092,8 @@ var userActionHandlers = {
1092
1092
  if (isCrossDataset) {
1093
1093
  graphDataRef.current[finalTargetDatasetId] = targetDataToUpdate;
1094
1094
  }
1095
+ if (sceneDataRef.current.parent_dbs.some((db) => String(db.db_id) === String(sourceParentInfo.parentFileId))) {
1096
+ }
1095
1097
  const finalPosition = stateRef.current.ghostElements.node.position.clone();
1096
1098
  addNewNodeToScene(stateRef.current, newNode, newLink, finalPosition);
1097
1099
  stateRef.current.nodeIdToParentFileMap.set(String(newNode.id), {
@@ -1290,6 +1292,9 @@ var userActionHandlers = {
1290
1292
  );
1291
1293
  }
1292
1294
  graphDataRef.current[parentFileId] = specificParentData;
1295
+ if (isView && parentFileId === context.sceneConfigId) {
1296
+ sceneDataRef.current.quest_nodes = [...specificParentData.nodes];
1297
+ }
1293
1298
  const finalPosition = stateRef.current.ghostElements.node.position.clone();
1294
1299
  addNewNodeToScene(stateRef.current, newNode, newLink, finalPosition);
1295
1300
  setters.setSceneVersion((v) => v + 1);
@@ -2309,8 +2314,6 @@ var userActionHandlers = {
2309
2314
  milestones: sceneDataRef.current.milestones || [],
2310
2315
  quest_counter: sceneDataRef.current.quest_counter || 1
2311
2316
  };
2312
- sceneDataRef.current.quest_nodes = specificParentData.nodes;
2313
- sceneDataRef.current.quest_links = specificParentData.links;
2314
2317
  await context.actions.save_view_data(
2315
2318
  context.sceneSaveUrl,
2316
2319
  viewFilePayload
@@ -2323,6 +2326,10 @@ var userActionHandlers = {
2323
2326
  );
2324
2327
  }
2325
2328
  graphDataRef.current[parentFileId] = specificParentData;
2329
+ if (isView && parentFileId === context.sceneConfigId) {
2330
+ sceneDataRef.current.quest_nodes = [...specificParentData.nodes];
2331
+ sceneDataRef.current.quest_counter = specificParentData.quest_counter || sceneDataRef.current.quest_counter;
2332
+ }
2326
2333
  updateExistingNodeVisuals(stateRef.current, nodeToSave);
2327
2334
  setters.setSceneVersion((v) => v + 1);
2328
2335
  if (!keepOpen) {
@@ -12912,309 +12919,130 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
12912
12919
  }
12913
12920
 
12914
12921
  // src/components/AncestryBoard.jsx
12915
- var import_react30 = __toESM(require("react"));
12916
- var import_fi23 = require("react-icons/fi");
12917
- var import_uuid11 = require("uuid");
12918
-
12919
- // src/components/MentionEditor.jsx
12920
- var import_react28 = __toESM(require("react"));
12921
- var import_react29 = require("@tiptap/react");
12922
- var import_starter_kit = __toESM(require("@tiptap/starter-kit"));
12923
- var import_extension_mention = __toESM(require("@tiptap/extension-mention"));
12924
- var import_tippy = __toESM(require("tippy.js"));
12925
-
12926
- // src/components/MentionList.jsx
12927
12922
  var import_react27 = __toESM(require("react"));
12928
12923
  var import_fi22 = require("react-icons/fi");
12929
- var MentionList = (0, import_react27.forwardRef)((props, ref) => {
12930
- const [selectedIndex, setSelectedIndex] = (0, import_react27.useState)(0);
12931
- const selectItem = (index) => {
12932
- const item = props.items[index];
12933
- if (item) {
12934
- props.command({ id: item.id, label: item.name, type: item.type });
12935
- }
12936
- };
12937
- const upHandler = () => {
12938
- setSelectedIndex(
12939
- (selectedIndex + props.items.length - 1) % props.items.length
12940
- );
12941
- };
12942
- const downHandler = () => {
12943
- setSelectedIndex((selectedIndex + 1) % props.items.length);
12944
- };
12945
- const enterHandler = () => {
12946
- selectItem(selectedIndex);
12947
- };
12948
- (0, import_react27.useEffect)(() => setSelectedIndex(0), [props.items]);
12949
- (0, import_react27.useImperativeHandle)(ref, () => ({
12950
- onKeyDown: ({ event }) => {
12951
- if (event.key === "ArrowUp") {
12952
- upHandler();
12953
- return true;
12954
- }
12955
- if (event.key === "ArrowDown") {
12956
- downHandler();
12957
- return true;
12958
- }
12959
- if (event.key === "Enter") {
12960
- enterHandler();
12961
- return true;
12962
- }
12963
- return false;
12964
- }
12965
- }));
12966
- return /* @__PURE__ */ import_react27.default.createElement("div", { className: "z-[3000] bg-slate-900 border border-white/10 rounded-lg shadow-2xl overflow-hidden min-w-[280px] max-w-[400px] animate-in fade-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-2 border-b border-white/5 bg-slate-950/50 flex items-center gap-2" }, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiSearch, { className: "text-indigo-400", size: 14 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wider font-bold text-slate-500" }, "Mencionar Recurso")), /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-1 max-h-[300px] overflow-y-auto custom-scrollbar" }, props.items.length ? props.items.map((item, index) => {
12967
- const isQuest = item.type === "quest";
12968
- const isVersion = item.type === "version";
12969
- const isNode = item.type === "node";
12970
- let Icon = import_fi22.FiLayers;
12971
- let colorClass = "text-indigo-400";
12972
- let badgeText = "Ancestralidade";
12973
- if (isQuest) {
12974
- Icon = import_fi22.FiCheckSquare;
12975
- colorClass = "text-amber-400";
12976
- badgeText = "Quest";
12977
- } else if (isVersion) {
12978
- Icon = import_fi22.FiGitBranch;
12979
- colorClass = "text-purple-400";
12980
- badgeText = "Vers\xE3o";
12981
- } else if (isNode) {
12982
- Icon = import_fi22.FiBox;
12983
- colorClass = "text-emerald-400";
12984
- badgeText = "Node";
12985
- }
12986
- return /* @__PURE__ */ import_react27.default.createElement(
12987
- "button",
12988
- {
12989
- className: `
12990
- w-full flex items-center gap-3 px-3 py-2 text-left rounded-md transition-all
12991
- ${index === selectedIndex ? "bg-indigo-500/20 border border-indigo-500/30 text-white" : "text-slate-400 hover:bg-white/5 border border-transparent"}
12992
- `,
12993
- key: item.id,
12994
- onClick: () => selectItem(index)
12995
- },
12996
- /* @__PURE__ */ import_react27.default.createElement("div", { className: `shrink-0 w-8 h-8 rounded border border-white/5 flex items-center justify-center bg-slate-800/50 ${colorClass}` }, /* @__PURE__ */ import_react27.default.createElement(Icon, { size: 14 })),
12997
- /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-sm font-medium truncate" }, item.name), /* @__PURE__ */ import_react27.default.createElement("span", { className: `text-[9px] px-1 py-0.5 rounded border border-current opacity-60 ${colorClass}` }, badgeText)))
12998
- );
12999
- }) : /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-4 text-center text-slate-500 text-sm italic" }, "Nenhum resultado encontrado...")));
13000
- });
13001
- MentionList.displayName = "MentionList";
13002
- var MentionList_default = MentionList;
13003
-
13004
- // src/components/MentionEditor.jsx
13005
- var CustomMention = import_extension_mention.default.extend({
13006
- addAttributes() {
13007
- var _a;
13008
- return {
13009
- ...(_a = this.parent) == null ? void 0 : _a.call(this),
13010
- type: {
13011
- default: null,
13012
- parseHTML: (element) => element.getAttribute("data-mention-type"),
13013
- renderHTML: (attributes) => {
13014
- if (!attributes.type) {
13015
- return {};
13016
- }
13017
- return {
13018
- "data-mention-type": attributes.type
13019
- };
13020
- }
13021
- }
13022
- };
13023
- }
13024
- });
13025
- var MentionEditor = ({
13026
- initialValue = "",
13027
- onChange,
13028
- onPlay,
13029
- // Mantido para futura expansão se quisermos badges clicáveis reais no editor
13030
- availableItems = [],
13031
- canEdit = true,
13032
- placeholder = "Escreva algo... use @ para mencionar"
13033
- }) => {
13034
- const parseInitialContent = (text) => {
13035
- if (!text) return "<p></p>";
13036
- const parts = text.split(/(\[\[MENTION:[^\]]+\]\])/g);
13037
- return parts.map((part) => {
13038
- const match = part.match(/\[\[MENTION:([^:]+):([^:]+):([^\]]+)\]\]/);
13039
- if (match) {
13040
- const [, type, id, label] = match;
13041
- return `<span data-type="mention" data-id="${id}" data-mention-type="${type}" data-label="${label}">@${label}</span>`;
13042
- }
13043
- return part;
13044
- }).join("");
13045
- };
13046
- const content = (0, import_react28.useMemo)(() => parseInitialContent(initialValue), [initialValue]);
13047
- const editor = (0, import_react29.useEditor)({
13048
- extensions: [
13049
- import_starter_kit.default.configure({
13050
- heading: false,
13051
- bulletList: false,
13052
- orderedList: false,
13053
- codeBlock: false,
13054
- blockquote: false
13055
- }),
13056
- CustomMention.configure({
13057
- HTMLAttributes: {
13058
- class: "mention"
13059
- },
13060
- suggestion: {
13061
- items: ({ query }) => {
13062
- return availableItems.filter(
13063
- (item) => item.name.toLowerCase().includes(query.toLowerCase())
13064
- ).slice(0, 10);
13065
- },
13066
- render: () => {
13067
- let component;
13068
- let popup;
13069
- return {
13070
- onStart: (props) => {
13071
- component = new import_react29.ReactRenderer(MentionList_default, {
13072
- props,
13073
- editor: props.editor
13074
- });
13075
- if (!props.clientRect) {
13076
- return;
13077
- }
13078
- popup = (0, import_tippy.default)("body", {
13079
- getReferenceClientRect: props.clientRect,
13080
- appendTo: () => document.body,
13081
- content: component.element,
13082
- showOnCreate: true,
13083
- interactive: true,
13084
- trigger: "manual",
13085
- placement: "bottom-start"
13086
- });
13087
- },
13088
- onUpdate(props) {
13089
- component.updateProps(props);
13090
- if (!props.clientRect) {
13091
- return;
13092
- }
13093
- popup[0].setProps({
13094
- getReferenceClientRect: props.clientRect
13095
- });
13096
- },
13097
- onKeyDown(props) {
13098
- var _a;
13099
- if (props.event.key === "Escape") {
13100
- popup[0].hide();
13101
- return true;
13102
- }
13103
- return (_a = component == null ? void 0 : component.ref) == null ? void 0 : _a.onKeyDown(props);
13104
- },
13105
- onExit() {
13106
- if (popup && popup[0]) popup[0].destroy();
13107
- if (component) component.destroy();
13108
- }
13109
- };
13110
- }
13111
- }
13112
- })
13113
- ],
13114
- content,
13115
- editable: canEdit,
13116
- onUpdate: ({ editor: editor2 }) => {
13117
- const serialize = (json) => {
13118
- if (!json.content) return "";
13119
- return json.content.map((block) => {
13120
- if (block.type === "paragraph") {
13121
- const inner = block.content ? block.content.map((node) => {
13122
- if (node.type === "text") return node.text;
13123
- if (node.type === "mention") {
13124
- return `[[MENTION:${node.attrs.type}:${node.attrs.id}:${node.attrs.label}]]`;
13125
- }
13126
- return "";
13127
- }).join("") : "";
13128
- return inner;
13129
- }
13130
- return "";
13131
- }).join("\n").trim();
13132
- };
13133
- const serialized = serialize(editor2.getJSON());
13134
- onChange(serialized);
13135
- }
13136
- });
13137
- if (!editor) {
13138
- return null;
13139
- }
13140
- return /* @__PURE__ */ import_react28.default.createElement("div", { className: "relative group/editor min-h-[1.5rem] w-full" }, /* @__PURE__ */ import_react28.default.createElement(
13141
- import_react29.EditorContent,
13142
- {
13143
- editor,
13144
- className: "text-sm text-slate-200 placeholder-slate-600 focus:outline-none"
13145
- }
13146
- ), /* @__PURE__ */ import_react28.default.createElement("style", null, `
13147
- .tiptap p {
13148
- margin: 0;
13149
- min-height: 1.2em;
13150
- }
13151
- .tiptap .mention {
13152
- display: inline-flex;
13153
- align-items: center;
13154
- background-color: rgba(99, 102, 241, 0.15);
13155
- border: 1px solid rgba(99, 102, 241, 0.3);
13156
- border-radius: 4px;
13157
- padding: 0 4px;
13158
- color: #a5b4fc;
13159
- font-weight: 500;
13160
- cursor: pointer;
13161
- margin: 0 2px;
13162
- transition: all 0.2s;
13163
- }
13164
- .tiptap .mention:hover {
13165
- background-color: rgba(99, 102, 241, 0.25);
13166
- border-color: rgba(99, 102, 241, 0.5);
13167
- color: white;
13168
- }
13169
- .tiptap:focus {
13170
- outline: none;
13171
- }
13172
- `));
13173
- };
13174
- var MentionEditor_default = MentionEditor;
13175
-
13176
- // src/components/AncestryBoard.jsx
12924
+ var import_uuid11 = require("uuid");
13177
12925
  var GroupItem = ({
13178
12926
  group,
13179
12927
  index,
12928
+ siblings,
13180
12929
  onUpdate,
13181
12930
  onDelete,
13182
12931
  onAddSubgroup,
13183
12932
  onIndent,
13184
12933
  onOutdent,
12934
+ onRemoveAncestry,
12935
+ onRequestPickAncestry,
12936
+ pickingGroupId,
13185
12937
  onPlayAncestry,
13186
- availableMentionItems,
12938
+ availableIds,
13187
12939
  canEdit
13188
12940
  }) => {
13189
12941
  const canIndent = index > 0;
13190
- return /* @__PURE__ */ import_react30.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_react30.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react30.default.createElement(
12942
+ const isPickingForThisGroup = pickingGroupId === group.id;
12943
+ const textareaRef = (0, import_react27.useRef)(null);
12944
+ const adjustHeight = () => {
12945
+ const textarea = textareaRef.current;
12946
+ if (textarea) {
12947
+ textarea.style.height = "auto";
12948
+ textarea.style.height = `${textarea.scrollHeight}px`;
12949
+ }
12950
+ };
12951
+ (0, import_react27.useEffect)(() => {
12952
+ adjustHeight();
12953
+ }, [group.text]);
12954
+ 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(
13191
12955
  "div",
13192
12956
  {
13193
- className: "flex flex-col gap-2 py-2 px-3 transition-all duration-200 hover:bg-white/5 border-l-2 border-transparent hover:border-white/20"
12957
+ className: `
12958
+ flex flex-col gap-2 py-2 px-3 transition-all duration-200
12959
+ ${isPickingForThisGroup ? "bg-indigo-500/10 border-l-2 border-indigo-500" : "hover:bg-white/5 border-l-2 border-transparent hover:border-white/20"}
12960
+ `
13194
12961
  },
13195
- /* @__PURE__ */ import_react30.default.createElement(
13196
- MentionEditor_default,
12962
+ /* @__PURE__ */ import_react27.default.createElement(
12963
+ "textarea",
13197
12964
  {
13198
- initialValue: group.text,
13199
- onChange: (newText) => {
13200
- if (canEdit) onUpdate(group.id, { ...group, text: newText });
12965
+ ref: textareaRef,
12966
+ className: `w-full bg-transparent text-sm text-slate-200 placeholder-slate-600 resize-none focus:outline-none focus:placeholder-slate-500 overflow-y-auto ${!canEdit ? "cursor-default" : ""}`,
12967
+ rows: 1,
12968
+ style: {
12969
+ minHeight: "1.5rem",
12970
+ maxHeight: "250px"
13201
12971
  },
13202
- onPlay: onPlayAncestry,
13203
- availableItems: availableMentionItems,
13204
- canEdit,
13205
- placeholder: "Escreva sobre este grupo... use @ para mencionar"
12972
+ placeholder: canEdit ? "Escreva sobre este grupo..." : "",
12973
+ value: group.text,
12974
+ readOnly: !canEdit,
12975
+ onChange: (e) => {
12976
+ if (canEdit) onUpdate(group.id, { ...group, text: e.target.value });
12977
+ }
13206
12978
  }
13207
12979
  ),
13208
- canEdit && /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-0 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react30.default.createElement(
12980
+ group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-wrap gap-2 mt-1" }, group.ancestries.map((anc) => {
12981
+ const isValid = availableIds.has(String(anc.ancestry_id));
12982
+ return /* @__PURE__ */ import_react27.default.createElement(
12983
+ "div",
12984
+ {
12985
+ key: anc.ancestry_id,
12986
+ className: `
12987
+ flex items-center gap-2 rounded-md px-3 py-1.5 text-xs transition-all group/card border
12988
+ ${isValid ? "bg-slate-800/60 border-white/10 hover:border-indigo-500/30 text-slate-200" : "bg-red-900/10 border-red-500/30 text-red-300/70 hover:bg-red-900/20"}
12989
+ `,
12990
+ title: isValid ? "" : "Esta ancestralidade foi removida ou n\xE3o existe mais."
12991
+ },
12992
+ isValid ? /* @__PURE__ */ import_react27.default.createElement(
12993
+ "button",
12994
+ {
12995
+ onClick: () => onPlayAncestry(anc),
12996
+ className: "text-indigo-400 hover:text-white hover:bg-indigo-500 p-1 rounded-full transition-colors",
12997
+ title: "Focar no cen\xE1rio"
12998
+ },
12999
+ /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
13000
+ ) : /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-1 text-red-500 cursor-not-allowed" }, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiAlertTriangle, { size: 10 })),
13001
+ /* @__PURE__ */ import_react27.default.createElement(
13002
+ "div",
13003
+ {
13004
+ className: `flex items-center gap-1.5 font-medium truncate max-w-[180px] ${!isValid && "line-through decoration-red-500/50"}`
13005
+ },
13006
+ !isValid ? null : anc.type === "node" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiBox, { size: 10, className: "text-slate-400" }) : anc.type === "quest" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiCheckSquare, { size: 10, className: "text-emerald-400" }) : anc.type === "version" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiGitBranch, { size: 10, className: "text-amber-400" }) : /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiLayers, { size: 10, className: "text-indigo-400" }),
13007
+ anc.name
13008
+ ),
13009
+ canEdit && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(
13010
+ "div",
13011
+ {
13012
+ className: `w-px h-3 mx-0.5 ${isValid ? "bg-white/10" : "bg-red-500/20"}`
13013
+ }
13014
+ ), /* @__PURE__ */ import_react27.default.createElement(
13015
+ "button",
13016
+ {
13017
+ onClick: () => onRemoveAncestry(group.id, anc.ancestry_id),
13018
+ className: `${isValid ? "text-slate-500 hover:text-red-400" : "text-red-400 hover:text-red-200"} p-0.5 rounded transition-colors`,
13019
+ title: "Remover men\xE7\xE3o"
13020
+ },
13021
+ /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiX, { size: 12 })
13022
+ ))
13023
+ );
13024
+ })),
13025
+ 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(
13026
+ "button",
13027
+ {
13028
+ onClick: () => onRequestPickAncestry(group.id),
13029
+ className: `
13030
+ flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium transition-colors
13031
+ ${isPickingForThisGroup ? "text-indigo-300 animate-pulse" : "text-slate-500 hover:text-indigo-300 hover:bg-indigo-500/10"}
13032
+ `,
13033
+ title: "Adicionar Ancestralidade a este grupo"
13034
+ },
13035
+ isPickingForThisGroup ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiSearch, { size: 12 }),
13036
+ isPickingForThisGroup ? "Selecionando..." : "Adicionar"
13037
+ ), /* @__PURE__ */ import_react27.default.createElement(
13209
13038
  "button",
13210
13039
  {
13211
13040
  onClick: () => onAddSubgroup(group.id),
13212
- className: "flex items-center gap-1.5 px-3 py-1.5 text-xs text-slate-500 hover:text-white hover:bg-white/10 rounded-md transition-colors",
13041
+ className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
13213
13042
  title: "Criar Subgrupo"
13214
13043
  },
13215
- /* @__PURE__ */ import_react30.default.createElement(import_fi23.FiPlus, { size: 14 }),
13216
- /* @__PURE__ */ import_react30.default.createElement("span", null, "Adicionar Subgrupo")
13217
- )), /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react30.default.createElement(
13044
+ /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlus, { size: 14 })
13045
+ )), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react27.default.createElement(
13218
13046
  "button",
13219
13047
  {
13220
13048
  onClick: () => onIndent(group.id),
@@ -13222,25 +13050,25 @@ var GroupItem = ({
13222
13050
  className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
13223
13051
  title: "Aninhar no grupo acima"
13224
13052
  },
13225
- /* @__PURE__ */ import_react30.default.createElement(import_fi23.FiArrowRight, { size: 14 })
13226
- ), /* @__PURE__ */ import_react30.default.createElement(
13053
+ /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiArrowRight, { size: 14 })
13054
+ ), /* @__PURE__ */ import_react27.default.createElement(
13227
13055
  "button",
13228
13056
  {
13229
13057
  onClick: () => onOutdent(group.id),
13230
13058
  className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
13231
13059
  title: "Desaninhar"
13232
13060
  },
13233
- /* @__PURE__ */ import_react30.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
13234
- ), /* @__PURE__ */ import_react30.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react30.default.createElement(
13061
+ /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiArrowLeft, { size: 14 })
13062
+ ), /* @__PURE__ */ import_react27.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react27.default.createElement(
13235
13063
  "button",
13236
13064
  {
13237
13065
  onClick: () => onDelete(group.id),
13238
13066
  className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
13239
13067
  title: "Remover Grupo"
13240
13068
  },
13241
- /* @__PURE__ */ import_react30.default.createElement(import_fi23.FiTrash2, { size: 14 })
13069
+ /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiTrash2, { size: 14 })
13242
13070
  )))
13243
- ), group.children && group.children.length > 0 && /* @__PURE__ */ import_react30.default.createElement("div", { className: "ml-2" }, group.children.map((childGroup, idx) => /* @__PURE__ */ import_react30.default.createElement(
13071
+ ), 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(
13244
13072
  GroupItem,
13245
13073
  {
13246
13074
  key: childGroup.id,
@@ -13252,8 +13080,11 @@ var GroupItem = ({
13252
13080
  onAddSubgroup,
13253
13081
  onIndent,
13254
13082
  onOutdent,
13083
+ onRemoveAncestry,
13084
+ onRequestPickAncestry,
13085
+ pickingGroupId,
13255
13086
  onPlayAncestry,
13256
- availableMentionItems,
13087
+ availableIds,
13257
13088
  canEdit
13258
13089
  }
13259
13090
  ))));
@@ -13267,20 +13098,23 @@ function AncestryBoard({
13267
13098
  initialGroups = [],
13268
13099
  onSave,
13269
13100
  userRole
13101
+ // [NOVO] Recebe a role do usuário
13270
13102
  }) {
13271
- const [groups, setGroups] = (0, import_react30.useState)([]);
13272
- const [isLoaded, setIsLoaded] = (0, import_react30.useState)(false);
13273
- const [saveStatus, setSaveStatus] = (0, import_react30.useState)("idle");
13274
- const canEdit = (0, import_react30.useMemo)(() => {
13103
+ const [searchTerm, setSearchTerm] = (0, import_react27.useState)("");
13104
+ const [groups, setGroups] = (0, import_react27.useState)([]);
13105
+ const [isLoaded, setIsLoaded] = (0, import_react27.useState)(false);
13106
+ const [pickingGroupId, setPickingGroupId] = (0, import_react27.useState)(null);
13107
+ const [saveStatus, setSaveStatus] = (0, import_react27.useState)("idle");
13108
+ const canEdit = (0, import_react27.useMemo)(() => {
13275
13109
  return userRole !== "viewer";
13276
13110
  }, [userRole]);
13277
- (0, import_react30.useEffect)(() => {
13111
+ (0, import_react27.useEffect)(() => {
13278
13112
  if (initialGroups && !isLoaded) {
13279
13113
  setGroups(initialGroups);
13280
13114
  setIsLoaded(true);
13281
13115
  }
13282
13116
  }, [initialGroups, isLoaded]);
13283
- const nodeNamesMap = (0, import_react30.useMemo)(() => {
13117
+ const nodeNamesMap = (0, import_react27.useMemo)(() => {
13284
13118
  const map = /* @__PURE__ */ new Map();
13285
13119
  if (availableNodes && Array.isArray(availableNodes)) {
13286
13120
  availableNodes.forEach((node) => {
@@ -13291,41 +13125,52 @@ function AncestryBoard({
13291
13125
  }
13292
13126
  return map;
13293
13127
  }, [availableNodes]);
13294
- const availableIds = (0, import_react30.useMemo)(() => {
13295
- return new Set(availableAncestries.map((a) => String(a.ancestry_id)));
13296
- }, [availableAncestries]);
13297
- const availableMentionItems = (0, import_react30.useMemo)(() => {
13298
- const ancestries = availableAncestries.map((a) => ({
13299
- id: String(a.ancestry_id),
13300
- ancestry_id: a.ancestry_id,
13301
- name: a.name,
13302
- description: a.description,
13303
- type: "ancestry",
13304
- ancestral_node: a.ancestral_node,
13305
- is_private: a.is_private
13306
- }));
13307
- const nodes = availableNodes.map((n) => {
13128
+ const availableIds = (0, import_react27.useMemo)(() => {
13129
+ const ids = /* @__PURE__ */ new Set();
13130
+ availableAncestries.forEach((a) => ids.add(String(a.ancestry_id)));
13131
+ availableNodes.forEach((n) => ids.add(String(n.id)));
13132
+ return ids;
13133
+ }, [availableAncestries, availableNodes]);
13134
+ const allSearchableItems = (0, import_react27.useMemo)(() => {
13135
+ const items = [];
13136
+ availableAncestries.forEach((anc) => {
13137
+ items.push({
13138
+ ...anc,
13139
+ id: String(anc.ancestry_id),
13140
+ type: "ancestry",
13141
+ searchLabel: anc.name || "",
13142
+ searchDesc: anc.description || ""
13143
+ });
13144
+ });
13145
+ availableNodes.forEach((node) => {
13146
+ var _a;
13308
13147
  let type = "node";
13309
- if (n.is_quest) type = "quest";
13310
- else if (n.is_version) type = "version";
13311
- return {
13312
- id: String(n.id),
13313
- name: n.name,
13314
- description: n.description,
13148
+ if (node.is_quest) type = "quest";
13149
+ else if ((_a = node.version_node) == null ? void 0 : _a.is_version) type = "version";
13150
+ items.push({
13151
+ ...node,
13152
+ id: String(node.id),
13315
13153
  type,
13316
- raw_node: n
13317
- };
13154
+ searchLabel: node.name || node.raw_title || "",
13155
+ searchDesc: node.description || ""
13156
+ });
13318
13157
  });
13319
- return [...ancestries, ...nodes];
13158
+ return items;
13320
13159
  }, [availableAncestries, availableNodes]);
13321
13160
  const sanitizeGroups = (groupList) => {
13322
13161
  return groupList.map((g) => ({
13323
13162
  id: g.id,
13324
13163
  text: g.text || "",
13164
+ ancestries: (g.ancestries || []).map((a) => ({
13165
+ id: a.id || a.ancestry_id,
13166
+ ancestry_id: a.ancestry_id || a.id,
13167
+ name: a.name,
13168
+ type: a.type || "ancestry"
13169
+ })),
13325
13170
  children: sanitizeGroups(g.children || [])
13326
13171
  }));
13327
13172
  };
13328
- (0, import_react30.useEffect)(() => {
13173
+ (0, import_react27.useEffect)(() => {
13329
13174
  if (!isLoaded || !onSave) return;
13330
13175
  const timeoutId = setTimeout(async () => {
13331
13176
  setSaveStatus("saving");
@@ -13343,22 +13188,42 @@ function AncestryBoard({
13343
13188
  }, 3e3);
13344
13189
  return () => clearTimeout(timeoutId);
13345
13190
  }, [groups, isLoaded, onSave]);
13346
- (0, import_react30.useEffect)(() => {
13191
+ (0, import_react27.useEffect)(() => {
13347
13192
  if (!isOpen) return;
13348
13193
  const handleKeyDown = (e) => {
13349
13194
  if (e.key === "Escape") {
13350
- onClose();
13195
+ if (pickingGroupId) {
13196
+ setPickingGroupId(null);
13197
+ } else {
13198
+ onClose();
13199
+ }
13351
13200
  e.preventDefault();
13352
13201
  e.stopPropagation();
13353
13202
  }
13354
13203
  };
13355
13204
  window.addEventListener("keydown", handleKeyDown);
13356
13205
  return () => window.removeEventListener("keydown", handleKeyDown);
13357
- }, [isOpen, onClose]);
13206
+ }, [isOpen, onClose, pickingGroupId]);
13207
+ const filtered = (0, import_react27.useMemo)(() => {
13208
+ const term = searchTerm.toLowerCase().trim();
13209
+ return allSearchableItems.filter((item) => {
13210
+ var _a, _b;
13211
+ if (!term) return true;
13212
+ const labelMatch = (_a = item.searchLabel) == null ? void 0 : _a.toLowerCase().includes(term);
13213
+ const descMatch = (_b = item.searchDesc) == null ? void 0 : _b.toLowerCase().includes(term);
13214
+ let parentMatch = false;
13215
+ if (item.type === "ancestry") {
13216
+ const parentName = nodeNamesMap.get(String(item.ancestral_node)) || "";
13217
+ parentMatch = parentName.toLowerCase().includes(term);
13218
+ }
13219
+ return labelMatch || descMatch || parentMatch;
13220
+ });
13221
+ }, [allSearchableItems, searchTerm, nodeNamesMap]);
13358
13222
  const handleAddRootGroup = () => {
13359
13223
  const newGroup = {
13360
13224
  id: (0, import_uuid11.v4)(),
13361
13225
  text: "",
13226
+ ancestries: [],
13362
13227
  children: []
13363
13228
  };
13364
13229
  setGroups((prev) => [newGroup, ...prev]);
@@ -13367,6 +13232,7 @@ function AncestryBoard({
13367
13232
  const newGroup = {
13368
13233
  id: (0, import_uuid11.v4)(),
13369
13234
  text: "",
13235
+ ancestries: [],
13370
13236
  children: []
13371
13237
  };
13372
13238
  const addRecursive = (list) => {
@@ -13437,49 +13303,91 @@ function AncestryBoard({
13437
13303
  return newList;
13438
13304
  });
13439
13305
  };
13440
- const handlePlayFromGroup = (item) => {
13441
- let fullItem = item;
13442
- if (item.type === "ancestry" || !item.type) {
13443
- fullItem = availableAncestries.find(
13444
- (a) => String(a.ancestry_id) === String(item.id || item.ancestry_id)
13445
- ) || item;
13446
- } else {
13447
- fullItem = availableNodes.find(
13448
- (n) => String(n.id) === String(item.id)
13449
- ) || item;
13306
+ const handleRequestPick = (groupId) => {
13307
+ setPickingGroupId((prev) => prev === groupId ? null : groupId);
13308
+ };
13309
+ const handleSelectAncestry = (ancestry) => {
13310
+ if (pickingGroupId) {
13311
+ setGroups((prev) => {
13312
+ const addRecursive = (list) => {
13313
+ return list.map((g) => {
13314
+ if (g.id === pickingGroupId) {
13315
+ const exists = g.ancestries.some(
13316
+ (a) => String(a.id || a.ancestry_id) === String(ancestry.id)
13317
+ );
13318
+ if (exists) return g;
13319
+ return {
13320
+ ...g,
13321
+ ancestries: [
13322
+ ...g.ancestries,
13323
+ {
13324
+ id: ancestry.id,
13325
+ ancestry_id: ancestry.id,
13326
+ name: ancestry.searchLabel,
13327
+ type: ancestry.type
13328
+ }
13329
+ ]
13330
+ };
13331
+ }
13332
+ return { ...g, children: addRecursive(g.children) };
13333
+ });
13334
+ };
13335
+ return addRecursive(prev);
13336
+ });
13337
+ onSelect(ancestry);
13450
13338
  }
13451
- if (fullItem && onSelect) {
13452
- onSelect(fullItem);
13339
+ };
13340
+ const handlePlayFromGroup = (ancestry) => {
13341
+ if (ancestry && onSelect) {
13342
+ onSelect(ancestry);
13453
13343
  }
13454
13344
  };
13345
+ const handleRemoveAncestryFromGroup = (groupId, ancestryId) => {
13346
+ setGroups((prev) => {
13347
+ const removeRecursive = (list) => {
13348
+ return list.map((g) => {
13349
+ if (g.id === groupId) {
13350
+ return {
13351
+ ...g,
13352
+ ancestries: g.ancestries.filter(
13353
+ (a) => String(a.id || a.ancestry_id) !== String(ancestryId)
13354
+ )
13355
+ };
13356
+ }
13357
+ return { ...g, children: removeRecursive(g.children) };
13358
+ });
13359
+ };
13360
+ return removeRecursive(prev);
13361
+ });
13362
+ };
13455
13363
  if (!isOpen) return null;
13456
- return /* @__PURE__ */ import_react30.default.createElement(
13364
+ return /* @__PURE__ */ import_react27.default.createElement(
13457
13365
  "div",
13458
13366
  {
13459
13367
  className: "fixed inset-0 z-[2200] bg-black/80 backdrop-blur-sm flex items-center justify-center p-2",
13460
13368
  onClick: onClose
13461
13369
  },
13462
- /* @__PURE__ */ import_react30.default.createElement(
13370
+ /* @__PURE__ */ import_react27.default.createElement(
13463
13371
  "div",
13464
13372
  {
13465
- className: "bg-slate-950 border border-white/10 rounded-xl w-[90vw] max-w-[1200px] h-[90vh] flex flex-col shadow-2xl overflow-hidden animate-in fade-in zoom-in-95 duration-200",
13373
+ 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",
13466
13374
  onClick: (e) => e.stopPropagation()
13467
13375
  },
13468
- /* @__PURE__ */ import_react30.default.createElement("div", { className: "h-14 px-6 border-b border-white/10 bg-slate-900/90 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react30.default.createElement("h3", { className: "text-base font-semibold text-white flex items-center gap-2 whitespace-nowrap" }, /* @__PURE__ */ import_react30.default.createElement(import_fi23.FiLayers, { className: "text-indigo-400" }), "Ancestry Board"), saveStatus !== "idle" && /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react30.default.createElement("div", { className: "w-px h-4 bg-white/10 mx-1" }), /* @__PURE__ */ import_react30.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_react30.default.createElement(import_react30.default.Fragment, null, /* @__PURE__ */ import_react30.default.createElement(
13469
- import_fi23.FiLoader,
13376
+ /* @__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_fi22.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(
13377
+ import_fi22.FiLoader,
13470
13378
  {
13471
13379
  className: "animate-spin text-indigo-400",
13472
13380
  size: 12
13473
13381
  }
13474
- ), /* @__PURE__ */ import_react30.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-indigo-300" }, "Salvando")), saveStatus === "saved" && /* @__PURE__ */ import_react30.default.createElement(import_react30.default.Fragment, null, /* @__PURE__ */ import_react30.default.createElement(import_fi23.FiCheckCircle, { className: "text-emerald-400", size: 12 }), /* @__PURE__ */ import_react30.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-slate-400" }, "Salvo")), saveStatus === "error" && /* @__PURE__ */ import_react30.default.createElement(import_react30.default.Fragment, null, /* @__PURE__ */ import_react30.default.createElement("span", { className: "w-2 h-2 rounded-full bg-red-500" }), /* @__PURE__ */ import_react30.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-red-400" }, "Erro"))))), /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex items-center gap-3" }, canEdit && /* @__PURE__ */ import_react30.default.createElement(
13382
+ ), /* @__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_fi22.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(
13475
13383
  "button",
13476
13384
  {
13477
13385
  onClick: handleAddRootGroup,
13478
13386
  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 "
13479
13387
  },
13480
- /* @__PURE__ */ import_react30.default.createElement(import_fi23.FiPlus, { size: 14, className: "text-indigo-400" }),
13481
- /* @__PURE__ */ import_react30.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
13482
- ), /* @__PURE__ */ import_react30.default.createElement(
13388
+ /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlus, { size: 14, className: "text-indigo-400" }),
13389
+ /* @__PURE__ */ import_react27.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
13390
+ ), /* @__PURE__ */ import_react27.default.createElement(
13483
13391
  "button",
13484
13392
  {
13485
13393
  onClick: onClose,
@@ -13487,37 +13395,103 @@ function AncestryBoard({
13487
13395
  },
13488
13396
  "\xD7"
13489
13397
  ))),
13490
- /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex flex-1 overflow-hidden bg-slate-900/20" }, /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex flex-col flex-1" }, /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-8 max-w-[900px] mx-auto w-full space-y-6" }, groups.length === 0 ? /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-4 border-2 border-dashed border-white/5 rounded-2xl bg-slate-900/40 p-12" }, /* @__PURE__ */ import_react30.default.createElement(import_fi23.FiLayers, { size: 40, className: "opacity-10 text-indigo-400" }), /* @__PURE__ */ import_react30.default.createElement("div", { className: "text-center space-y-1" }, /* @__PURE__ */ import_react30.default.createElement("p", { className: "text-sm font-medium text-slate-300" }, "Nenhum grupo criado"), /* @__PURE__ */ import_react30.default.createElement("p", { className: "text-xs text-slate-500 max-w-[200px]" }, canEdit ? "Comece organizando sua narrativa criando o primeiro grupo." : "Este board ainda n\xE3o possui conte\xFAdo.")), canEdit && /* @__PURE__ */ import_react30.default.createElement(
13491
- "button",
13398
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react27.default.createElement(
13399
+ "div",
13492
13400
  {
13493
- onClick: handleAddRootGroup,
13494
- className: "mt-2 px-4 py-2 bg-indigo-500/10 hover:bg-indigo-500/20 text-indigo-400 rounded-lg border border-indigo-500/20 transition-all text-xs font-bold uppercase tracking-wider"
13401
+ className: `
13402
+ flex flex-col border-r border-white/10 transition-all duration-300 flex-none
13403
+ ${pickingGroupId ? "w-[25%] border-indigo-500/30" : "w-[20%]"}
13404
+ min-w-[280px] max-w-[500px] bg-slate-900
13405
+ `
13495
13406
  },
13496
- "Criar Primeiro Grupo"
13497
- )) : groups.map((group, index) => /* @__PURE__ */ import_react30.default.createElement(
13407
+ /* @__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(
13408
+ import_fi22.FiSearch,
13409
+ {
13410
+ 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"}`
13411
+ }
13412
+ ), /* @__PURE__ */ import_react27.default.createElement(
13413
+ "input",
13414
+ {
13415
+ type: "text",
13416
+ placeholder: pickingGroupId ? "Pesquise nodes ou ancestralidades..." : "Pesquisar no board...",
13417
+ className: `
13418
+ w-full rounded-md pl-9 pr-4 py-2 text-sm transition-all focus:outline-none focus:ring-1 focus:ring-indigo-500 border
13419
+ ${pickingGroupId ? "bg-indigo-950/30 border-indigo-500/30 text-white placeholder-indigo-300/50" : "bg-slate-950 border-white/10 text-slate-200 placeholder-slate-600"}
13420
+ `,
13421
+ value: searchTerm,
13422
+ onChange: (e) => setSearchTerm(e.target.value),
13423
+ autoFocus: !pickingGroupId
13424
+ }
13425
+ ))),
13426
+ /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
13427
+ const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
13428
+ const isPicking = !!pickingGroupId;
13429
+ return /* @__PURE__ */ import_react27.default.createElement(
13430
+ "div",
13431
+ {
13432
+ key: anc.id,
13433
+ onClick: () => {
13434
+ if (isPicking) handleSelectAncestry(anc);
13435
+ },
13436
+ className: `
13437
+ group relative flex items-start gap-3 p-3 text-left rounded-lg border transition-all duration-200
13438
+ ${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"}
13439
+ `
13440
+ },
13441
+ /* @__PURE__ */ import_react27.default.createElement(
13442
+ "div",
13443
+ {
13444
+ className: `
13445
+ mt-0.5 w-8 h-8 rounded-md grid place-content-center shrink-0 border transition-all shadow-lg
13446
+ ${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"}
13447
+ ${anc.type === "quest" ? "text-emerald-400" : anc.type === "version" ? "text-amber-400" : anc.type === "node" ? "text-slate-400" : "text-indigo-400"}
13448
+ `
13449
+ },
13450
+ isPicking ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlus, { size: 16 }) : anc.type === "quest" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiCheckSquare, { size: 14 }) : anc.type === "version" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiGitBranch, { size: 14 }) : anc.type === "node" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiBox, { size: 14 }) : /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiLayers, { size: 14 })
13451
+ ),
13452
+ /* @__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.searchLabel || "Sem Nome"), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[9px] px-1.5 py-0.5 rounded-full bg-white/5 text-slate-500 border border-white/5 uppercase tracking-tighter" }, anc.type)), anc.type === "ancestry" && /* @__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_fi22.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.searchDesc && /* @__PURE__ */ import_react27.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.searchDesc)),
13453
+ !isPicking && /* @__PURE__ */ import_react27.default.createElement(
13454
+ "button",
13455
+ {
13456
+ onClick: (e) => {
13457
+ e.stopPropagation();
13458
+ handleSelectAncestry(anc);
13459
+ },
13460
+ 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",
13461
+ title: "Focar no cen\xE1rio"
13462
+ },
13463
+ /* @__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_fi22.FiPlay, { size: 14, className: "ml-0.5" }))
13464
+ )
13465
+ );
13466
+ }))
13467
+ ), /* @__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_fi22.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(
13498
13468
  GroupItem,
13499
13469
  {
13500
13470
  key: group.id,
13501
13471
  index,
13502
13472
  group,
13473
+ siblings: groups,
13503
13474
  onUpdate: handleUpdateGroup,
13504
13475
  onDelete: handleDeleteGroup,
13505
13476
  onAddSubgroup: handleAddSubgroup,
13506
13477
  onIndent: handleIndent,
13507
13478
  onOutdent: handleOutdent,
13479
+ onRemoveAncestry: handleRemoveAncestryFromGroup,
13480
+ onRequestPickAncestry: handleRequestPick,
13481
+ pickingGroupId,
13508
13482
  onPlayAncestry: handlePlayFromGroup,
13509
- availableMentionItems,
13483
+ availableIds,
13510
13484
  canEdit
13511
13485
  }
13512
13486
  ))))),
13513
- /* @__PURE__ */ import_react30.default.createElement("div", { className: "px-6 py-3 border-t border-white/10 bg-slate-950/50 text-[10px] uppercase tracking-widest font-bold text-slate-600 flex justify-between items-center flex-shrink-0" }, /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react30.default.createElement("span", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react30.default.createElement("div", { className: "w-1.5 h-1.5 rounded-full bg-indigo-500" }), " ", availableMentionItems.length, " RECURSOS DISPON\xCDVEIS"), /* @__PURE__ */ import_react30.default.createElement("span", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react30.default.createElement("div", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500" }), " ", groups.length, " GRUPOS PRINCIPAIS")), /* @__PURE__ */ import_react30.default.createElement("span", { className: "text-slate-700" }, "X.VIEW :: ANCESTRY BOARD ENGINE"))
13487
+ /* @__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"))
13514
13488
  )
13515
13489
  );
13516
13490
  }
13517
13491
 
13518
13492
  // src/components/MilestoneManager.jsx
13519
- var import_react31 = __toESM(require("react"));
13520
- var import_fi24 = require("react-icons/fi");
13493
+ var import_react28 = __toESM(require("react"));
13494
+ var import_fi23 = require("react-icons/fi");
13521
13495
  function MilestoneManager({
13522
13496
  isOpen,
13523
13497
  onClose,
@@ -13525,7 +13499,7 @@ function MilestoneManager({
13525
13499
  onUpdateMilestones = () => {
13526
13500
  }
13527
13501
  }) {
13528
- const [newMilestoneName, setNewMilestoneName] = (0, import_react31.useState)("");
13502
+ const [newMilestoneName, setNewMilestoneName] = (0, import_react28.useState)("");
13529
13503
  const handleAddMilestone = () => {
13530
13504
  if (!newMilestoneName.trim()) return;
13531
13505
  const newMilestone = {
@@ -13550,27 +13524,27 @@ function MilestoneManager({
13550
13524
  };
13551
13525
  if (!isOpen) return null;
13552
13526
  const swallow = (e) => e.stopPropagation();
13553
- return /* @__PURE__ */ import_react31.default.createElement(
13527
+ return /* @__PURE__ */ import_react28.default.createElement(
13554
13528
  "div",
13555
13529
  {
13556
13530
  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",
13557
13531
  onClick: onClose
13558
13532
  },
13559
- /* @__PURE__ */ import_react31.default.createElement(
13533
+ /* @__PURE__ */ import_react28.default.createElement(
13560
13534
  "div",
13561
13535
  {
13562
13536
  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",
13563
13537
  onClick: swallow
13564
13538
  },
13565
- /* @__PURE__ */ import_react31.default.createElement("div", { className: "px-6 py-4 border-b border-white/10 flex items-center justify-between" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "p-2 rounded-lg bg-indigo-500/20 text-indigo-400" }, /* @__PURE__ */ import_react31.default.createElement(import_fi24.FiTarget, { size: 20 })), /* @__PURE__ */ import_react31.default.createElement("div", null, /* @__PURE__ */ import_react31.default.createElement("h2", { className: "text-lg font-semibold text-slate-100" }, "Milestones"), /* @__PURE__ */ import_react31.default.createElement("p", { className: "text-xs text-slate-400" }, "Gerencie os marcos do seu cen\xE1rio"))), /* @__PURE__ */ import_react31.default.createElement(
13539
+ /* @__PURE__ */ import_react28.default.createElement("div", { className: "px-6 py-4 border-b border-white/10 flex items-center justify-between" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "p-2 rounded-lg bg-indigo-500/20 text-indigo-400" }, /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiTarget, { size: 20 })), /* @__PURE__ */ import_react28.default.createElement("div", null, /* @__PURE__ */ import_react28.default.createElement("h2", { className: "text-lg font-semibold text-slate-100" }, "Milestones"), /* @__PURE__ */ import_react28.default.createElement("p", { className: "text-xs text-slate-400" }, "Gerencie os marcos do seu cen\xE1rio"))), /* @__PURE__ */ import_react28.default.createElement(
13566
13540
  "button",
13567
13541
  {
13568
13542
  onClick: onClose,
13569
13543
  className: "p-2 rounded-full hover:bg-white/10 text-slate-400 hover:text-white transition-colors"
13570
13544
  },
13571
- /* @__PURE__ */ import_react31.default.createElement(import_fi24.FiX, { size: 20 })
13545
+ /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiX, { size: 20 })
13572
13546
  )),
13573
- /* @__PURE__ */ import_react31.default.createElement("div", { className: "px-6 py-5 bg-white/5 border-b border-white/5" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ import_react31.default.createElement(
13547
+ /* @__PURE__ */ import_react28.default.createElement("div", { className: "px-6 py-5 bg-white/5 border-b border-white/5" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ import_react28.default.createElement(
13574
13548
  "input",
13575
13549
  {
13576
13550
  type: "text",
@@ -13580,47 +13554,47 @@ function MilestoneManager({
13580
13554
  placeholder: "Adicionar novo milestone...",
13581
13555
  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"
13582
13556
  }
13583
- ), /* @__PURE__ */ import_react31.default.createElement(
13557
+ ), /* @__PURE__ */ import_react28.default.createElement(
13584
13558
  "button",
13585
13559
  {
13586
13560
  onClick: handleAddMilestone,
13587
13561
  disabled: !newMilestoneName.trim(),
13588
13562
  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"
13589
13563
  },
13590
- /* @__PURE__ */ import_react31.default.createElement(import_fi24.FiPlus, { size: 18 }),
13564
+ /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiPlus, { size: 18 }),
13591
13565
  "Adicionar"
13592
13566
  ))),
13593
- /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex-1 overflow-y-auto px-6 py-4 custom-scrollbar" }, milestones.length > 0 ? /* @__PURE__ */ import_react31.default.createElement("div", { className: "space-y-3" }, milestones.map((ms) => /* @__PURE__ */ import_react31.default.createElement(
13567
+ /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex-1 overflow-y-auto px-6 py-4 custom-scrollbar" }, milestones.length > 0 ? /* @__PURE__ */ import_react28.default.createElement("div", { className: "space-y-3" }, milestones.map((ms) => /* @__PURE__ */ import_react28.default.createElement(
13594
13568
  "div",
13595
13569
  {
13596
13570
  key: ms.id,
13597
13571
  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]"}`
13598
13572
  },
13599
- /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react31.default.createElement(
13573
+ /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react28.default.createElement(
13600
13574
  "div",
13601
13575
  {
13602
13576
  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"}`
13603
13577
  }
13604
- ), /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react31.default.createElement("span", { className: `text-sm font-medium truncate ${ms.status === "active" ? "text-slate-100" : "text-slate-400 line-through"}` }, ms.name), /* @__PURE__ */ import_react31.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-wider" }, ms.status === "active" ? "Ativo" : "Inativo"))),
13605
- /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react31.default.createElement(
13578
+ ), /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react28.default.createElement("span", { className: `text-sm font-medium truncate ${ms.status === "active" ? "text-slate-100" : "text-slate-400 line-through"}` }, ms.name), /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-wider" }, ms.status === "active" ? "Ativo" : "Inativo"))),
13579
+ /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react28.default.createElement(
13606
13580
  "button",
13607
13581
  {
13608
13582
  onClick: () => handleToggleMilestoneStatus(ms.id),
13609
13583
  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"}`,
13610
13584
  title: ms.status === "active" ? "Inativar" : "Ativar"
13611
13585
  },
13612
- ms.status === "active" ? /* @__PURE__ */ import_react31.default.createElement(import_fi24.FiPauseCircle, { size: 18 }) : /* @__PURE__ */ import_react31.default.createElement(import_fi24.FiPlayCircle, { size: 18 })
13613
- ), /* @__PURE__ */ import_react31.default.createElement(
13586
+ ms.status === "active" ? /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiPauseCircle, { size: 18 }) : /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiPlayCircle, { size: 18 })
13587
+ ), /* @__PURE__ */ import_react28.default.createElement(
13614
13588
  "button",
13615
13589
  {
13616
13590
  onClick: () => handleRemoveMilestone(ms.id),
13617
13591
  className: "p-2 rounded-lg hover:bg-red-500/20 text-slate-500 hover:text-red-400 transition-all",
13618
13592
  title: "Remover"
13619
13593
  },
13620
- /* @__PURE__ */ import_react31.default.createElement(import_fi24.FiTrash2, { size: 18 })
13594
+ /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiTrash2, { size: 18 })
13621
13595
  ))
13622
- ))) : /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex flex-col items-center justify-center py-12 text-center" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "p-4 rounded-full bg-slate-800/30 text-slate-600 mb-4" }, /* @__PURE__ */ import_react31.default.createElement(import_fi24.FiTarget, { size: 40 })), /* @__PURE__ */ import_react31.default.createElement("h3", { className: "text-slate-400 font-medium" }, "Nenhum milestone definido"), /* @__PURE__ */ import_react31.default.createElement("p", { className: "text-xs text-slate-600 max-w-[200px] mt-1 italic" }, "Defina marcos importantes para orientar o progresso do projeto."))),
13623
- /* @__PURE__ */ import_react31.default.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__ */ import_react31.default.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react31.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-widest" }, "Total:"), /* @__PURE__ */ import_react31.default.createElement("span", { className: "text-xs font-bold text-slate-300" }, milestones.length)), /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react31.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-widest" }, "Ativos:"), /* @__PURE__ */ import_react31.default.createElement("span", { className: "text-xs font-bold text-indigo-400" }, milestones.filter((m) => m.status === "active").length))))
13596
+ ))) : /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col items-center justify-center py-12 text-center" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "p-4 rounded-full bg-slate-800/30 text-slate-600 mb-4" }, /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiTarget, { size: 40 })), /* @__PURE__ */ import_react28.default.createElement("h3", { className: "text-slate-400 font-medium" }, "Nenhum milestone definido"), /* @__PURE__ */ import_react28.default.createElement("p", { className: "text-xs text-slate-600 max-w-[200px] mt-1 italic" }, "Defina marcos importantes para orientar o progresso do projeto."))),
13597
+ /* @__PURE__ */ import_react28.default.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__ */ import_react28.default.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-widest" }, "Total:"), /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-xs font-bold text-slate-300" }, milestones.length)), /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-widest" }, "Ativos:"), /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-xs font-bold text-indigo-400" }, milestones.filter((m) => m.status === "active").length))))
13624
13598
  )
13625
13599
  );
13626
13600
  }
@@ -13706,13 +13680,13 @@ function XViewScene({
13706
13680
  check_user_permission,
13707
13681
  get_view_members
13708
13682
  }) {
13709
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
13710
- const { data: session, status } = (0, import_react33.useSession)();
13683
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
13684
+ const { data: session, status } = (0, import_react30.useSession)();
13711
13685
  const router = (0, import_navigation.useRouter)();
13712
13686
  const searchParams = (0, import_navigation.useSearchParams)();
13713
13687
  const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
13714
13688
  const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
13715
- const viewParams = (0, import_react32.useMemo)(() => {
13689
+ const viewParams = (0, import_react29.useMemo)(() => {
13716
13690
  if (encryptedConfig) {
13717
13691
  const data = decryptData(encryptedConfig);
13718
13692
  if (data) {
@@ -13721,7 +13695,7 @@ function XViewScene({
13721
13695
  }
13722
13696
  return null;
13723
13697
  }, [encryptedConfig, session]);
13724
- (0, import_react32.useEffect)(() => {
13698
+ (0, import_react29.useEffect)(() => {
13725
13699
  async function verifyPermission() {
13726
13700
  if (!viewParams || !session || !check_user_permission) return;
13727
13701
  const { id, type, owner_id } = viewParams;
@@ -13758,65 +13732,65 @@ function XViewScene({
13758
13732
  setIsLoading(false);
13759
13733
  }
13760
13734
  }, [viewParams, session, status, check_user_permission]);
13761
- const sceneConfigId = (0, import_react32.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
13762
- const ownerId = (0, import_react32.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
13763
- const dbSaveUrl = (0, import_react32.useMemo)(() => {
13735
+ const sceneConfigId = (0, import_react29.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
13736
+ const ownerId = (0, import_react29.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
13737
+ const dbSaveUrl = (0, import_react29.useMemo)(() => {
13764
13738
  if (ownerId && sceneConfigId) {
13765
13739
  return `x_view_dbs/${ownerId}/${sceneConfigId}`;
13766
13740
  }
13767
13741
  return null;
13768
13742
  }, [ownerId, sceneConfigId]);
13769
- const sceneSaveUrl = (0, import_react32.useMemo)(() => {
13743
+ const sceneSaveUrl = (0, import_react29.useMemo)(() => {
13770
13744
  if (ownerId && sceneConfigId) {
13771
13745
  return `x_view_scenes/${ownerId}/${sceneConfigId}`;
13772
13746
  }
13773
13747
  return null;
13774
13748
  }, [ownerId, sceneConfigId]);
13775
- const ancestry_save_url = (0, import_react32.useMemo)(() => {
13749
+ const ancestry_save_url = (0, import_react29.useMemo)(() => {
13776
13750
  if (ownerId && sceneConfigId) {
13777
13751
  return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
13778
13752
  }
13779
13753
  return null;
13780
13754
  }, [ownerId, sceneConfigId]);
13781
- const sceneDataRef = (0, import_react32.useRef)(null);
13782
- const parentDataRef = (0, import_react32.useRef)(null);
13783
- const ancestryDataRef = (0, import_react32.useRef)(null);
13784
- const [isLoading, setIsLoading] = (0, import_react32.useState)(true);
13785
- const [permissionStatus, setPermissionStatus] = (0, import_react32.useState)("loading");
13786
- const [userPermissionRole, setUserPermissionRole] = (0, import_react32.useState)(null);
13787
- const [viewMembers, setViewMembers] = (0, import_react32.useState)([]);
13788
- const [isInitialized, setIsInitialized] = (0, import_react32.useState)(false);
13789
- const [sceneVersion, setSceneVersion] = (0, import_react32.useState)(0);
13790
- const [contextMenu, setContextMenu] = (0, import_react32.useState)({
13755
+ const sceneDataRef = (0, import_react29.useRef)(null);
13756
+ const parentDataRef = (0, import_react29.useRef)(null);
13757
+ const ancestryDataRef = (0, import_react29.useRef)(null);
13758
+ const [isLoading, setIsLoading] = (0, import_react29.useState)(true);
13759
+ const [permissionStatus, setPermissionStatus] = (0, import_react29.useState)("loading");
13760
+ const [userPermissionRole, setUserPermissionRole] = (0, import_react29.useState)(null);
13761
+ const [viewMembers, setViewMembers] = (0, import_react29.useState)([]);
13762
+ const [isInitialized, setIsInitialized] = (0, import_react29.useState)(false);
13763
+ const [sceneVersion, setSceneVersion] = (0, import_react29.useState)(0);
13764
+ const [contextMenu, setContextMenu] = (0, import_react29.useState)({
13791
13765
  visible: false,
13792
13766
  x: 0,
13793
13767
  y: 0,
13794
13768
  nodeData: null
13795
13769
  });
13796
- const [multiContextMenu, setMultiContextMenu] = (0, import_react32.useState)({
13770
+ const [multiContextMenu, setMultiContextMenu] = (0, import_react29.useState)({
13797
13771
  visible: false,
13798
13772
  x: 0,
13799
13773
  y: 0,
13800
13774
  nodeIds: null
13801
13775
  });
13802
- const [relationshipMenu, setRelationshipMenu] = (0, import_react32.useState)({
13776
+ const [relationshipMenu, setRelationshipMenu] = (0, import_react29.useState)({
13803
13777
  visible: false,
13804
13778
  x: 0,
13805
13779
  y: 0,
13806
13780
  linkObject: null
13807
13781
  });
13808
- const [creationMode, setCreationMode] = (0, import_react32.useState)({
13782
+ const [creationMode, setCreationMode] = (0, import_react29.useState)({
13809
13783
  isActive: false,
13810
13784
  sourceNodeData: null
13811
13785
  });
13812
- const [versionMode, setVersionMode] = (0, import_react32.useState)({
13786
+ const [versionMode, setVersionMode] = (0, import_react29.useState)({
13813
13787
  isActive: false,
13814
13788
  sourceNodeData: null
13815
13789
  });
13816
- const [questMode, setQuestMode] = (0, import_react32.useState)({ isActive: false });
13817
- const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react32.useState)(false);
13818
- const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react32.useState)(false);
13819
- const [ancestryMode, setAncestryMode] = (0, import_react32.useState)({
13790
+ const [questMode, setQuestMode] = (0, import_react29.useState)({ isActive: false });
13791
+ const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react29.useState)(false);
13792
+ const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react29.useState)(false);
13793
+ const [ancestryMode, setAncestryMode] = (0, import_react29.useState)({
13820
13794
  isActive: false,
13821
13795
  tree: null,
13822
13796
  selectedParentId: null,
@@ -13827,42 +13801,42 @@ function XViewScene({
13827
13801
  ancestryDescriptionSections: [],
13828
13802
  isAddingNodes: false
13829
13803
  });
13830
- const [readingMode, setReadingMode] = (0, import_react32.useState)({
13804
+ const [readingMode, setReadingMode] = (0, import_react29.useState)({
13831
13805
  isActive: false,
13832
13806
  ancestry: null,
13833
13807
  branchStack: [],
13834
13808
  autoAbstraction: false
13835
13809
  });
13836
- const [formPosition, setFormPosition] = (0, import_react32.useState)({
13810
+ const [formPosition, setFormPosition] = (0, import_react29.useState)({
13837
13811
  left: 16,
13838
13812
  top: 16,
13839
13813
  opacity: 0
13840
13814
  });
13841
- const [detailsNode, setDetailsNode] = (0, import_react32.useState)(null);
13842
- const [detailsLink, setDetailsLink] = (0, import_react32.useState)(null);
13843
- const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react32.useState)(null);
13844
- const [imageViewer, setImageViewer] = (0, import_react32.useState)({
13815
+ const [detailsNode, setDetailsNode] = (0, import_react29.useState)(null);
13816
+ const [detailsLink, setDetailsLink] = (0, import_react29.useState)(null);
13817
+ const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react29.useState)(null);
13818
+ const [imageViewer, setImageViewer] = (0, import_react29.useState)({
13845
13819
  visible: false,
13846
13820
  images: [],
13847
13821
  startIndex: 0
13848
13822
  });
13849
- const [editingAncestryRel, setEditingAncestryRel] = (0, import_react32.useState)({
13823
+ const [editingAncestryRel, setEditingAncestryRel] = (0, import_react29.useState)({
13850
13824
  visible: false,
13851
13825
  data: null,
13852
13826
  path: null
13853
13827
  });
13854
- const [isImportModalOpen, setIsImportModalOpen] = (0, import_react32.useState)(false);
13855
- const [importSuccessMessage, setImportSuccessMessage] = (0, import_react32.useState)("");
13856
- const [invalidTargetError, setInvalidTargetError] = (0, import_react32.useState)(null);
13857
- const [highlightedNodeId, setHighlightedNodeId] = (0, import_react32.useState)(null);
13858
- const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react32.useState)(false);
13859
- const [ancestryBoardData, setAncestryBoardData] = (0, import_react32.useState)([]);
13860
- const [isSidebarOpen, setIsSidebarOpen] = (0, import_react32.useState)(false);
13861
- const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = (0, import_react32.useState)(false);
13862
- const mountRef = (0, import_react32.useRef)(null);
13863
- const tooltipRef = (0, import_react32.useRef)(null);
13864
- const formRef = (0, import_react32.useRef)(null);
13865
- const stateRef = (0, import_react32.useRef)({
13828
+ const [isImportModalOpen, setIsImportModalOpen] = (0, import_react29.useState)(false);
13829
+ const [importSuccessMessage, setImportSuccessMessage] = (0, import_react29.useState)("");
13830
+ const [invalidTargetError, setInvalidTargetError] = (0, import_react29.useState)(null);
13831
+ const [highlightedNodeId, setHighlightedNodeId] = (0, import_react29.useState)(null);
13832
+ const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react29.useState)(false);
13833
+ const [ancestryBoardData, setAncestryBoardData] = (0, import_react29.useState)([]);
13834
+ const [isSidebarOpen, setIsSidebarOpen] = (0, import_react29.useState)(false);
13835
+ const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = (0, import_react29.useState)(false);
13836
+ const mountRef = (0, import_react29.useRef)(null);
13837
+ const tooltipRef = (0, import_react29.useRef)(null);
13838
+ const formRef = (0, import_react29.useRef)(null);
13839
+ const stateRef = (0, import_react29.useRef)({
13866
13840
  readMode: {
13867
13841
  currentMaxIndex: 0,
13868
13842
  progressMap: {}
@@ -13926,10 +13900,10 @@ function XViewScene({
13926
13900
  minWidth: 320,
13927
13901
  maxWidth: maxReadPanelW
13928
13902
  });
13929
- (0, import_react32.useEffect)(() => {
13903
+ (0, import_react29.useEffect)(() => {
13930
13904
  stateRef.current.ancestry = ancestryMode;
13931
13905
  }, [ancestryMode]);
13932
- (0, import_react32.useEffect)(() => {
13906
+ (0, import_react29.useEffect)(() => {
13933
13907
  var _a2;
13934
13908
  if (!isInitialized) return;
13935
13909
  const map = /* @__PURE__ */ new Map();
@@ -13952,10 +13926,10 @@ function XViewScene({
13952
13926
  }
13953
13927
  stateRef.current.nodeIdToParentFileMap = map;
13954
13928
  }, [isInitialized, sceneVersion]);
13955
- const handleNavigateBack = (0, import_react32.useCallback)(() => {
13929
+ const handleNavigateBack = (0, import_react29.useCallback)(() => {
13956
13930
  router.push("/dashboard/scenes");
13957
13931
  }, [router]);
13958
- const handleConfirmImport = (0, import_react32.useCallback)(
13932
+ const handleConfirmImport = (0, import_react29.useCallback)(
13959
13933
  async (importPayload) => {
13960
13934
  var _a2, _b2;
13961
13935
  let files = [];
@@ -14083,7 +14057,7 @@ function XViewScene({
14083
14057
  const handleOpenImageViewer = (images, startIndex) => {
14084
14058
  setImageViewer({ visible: true, images, startIndex });
14085
14059
  };
14086
- const tweenToTarget = (0, import_react32.useCallback)(
14060
+ const tweenToTarget = (0, import_react29.useCallback)(
14087
14061
  (target, zoomFactor = 1, forcedDirection = null) => {
14088
14062
  const { camera, controls, tweenGroup } = stateRef.current;
14089
14063
  if (!camera || !controls || !tweenGroup) return;
@@ -14109,7 +14083,7 @@ function XViewScene({
14109
14083
  if (!t || typeof t.closest !== "function") return false;
14110
14084
  return !!t.closest(".ui-overlay");
14111
14085
  };
14112
- const buildFullAncestryTree = (0, import_react32.useCallback)(
14086
+ const buildFullAncestryTree = (0, import_react29.useCallback)(
14113
14087
  (idTree, nodes, ancestries = []) => {
14114
14088
  if (!idTree) return null;
14115
14089
  const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
@@ -14194,7 +14168,7 @@ function XViewScene({
14194
14168
  },
14195
14169
  []
14196
14170
  );
14197
- const handleActivateTimeline = (0, import_react32.useCallback)(() => {
14171
+ const handleActivateTimeline = (0, import_react29.useCallback)(() => {
14198
14172
  const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
14199
14173
  if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
14200
14174
  while (timelineIntervalsGroup.children.length > 0) {
@@ -14354,7 +14328,7 @@ function XViewScene({
14354
14328
  }
14355
14329
  });
14356
14330
  }, []);
14357
- const handleVersionTimeline = (0, import_react32.useCallback)((sourceMesh, versionMeshes) => {
14331
+ const handleVersionTimeline = (0, import_react29.useCallback)((sourceMesh, versionMeshes) => {
14358
14332
  const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
14359
14333
  if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
14360
14334
  return;
@@ -14491,7 +14465,7 @@ function XViewScene({
14491
14465
  }
14492
14466
  });
14493
14467
  }, []);
14494
- (0, import_react32.useEffect)(() => {
14468
+ (0, import_react29.useEffect)(() => {
14495
14469
  async function fetchAllData(configPath, ownerId2) {
14496
14470
  var _a2, _b2;
14497
14471
  if (!get_scene_view_data) {
@@ -14596,12 +14570,12 @@ function XViewScene({
14596
14570
  focusNodeId,
14597
14571
  focusAncestryId
14598
14572
  ]);
14599
- const isNodeInView = (0, import_react32.useCallback)((id) => {
14573
+ const isNodeInView = (0, import_react29.useCallback)((id) => {
14600
14574
  const key = String(id);
14601
14575
  const objs = stateRef.current.nodeObjects || {};
14602
14576
  return !!objs[key];
14603
14577
  }, []);
14604
- const addOrUpdateNodeMesh = (0, import_react32.useCallback)(
14578
+ const addOrUpdateNodeMesh = (0, import_react29.useCallback)(
14605
14579
  (nodeData, position, suppressVersionUpdate = false, forceShowQuestDate = false) => {
14606
14580
  const {
14607
14581
  graphGroup,
@@ -14642,7 +14616,7 @@ function XViewScene({
14642
14616
  },
14643
14617
  []
14644
14618
  );
14645
- const handleActivateQuestLens = (0, import_react32.useCallback)(({ assigneeId, status: status2, milestoneId }) => {
14619
+ const handleActivateQuestLens = (0, import_react29.useCallback)(({ assigneeId, status: status2, milestoneId }) => {
14646
14620
  var _a2;
14647
14621
  const { nodeObjects, tweenGroup, graphGroup } = stateRef.current;
14648
14622
  if (!nodeObjects || !tweenGroup || !graphGroup) return;
@@ -14856,7 +14830,7 @@ function XViewScene({
14856
14830
  camTween.start();
14857
14831
  }
14858
14832
  }, [addOrUpdateNodeMesh]);
14859
- (0, import_react32.useEffect)(() => {
14833
+ (0, import_react29.useEffect)(() => {
14860
14834
  if (!isInitialized || !sceneDataRef.current) return;
14861
14835
  const currentMount = mountRef.current;
14862
14836
  if (!currentMount) return;
@@ -15612,7 +15586,7 @@ function XViewScene({
15612
15586
  get_scene_view_data,
15613
15587
  save_view_data
15614
15588
  ]);
15615
- const handleGhostNodeImageChange = (0, import_react32.useCallback)((useImage, imageUrl) => {
15589
+ const handleGhostNodeImageChange = (0, import_react29.useCallback)((useImage, imageUrl) => {
15616
15590
  const {
15617
15591
  node: ghostNode,
15618
15592
  line: ghostLine,
@@ -15660,7 +15634,7 @@ function XViewScene({
15660
15634
  aura: newGhostNode.getObjectByName("aura")
15661
15635
  };
15662
15636
  }, []);
15663
- const handleGhostNodeIntensityChange = (0, import_react32.useCallback)((newIntensity) => {
15637
+ const handleGhostNodeIntensityChange = (0, import_react29.useCallback)((newIntensity) => {
15664
15638
  const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
15665
15639
  if (!ghostNode) return;
15666
15640
  const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
@@ -15681,7 +15655,7 @@ function XViewScene({
15681
15655
  ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
15682
15656
  }
15683
15657
  }, []);
15684
- const handleDetailNodeIntensityChange = (0, import_react32.useCallback)(
15658
+ const handleDetailNodeIntensityChange = (0, import_react29.useCallback)(
15685
15659
  (nodeId, newIntensity) => {
15686
15660
  const mesh = stateRef.current.nodeObjects[String(nodeId)];
15687
15661
  if (!mesh) return;
@@ -15837,7 +15811,7 @@ function XViewScene({
15837
15811
  mountRef.current.style.cursor = "default";
15838
15812
  }
15839
15813
  };
15840
- const handleAncestryTreeUpdate = (0, import_react32.useCallback)((newTree, extraData = null) => {
15814
+ const handleAncestryTreeUpdate = (0, import_react29.useCallback)((newTree, extraData = null) => {
15841
15815
  setAncestryMode((prev) => {
15842
15816
  const prevTreeStr = JSON.stringify(prev.tree);
15843
15817
  const newTreeStr = JSON.stringify(newTree);
@@ -15860,7 +15834,7 @@ function XViewScene({
15860
15834
  };
15861
15835
  });
15862
15836
  }, []);
15863
- const actionHandlerContext = (0, import_react32.useMemo)(
15837
+ const actionHandlerContext = (0, import_react29.useMemo)(
15864
15838
  () => {
15865
15839
  var _a2;
15866
15840
  return {
@@ -15921,7 +15895,7 @@ function XViewScene({
15921
15895
  const handleStartVersioning = (nodeData) => {
15922
15896
  userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
15923
15897
  };
15924
- const handleStartQuestQuick = (0, import_react32.useCallback)((questNode) => {
15898
+ const handleStartQuestQuick = (0, import_react29.useCallback)((questNode) => {
15925
15899
  var _a2, _b2, _c2;
15926
15900
  if (!questNode || !actionHandlerContext) return;
15927
15901
  const allParentNodes = Object.values(parentDataRef.current).flatMap((fileData) => fileData.nodes || []);
@@ -15956,7 +15930,7 @@ function XViewScene({
15956
15930
  }
15957
15931
  setDetailsNode(updatedNode);
15958
15932
  }, [session, actionHandlerContext]);
15959
- const handleFinishQuestQuick = (0, import_react32.useCallback)((questNode) => {
15933
+ const handleFinishQuestQuick = (0, import_react29.useCallback)((questNode) => {
15960
15934
  var _a2, _b2, _c2, _d2;
15961
15935
  if (!questNode || !actionHandlerContext) return;
15962
15936
  const {
@@ -16030,7 +16004,7 @@ function XViewScene({
16030
16004
  setDetailsNode(null);
16031
16005
  }
16032
16006
  }, [session, actionHandlerContext, viewMembers, detailsNode]);
16033
- const handleCancelQuest = (0, import_react32.useCallback)(() => {
16007
+ const handleCancelQuest = (0, import_react29.useCallback)(() => {
16034
16008
  const { graphGroup, ghostElements } = stateRef.current;
16035
16009
  if (ghostElements.node && graphGroup) {
16036
16010
  if (ghostElements.node.userData.labelObject) {
@@ -16089,13 +16063,15 @@ function XViewScene({
16089
16063
  try {
16090
16064
  await actions.save_view_data(sceneSaveUrl2, sceneFileData);
16091
16065
  sceneDataRef2.current.quest_counter = currentCounter + 1;
16092
- sceneDataRef2.current.quest_nodes = sceneFileData.quest_nodes;
16093
- sceneDataRef2.current.quest_links = sceneFileData.quest_links;
16094
16066
  stateRef2.current.nodeIdToParentFileMap.set(String(newNode.id), {
16095
16067
  parentFileId: sceneConfigId2,
16096
16068
  ownerId: ownerId2,
16097
16069
  datasetName: "Quests Internas (View)"
16098
16070
  });
16071
+ sceneDataRef2.current.quest_nodes = [...graphDataRef.current[sceneConfigId2].nodes];
16072
+ if (parentDataRef.current[sceneConfigId2]) {
16073
+ parentDataRef.current[sceneConfigId2].nodes = [...graphDataRef.current[sceneConfigId2].nodes];
16074
+ }
16099
16075
  const finalPosition = stateRef2.current.ghostElements.node ? stateRef2.current.ghostElements.node.position.clone() : stateRef2.current.controls.target.clone();
16100
16076
  const { graphGroup, ghostElements } = stateRef2.current;
16101
16077
  if (ghostElements.node && graphGroup) {
@@ -16185,7 +16161,7 @@ function XViewScene({
16185
16161
  }
16186
16162
  userActionHandlers.handleCancelConnection(context);
16187
16163
  };
16188
- const handleClearAncestryVisuals = (0, import_react32.useCallback)((ancestryId) => {
16164
+ const handleClearAncestryVisuals = (0, import_react29.useCallback)((ancestryId) => {
16189
16165
  const { renderedAncestries, ancestryGroup } = stateRef.current;
16190
16166
  const renderIndex = renderedAncestries.findIndex(
16191
16167
  (a) => String(a.id) === String(ancestryId)
@@ -16203,7 +16179,7 @@ function XViewScene({
16203
16179
  );
16204
16180
  }
16205
16181
  }, []);
16206
- const handleRenderAncestry = (0, import_react32.useCallback)(
16182
+ const handleRenderAncestry = (0, import_react29.useCallback)(
16207
16183
  async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
16208
16184
  setContextMenu(
16209
16185
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -16697,7 +16673,7 @@ function XViewScene({
16697
16673
  ancestryMode.isActive
16698
16674
  ]
16699
16675
  );
16700
- const handleRenderAbstractionTree = (0, import_react32.useCallback)(
16676
+ const handleRenderAbstractionTree = (0, import_react29.useCallback)(
16701
16677
  (ancestryObject, targetNodeId = null) => {
16702
16678
  setContextMenu(
16703
16679
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -16785,7 +16761,7 @@ function XViewScene({
16785
16761
  handleClearAncestryVisuals
16786
16762
  ]
16787
16763
  );
16788
- const handleReadModeBranchNav = (0, import_react32.useCallback)(
16764
+ const handleReadModeBranchNav = (0, import_react29.useCallback)(
16789
16765
  (nodeId, action, direction = "right") => {
16790
16766
  const { ancestry, branchStack } = readingMode;
16791
16767
  if (!ancestry || !ancestry.tree) return;
@@ -16963,13 +16939,13 @@ function XViewScene({
16963
16939
  },
16964
16940
  [readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
16965
16941
  );
16966
- const handleReadModeHighlight = (0, import_react32.useCallback)((nodeId) => {
16942
+ const handleReadModeHighlight = (0, import_react29.useCallback)((nodeId) => {
16967
16943
  if (stateRef.current.highlightedNodeId !== nodeId) {
16968
16944
  stateRef.current.highlightedNodeId = nodeId;
16969
16945
  }
16970
16946
  setHighlightedNodeId(nodeId);
16971
16947
  }, []);
16972
- const activeNodeBranches = (0, import_react32.useMemo)(() => {
16948
+ const activeNodeBranches = (0, import_react29.useMemo)(() => {
16973
16949
  if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
16974
16950
  return null;
16975
16951
  const fullTree = buildFullAncestryTree(
@@ -17013,7 +16989,7 @@ function XViewScene({
17013
16989
  readingMode.branchStack,
17014
16990
  ancestryDataRef.current
17015
16991
  ]);
17016
- const backNavigationInfo = (0, import_react32.useMemo)(() => {
16992
+ const backNavigationInfo = (0, import_react29.useMemo)(() => {
17017
16993
  const { branchStack } = readingMode;
17018
16994
  if (!branchStack || branchStack.length === 0) return null;
17019
16995
  const lastStep = branchStack[branchStack.length - 1];
@@ -17024,7 +17000,7 @@ function XViewScene({
17024
17000
  name: "Voltar para anterior"
17025
17001
  };
17026
17002
  }, [readingMode.branchStack]);
17027
- const getReadModeDisplayContext = (0, import_react32.useMemo)(() => {
17003
+ const getReadModeDisplayContext = (0, import_react29.useMemo)(() => {
17028
17004
  const { ancestry, branchStack } = readingMode;
17029
17005
  if (!ancestry) return null;
17030
17006
  if (branchStack.length === 0) {
@@ -17067,7 +17043,7 @@ function XViewScene({
17067
17043
  customProperties: branchProps
17068
17044
  };
17069
17045
  }, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
17070
- const readModeAbstractionTree = (0, import_react32.useMemo)(() => {
17046
+ const readModeAbstractionTree = (0, import_react29.useMemo)(() => {
17071
17047
  if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
17072
17048
  return null;
17073
17049
  }
@@ -17086,7 +17062,7 @@ function XViewScene({
17086
17062
  buildFullAncestryTree,
17087
17063
  sceneVersion
17088
17064
  ]);
17089
- const handleStartReadingAncestry = (0, import_react32.useCallback)(
17065
+ const handleStartReadingAncestry = (0, import_react29.useCallback)(
17090
17066
  async (ancestryObject, renderMode = "full") => {
17091
17067
  setContextMenu(
17092
17068
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -17129,7 +17105,7 @@ function XViewScene({
17129
17105
  },
17130
17106
  [handleRenderAncestry, handleRenderAbstractionTree]
17131
17107
  );
17132
- const handleReadModeSectionChange = (0, import_react32.useCallback)(
17108
+ const handleReadModeSectionChange = (0, import_react29.useCallback)(
17133
17109
  (activeSectionId) => {
17134
17110
  const { ancestry, branchStack } = readingMode;
17135
17111
  if (!ancestry || !readingMode.isActive) return;
@@ -17214,10 +17190,10 @@ function XViewScene({
17214
17190
  ancestryDataRef.current
17215
17191
  ]
17216
17192
  );
17217
- const handleCloseReadMode = (0, import_react32.useCallback)(() => {
17193
+ const handleCloseReadMode = (0, import_react29.useCallback)(() => {
17218
17194
  setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
17219
17195
  }, []);
17220
- const handleAncestrySectionChange = (0, import_react32.useCallback)(
17196
+ const handleAncestrySectionChange = (0, import_react29.useCallback)(
17221
17197
  (activeSectionId, ancestryOverride = null, rotation = 0) => {
17222
17198
  var _a2, _b2;
17223
17199
  const currentMode = stateRef.current.ancestry;
@@ -17279,7 +17255,7 @@ function XViewScene({
17279
17255
  },
17280
17256
  [handleRenderAncestry]
17281
17257
  );
17282
- const handleEditAncestry = (0, import_react32.useCallback)(
17258
+ const handleEditAncestry = (0, import_react29.useCallback)(
17283
17259
  async (ancestryObject) => {
17284
17260
  setContextMenu(
17285
17261
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -17334,7 +17310,7 @@ function XViewScene({
17334
17310
  const handleSelectAncestryParent = (nodeId) => {
17335
17311
  setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
17336
17312
  };
17337
- const handleRemoveFromAncestry = (0, import_react32.useCallback)((pathToRemove) => {
17313
+ const handleRemoveFromAncestry = (0, import_react29.useCallback)((pathToRemove) => {
17338
17314
  if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
17339
17315
  console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
17340
17316
  return;
@@ -17359,7 +17335,7 @@ function XViewScene({
17359
17335
  return { ...prev, tree: newTree };
17360
17336
  });
17361
17337
  }, []);
17362
- const handleSaveAncestry = (0, import_react32.useCallback)(
17338
+ const handleSaveAncestry = (0, import_react29.useCallback)(
17363
17339
  async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
17364
17340
  const treeToUse = treeOverride || ancestryMode.tree;
17365
17341
  const { isEditMode, currentAncestryId } = ancestryMode;
@@ -17595,7 +17571,7 @@ function XViewScene({
17595
17571
  });
17596
17572
  setEditingAncestryRel({ visible: false, data: null, path: null });
17597
17573
  };
17598
- const handleDeleteAncestry = (0, import_react32.useCallback)(
17574
+ const handleDeleteAncestry = (0, import_react29.useCallback)(
17599
17575
  async (ancestryIdToDelete) => {
17600
17576
  if (!ancestryIdToDelete) {
17601
17577
  alert("ID da ancestralidade n\xE3o encontrado.");
@@ -17677,28 +17653,22 @@ function XViewScene({
17677
17653
  },
17678
17654
  [save_view_data, delete_file_action]
17679
17655
  );
17680
- const handleOpenAncestryBoard = (0, import_react32.useCallback)(() => {
17656
+ const handleOpenAncestryBoard = (0, import_react29.useCallback)(() => {
17681
17657
  setIsAncestryBoardOpen(true);
17682
17658
  }, []);
17683
- const handleSelectAncestryFromBoard = (0, import_react32.useCallback)(
17659
+ const handleSelectAncestryFromBoard = (0, import_react29.useCallback)(
17684
17660
  (item) => {
17685
17661
  setIsAncestryBoardOpen(false);
17686
17662
  setIsSidebarOpen(false);
17687
- if (item.type === "ancestry" || !item.type) {
17663
+ if (item.type === "ancestry") {
17688
17664
  handleStartReadingAncestry(item);
17689
17665
  } else {
17690
- const nodeId = String(item.id);
17691
- const sceneMesh = stateRef.current.nodeObjects[nodeId];
17692
- if (sceneMesh) {
17693
- tweenToTarget(sceneMesh);
17694
- } else {
17695
- console.warn("Objeto n\xE3o encontrado na cena para foco:", nodeId);
17696
- }
17666
+ handleOpenReference({ type: "node", id: item.id });
17697
17667
  }
17698
17668
  },
17699
- [handleStartReadingAncestry, tweenToTarget]
17669
+ [handleStartReadingAncestry, handleOpenReference]
17700
17670
  );
17701
- const handleSaveAncestryBoard = (0, import_react32.useCallback)(
17671
+ const handleSaveAncestryBoard = (0, import_react29.useCallback)(
17702
17672
  async (groups) => {
17703
17673
  if (!sceneConfigId || !viewParams || !session) return;
17704
17674
  const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
@@ -17712,7 +17682,7 @@ function XViewScene({
17712
17682
  },
17713
17683
  [sceneConfigId, viewParams, session, save_ancestry_board_action, ownerId]
17714
17684
  );
17715
- const existingNodeTypes = (0, import_react32.useMemo)(() => {
17685
+ const existingNodeTypes = (0, import_react29.useMemo)(() => {
17716
17686
  if (!parentDataRef.current) {
17717
17687
  return [];
17718
17688
  }
@@ -17724,28 +17694,22 @@ function XViewScene({
17724
17694
  ).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
17725
17695
  return [...new Set(allTypes)];
17726
17696
  }, [parentDataRef.current, sceneVersion]);
17727
- const searchableDbNodes = (0, import_react32.useMemo)(() => {
17728
- var _a2;
17697
+ const searchableDbNodes = (0, import_react29.useMemo)(() => {
17729
17698
  if (!parentDataRef.current) {
17730
17699
  return [];
17731
17700
  }
17732
- const datasetsPool = Object.entries(parentDataRef.current).flatMap(([dbId, fileData]) => {
17701
+ return Object.entries(parentDataRef.current).flatMap(([dbId, fileData]) => {
17733
17702
  const datasetName = fileData.dataset_name || `Dataset #${dbId.substring(0, 6)}`;
17734
17703
  return (fileData.nodes || []).map((node) => ({
17735
17704
  ...node,
17736
17705
  dataset_name: datasetName
17737
17706
  }));
17707
+ }).filter((node) => {
17708
+ var _a2;
17709
+ return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
17738
17710
  });
17739
- const questsPool = (((_a2 = sceneDataRef.current) == null ? void 0 : _a2.quest_nodes) || []).map((node) => ({
17740
- ...node,
17741
- dataset_name: "Quests Internas (View)"
17742
- }));
17743
- return [...datasetsPool, ...questsPool].filter((node) => {
17744
- var _a3;
17745
- return !((_a3 = node.version_node) == null ? void 0 : _a3.is_version);
17746
- });
17747
- }, [parentDataRef.current, (_b = sceneDataRef.current) == null ? void 0 : _b.quest_nodes, sceneVersion]);
17748
- const handleAddExistingNode = (0, import_react32.useCallback)(
17711
+ }, [parentDataRef.current, sceneVersion]);
17712
+ const handleAddExistingNode = (0, import_react29.useCallback)(
17749
17713
  (nodeId) => {
17750
17714
  return userActionHandlers.handleAddExistingNodeById(
17751
17715
  actionHandlerContext,
@@ -17754,7 +17718,7 @@ function XViewScene({
17754
17718
  },
17755
17719
  [actionHandlerContext]
17756
17720
  );
17757
- const handleUpdateMilestones = (0, import_react32.useCallback)(
17721
+ const handleUpdateMilestones = (0, import_react29.useCallback)(
17758
17722
  async (newMilestones) => {
17759
17723
  var _a2, _b2, _c2;
17760
17724
  if (!sceneDataRef.current) return;
@@ -17800,7 +17764,7 @@ function XViewScene({
17800
17764
  viewParams == null ? void 0 : viewParams.type
17801
17765
  ]
17802
17766
  );
17803
- const handleSaveCurrentView = (0, import_react32.useCallback)(async () => {
17767
+ const handleSaveCurrentView = (0, import_react29.useCallback)(async () => {
17804
17768
  var _a2, _b2, _c2;
17805
17769
  const { nodeObjects, allLinks } = stateRef.current;
17806
17770
  if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
@@ -17843,16 +17807,16 @@ function XViewScene({
17843
17807
  console.error("Erro na chamada de save_view_data:", error);
17844
17808
  }
17845
17809
  }, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
17846
- const allAvailableNodes = (0, import_react32.useMemo)(() => {
17810
+ const allAvailableNodes = (0, import_react29.useMemo)(() => {
17847
17811
  if (!parentDataRef.current) return [];
17848
17812
  return Object.values(parentDataRef.current).flatMap(
17849
17813
  (fileData) => fileData.nodes || []
17850
17814
  );
17851
17815
  }, [sceneVersion, isInitialized]);
17852
- const allAvailableAncestries = (0, import_react32.useMemo)(() => {
17816
+ const allAvailableAncestries = (0, import_react29.useMemo)(() => {
17853
17817
  return ancestryDataRef.current || [];
17854
17818
  }, [sceneVersion, isInitialized]);
17855
- const handleOpenReference = (0, import_react32.useCallback)(
17819
+ const handleOpenReference = (0, import_react29.useCallback)(
17856
17820
  (referenceData) => {
17857
17821
  const { type, id } = referenceData;
17858
17822
  if (type === "node") {
@@ -17891,13 +17855,13 @@ function XViewScene({
17891
17855
  tweenToTarget
17892
17856
  ]
17893
17857
  );
17894
- const handleToggleAncestryAddMode = (0, import_react32.useCallback)(() => {
17858
+ const handleToggleAncestryAddMode = (0, import_react29.useCallback)(() => {
17895
17859
  setAncestryMode((prev) => ({
17896
17860
  ...prev,
17897
17861
  isAddingNodes: !prev.isAddingNodes
17898
17862
  }));
17899
17863
  }, []);
17900
- const handleFocusNode = (0, import_react32.useCallback)(
17864
+ const handleFocusNode = (0, import_react29.useCallback)(
17901
17865
  (nodeData) => {
17902
17866
  var _a2;
17903
17867
  if (!nodeData) return;
@@ -17913,7 +17877,7 @@ function XViewScene({
17913
17877
  },
17914
17878
  [tweenToTarget]
17915
17879
  );
17916
- const availableDatasets = (0, import_react32.useMemo)(() => {
17880
+ const availableDatasets = (0, import_react29.useMemo)(() => {
17917
17881
  if (!sceneDataRef.current || !parentDataRef.current) return [];
17918
17882
  return sceneDataRef.current.parent_dbs.map((db) => {
17919
17883
  var _a2;
@@ -17923,11 +17887,11 @@ function XViewScene({
17923
17887
  };
17924
17888
  });
17925
17889
  }, [sceneVersion, isInitialized]);
17926
- const sourceNodeDatasetId = creationMode.sourceNodeData ? (_c = stateRef.current.nodeIdToParentFileMap.get(
17890
+ const sourceNodeDatasetId = creationMode.sourceNodeData ? (_b = stateRef.current.nodeIdToParentFileMap.get(
17927
17891
  String(creationMode.sourceNodeData.id)
17928
- )) == null ? void 0 : _c.parentFileId : null;
17892
+ )) == null ? void 0 : _b.parentFileId : null;
17929
17893
  const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
17930
- (0, import_react32.useEffect)(() => {
17894
+ (0, import_react29.useEffect)(() => {
17931
17895
  if (isInitialized && focusNodeId && !hasFocusedInitial) {
17932
17896
  const nodeObjects = stateRef.current.nodeObjects || {};
17933
17897
  const targetMesh = nodeObjects[String(focusNodeId)];
@@ -17950,7 +17914,7 @@ function XViewScene({
17950
17914
  hasFocusedInitial,
17951
17915
  tweenToTarget
17952
17916
  ]);
17953
- (0, import_react32.useEffect)(() => {
17917
+ (0, import_react29.useEffect)(() => {
17954
17918
  if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
17955
17919
  const ancestries = ancestryDataRef.current || [];
17956
17920
  const targetAncestry = ancestries.find(
@@ -17975,7 +17939,7 @@ function XViewScene({
17975
17939
  hasOpenedInitialAncestry,
17976
17940
  handleStartReadingAncestry
17977
17941
  ]);
17978
- (0, import_react32.useEffect)(() => {
17942
+ (0, import_react29.useEffect)(() => {
17979
17943
  function handleKeyDown(event) {
17980
17944
  var _a2, _b2, _c2;
17981
17945
  const context = actionHandlerContext;
@@ -18098,10 +18062,10 @@ function XViewScene({
18098
18062
  // <-- handleCancelQuest adicionado aqui
18099
18063
  ]);
18100
18064
  if (isLoading || status === "loading" || permissionStatus === "loading") {
18101
- return /* @__PURE__ */ import_react32.default.createElement(LoadingScreen, null);
18065
+ return /* @__PURE__ */ import_react29.default.createElement(LoadingScreen, null);
18102
18066
  }
18103
18067
  if (permissionStatus === "denied") {
18104
- return /* @__PURE__ */ import_react32.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react32.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_react32.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react32.default.createElement(
18068
+ return /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react29.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_react29.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react29.default.createElement(
18105
18069
  "svg",
18106
18070
  {
18107
18071
  xmlns: "http://www.w3.org/2000/svg",
@@ -18111,7 +18075,7 @@ function XViewScene({
18111
18075
  stroke: "currentColor",
18112
18076
  className: "w-16 h-16 mx-auto"
18113
18077
  },
18114
- /* @__PURE__ */ import_react32.default.createElement(
18078
+ /* @__PURE__ */ import_react29.default.createElement(
18115
18079
  "path",
18116
18080
  {
18117
18081
  strokeLinecap: "round",
@@ -18119,13 +18083,13 @@ function XViewScene({
18119
18083
  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"
18120
18084
  }
18121
18085
  )
18122
- )), /* @__PURE__ */ import_react32.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react32.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_react32.default.createElement(
18086
+ )), /* @__PURE__ */ import_react29.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react29.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_react29.default.createElement(
18123
18087
  "button",
18124
18088
  {
18125
18089
  onClick: () => router.push("/dashboard/scenes"),
18126
18090
  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"
18127
18091
  },
18128
- /* @__PURE__ */ import_react32.default.createElement(
18092
+ /* @__PURE__ */ import_react29.default.createElement(
18129
18093
  "svg",
18130
18094
  {
18131
18095
  xmlns: "http://www.w3.org/2000/svg",
@@ -18135,7 +18099,7 @@ function XViewScene({
18135
18099
  stroke: "currentColor",
18136
18100
  className: "w-5 h-5"
18137
18101
  },
18138
- /* @__PURE__ */ import_react32.default.createElement(
18102
+ /* @__PURE__ */ import_react29.default.createElement(
18139
18103
  "path",
18140
18104
  {
18141
18105
  strokeLinecap: "round",
@@ -18147,7 +18111,7 @@ function XViewScene({
18147
18111
  "Voltar para Scenes"
18148
18112
  )));
18149
18113
  }
18150
- return /* @__PURE__ */ import_react32.default.createElement(
18114
+ return /* @__PURE__ */ import_react29.default.createElement(
18151
18115
  "div",
18152
18116
  {
18153
18117
  ref: mountRef,
@@ -18159,7 +18123,7 @@ function XViewScene({
18159
18123
  cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
18160
18124
  }
18161
18125
  },
18162
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react32.default.createElement(
18126
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react29.default.createElement(
18163
18127
  XViewSidebar,
18164
18128
  {
18165
18129
  dbNodes: searchableDbNodes,
@@ -18179,11 +18143,11 @@ function XViewScene({
18179
18143
  onToggle: setIsSidebarOpen,
18180
18144
  userRole: userPermissionRole,
18181
18145
  viewMembers,
18182
- milestones: ((_d = sceneDataRef.current) == null ? void 0 : _d.milestones) || [],
18146
+ milestones: ((_c = sceneDataRef.current) == null ? void 0 : _c.milestones) || [],
18183
18147
  onOpenMilestoneManager: () => setIsMilestoneManagerOpen(true)
18184
18148
  }
18185
18149
  ),
18186
- creationMode.isActive && /* @__PURE__ */ import_react32.default.createElement(
18150
+ creationMode.isActive && /* @__PURE__ */ import_react29.default.createElement(
18187
18151
  InSceneCreationForm,
18188
18152
  {
18189
18153
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -18204,8 +18168,8 @@ function XViewScene({
18204
18168
  },
18205
18169
  refEl: formRef,
18206
18170
  existingTypes: existingNodeTypes,
18207
- initialColor: (_e = creationMode.sourceNodeData) == null ? void 0 : _e.color,
18208
- sourceTypes: (_f = creationMode.sourceNodeData) == null ? void 0 : _f.type,
18171
+ initialColor: (_d = creationMode.sourceNodeData) == null ? void 0 : _d.color,
18172
+ sourceTypes: (_e = creationMode.sourceNodeData) == null ? void 0 : _e.type,
18209
18173
  onIntensityChange: handleGhostNodeIntensityChange,
18210
18174
  onUploadFile: upload_file_action,
18211
18175
  availableDatasets,
@@ -18215,7 +18179,7 @@ function XViewScene({
18215
18179
  availableAncestries: allAvailableAncestries
18216
18180
  }
18217
18181
  ),
18218
- versionMode.isActive && /* @__PURE__ */ import_react32.default.createElement(
18182
+ versionMode.isActive && /* @__PURE__ */ import_react29.default.createElement(
18219
18183
  InSceneVersionForm,
18220
18184
  {
18221
18185
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -18234,14 +18198,14 @@ function XViewScene({
18234
18198
  transition: "opacity 200ms ease-out"
18235
18199
  },
18236
18200
  refEl: formRef,
18237
- fixedType: (_g = versionMode.sourceNodeData) == null ? void 0 : _g.type,
18238
- fixedColor: (_h = versionMode.sourceNodeData) == null ? void 0 : _h.color,
18201
+ fixedType: (_f = versionMode.sourceNodeData) == null ? void 0 : _f.type,
18202
+ fixedColor: (_g = versionMode.sourceNodeData) == null ? void 0 : _g.color,
18239
18203
  onUploadFile: upload_file_action,
18240
18204
  availableNodes: allAvailableNodes,
18241
18205
  availableAncestries: allAvailableAncestries
18242
18206
  }
18243
18207
  ),
18244
- questMode.isActive && /* @__PURE__ */ import_react32.default.createElement(
18208
+ questMode.isActive && /* @__PURE__ */ import_react29.default.createElement(
18245
18209
  InSceneQuestForm,
18246
18210
  {
18247
18211
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -18263,13 +18227,13 @@ function XViewScene({
18263
18227
  availableNodes: allAvailableNodes,
18264
18228
  availableAncestries: allAvailableAncestries,
18265
18229
  viewName: viewParams == null ? void 0 : viewParams.name,
18266
- questCounter: ((_i = sceneDataRef.current) == null ? void 0 : _i.quest_counter) || 1,
18230
+ questCounter: ((_h = sceneDataRef.current) == null ? void 0 : _h.quest_counter) || 1,
18267
18231
  viewMembers,
18268
- milestones: ((_j = sceneDataRef.current) == null ? void 0 : _j.milestones) || [],
18232
+ milestones: ((_i = sceneDataRef.current) == null ? void 0 : _i.milestones) || [],
18269
18233
  onUpdateMilestones: handleUpdateMilestones
18270
18234
  }
18271
18235
  ),
18272
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react32.default.createElement(
18236
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react29.default.createElement(
18273
18237
  "div",
18274
18238
  {
18275
18239
  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"}`,
@@ -18282,7 +18246,7 @@ function XViewScene({
18282
18246
  maxWidth: "92vw"
18283
18247
  }
18284
18248
  },
18285
- /* @__PURE__ */ import_react32.default.createElement(
18249
+ /* @__PURE__ */ import_react29.default.createElement(
18286
18250
  "div",
18287
18251
  {
18288
18252
  onPointerDown: (e) => {
@@ -18293,7 +18257,7 @@ function XViewScene({
18293
18257
  title: "Arraste para redimensionar"
18294
18258
  }
18295
18259
  ),
18296
- /* @__PURE__ */ import_react32.default.createElement(
18260
+ /* @__PURE__ */ import_react29.default.createElement(
18297
18261
  DescriptionReadModePanel,
18298
18262
  {
18299
18263
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -18328,7 +18292,7 @@ function XViewScene({
18328
18292
  }
18329
18293
  )
18330
18294
  ),
18331
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react32.default.createElement(
18295
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react29.default.createElement(
18332
18296
  CreateAncestryPanel,
18333
18297
  {
18334
18298
  ancestryMode,
@@ -18364,7 +18328,7 @@ function XViewScene({
18364
18328
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
18365
18329
  }
18366
18330
  ),
18367
- editingAncestryRel.visible && /* @__PURE__ */ import_react32.default.createElement(
18331
+ editingAncestryRel.visible && /* @__PURE__ */ import_react29.default.createElement(
18368
18332
  AncestryRelationshipPanel,
18369
18333
  {
18370
18334
  data: editingAncestryRel.data,
@@ -18378,7 +18342,7 @@ function XViewScene({
18378
18342
  onUploadFile: upload_file_action
18379
18343
  }
18380
18344
  ),
18381
- detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react32.default.createElement(
18345
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react29.default.createElement(
18382
18346
  QuestDetailsPanel,
18383
18347
  {
18384
18348
  node: detailsNode,
@@ -18400,11 +18364,11 @@ function XViewScene({
18400
18364
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
18401
18365
  viewMembers,
18402
18366
  currentUser: session == null ? void 0 : session.user,
18403
- milestones: ((_k = sceneDataRef.current) == null ? void 0 : _k.milestones) || [],
18367
+ milestones: ((_j = sceneDataRef.current) == null ? void 0 : _j.milestones) || [],
18404
18368
  onUpdateMilestones: handleUpdateMilestones
18405
18369
  }
18406
18370
  ),
18407
- detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react32.default.createElement(
18371
+ detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react29.default.createElement(
18408
18372
  NodeDetailsPanel,
18409
18373
  {
18410
18374
  node: detailsNode,
@@ -18436,7 +18400,7 @@ function XViewScene({
18436
18400
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
18437
18401
  }
18438
18402
  ),
18439
- detailsLink && /* @__PURE__ */ import_react32.default.createElement(
18403
+ detailsLink && /* @__PURE__ */ import_react29.default.createElement(
18440
18404
  RelationshipDetailsPanel,
18441
18405
  {
18442
18406
  link: detailsLink,
@@ -18450,7 +18414,7 @@ function XViewScene({
18450
18414
  userRole: userPermissionRole
18451
18415
  }
18452
18416
  ),
18453
- ancestryLinkDetails && /* @__PURE__ */ import_react32.default.createElement(
18417
+ ancestryLinkDetails && /* @__PURE__ */ import_react29.default.createElement(
18454
18418
  AncestryLinkDetailsPanel,
18455
18419
  {
18456
18420
  data: ancestryLinkDetails,
@@ -18461,7 +18425,7 @@ function XViewScene({
18461
18425
  onUploadFile: upload_file_action
18462
18426
  }
18463
18427
  ),
18464
- /* @__PURE__ */ import_react32.default.createElement(
18428
+ /* @__PURE__ */ import_react29.default.createElement(
18465
18429
  "div",
18466
18430
  {
18467
18431
  ref: tooltipRef,
@@ -18488,7 +18452,7 @@ function XViewScene({
18488
18452
  }
18489
18453
  }
18490
18454
  ),
18491
- /* @__PURE__ */ import_react32.default.createElement(
18455
+ /* @__PURE__ */ import_react29.default.createElement(
18492
18456
  ContextMenu,
18493
18457
  {
18494
18458
  data: contextMenu,
@@ -18521,7 +18485,7 @@ function XViewScene({
18521
18485
  onFinishQuest: handleFinishQuestQuick
18522
18486
  }
18523
18487
  ),
18524
- /* @__PURE__ */ import_react32.default.createElement(
18488
+ /* @__PURE__ */ import_react29.default.createElement(
18525
18489
  MultiNodeContextMenu,
18526
18490
  {
18527
18491
  data: multiContextMenu,
@@ -18541,7 +18505,7 @@ function XViewScene({
18541
18505
  )
18542
18506
  }
18543
18507
  ),
18544
- /* @__PURE__ */ import_react32.default.createElement(
18508
+ /* @__PURE__ */ import_react29.default.createElement(
18545
18509
  RelationshipContextMenu,
18546
18510
  {
18547
18511
  data: relationshipMenu,
@@ -18559,14 +18523,14 @@ function XViewScene({
18559
18523
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
18560
18524
  }
18561
18525
  ),
18562
- /* @__PURE__ */ import_react32.default.createElement(
18526
+ /* @__PURE__ */ import_react29.default.createElement(
18563
18527
  ImageViewer,
18564
18528
  {
18565
18529
  data: imageViewer,
18566
18530
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
18567
18531
  }
18568
18532
  ),
18569
- /* @__PURE__ */ import_react32.default.createElement(
18533
+ /* @__PURE__ */ import_react29.default.createElement(
18570
18534
  AncestryBoard,
18571
18535
  {
18572
18536
  isOpen: isAncestryBoardOpen,
@@ -18579,29 +18543,29 @@ function XViewScene({
18579
18543
  userRole: userPermissionRole
18580
18544
  }
18581
18545
  ),
18582
- /* @__PURE__ */ import_react32.default.createElement(
18546
+ /* @__PURE__ */ import_react29.default.createElement(
18583
18547
  MilestoneManager,
18584
18548
  {
18585
18549
  isOpen: isMilestoneManagerOpen,
18586
18550
  onClose: () => setIsMilestoneManagerOpen(false),
18587
- milestones: ((_l = sceneDataRef.current) == null ? void 0 : _l.milestones) || [],
18551
+ milestones: ((_k = sceneDataRef.current) == null ? void 0 : _k.milestones) || [],
18588
18552
  onUpdateMilestones: handleUpdateMilestones
18589
18553
  }
18590
18554
  ),
18591
- /* @__PURE__ */ import_react32.default.createElement(
18555
+ /* @__PURE__ */ import_react29.default.createElement(
18592
18556
  ImportParentFileModal,
18593
18557
  {
18594
18558
  isOpen: isImportModalOpen,
18595
18559
  onClose: () => setIsImportModalOpen(false),
18596
18560
  onConfirm: handleConfirmImport,
18597
18561
  session,
18598
- parentDbs: ((_m = sceneDataRef.current) == null ? void 0 : _m.parent_dbs) || [],
18562
+ parentDbs: ((_l = sceneDataRef.current) == null ? void 0 : _l.parent_dbs) || [],
18599
18563
  onFetchAvailableFiles: import_parent_file_modal_get,
18600
18564
  currentViewName: viewParams == null ? void 0 : viewParams.name,
18601
18565
  currentAncestries: ancestryDataRef.current || []
18602
18566
  }
18603
18567
  ),
18604
- invalidTargetError && /* @__PURE__ */ import_react32.default.createElement(
18568
+ invalidTargetError && /* @__PURE__ */ import_react29.default.createElement(
18605
18569
  "div",
18606
18570
  {
18607
18571
  className: "ui-overlay",
@@ -18626,13 +18590,13 @@ function XViewScene({
18626
18590
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
18627
18591
  }
18628
18592
  },
18629
- /* @__PURE__ */ import_react32.default.createElement("style", null, `
18593
+ /* @__PURE__ */ import_react29.default.createElement("style", null, `
18630
18594
  @keyframes fadeInDown {
18631
18595
  from { opacity: 0; transform: translate(-50%, -20px); }
18632
18596
  to { opacity: 1; transform: translate(-50%, 0); }
18633
18597
  }
18634
18598
  `),
18635
- /* @__PURE__ */ import_react32.default.createElement(
18599
+ /* @__PURE__ */ import_react29.default.createElement(
18636
18600
  "svg",
18637
18601
  {
18638
18602
  width: "20",
@@ -18644,12 +18608,12 @@ function XViewScene({
18644
18608
  strokeLinecap: "round",
18645
18609
  strokeLinejoin: "round"
18646
18610
  },
18647
- /* @__PURE__ */ import_react32.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
18648
- /* @__PURE__ */ import_react32.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
18649
- /* @__PURE__ */ import_react32.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
18611
+ /* @__PURE__ */ import_react29.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
18612
+ /* @__PURE__ */ import_react29.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
18613
+ /* @__PURE__ */ import_react29.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
18650
18614
  ),
18651
- /* @__PURE__ */ import_react32.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
18652
- /* @__PURE__ */ import_react32.default.createElement(
18615
+ /* @__PURE__ */ import_react29.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
18616
+ /* @__PURE__ */ import_react29.default.createElement(
18653
18617
  "button",
18654
18618
  {
18655
18619
  onClick: () => setInvalidTargetError(null),