@mindexec/cli 0.2.432 → 0.2.433

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.432",
3
+ "version": "0.2.433",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -7152,6 +7152,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7152
7152
  'lodCleanup',
7153
7153
  'lodNodeScan',
7154
7154
  'lodResidentApply',
7155
+ 'lodLinePatch',
7155
7156
  'lodImageInstances',
7156
7157
  'lodPositionPatch',
7157
7158
  'lodFallbacks',
@@ -1736,14 +1736,7 @@
1736
1736
  atlasContext.fillRect(0, 0, IMAGE_LOD_ATLAS_SIZE, IMAGE_LOD_ATLAS_SIZE);
1737
1737
  }
1738
1738
  this.imageAtlasTexture = new THREE.CanvasTexture(this.imageAtlasCanvas);
1739
- this.imageAtlasTexture.colorSpace = THREE.SRGBColorSpace;
1740
- this.imageAtlasTexture.minFilter = THREE.LinearFilter;
1741
- this.imageAtlasTexture.magFilter = THREE.LinearFilter;
1742
- this.imageAtlasTexture.wrapS = THREE.ClampToEdgeWrapping;
1743
- this.imageAtlasTexture.wrapT = THREE.ClampToEdgeWrapping;
1744
- this.imageAtlasTexture.flipY = false;
1745
- this.imageAtlasTexture.generateMipmaps = false;
1746
- this.imageAtlasTexture.needsUpdate = true;
1739
+ window.MindMapRenderPlan?.configureImageAtlasTexture?.(this.imageAtlasTexture, THREE);
1747
1740
  }
1748
1741
 
1749
1742
  const nodeVertexShader = `
@@ -1956,6 +1949,7 @@
1956
1949
  polygonOffsetUnits: -10.0
1957
1950
  });
1958
1951
 
1952
+ const imageAtlasOutputColorChunk = window.MindMapRenderPlan?.getImageAtlasOutputColorChunk?.(THREE) || '';
1959
1953
  const imageLodMaterial = new THREE.ShaderMaterial({
1960
1954
  uniforms: {
1961
1955
  uImageAtlas: { value: this.imageAtlasTexture },
@@ -2016,7 +2010,7 @@
2016
2010
  color = mix(color, borderColor, borderMask * (vSelected > 0.5 ? 0.92 : 0.36));
2017
2011
 
2018
2012
  gl_FragColor = vec4(color, 1.0);
2019
- #include <colorspace_fragment>
2013
+ ${imageAtlasOutputColorChunk}
2020
2014
  }
2021
2015
  `,
2022
2016
  transparent: false,
@@ -3420,7 +3414,7 @@
3420
3414
  }
3421
3415
 
3422
3416
  hasResidentDirtyWork(camera = this._module?.camera, module = this._module) {
3423
- return this.getResidentDirtyState(camera, module).dirty === true;
3417
+ return window.MindMapRenderPlan?.hasResidentDirtyWork?.(this, camera, module, getLodBandForCameraZ, buildLodSelectionKey, isAnimatedGifImageModel) === true;
3424
3418
  }
3425
3419
 
3426
3420
  willLodBandChange(camera) {
@@ -4018,17 +4012,10 @@
4018
4012
  }
4019
4013
 
4020
4014
  _clearFullResImageVisuals(nodeObjectsById) {
4021
- if (!this._fullResImageVisualIds || this._fullResImageVisualIds.size === 0) return;
4022
-
4023
- for (const nodeId of this._fullResImageVisualIds) {
4024
- const entry = nodeObjectsById?.get?.(nodeId) || null;
4025
- if (entry) this._hideImageLodFullVisual(entry);
4026
- }
4027
-
4028
- this._fullResImageVisualIds.clear();
4015
+ window.MindMapRenderPlan?.clearFullResImageVisuals?.(this, nodeObjectsById);
4029
4016
  }
4030
4017
 
