@mindexec/cli 0.2.446 → 0.2.447

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +2 -2
  2. package/package.json +2 -2
  3. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  4. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  5. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  6. package/remote-hub.js +1 -1
  7. package/scripts/remote-fleet-render-smoke.mjs +74 -36
  8. package/scripts/remote-hub-smoke.mjs +7 -0
  9. package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +1 -3
  10. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +199 -100
  11. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-hotpath.js +902 -0
  12. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +56 -385
  13. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +90 -134
  14. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +167 -24
  15. package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +92 -50
  16. package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +35 -12
  17. package/wwwroot/_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js +35 -2
  18. package/wwwroot/_framework/{MindExecution.Core.djyzj5mxyk.dll → MindExecution.Core.mswl4wlkm9.dll} +0 -0
  19. package/wwwroot/_framework/{MindExecution.Kernel.6e5cj9aijz.dll → MindExecution.Kernel.zupeldfptg.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Plugins.Admin.siulh9tfrf.dll → MindExecution.Plugins.Admin.hq0vyqnqtn.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Plugins.Business.8cjtrc7qd3.dll → MindExecution.Plugins.Business.pucw3o7rno.dll} +0 -0
  22. package/wwwroot/_framework/{MindExecution.Plugins.Concept.rpp78mc75u.dll → MindExecution.Plugins.Concept.557tzzkrrx.dll} +0 -0
  23. package/wwwroot/_framework/{MindExecution.Plugins.Directory.wfv0ff9v4u.dll → MindExecution.Plugins.Directory.zh1ddg1fn6.dll} +0 -0
  24. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.jdppnbd6g4.dll → MindExecution.Plugins.PlanMaster.0z9pzynpu9.dll} +0 -0
  25. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.a43f2q3pkw.dll → MindExecution.Plugins.YouTube.y8g77r54fa.dll} +0 -0
  26. package/wwwroot/_framework/{MindExecution.Shared.gwtyj0e9lw.dll → MindExecution.Shared.1ymsdbwid2.dll} +0 -0
  27. package/wwwroot/_framework/{MindExecution.Web.j3zaapcxtt.dll → MindExecution.Web.bb1txupuv0.dll} +0 -0
  28. package/wwwroot/_framework/blazor.boot.json +21 -21
  29. package/wwwroot/index.html +2 -1
  30. package/wwwroot/service-worker-assets.js +35 -31
  31. package/wwwroot/service-worker.js +1 -1
@@ -44,7 +44,6 @@
44
44
  const NODE_VIEW_HOST_HYBRID = 'hybrid';
45
45
  const NODE_VIEW_RENDERER_VERSION = 'shared-node-view-v1';
46
46
  const CSS3D_ONLY_NODE_RENDERING = true;
47
- const NATIVE_TEXT_SELECTION_CONTENT_SELECTORS = '.node-response, .code-body, .text-content, .markdown-body, .csv-table-scroll, .csv-table-cell, textarea, .map-node-memo__title, .map-node-memo__body, .map-node-memo__body-view, .map-node-memo__body-view *';
48
47
  const CSV_TABLE_MAX_RENDER_ROWS = 500;
49
48
  const CSV_TABLE_MAX_RENDER_COLUMNS = 80;
50
49
  const REMOTE_FLEET_DISPLAY_NAME = 'Multi Desktop Monitor';
@@ -827,6 +826,19 @@
827
826
  cursor: grab;
828
827
  }
829
828
 
829
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) .node-response,
830
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) .code-body,
831
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) .text-content,
832
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) .markdown-body,
833
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) .csv-table-scroll,
834
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) textarea,
835
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) .map-node-memo__title,
836
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) .map-node-memo__body,
837
+ .css3d-resolution-wrapper:not(.is-text-selection-owner) .map-node-memo__body-view {
838
+ user-select: none !important;
839
+ -webkit-user-select: none !important;
840
+ }
841
+
830
842
  .css3d-resolution-wrapper.is-text-selection-owner .node-response,
