@mindexec/cli 0.2.223 → 0.2.226

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.223",
3
+ "version": "0.2.226",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -5,7 +5,7 @@
5
5
  const DEBUG = false;
6
6
  const FPS_DEBUG = false;
7
7
  const FRAME_PERF_DEBUG = false;
8
- const MINDMAP_CORE_BUILD_ID = '20260619-ua-motion-hidden-work-v670';
8
+ const MINDMAP_CORE_BUILD_ID = '20260619-ua-motion-hidden-work-v673';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -478,10 +478,12 @@
478
478
  }
479
479
 
480
480
  // Static backgrounds can move as a single viewport surface. Continuous
481
- // themes need real animation frames during interaction; freezing the
482
- // last WebGL canvas makes particle themes look like they are skipping.
481
+ // particle themes keep real animation only when the user explicitly asks
482
+ // for 60fps animation; the default work mode reuses the last WebGL
483
+ // surface during camera motion so one animated background cannot dominate
484
+ // pan/zoom cost on low-power GPUs.
483
485
  if (isContinuousBackgroundTheme(module) === true) {
484
- return false;
486
+ return module?.useAnimation60Fps !== true;
485
487
  }
486
488
 
487
489
  return true;
@@ -536,6 +538,7 @@
536
538
  }
537
539
 
538
540
  const RENDER_DEBUG_STORAGE_KEY = 'mindmap.renderDebug.flags';
541
+ const RENDER_DEBUG_FLAGS_SCHEMA_VERSION = 2;
539
542
  const DEFAULT_RENDER_DEBUG_FLAGS = Object.freeze({
540
543
  enableCss3d: true,
541
544
  enableCss3dTransformSync: true,
@@ -929,7 +932,16 @@
929
932
  return { ...DEFAULT_RENDER_DEBUG_FLAGS };
930
933
  }
931
934
 
932
- return normalizeRenderDebugFlags(JSON.parse(raw));
935
+ const parsed = JSON.parse(raw);
936
+ if (!parsed ||
937
+ typeof parsed !== 'object' ||
938
+ Number(parsed.schemaVersion || 0) !== RENDER_DEBUG_FLAGS_SCHEMA_VERSION ||
939
+ !parsed.flags ||
940
+ typeof parsed.flags !== 'object') {
941
+ return { ...DEFAULT_RENDER_DEBUG_FLAGS };
942
+ }
943
+
944
+ return normalizeRenderDebugFlags(parsed.flags);
933
945
  } catch {
934
946
  return { ...DEFAULT_RENDER_DEBUG_FLAGS };
935
947
  }
@@ -937,7 +949,10 @@
937
949
 
938
950
  function persistRenderDebugFlags() {
939
951
  try {
940
- globalThis.localStorage?.setItem?.(RENDER_DEBUG_STORAGE_KEY, JSON.stringify(renderDebugFlags));
952
+ globalThis.localStorage?.setItem?.(RENDER_DEBUG_STORAGE_KEY, JSON.stringify({
953
+ schemaVersion: RENDER_DEBUG_FLAGS_SCHEMA_VERSION,
954
+ flags: renderDebugFlags
955
+ }));
941
956
  } catch { }
942
957
  }
943
958
 
@@ -1165,9 +1180,13 @@
1165
1180
  }
1166
1181
 