4031
- _syncFullResImageVisuals(visibleIds, nodeObjectsById, module, lodBand) {
4018
+ _syncFullResImageVisuals(visibleIds, nodeObjectsById, module, lodBand, selectionKey = '') {
4032
4019
  if (this.isInLODMode !== false || !nodeObjectsById) {
4033
4020
  this._clearFullResImageVisuals(nodeObjectsById);
4034
4021
  return;
@@ -4058,7 +4045,10 @@
4058
4045
  if (!entry) continue;
4059
4046
 
4060
4047
  if (supportsCss3dNodeModel(entry?.model)) {
4061
- this._syncCssImageBodyBridge(entry, module);
4048
+ if (window.MindMapRenderPlan?.restoreParkedFullResCss?.(
4049
+ this, entry, module, nodeObjectsById, selectionKey, lodBand, nodeId) !== true) {
4050
+ this._syncCssImageBodyBridge(entry, module);
4051
+ }
4062
4052
  continue;
4063
4053
  }
4064
4054
 
@@ -4663,6 +4653,7 @@
4663
4653
  }
4664
4654
 
4665
4655
  entry.cssObject = cssObject;
4656
+ window.MindMapRenderPlan?.cachePreparedResidentCss?.(this, entry, module, module.nodeObjectsById);
4666
4657
  return true;
4667
4658
  }
4668
4659
 
@@ -4672,8 +4663,7 @@
4672
4663
  !Array.isArray(prioritizedVisible) ||
4673
4664
  !nodeObjectsById ||
4674
4665
  !module ||
4675
- this.isLoading ||
4676
- module.isZooming === true) {
4666
+ this.isLoading) {
4677
4667
  return;
4678
4668
  }
4679
4669
 
@@ -4684,12 +4674,12 @@
4684
4674
  if (!nodeId || this._css3dPrewarmQueuedIds.has(nodeId)) continue;
4685
4675
 
4686
4676
  const entry = nodeObjectsById.get(nodeId);
4687
- if (!entry || entry.cssObject || !supportsCss3dNodeModel(entry.model)) continue;
4677
+ if (!entry || (entry.cssObject && entry.isCssDirty !== true) || !supportsCss3dNodeModel(entry.model)) continue;
4688
4678
  if (allowPanTextPrewarm && !isTextLikeModel(entry.model)) continue;
4689
4679
  if (shouldShowAgentConsoleInLodBand(lodBand) && hasAgentConsoleOpenForEntry(entry)) continue;
4690
4680
 
4691
4681
  this._css3dPrewarmQueuedIds.add(nodeId);
4692
- this._css3dPrewarmQueue.push({ nodeId, module });
4682
+ this._css3dPrewarmQueue.push({ nodeId, module, nodeObjectsById, entry });
4693
4683
  }
4694
4684
 
4695
4685
  if (this._css3dPrewarmQueue.length > 0 && !this._css3dPrewarmProcessing) {
@@ -4715,6 +4705,7 @@
4715
4705
  const module = this._module || null;
4716
4706
  const allowPanTextPrewarm = module?.isPanning === true && module?.isZooming !== true;
4717
4707
  if ((module?.isPanning === true && !allowPanTextPrewarm) || module?.isZooming === true) {
4708
+ shouldContinue = this._css3dPrewarmQueue.length > 0;
4718
4709
  return;
4719
4710
  }
4720
4711
 
@@ -4740,11 +4731,17 @@
4740
4731
 
4741
4732
  this._css3dPrewarmQueuedIds.delete(nodeId);
4742
4733
  const itemModule = item.module || this._module;
4734
+ if (itemModule !== this._module || item.nodeObjectsById !== itemModule?.nodeObjectsById) continue;
4743
4735
  const entry = itemModule?.nodeObjectsById?.get(nodeId);
4744
- if (!entry || entry.cssObject || !supportsCss3dNodeModel(entry.model)) continue;
4736
+ if (!entry || entry !== item.entry || (entry.cssObject && entry.isCssDirty !== true) || !supportsCss3dNodeModel(entry.model)) continue;
4745
4737
  if (allowPanTextPrewarm && !isTextLikeModel(entry.model)) continue;
4746
4738
 
4747
- this._ensureHiddenCss3dObject(entry, itemModule);
4739
+ if (!entry.cssObject && !this._ensureHiddenCss3dObject(entry, itemModule)) continue;
4740
+ if (entry.isCssDirty === true && window.MindMapCss3DManager?.syncCss3dContent) {
4741
+ window.MindMapCss3DManager.syncCss3dContent(entry.model, entry.cssObject);
4742
+ entry.isCssDirty = false;
4743
+ }
4744
+ window.MindMapRenderPlan?.cachePreparedResidentCss?.(this, entry, itemModule, item.nodeObjectsById);
4748
4745
  count++;
4749
4746
  }