831
843
  .css3d-resolution-wrapper.is-text-selection-owner .code-body,
832
844
  .css3d-resolution-wrapper.is-text-selection-owner .text-content,
@@ -4703,9 +4715,6 @@
4703
4715
  const TEXT_OVERLAY_MAX_CANDIDATES = 6;
4704
4716
  const TEXT_OVERLAY_MAX_VISIBLE = 2;
4705
4717
  const TEXT_OVERLAY_OVERLAP_PADDING = 10;
4706
- const TEXT_OVERLAY_SOURCE_SUSPENDED_CLASS = 'mind-map-text-overlay-source-suspended';
4707
- const TEXT_OVERLAY_SOURCE_SUSPENDED_ATTR = 'data-text-overlay-source-suspended';
4708
- const TEXT_OVERLAY_SOURCE_STYLE_STATE = new WeakMap();
4709
4718
  const EDIT_OVERLAY_SUPPORTED_TYPES = new Set(['memo', 'note']);
4710
4719
 
4711
4720
  function hexToRgb(hexColor) {
@@ -5019,388 +5028,45 @@
5019
5028
  || getTextOverlayHostElement(nodeEntry);
5020
5029
  }
5021
5030
 
5022
- function getTextOverlaySourceTargets(nodeEntry) {
5023
- if (!nodeEntry?.cssObject?.element || !supportsTextOverlay(nodeEntry.model)) {
5024
- return [];
5025
- }
5026
-
5027
- if (getTextOverlayRenderMode(nodeEntry) === 'memo') {
5028
- const host = getTextOverlayHostElement(nodeEntry);
5029
- if (!host) {
5030
- return [];
5031
- }
5032
-
5033
- return [
5034
- host.querySelector('.map-node-memo__title'),
5035
- host.querySelector('.map-node-memo__body-view')
5036
- ].filter(element =>
5037
- !!element && (element.style.display !== 'none' || element.offsetWidth > 0 || element.offsetHeight > 0));
5038
- }
5039
-
5040
- const root = getTextOverlayRootElement(nodeEntry);
5041
- if (!root?.children?.length) {
5042
- return [];
5043
- }
5044
-
5045
- return Array.from(root.children).filter(element =>
5046
- !!element
5047
- && !element.classList?.contains?.('resize-handle')
5048
- && (element.style.display !== 'none' || element.offsetWidth > 0 || element.offsetHeight > 0));
5049
- }
5050
-
5051
- function ensureTextOverlaySourceStyleState(element) {
5052
- if (!element) {
5053
- return null;
5054
- }
5055
-
5056
- let state = TEXT_OVERLAY_SOURCE_STYLE_STATE.get(element) || null;
5057
- if (!state) {
5058
- state = {
5059
- opacity: element.style.opacity,
5060
- pointerEvents: element.style.pointerEvents,
5061
- userSelect: element.style.userSelect,
5062
- webkitUserSelect: element.style.webkitUserSelect,
5063
- caretColor: element.style.caretColor,
5064
- contentVisibility: element.style.contentVisibility,
5065
- containIntrinsicSize: element.style.containIntrinsicSize,
5066
- contain: element.style.contain
5067
- };
5068
- TEXT_OVERLAY_SOURCE_STYLE_STATE.set(element, state);
5069
- }
5070
-
5071
- return state;
5072
- }
5073
-
5074
- function resetTextOverlaySourcePresentation(element) {
5075
- if (!element) {
5076
- return;
5077
- }
5078
-
5079
- element.classList?.remove?.(TEXT_OVERLAY_SOURCE_SUSPENDED_CLASS);
5080
- element.removeAttribute?.(TEXT_OVERLAY_SOURCE_SUSPENDED_ATTR);
5081
- element.style.opacity = '';
5082
- element.style.pointerEvents = '';
5083
- element.style.userSelect = '';
5084
- element.style.webkitUserSelect = '';
5085
- element.style.caretColor = '';
5086
- element.style.contentVisibility = '';
5087
- element.style.containIntrinsicSize = '';
5088
- element.style.contain = '';
5089
- }
5090
-
5091
- function suspendTextOverlaySourceTarget(element) {
5092
- if (!element) {
5093
- return;
5094
- }
5095
-
5096
- ensureTextOverlaySourceStyleState(element);
5097
-
5098
- const rect = element.getBoundingClientRect();
5099
- const width = Math.max(1, Math.round(Number(rect.width || element.offsetWidth || 1)));
5100
- const height = Math.max(1, Math.round(Number(rect.height || element.offsetHeight || 1)));
5101
-
5102
- element.classList?.add?.(TEXT_OVERLAY_SOURCE_SUSPENDED_CLASS);
5103
- element.setAttribute?.(TEXT_OVERLAY_SOURCE_SUSPENDED_ATTR, 'true');
5104
- element.style.pointerEvents = 'none';
5105
- element.style.userSelect = 'none';
5106
- element.style.webkitUserSelect = 'none';
5107
- element.style.caretColor = 'transparent';
5108
- element.style.opacity = '0';
5109
- element.style.contain = 'layout style paint';
5110
- // Keep scroll metrics alive while the overlay clone is visible. If this
5111
- // becomes content-visibility:hidden, scrollHeight/clientHeight collapse
5112
- // and overlay scroll can no longer be mapped back to CSS3D accurately.
5113
- element.style.contentVisibility = 'visible';
5114
- element.style.containIntrinsicSize = '';
5115
- }
5116
-
5117
- function restoreTextOverlaySourceTarget(element) {
5118
- if (!element) {
5119
- return;
5120
- }
5121
-
5122
- const state = TEXT_OVERLAY_SOURCE_STYLE_STATE.get(element) || null;
5123
- if (!state) {
5124
- resetTextOverlaySourcePresentation(element);
5125
- return;
5126
- }
5127
-
5128
- element.classList?.remove?.(TEXT_OVERLAY_SOURCE_SUSPENDED_CLASS);
5129
- element.removeAttribute?.(TEXT_OVERLAY_SOURCE_SUSPENDED_ATTR);
5130
- element.style.opacity = state.opacity;
5131
- element.style.pointerEvents = state.pointerEvents;
5132
- element.style.userSelect = state.userSelect;
5133
- element.style.webkitUserSelect = state.webkitUserSelect;
5134
- element.style.caretColor = state.caretColor;
5135
- element.style.contentVisibility = state.contentVisibility;
5136
- element.style.containIntrinsicSize = state.containIntrinsicSize;
5137
- element.style.contain = state.contain;
5138
- TEXT_OVERLAY_SOURCE_STYLE_STATE.delete(element);
5139
- }
5140
-
5141
- function stripTextOverlayPresentationOverrides(root) {
5142
- if (!root) {
5143
- return;
5144
- }
5145
-
5146
- const resetTarget = element => {
5147
- if (!element) {
5148
- return;
5149
- }
5150
-
5151
- resetTextOverlaySourcePresentation(element);
5152
- };
5153
-
5154
- if (root.hasAttribute?.(TEXT_OVERLAY_SOURCE_SUSPENDED_ATTR) || root.classList?.contains?.(TEXT_OVERLAY_SOURCE_SUSPENDED_CLASS)) {
5155
- resetTarget(root);
5156
- }
5157
- root.querySelectorAll?.(`[${TEXT_OVERLAY_SOURCE_SUSPENDED_ATTR}], .${TEXT_OVERLAY_SOURCE_SUSPENDED_CLASS}`)?.forEach?.(resetTarget);
5158
- }
5159
-
5160
- function getNativeTextSelectionSourceNodeId(module) {
5161
- return String(module?._nativeTextSelectionSourceNodeId || '').trim();
5162
- }
5163
-
5164
- function hasNativeTextSelectionSource(module, nodeId = null) {
5165
- const activeId = getNativeTextSelectionSourceNodeId(module);
5166
- if (!activeId) {
5167
- return false;
5168
- }
5169
-
5170
- if (nodeId === null) {
5171
- return true;
5172
- }
5173
-
5174
- return activeId === String(nodeId || '').trim();
5175
- }
5176
-
5177
- function setNativeTextSelectionOwnerClass(module, nodeId = null) {
5178
- if (!module) return false;
5179
- const nextId = String(nodeId || '').trim();
5180
- const previousId = String(module._nativeTextSelectionOwnerNodeId || '').trim();
5181
- if (previousId === nextId) return true;
5182
-
5183
- const getWrapper = id => {
5184
- const entry = id ? module.nodeObjectsById?.get?.(id) : null;
5185
- return entry?.cssObject?.element?.closest?.('.css3d-resolution-wrapper')
5186
- || entry?.cssObject?.element
5187
- || null;
5188
- };
5189
- const previousWrapper = getWrapper(previousId);
5190
- previousWrapper?.classList?.remove?.('is-text-selection-owner');
5191
- if (previousWrapper?.querySelectorAll) {
5192
- previousWrapper.querySelectorAll(NATIVE_TEXT_SELECTION_CONTENT_SELECTORS).forEach(element => {
5193
- element.style.userSelect = 'none';
5194
- element.style.webkitUserSelect = 'none';
5195
- });
5196
- }
5197
- const nextWrapper = getWrapper(nextId);
5198
- nextWrapper?.classList?.add?.('is-text-selection-owner');
5199
- if (nextWrapper?.querySelectorAll) {
5200
- nextWrapper.querySelectorAll(NATIVE_TEXT_SELECTION_CONTENT_SELECTORS).forEach(element => {
5201
- element.style.userSelect = 'text';
5202
- element.style.webkitUserSelect = 'text';
5203
- });
5204
- }
5205
- module._nativeTextSelectionOwnerNodeId = nextId || null;
5206
- return true;
5207
- }
5208
-
5209
- function activateNativeTextSelectionSource(module, nodeId) {
5210
- const id = String(nodeId || '').trim();
5211
- if (!module || !id) {
5212
- return false;
5213
- }
5214
-
5215
- module._nativeTextSelectionSourceNodeId = id;
5216
- setNativeTextSelectionOwnerClass(module, id);
5217
- ensureTextOverlaySourceVisible(module, id);
5218
- return true;
5219
- }
5220
-
5221
- function clearNativeTextSelectionSource(module, nodeId = null) {
5222
- const activeId = getNativeTextSelectionSourceNodeId(module);
5223
- const requestedId = nodeId === null ? activeId : String(nodeId || '').trim();
5224
- if (!module || !activeId || !requestedId || activeId !== requestedId) {
5225
- return false;
5226
- }
5227
-
5228
- module._nativeTextSelectionSourceNodeId = null;
5229
- setNativeTextSelectionOwnerClass(module, null);
5230
- return true;
5231
- }
5232
-
5233
- function isTextOverlaySelectionNode(module, nodeEntry) {
5234
- const contentType = String(nodeEntry?.model?.contentType ?? nodeEntry?.model?.ContentType ?? '').toLowerCase();
5235
- if (contentType !== 'text' && contentType !== 'markdown') {
5236
- return false;
5237
- }
5238
-
5239
- const nodeId = String(getNodeId(nodeEntry?.model) || '').trim();
5240
- return hasNativeTextSelectionSource(module, nodeId);
5241
- }
5242
-
5243
- function setTextOverlaySourceActive(nodeEntry, isActive) {
5244
- if (isCss3dMediaNode(nodeEntry?.model)) {
5245
- restoreCss3dMediaOverlayState(nodeEntry.model, nodeEntry.cssObject);
5246
- nodeEntry._textOverlayActive = false; nodeEntry._css3dSourceSuspended = false;
5247
- return;
5248
- }
5249
-
5250
- const host = getTextOverlayHostElement(nodeEntry);
5251
- if (!host?.classList) {
5252
- return;
5253
- }
5254
-
5255
- host.classList.toggle('mind-map-text-overlay-active', !!isActive);
5256
- getTextOverlaySourceTargets(nodeEntry).forEach(target => {
5257
- if (isActive) {
5258
- suspendTextOverlaySourceTarget(target);
5259
- } else {
5260
- restoreTextOverlaySourceTarget(target);
5261
- }
5262
- });
5263
- nodeEntry._textOverlayActive = nodeEntry._css3dSourceSuspended = !!isActive;
5264
- }
5265
-
5266
- function getTextOverlayPlacementInfo(module, element) {
5267
- if (!module?.container || !element) {
5268
- return null;
5269
- }
5270
-
5271
- const rect = element.getBoundingClientRect();
5272
- const containerRect = module.container.getBoundingClientRect();
5273
- const width = Math.max(0, rect.width || 0);
5274
- const height = Math.max(0, rect.height || 0);
5275
- if (width < 1 || height < 1) {
5276
- return null;
5277
- }
5278
-
5279
- return {
5280
- left: rect.left - containerRect.left,
5281
- top: rect.top - containerRect.top,
5282
- width,
5283
- height,
5284
- baseWidth: Math.max(1, Number(element.offsetWidth || width || 1)),
5285
- baseHeight: Math.max(1, Number(element.offsetHeight || height || 1)),
5286
- right: rect.left - containerRect.left + width,
5287
- bottom: rect.top - containerRect.top + height
5288
- };
5289
- }
5290
-
5291
- function doesTextOverlayRectOverlap(a, b, padding = 0) {
5292
- if (!a || !b) {
5293
- return false;
5294
- }
5295
-
5296
- const inset = Number.isFinite(Number(padding)) ? Number(padding) : 0;
5297
- return !(
5298
- (a.left + a.width + inset) < b.left
5299
- || (b.left + b.width + inset) < a.left
5300
- || (a.top + a.height + inset) < b.top
5301
- || (b.top + b.height + inset) < a.top
5302
- );
5303
- }
5304
-
5305
- function isTextOverlayPlacementVisible(module, placement, options = {}) {
5306
- if (!module?.container || !placement) {
5307
- return false;
5308
- }
5309
-
5310
- const { ignoreMinSize = false } = options;
5311
- if (!ignoreMinSize && (placement.width < TEXT_OVERLAY_MIN_WIDTH || placement.height < TEXT_OVERLAY_MIN_HEIGHT)) {
5312
- return false;
5313
- }
5314
-
5315
- const maxWidth = Number(module.container.clientWidth || 0);
5316
- const maxHeight = Number(module.container.clientHeight || 0);
5317
- if (!(maxWidth > 0) || !(maxHeight > 0)) {
5318
- return false;
5319
- }
5320
-
5321
- return !(
5322
- placement.right < 0
5323
- || placement.left > maxWidth
5324
- || placement.bottom < 0
5325
- || placement.top > maxHeight
5326
- );
5327
- }
5328
-
5329
- function getTextOverlayPriority(module, nodeEntry) {
5330
- const nodeModel = nodeEntry?.model;
5331
- const nodeId = String(getNodeId(nodeModel) || '').trim();
5332
- if (!nodeModel || !nodeId) {
5333
- return Number.NEGATIVE_INFINITY;
5334
- }
5335
-
5336
- let priority = 0;
5337
- if (String(module?.selectedNodeIdJs || '').trim() === nodeId) {
5338
- priority += 100000;
5339
- } else if (module?.multiSelectedNodeIds?.has?.(nodeId)) {
5340
- priority += 50000;
5341
- }
5342
-
5343
- const width = Math.max(1, Number(nodeModel?.width || nodeModel?.Width || 0));
5344
- const height = Math.max(1, Number(nodeModel?.height || nodeModel?.Height || 0));
5345
- priority += Math.min(6000, (width * height) / 18);
5346
-
5347
- if (module?.camera) {
5348
- const centerX = Number(nodeModel?.positionX ?? nodeModel?.PositionX ?? nodeModel?.x ?? nodeModel?.X ?? 0) + (width * 0.5);
5349
- const centerY = Number(nodeModel?.positionY ?? nodeModel?.PositionY ?? nodeModel?.y ?? nodeModel?.Y ?? 0) - (height * 0.5);
5350
- const dx = Math.abs(centerX - Number(module.camera.position?.x || 0));
5351
- const dy = Math.abs(centerY - Number(module.camera.position?.y || 0));
5352
- priority += Math.max(0, 24000 - (dx + dy));
5353
- }
5354
-
5355
- const zIndex = Number(nodeEntry?.cssObject?.element?.style?.zIndex || 0);
5356
- if (Number.isFinite(zIndex)) {
5357
- priority += zIndex * 10;
5358
- }
5359
-
5360
- return priority;
5361
- }
5362
-
5363
- function isAlwaysTextOverlayNode(nodeEntry) {
5364
- const contentType = String(nodeEntry?.model?.contentType ?? nodeEntry?.model?.ContentType ?? '').toLowerCase();
5365
- return contentType === 'markdown' || contentType === 'text';
5366
- }
5367
-
5368
- function getTextOverlayContentSignature(nodeEntry) {
5369
- const model = nodeEntry?.model || {};
5370
- const contentType = String(model.contentType ?? model.ContentType ?? '').toLowerCase();
5371
- const prompt = String(model.prompt ?? model.Prompt ?? '');
5372
- const response = String(model.response ?? model.Response ?? '');
5373
- const isLoading = (model.isLoading ?? model.IsLoading ?? false) ? '1' : '0';
5374
- const width = Math.max(0, Number(model.width ?? model.Width ?? 0));
5375
- const height = Math.max(0, Number(model.height ?? model.Height ?? 0));
5376
- return `${contentType}||${prompt}||${response}||${isLoading}||${width}||${height}`;
5377
- }
5378
-
5379
- function getTextOverlayLayoutSignature(sourceElement, mode = 'full', hostPlacement = null) {
5380
- if (!sourceElement) {
5381
- return '';
5382
- }
5031
+ const {
5032
+ getTextOverlaySourceTargets,
5033
+ ensureTextOverlaySourceStyleState,
5034
+ resetTextOverlaySourcePresentation,
5035
+ suspendTextOverlaySourceTarget,
5036
+ restoreTextOverlaySourceTarget,
5037
+ stripTextOverlayPresentationOverrides,
5038
+ getNativeTextSelectionSourceNodeId,
5039
+ hasNativeTextSelectionSource,
5040
+ setNativeTextSelectionOwnerClass,
5041
+ activateNativeTextSelectionSource,
5042
+ clearNativeTextSelectionSource,
5043
+ isTextOverlaySelectionNode,
5044
+ setTextOverlaySourceActive
5045
+ } = window.MindMapCss3dHotPath.installTextSource({
5046
+ getModule: () => _module,
5047
+ supportsTextOverlay,
5048
+ getTextOverlayRenderMode,
5049
+ getTextOverlayHostElement,
5050
+ getTextOverlayRootElement,
5051
+ isCss3dMediaNode,
5052
+ restoreCss3dMediaOverlayState,
5053
+ ensureTextOverlaySourceVisible,
5054
+ getNodeId
5055
+ });
5383
5056
 
5384
- if (mode === 'memo') {
5385
- const titleInput = sourceElement.querySelector('.map-node-memo__title');
5386
- const bodyView = sourceElement.querySelector('.map-node-memo__body-view');
5387
- const hostWidth = Math.round(Number(hostPlacement?.baseWidth || sourceElement.offsetWidth || 0));
5388
- const hostHeight = Math.round(Number(hostPlacement?.baseHeight || sourceElement.offsetHeight || 0));
5389
- const titleSignature = titleInput
5390
- ? `${titleInput.offsetLeft}:${titleInput.offsetTop}:${titleInput.offsetWidth}:${titleInput.offsetHeight}:${titleInput.style.display}`
5391
- : 'title:none';
5392
- const bodySignature = bodyView
5393
- ? `${bodyView.offsetLeft}:${bodyView.offsetTop}:${bodyView.offsetWidth}:${bodyView.offsetHeight}:${bodyView.style.display}`
5394
- : 'body:none';
5395
- return `${mode}||${hostWidth}x${hostHeight}||${titleSignature}||${bodySignature}`;
5396
- }
5397
-
5398
- const rootWidth = Math.round(Number(sourceElement.offsetWidth || 0));
5399
- const rootHeight = Math.round(Number(sourceElement.offsetHeight || 0));
5400
- const childSignature = Array.from(sourceElement.children || []).map(child =>
5401
- `${child.tagName}:${child.offsetWidth}:${child.offsetHeight}:${child.style.display}`).join('|');
5402
- return `${mode}||${rootWidth}x${rootHeight}||${childSignature}`;
5403
- }
5057
+ const {
5058
+ getTextOverlayPlacementInfo,
5059
+ doesTextOverlayRectOverlap,
5060
+ isTextOverlayPlacementVisible,
5061
+ getTextOverlayPriority,
5062
+ isAlwaysTextOverlayNode,
5063
+ getTextOverlayContentSignature,
5064
+ getTextOverlayLayoutSignature
5065
+ } = window.MindMapCss3dHotPath.installOverlayGeometry({
5066
+ getNodeId,
5067
+ minWidth: TEXT_OVERLAY_MIN_WIDTH,
5068
+ minHeight: TEXT_OVERLAY_MIN_HEIGHT
5069
+ });
5404
5070
 
