@mindexec/cli 0.2.223 → 0.2.225

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.225",
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-v672';
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
 
@@ -6382,20 +6397,28 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6382
6397
  const editingOverlayNodeId = useTextOverlayV2
6383
6398
  ? String(this._textOverlayV2State?.editing?.nodeId || '').trim()
6384
6399
  : String(this._editingOverlayState?.nodeId || '').trim();
6400
+ const hasFocusedTextOverlay = !!selectableOverlayNodeId;
6401
+ const hasEditingOverlay = !!editingOverlayNodeId;
6402
+ const shouldTrackTextOverlayDirty =
6403
+ isPassiveDomOverlayRuntimeEnabled === true ||
6404
+ hasFocusedTextOverlay === true ||
6405
+ hasEditingOverlay === true;
6385
6406
  const selectedOverlayNodeId = String(this.selectedNodeIdJs || '').trim();
6386
6407
  const overlaySelectionKey = `${selectedOverlayNodeId}|${selectableOverlayNodeId}|${editingOverlayNodeId}|${useTextOverlayV2 ? 'v2' : 'legacy'}`;
6387
6408
  if (overlaySelectionKey !== this._lastOverlaySelectionKey) {
6388
6409
  this._lastOverlaySelectionKey = overlaySelectionKey;
6389
- this._overlayDirty = true;
6410
+ if (shouldTrackTextOverlayDirty) {
6411
+ this._overlayDirty = true;
6412
+ }
6390
6413
  }
6391
- if (useTextOverlayV2 && (isNodeInteracting || hasNonCameraNavigationForcedUpdate || !!this.isWindowResizing)) {
6414
+ if (useTextOverlayV2 &&
6415
+ shouldTrackTextOverlayDirty &&
6416
+ (isNodeInteracting || hasNonCameraNavigationForcedUpdate || !!this.isWindowResizing)) {
6392
6417
  // V2 placements depend on live host rects, so drag/resize frames
6393
6418
  // must invalidate overlay layout even when the camera is stationary.
6394
6419
  this._overlayDirty = true;
6395
6420
  }
6396
6421
  _profileSection('pipelineOverlayPlan');
6397
- const hasFocusedTextOverlay = !!selectableOverlayNodeId;
6398
- const hasEditingOverlay = !!editingOverlayNodeId;
6399
6422
  const isUaStyleCameraTransformFrame =
6400
6423
  shouldPreferCameraOnlyMotionPipeline === true &&
6401
6424
  isCss3dEnabled === true &&
@@ -7034,7 +7057,9 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7034
7057
  const hasPassiveDomOverlaySurface =
7035
7058
  shouldRenderPassiveDomTextOverlay ||
7036
7059
  hasLiveInteractiveDomOverlay;
7037
- const overlayV2State = useTextOverlayV2 ? (this._textOverlayV2State || null) : null;
7060
+ const overlayV2State = useTextOverlayV2 && shouldTrackTextOverlayDirty
7061
+ ? (this._textOverlayV2State || null)
7062
+ : null;
7038
7063
  const hasOverlayV2DirtyState = !!(
7039
7064
  overlayV2State && (
7040
7065
  overlayV2State.dirtyLayout === true ||
@@ -7045,10 +7070,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7045
7070
  );
7046
7071
  const hasOverlayFocus = hasFocusedTextOverlay || hasEditingOverlay;
7047
7072
  const hasMotionBlockingOverlayFocus = hasEditingOverlay;
7048
- const visibleOverlayCount = Math.max(
7049
- Number(this._visibleIds?.size || 0),
7050
- Number(this._prevVisibleIds?.size || 0)
7051
- );
7073
+ const visibleOverlayCount = isPassiveDomOverlayRuntimeEnabled
7074
+ ? Math.max(
7075
+ Number(this._visibleIds?.size || 0),
7076
+ Number(this._prevVisibleIds?.size || 0)
7077
+ )
7078
+ : 0;
7052
7079
  const shouldThrottlePassiveOverlayRefresh =
7053
7080
  useTextOverlayV2 &&
7054
7081
  shouldRenderPassiveDomTextOverlay &&
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "mhkJA+oz",
2
+ "version": "DOQXBbI8",
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-dAXTBBzz3gWtBqOMk0spDkHg8jlOGS+d4YmCyxO3QsI=",
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: DOQXBbI8 */
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