4750
4747
 
@@ -5037,6 +5034,7 @@
5037
5034
  if (!entry || !isCssMediaFallbackModel(entry?.model)) {
5038
5035
  return false;
5039
5036
  }
5037
+ if (window.MindMapRenderPlan?.reuseActiveCssMediaFallback?.(this,entry,module)) return true;
5040
5038
 
5041
5039
  if (!entry.cssObject?.element && !this._ensureHiddenCss3dObject(entry, module)) {
5042
5040
  return false;
@@ -5153,6 +5151,12 @@
5153
5151
  const isNodeSelected = nodeId
5154
5152
  ? isNodeSelectedForLod(nodeId, multiSelectedIds, selectedNodeId)
5155
5153
  : false;
5154
+ const hasInteractiveOwner = module?.draggedNodeId === nodeId || this._getCurrentHoveredNodeId(module) === nodeId;
5155
+ if (contentType === 'image' && !isAnimatedGifImageModel(entry.model) &&
5156
+ this._hasActiveImageLodInstance(nodeId) && !isNodeSelected && !hasInteractiveOwner) {
5157
+ this._hideCssMediaLodFallback(entry, { forceMediaGlFallback: true });
5158
+ return false;
5159
+ }
5156
5160
  const shouldKeep = contentType === 'image'
5157
5161
  ? (entry.isVisibleInFrustum === true || isNodeSelected === true)
5158
5162
  : entry.isVisibleInFrustum === true;
@@ -5172,7 +5176,7 @@
5172
5176
 
5173
5177
  const allowImageCssFallbacks = this._shouldUseCssImageFallbackInResidentLod(module, lodBand);
5174
5178
 
5175
- for (const nodeId of Array.from(this._lodImageCssFallbackNodeIds)) {
5179
+ for (const nodeId of window.MindMapRenderPlan?.fallbackBatch?.(this, this._lodImageCssFallbackNodeIds) || []) {
5176
5180
  const entry = nodeObjectsById.get(nodeId) || null;
5177
5181
  if (!entry || !isCssMediaFallbackModel(entry.model)) {
5178
5182
  this._lodImageCssFallbackNodeIds.delete(nodeId);
@@ -5311,39 +5315,7 @@
5311
5315
  }
5312
5316
 
5313
5317
  hasPendingNearCssWarmup(module) {
5314
- if (this.isInLODMode !== false) {
5315
- return false;
5316
- }
5317
-
5318
- if (this._css3dProcessing || this._css3dQueuedMap.size > 0 || this._hasCss3dQueueItems()) {
5319
- return true;
5320
- }
5321
-
5322
- if (this._nearEntryBoostFrames > 0) {
5323
- return true;
5324
- }
5325
-
5326
- const moduleRef = module || this._module || null;
5327
- const visibleIds = this._getNearVisibleIds(moduleRef);
5328
- const nodeObjectsById = moduleRef?.nodeObjectsById || null;
5329
- if (!visibleIds || !nodeObjectsById || visibleIds.size === 0) {
5330
- return false;
5331
- }
5332
-
5333
- for (const nodeId of visibleIds) {
5334
- if (this._nearCssVisibleIds.has(nodeId)) {
5335
- continue;
5336
- }
5337
-
5338
- const entry = nodeObjectsById.get(nodeId);
5339
- if (!entry?.glObject || !supportsCss3dNodeModel(entry.model)) {
5340
- continue;
5341
- }
5342
-
5343
- return true;
5344
- }
5345
-
5346
- return false;
5318
+ return window.MindMapRenderPlan?.hasPendingNearCssWarmup?.(this, module, buildLodSelectionKey, isCss3dRendererEnabled, supportsCss3dNodeModel) === true;
5347
5319
  }
5348
5320
 
5349
5321
 
@@ -5668,40 +5640,8 @@
5668
5640
  return { warmMax, queueMax, perIdle, budgetMs };
5669
5641
  }
5670
5642
 
5671
- _getAdaptiveNearEntryBoostFrames(visibleCount = 0, module = this._module) {
5672
- const avgFrameTime = Number(module?._avgFrameTime || 16);
5673
- const fps = Number(module?._currentFps || 60);
5674
- let frames = 12;
5675
-
5676
- if (visibleCount >= 72) {
5677
- frames = 16;
5678
- }
5679
- if (visibleCount >= 144) {
5680
- frames = 20;
5681
- }
5682
- if (visibleCount >= 240) {
5683
- frames = 24;
5684
- }
5685
-
5686
- if (avgFrameTime > 22 || fps < 42) {
5687
- frames = Math.max(10, frames - 4);
5688
- }
5689
-
5690
- return frames;
5691
- }
5692
-
5693
- _getAdaptiveNearCssActivationConfig(visibleCount = 0, module = this._module, isNearBoostFrame = false) {
5694
- const visibleBudget = Number.isFinite(Number(visibleCount))
5695
- ? Math.max(1, Math.ceil(Number(visibleCount)))
5696
- : Number.MAX_SAFE_INTEGER;
5697
-
5698
- // NEAR/NORMAL is the readable full-res CSS3D path. Splitting activation
5699
- // across frames makes some nodes move or reveal later than others, which
5700
- // is visually worse than a bounded one-tick activation cost.
5701
- return {
5702
- maxPerFrame: visibleBudget,
5703
- budgetMs: Number.MAX_SAFE_INTEGER
5704
- };
5643
+ _getAdaptiveNearCssActivationConfig(visibleCount = 0) {
5644
+ return { maxPerFrame: Math.max(1, Math.ceil(Number(visibleCount) || 1)), budgetMs: Number.MAX_SAFE_INTEGER };
5705
5645
  }
5706
5646
 
5707
5647
  updateLOD(camera, nodeObjectsById, module) {
@@ -5857,10 +5797,11 @@
5857
5797
  }
5858
5798
 
5859
5799
  if (modeChanged) {
5860
- const tModeStart = performance.now(); // ▼ [Timing]
5800
+ const transitionPlan = window.MindMapRenderPlan;
5801
+ transitionPlan?.beginResidentCssTransition?.(
5802
+ this, module, nodeObjectsById, previousLodBand, lodBand, lodSelectionKey);
5861
5803
  this.isInLODMode = shouldUseLOD;
5862
5804
  this._updateMeshVisibility(); // Use helper to respect loading state
5863
- console.log(`[LODRenderer] Mode switched to: ${shouldUseLOD ? 'LOD' : 'FULL-RES'} (Band=${lodBand}, Z=${cameraZ.toFixed(0)})`);
5864
5805
 
5865
5806
  if (this.isInLODMode) {
5866
5807
  this._lodVisualEpoch++;
@@ -5870,11 +5811,12 @@
5870
5811
  if (shouldUseLOD) {
5871
5812
  this._finishFullResHandoff('enter-lod');
5872
5813
  this._clearFullResImageVisuals(nodeObjectsById);
5814
+ if ((this.imageInstanceData?.nodeIds?.length || 0) > 0) {
5815
+ perfTime('lodImageInstances', () => this._applyImageInstanceData());
5816
+ }
5873
5817
  this._fullResMotionHiddenGlIds.clear();
5874
5818
  this._currentLodBand = lodBand;
5875
- if (lodBand === 'MID') {
5876
- this._markLineDetailsDirty();
5877
- }
5819
+ transitionPlan?.ensureResidentLineDetails?.(this, lodBand);
5878
5820
  if (this.instancedHaloMesh) this.instancedHaloMesh.visible = shouldShowInstancedHaloInLodBand(lodBand);
5879
5821
  this.instancedMesh.visible = true;
5880
5822
  if (this.isLoading) {
@@ -5895,6 +5837,7 @@
5895
5837
  cssIdsToHide.add(nodeId);
5896
5838
  }
5897
5839
  const currentNodeMap = this._module?.nodeObjectsById;
5840
+ const activeCssOwnerId = module?.draggedNodeId || this._getCurrentHoveredNodeId(module);
5898
5841
  for (const nodeId of this._activeFullResCssNodeIds) cssIdsToHide.add(nodeId);
5899
5842
  this._clearCss3dQueue();
5900
5843
  this._clearCss3dPrewarmQueue();
@@ -5909,7 +5852,6 @@
5909
5852
  this._primeWarmCss3dCache(prioritizedWarm, currentNodeMap, lodBand);
5910
5853
  this._queueCss3dPrewarm(prioritizedWarm, currentNodeMap, module, lodBand);
5911
5854
  if (currentNodeMap && cssIdsToHide.size > 0) {
5912
- const hideStart = performance.now();
5913
5855
  perfTime('lodCleanup', () => {
5914
5856
  for (const nodeId of cssIdsToHide) {
5915
5857
  const entry = currentNodeMap.get(nodeId);
@@ -5919,15 +5861,18 @@
5919
5861
  const isTextLike = isTextLikeModel(model);
5920
5862
  const shouldKeepConsoleProxy = false;
5921
5863
  if (!isLivePortalCss && isTextLike) {
5922
- if (entry.cssObject) {
5923
- entry.cssObject.visible = false;
5924
- entry.cssObject.element?.style?.setProperty?.('display', 'none', 'important');
5925
- }
5926
- entry.currentType = 'GL';
5864
+ transitionPlan?.parkFullResCss?.(
5865
+ this, entry, module, currentNodeMap, lodSelectionKey, 'text');
5927
5866
  if (entry.glObject) this._hideTextLodFullVisual(entry);
5928
5867
  this._setGlowVisibility(entry, false);
5929
5868
  continue;
5930
5869
  }
5870
+ const contentType = getNodeContentType(model);
5871
+ const isNodeSelected = isNodeSelectedForLod(nodeId, multiSelectedIds, selectedNodeId);
5872
+ if (!isLivePortalCss && contentType === 'image' &&
5873
+ transitionPlan?.parkReadyResidentImage?.(
5874
+ this, entry, module, currentNodeMap, lodSelectionKey, nodeId,
5875
+ isAnimatedGifImageModel(model), isNodeSelected, activeCssOwnerId === nodeId)) continue;
5931
5876
  const element = entry.cssObject?.element || null;
5932
5877
  if (!isLivePortalCss && isCssMediaFallbackModel(model) &&
5933
5878
  entry.cssObject?.visible === true && element && element.style.display !== 'none') {
@@ -5956,9 +5901,7 @@
5956
5901
  entry.currentType = 'GL';
5957
5902
  }
5958
5903
 
5959
- const contentType = getNodeContentType(model);
5960
5904
  const isImage = isImageLodProxyModel(model);
5961
- const isNodeSelected = isNodeSelectedForLod(nodeId, multiSelectedIds, selectedNodeId);
5962
5905
  if (!isLivePortalCss && isTextLike && entry.glObject) {
5963
5906
  this._hideTextLodFullVisual(entry);
5964
5907
  } else if (isImage) {
@@ -5979,7 +5922,6 @@
5979
5922
  module._css3dVisualChangedSinceLastRender = true;
5980
5923
  }
5981
5924
  });
5982
- console.log(`[LODRenderer] CSS3D hidden synchronously in ${(performance.now() - hideStart).toFixed(1)}ms (${cssIdsToHide.size} active)`);
5983
5925
  }
5984
5926
 
5985
5927
  if (module?.renderDebugFlags?.enableCss3dWillChange === true &&
@@ -6020,7 +5962,7 @@
6020
5962
  this._lastNearCssNoWorkKey = '';
6021
5963
  const nearVisibleIds = this._getNearVisibleIds(module);
6022
5964
  this._clearWarmCss3dCache(this._module?.nodeObjectsById, nearVisibleIds);
6023
- this._nearEntryBoostFrames = this._getAdaptiveNearEntryBoostFrames(nearVisibleIds?.size || 0, module);
5965
+ this._nearEntryBoostFrames = 0;
6024
5966
  this._lodCleanupPending = true;
6025
5967
 
6026
5968
  if (module?.renderDebugFlags?.enableCss3dWillChange === true &&
@@ -6095,7 +6037,7 @@
6095
6037
  }
6096
6038
 
6097
6039
  perfTime('fullResImages', () => {
6098
- this._syncFullResImageVisuals(visibleIds, nodeObjectsById, module, lodBand);
6040
+ this._syncFullResImageVisuals(visibleIds, nodeObjectsById, module, lodBand, lodSelectionKey);
6099
6041
  });
6100
6042
 
6101
6043
  const prioritizedVisible = this._getNearVisiblePriority(visibleIds, nodeObjectsById, camera);
@@ -6229,9 +6171,13 @@
6229
6171
  // visible CSS3D surface in-place so the expanded NORMAL
6230
6172
  // band cannot show a blank low-detail shell while a
6231
6173
  // deferred queue waits for motion/cooldown.
6232
- this._showNodeCss3d(entry, module);
6174
+ if (renderPlan?.restoreParkedFullResCss?.(
6175
+ this, entry, module, nodeObjectsById, lodSelectionKey, lodBand, nodeId) !== true) {
6176
+ this._showNodeCss3d(entry, module);
6177
+ }
6233
6178
  processedCount++;
6234
6179
  }
6180
+ renderPlan?.completeFullResTransition?.(this, allowedCssIds.size);
6235
6181
  });
6236
6182
 
6237
6183
  perfTime('fullResHandoff', () => {
@@ -6394,6 +6340,10 @@
6394
6340
  });
6395
6341
  }
6396
6342
 
6343
+ const committedResidentTextCount = window.MindMapRenderPlan?.syncCommittedResidentTextCount?.(
6344
+ this, hasResidentLodInstances, FORCE_RESIDENT_INSTANCES_IN_MID_FAR === true) ?? -1;
6345
+ if (committedResidentTextCount >= 0) totalTextLikeCount = committedResidentTextCount;
6346
+
6397
6347
  const nextVisibleSubsetMode = shouldUseLOD && this._shouldUseVisibleSubsetLod(totalTextLikeCount, lodBand);
6398
6348
  if (this._lodUsesVisibleSubset !== nextVisibleSubsetMode) {
6399
6349
  this._lodUsesVisibleSubset = nextVisibleSubsetMode;
@@ -6419,9 +6369,7 @@
6419
6369
  } else if (lodBand === 'MID') {
6420
6370
  this._setInstancedBaseColor(0xffffff);
6421
6371
  this._setInstancedDefaultBorderColor(0xd1d5db);
6422
- if (previousResidentBand === 'FAR') {
6423
- this._markLineDetailsDirty();
6424
- }
6372
+ if (previousResidentBand === 'FAR') window.MindMapRenderPlan?.ensureResidentLineDetails?.(this, lodBand);
6425
6373
  }
6426
6374
  }
6427
6375
  const shouldSyncTemplateCss3d =
@@ -6884,7 +6832,7 @@
6884
6832
  this._cachedImageNodeCount = imageNodeIds.length;
6885
6833
  }
6886
6834
 
6887
- _updateImageInstanceData(nodeObjectsById) {
6835
+ _updateImageInstanceData(nodeObjectsById, prepareOnly = false) {
6888
6836
  const imagePositions = [];
6889
6837
  const imageSizes = [];
6890
6838
  const imageSelections = [];
@@ -6911,13 +6859,13 @@
6911
6859
 
6912
6860
  if (contentType === 'image' &&
6913
6861
  this._shouldUseCssImageFallbackInResidentLod(this._module, this._currentLodBand)) {
6914
- this._hideImageLodFullVisual(entry);
6862
+ if (!prepareOnly) this._hideImageLodFullVisual(entry);
6915
6863
  return;
6916
6864
  }
6917
6865
 
6918
6866
  const obj = entry.glObject || entry.cssObject;
6919
6867
  if (!obj) {
6920
- this._hideImageLodFullVisual(entry);
6868
+ if (!prepareOnly) this._hideImageLodFullVisual(entry);
6921
6869
  return;
6922
6870
  }
6923
6871
 
@@ -6928,7 +6876,7 @@
6928
6876
  entry.isVisibleInFrustum === true ||
6929
6877
  isNodeSelected === true;
6930
6878
  if (!shouldKeepImageInstance) {
6931
- this._hideImageLodFullVisual(entry);
6879
+ if (!prepareOnly) this._hideImageLodFullVisual(entry);
6932
6880
  return;
6933
6881
  }
6934
6882
 
@@ -6943,7 +6891,7 @@
6943
6891
  if (!isRetryDeferred && isLoadPending) {
6944
6892
  imageBatchPendingIds.add(nodeId);
6945
6893
  }
6946
- if (contentType === 'image') {
6894
+ if (!prepareOnly && contentType === 'image') {
6947
6895
  this._syncImageLodTransitionVisual(
6948
6896
  entry,
6949
6897
  this._currentLodBand || 'MID',
@@ -6951,7 +6899,7 @@
6951
6899
  this._module,
6952
6900
  interactionState
6953
6901
  );
6954
- } else {
6902
+ } else if (!prepareOnly) {
6955
6903
  this._syncCssMediaLodFallback(entry, this._module);
6956
6904
  }
6957
6905
  return;
@@ -6967,10 +6915,10 @@
6967
6915
  imageUvRects.push(uvRect[0], uvRect[1], uvRect[2], uvRect[3]);
6968
6916
  imageNodeIds.push(nodeId);
6969
6917
  this._imageNodeIdToIndex.set(nodeId, imageNodeIds.length - 1);
6970
- if (contentType !== 'image') {
6918
+ if (!prepareOnly && contentType !== 'image') {
6971
6919
  this._hideCssMediaLodFallback(entry);
6972
6920
  }
6973
- this._hideImageLodFullVisual(entry);
6921
+ if (!prepareOnly) this._hideImageLodFullVisual(entry);
6974
6922
  });
6975
6923
 
6976
6924
  if (imageBatchPendingIds.size > 0) {
@@ -7135,35 +7083,7 @@
7135
7083
  }
7136
7084
 
7137
7085
  _hasAnimatedGifCssFallbackCandidates(module = this._module) {
7138
- const nodeObjectsById = module?.nodeObjectsById || this._module?.nodeObjectsById || null;
7139
- if (!nodeObjectsById) {
7140
- return false;
7141
- }
7142
-
7143
- const candidateIds = [];
7144
- const pushId = (value) => {
7145
- const id = String(value || '').trim();
7146
- if (id) candidateIds.push(id);
7147
- };
7148
-
7149
- module?._visibleIds?.forEach?.(pushId);
7150
- module?._prevVisibleIds?.forEach?.(pushId);
7151
- pushId(module?.selectedNodeIdJs);
7152
- module?.multiSelectedNodeIds?.forEach?.(pushId);
7153
- this._lodImageCssFallbackNodeIds?.forEach?.(pushId);
7154
-
7155
- const seenIds = new Set();
7156
- for (const nodeId of candidateIds) {
7157
- if (seenIds.has(nodeId)) continue;
7158
- seenIds.add(nodeId);
7159
-
7160
- const entry = nodeObjectsById.get(nodeId) || null;
7161
- if (isAnimatedGifImageModel(entry?.model)) {
7162
- return true;
7163
- }
7164
- }
7165
-
7166
- return false;
7086
+ return window.MindMapRenderPlan?.hasAnimatedGifCssFallbackCandidates?.(this, module, isAnimatedGifImageModel) === true;
7167
7087
  }
7168
7088
 
7169
7089
  _shouldPreserveCssMediaFallbackForInteraction(entry, module = this._module) {