5405
5071
  function stripOverlayCloneIds(root) {
5406
5072
  if (!root) {
@@ -24400,6 +24066,7 @@
24400
24066
  function syncCss3dContent(nodeModel, cssObject) {
24401
24067
  if (!nodeModel || !cssObject || !cssObject.element) return;
24402
24068
  const nodeId = String(getNodeId(nodeModel) || '').trim();
24069
+ window.MindMapCss3dHotPath?.invalidateDomRefsByCssObject?.(_module, cssObject, nodeId);
24403
24070
  if (_module && nodeId) {
24404
24071
  const overlayV2Cards = _module._textOverlayV2State?.cards || null;
24405
24072
  const selectionCard = overlayV2Cards?.get?.(`selection:${nodeId}`) || null;
@@ -25170,6 +24837,8 @@
25170
24837
  window.MindMapCss3DManager = {
25171
24838
  activateSelectableTextOverlay: activateSelectableTextOverlay,
25172
24839
  activateNativeTextSelectionSource: activateNativeTextSelectionSource,
24840
+ applyVisibilityDiff: (module, enteredIds, exitedIds) =>
24841
+ window.MindMapCss3dHotPath?.applyVisibilityDiff?.(module, enteredIds, exitedIds) || { complete: false, reason: 'hotpath-unavailable' },
25173
24842
  setNativeTextSelectionOwnerClass: setNativeTextSelectionOwnerClass,
25174
24843
  beginNodeEditingOverlay: beginNodeEditingOverlay,
25175
24844
  bindMemoWheelRouting: bindMemoWheelRouting,
@@ -25181,6 +24850,8 @@
25181
24850
  createNodeViewElement: createNodeViewElement,
25182
24851
  getNodeViewHostPolicy: getNodeViewHostPolicy,
25183
24852
  getNodeViewPrimaryHost: getNodeViewPrimaryHost,
24853
+ getDomRefs: (entry, module = _module) => window.MindMapCss3dHotPath?.getDomRefs?.(entry, module) || null,
24854
+ invalidateDomRefs: (entry) => window.MindMapCss3dHotPath?.invalidateDomRefs?.(entry),
25184
24855
  createEditingOverlayContent: createEditingOverlayContent,
25185
24856
  clearEditingOverlay: clearEditingOverlay,
25186
24857
  getTextInteractionContentSelectors: getTextInteractionContentSelectors,