1167
1182
  function tryRunUltraEarlyCameraOnlyFrame(module, loop, frameStart, isCameraMoving, shouldCaptureFramePerf, frameProfTimes, profileSection) {
1183
+ const isCameraNavigationActive =
1184
+ isCameraMoving === true ||
1185
+ module?.isPanning === true ||
1186
+ module?.isZooming === true;
1168
1187
  if (!module ||
1169
1188
  CAMERA_MOTION_VISUAL_ONLY_FAST_PATH_ENABLED !== true ||
1170
- isCameraMoving !== true ||
1189
+ isCameraNavigationActive !== true ||
1171
1190
  module.isLoading === true ||
1172
1191
  module.isSelecting === true ||
1173
1192
  module.isDraggingNode === true ||
@@ -1336,7 +1355,8 @@
1336
1355
  cameraZ: Number((module.camera?.position?.z || 0).toFixed(2)),
1337
1356
  isZooming: module.isZooming === true,
1338
1357
  isPanning: module.isPanning === true,
1339
- isCameraMoving: true,
1358
+ isCameraMoving: isCameraMoving === true,
1359
+ isCameraNavigationActive: true,
1340
1360
  isInLodMode: false,
1341
1361
  lodBand: module.lodRenderer?._currentLodBand || null,
1342
1362
  visibleNodes: Number(module._visibleIds?.size || module._prevVisibleIds?.size || 0),
@@ -1380,9 +1400,13 @@
1380
1400
  }
1381
1401
 
1382
1402
  function tryRunUltraEarlyResidentCameraOnlyFrame(module, loop, frameStart, isCameraMoving, shouldCaptureFramePerf, frameProfTimes, profileSection) {
1403
+ const isCameraNavigationActive =
1404
+ isCameraMoving === true ||
1405
+ module?.isPanning === true ||
1406
+ module?.isZooming === true;
1383
1407
  if (!module ||
1384
1408
  CAMERA_MOTION_VISUAL_ONLY_FAST_PATH_ENABLED !== true ||
1385
- isCameraMoving !== true ||
1409
+ isCameraNavigationActive !== true ||
1386
1410
  module.isLoading === true ||
1387
1411
  module.isSelecting === true ||
1388
1412
  module.isDraggingNode === true ||
@@ -1557,7 +1581,8 @@
1557
1581
  cameraZ: Number((module.camera?.position?.z || 0).toFixed(2)),
1558
1582
  isZooming: module.isZooming === true,
1559
1583
  isPanning: module.isPanning === true,
1560
- isCameraMoving: true,
1584
+ isCameraMoving: isCameraMoving === true,
1585
+ isCameraNavigationActive: true,
1561
1586
  isInLodMode: true,
1562
1587
  lodBand: module.lodRenderer?._currentLodBand || null,
1563
1588
  visibleNodes: Number(module._visibleIds?.size || module._prevVisibleIds?.size || 0),
@@ -6382,20 +6407,28 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6382
6407
  const editingOverlayNodeId = useTextOverlayV2
6383
6408
  ? String(this._textOverlayV2State?.editing?.nodeId || '').trim()
6384
6409
  : String(this._editingOverlayState?.nodeId || '').trim();
6410
+ const hasFocusedTextOverlay = !!selectableOverlayNodeId;
6411
+ const hasEditingOverlay = !!editingOverlayNodeId;
6412
+ const shouldTrackTextOverlayDirty =
6413
+ isPassiveDomOverlayRuntimeEnabled === true ||
6414
+ hasFocusedTextOverlay === true ||
6415
+ hasEditingOverlay === true;
6385
6416
  const selectedOverlayNodeId = String(this.selectedNodeIdJs || '').trim();
6386
6417
  const overlaySelectionKey = `${selectedOverlayNodeId}|${selectableOverlayNodeId}|${editingOverlayNodeId}|${useTextOverlayV2 ? 'v2' : 'legacy'}`;
6387
6418
  if (overlaySelectionKey !== this._lastOverlaySelectionKey) {
6388
6419
  this._lastOverlaySelectionKey = overlaySelectionKey;
6389
- this._overlayDirty = true;
6420
+ if (shouldTrackTextOverlayDirty) {
6421
+ this._overlayDirty = true;
6422
+ }
6390
6423
  }
6391
- if (useTextOverlayV2 && (isNodeInteracting || hasNonCameraNavigationForcedUpdate || !!this.isWindowResizing)) {
6424
+ if (useTextOverlayV2 &&
6425
+ shouldTrackTextOverlayDirty &&
6426
+ (isNodeInteracting || hasNonCameraNavigationForcedUpdate || !!this.isWindowResizing)) {
6392
6427
  // V2 placements depend on live host rects, so drag/resize frames
6393
6428
  // must invalidate overlay layout even when the camera is stationary.
6394
6429
  this._overlayDirty = true;
6395
6430
  }
6396
6431
  _profileSection('pipelineOverlayPlan');
6397
- const hasFocusedTextOverlay = !!selectableOverlayNodeId;
6398
- const hasEditingOverlay = !!editingOverlayNodeId;
6399
6432
  const isUaStyleCameraTransformFrame =
6400
6433
  shouldPreferCameraOnlyMotionPipeline === true &&
6401
6434
  isCss3dEnabled === true &&
@@ -7034,7 +7067,9 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7034
7067
  const hasPassiveDomOverlaySurface =
7035
7068
  shouldRenderPassiveDomTextOverlay ||
7036
7069
  hasLiveInteractiveDomOverlay;
7037
- const overlayV2State = useTextOverlayV2 ? (this._textOverlayV2State || null) : null;
7070
+ const overlayV2State = useTextOverlayV2 && shouldTrackTextOverlayDirty
7071
+ ? (this._textOverlayV2State || null)
7072
+ : null;
7038
7073
  const hasOverlayV2DirtyState = !!(
7039
7074
  overlayV2State && (
7040
7075
  overlayV2State.dirtyLayout === true ||
@@ -7045,10 +7080,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7045
7080
  );
7046
7081
  const hasOverlayFocus = hasFocusedTextOverlay || hasEditingOverlay;
7047
7082
  const hasMotionBlockingOverlayFocus = hasEditingOverlay;
7048
- const visibleOverlayCount = Math.max(
7049
- Number(this._visibleIds?.size || 0),
7050
- Number(this._prevVisibleIds?.size || 0)
7051
- );
7083
+ const visibleOverlayCount = isPassiveDomOverlayRuntimeEnabled
7084
+ ? Math.max(
7085
+ Number(this._visibleIds?.size || 0),
7086
+ Number(this._prevVisibleIds?.size || 0)
7087
+ )
7088
+ : 0;
7052
7089
  const shouldThrottlePassiveOverlayRefresh =
7053
7090
  useTextOverlayV2 &&
7054
7091
  shouldRenderPassiveDomTextOverlay &&
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "mhkJA+oz",
2
+ "version": "36RGH7+F",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -78,7 +78,7 @@
78
78
  "url": "_content/MindExecution.Shared/js/marked.min.js"
79
79
  },
80
80
  {
81
- "hash": "sha256-V9Gke8hWYGzarQib0ePGGTfm3WPoyPWCCtvWLOlO210=",
81
+ "hash": "sha256-FULOYbTxfjP57GtR0ZO6hxJUtWpBojHiKmUJQWOQ6Hw=",
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
83
83
  },
84
84
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: mhkJA+oz */
1
+ /* Manifest version: 36RGH7+F */
2
2
  // Hosted deployments should prefer the network over stale offline caches.
3
3
  // This service worker immediately clears old Blazor offline caches and unregisters itself.
4
4