@mindexec/cli 0.2.245 → 0.2.247

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.245",
3
+ "version": "0.2.247",
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 = '20260620-local-grid-zoom-fastpath-v692';
8
+ const MINDMAP_CORE_BUILD_ID = '20260620-wheel-zoom-coalesced-v694';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -502,6 +502,34 @@
502
502
  return true;
503
503
  }
504
504
 
505
+ function shouldFreezeWebglSurfaceForZoom(module) {
506
+ return !!(
507
+ module?.isZooming === true &&
508
+ module?.useAnimation60Fps !== true &&
509
+ module?._lastWebglRenderedCameraState
510
+ );
511
+ }
512
+
513
+ function markWebglSurfaceFrozenForZoom(module, mode) {
514
+ if (!module) {
515
+ return false;
516
+ }
517
+
518
+ module._clearWebglCanvasCameraTransform?.();
519
+ module._webglCameraMotionDeferred = true;
520
+ module._themeCameraMotionDeferred = true;
521
+ module._lastWebglRenderInfo = {
522
+ calls: 0,
523
+ triangles: 0,
524
+ points: 0,
525
+ lines: 0,
526
+ skipped: true,
527
+ webglSurfaceFrozenForZoom: true,
528
+ [mode || 'uaZoomFrozenWebgl']: true
529
+ };
530
+ return true;
531
+ }
532
+
505
533
  function deferContinuousThemeForCameraMotion(module) {
506
534
  if (!isContinuousBackgroundTheme(module)) {
507
535
  return false;
@@ -1624,6 +1652,8 @@
1624
1652
  webglCanvasCameraTransform: usedWebglCanvasCameraTransform === true,
1625
1653
  uaUltraEarlyCameraOnly: true
1626
1654
  };
1655
+ } else if (shouldFreezeWebglSurfaceForZoom(module) === true) {
1656
+ markWebglSurfaceFrozenForZoom(module, 'uaUltraEarlyCameraOnly');
1627
1657
  } else {
1628
1658
  module._clearWebglCanvasCameraTransform?.();
1629
1659
  module.renderer.render(module.scene, module.camera);
@@ -1844,6 +1874,8 @@
1844
1874
  webglCanvasCameraTransform: usedWebglCanvasCameraTransform === true,
1845
1875
  uaUltraResidentCameraOnly: true
1846
1876
  };
1877
+ } else if (shouldFreezeWebglSurfaceForZoom(module) === true) {
1878
+ markWebglSurfaceFrozenForZoom(module, 'uaUltraResidentCameraOnly');
1847
1879
  } else {
1848
1880
  module._clearWebglCanvasCameraTransform?.();
1849
1881
  module.renderer.render(module.scene, module.camera);
@@ -6575,18 +6607,22 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6575
6607
  uaVisualOnlyMotion: true
6576
6608
  };
6577
6609
  } else {
6578
- this._clearWebglCanvasCameraTransform();
6579
- this.renderer.render(this.scene, this.camera);
6580
- this._recordWebglRenderedCameraState();
6581
- const renderInfo = this.renderer?.info?.render || null;
6582
- this._lastWebglRenderInfo = renderInfo ? {
6583
- calls: Number(renderInfo.calls || 0),
6584
- triangles: Number(renderInfo.triangles || 0),
6585
- points: Number(renderInfo.points || 0),
6586
- lines: Number(renderInfo.lines || 0),
6587
- uaVisualOnlyMotion: true,
6588
- webglCanvasCameraBootstrap: true
6589
- } : null;
6610
+ if (shouldFreezeWebglSurfaceForZoom(this) === true) {
6611
+ markWebglSurfaceFrozenForZoom(this, 'uaVisualOnlyMotion');
6612
+ } else {
6613
+ this._clearWebglCanvasCameraTransform();
6614
+ this.renderer.render(this.scene, this.camera);
6615
+ this._recordWebglRenderedCameraState();
6616
+ const renderInfo = this.renderer?.info?.render || null;
6617
+ this._lastWebglRenderInfo = renderInfo ? {
6618
+ calls: Number(renderInfo.calls || 0),
6619
+ triangles: Number(renderInfo.triangles || 0),
6620
+ points: Number(renderInfo.points || 0),
6621
+ lines: Number(renderInfo.lines || 0),
6622
+ uaVisualOnlyMotion: true,
6623
+ webglCanvasCameraBootstrap: true
6624
+ } : null;
6625
+ }
6590
6626
  }
6591
6627
  }
6592
6628
  this._syncMotionGridLayerForCameraNavigation(usedWebglCanvasCameraTransformImmediate);
@@ -6742,18 +6778,22 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6742
6778
  uaStationaryVisualMotion: true
6743
6779
  };
6744
6780
  } else {
6745
- this._clearWebglCanvasCameraTransform();
6746
- this.renderer.render(this.scene, this.camera);
6747
- this._recordWebglRenderedCameraState();
6748
- const renderInfo = this.renderer?.info?.render || null;
6749
- this._lastWebglRenderInfo = renderInfo ? {
6750
- calls: Number(renderInfo.calls || 0),
6751
- triangles: Number(renderInfo.triangles || 0),
6752
- points: Number(renderInfo.points || 0),
6753
- lines: Number(renderInfo.lines || 0),
6754
- uaStationaryVisualMotion: true,
6755
- webglCanvasCameraBootstrap: true
6756
- } : null;
6781
+ if (shouldFreezeWebglSurfaceForZoom(this) === true) {
6782
+ markWebglSurfaceFrozenForZoom(this, 'uaStationaryVisualMotion');
6783
+ } else {
6784
+ this._clearWebglCanvasCameraTransform();
6785
+ this.renderer.render(this.scene, this.camera);
6786
+ this._recordWebglRenderedCameraState();
6787
+ const renderInfo = this.renderer?.info?.render || null;
6788
+ this._lastWebglRenderInfo = renderInfo ? {
6789
+ calls: Number(renderInfo.calls || 0),
6790
+ triangles: Number(renderInfo.triangles || 0),
6791
+ points: Number(renderInfo.points || 0),
6792
+ lines: Number(renderInfo.lines || 0),
6793
+ uaStationaryVisualMotion: true,
6794
+ webglCanvasCameraBootstrap: true
6795
+ } : null;
6796
+ }
6757
6797
  }
6758
6798
  }
6759
6799
  this._syncMotionGridLayerForCameraNavigation(usedWebglCanvasCameraTransformStationary);
@@ -6923,18 +6963,22 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6923
6963
  uaResidentVisualOnlyMotion: true
6924
6964
  };
6925
6965
  } else {
6926
- this._clearWebglCanvasCameraTransform();
6927
- this.renderer.render(this.scene, this.camera);
6928
- this._recordWebglRenderedCameraState();
6929
- const renderInfo = this.renderer?.info?.render || null;
6930
- this._lastWebglRenderInfo = renderInfo ? {
6931
- calls: Number(renderInfo.calls || 0),
6932
- triangles: Number(renderInfo.triangles || 0),
6933
- points: Number(renderInfo.points || 0),
6934
- lines: Number(renderInfo.lines || 0),
6935
- uaResidentVisualOnlyMotion: true,
6936
- webglCanvasCameraBootstrap: true
6937
- } : null;
6966
+ if (shouldFreezeWebglSurfaceForZoom(this) === true) {
6967
+ markWebglSurfaceFrozenForZoom(this, 'uaResidentVisualOnlyMotion');
6968
+ } else {
6969
+ this._clearWebglCanvasCameraTransform();
6970
+ this.renderer.render(this.scene, this.camera);
6971
+ this._recordWebglRenderedCameraState();
6972
+ const renderInfo = this.renderer?.info?.render || null;
6973
+ this._lastWebglRenderInfo = renderInfo ? {
6974
+ calls: Number(renderInfo.calls || 0),
6975
+ triangles: Number(renderInfo.triangles || 0),
6976
+ points: Number(renderInfo.points || 0),
6977
+ lines: Number(renderInfo.lines || 0),
6978
+ uaResidentVisualOnlyMotion: true,
6979
+ webglCanvasCameraBootstrap: true
6980
+ } : null;
6981
+ }
6938
6982
  }
6939
6983
  }
6940
6984
  }
@@ -7141,32 +7185,36 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7141
7185
  uaEarlyCameraOnly: true
7142
7186
  };
7143
7187
  } else if (this.renderer && this.scene && this.camera) {
7144
- let hiddenEarlyCameraMotionThemeObject = null;
7145
- this._clearWebglCanvasCameraTransform();
7146
- if (this._isMotionGridThemeEnabled() === true &&
7147
- this.currentThemeObject &&
7148
- this.currentThemeObject.visible !== false) {
7149
- hiddenEarlyCameraMotionThemeObject = this.currentThemeObject;
7150
- hiddenEarlyCameraMotionThemeObject.visible = false;
7151
- }
7152
- try {
7153
- this.renderer.render(this.scene, this.camera);
7154
- } finally {
7155
- if (hiddenEarlyCameraMotionThemeObject) {
7156
- hiddenEarlyCameraMotionThemeObject.visible = true;
7188
+ if (shouldFreezeWebglSurfaceForZoom(this) === true) {
7189
+ markWebglSurfaceFrozenForZoom(this, 'uaEarlyCameraOnly');
7190
+ } else {
7191
+ let hiddenEarlyCameraMotionThemeObject = null;
7192
+ this._clearWebglCanvasCameraTransform();
7193
+ if (this._isMotionGridThemeEnabled() === true &&
7194
+ this.currentThemeObject &&
7195
+ this.currentThemeObject.visible !== false) {
7196
+ hiddenEarlyCameraMotionThemeObject = this.currentThemeObject;
7197
+ hiddenEarlyCameraMotionThemeObject.visible = false;
7157
7198
  }
7199
+ try {
7200
+ this.renderer.render(this.scene, this.camera);
7201
+ } finally {
7202
+ if (hiddenEarlyCameraMotionThemeObject) {
7203
+ hiddenEarlyCameraMotionThemeObject.visible = true;
7204
+ }
7205
+ }
7206
+ this._recordWebglRenderedCameraState();
7207
+ const renderInfo = this.renderer?.info?.render || null;
7208
+ this._lastWebglRenderInfo = renderInfo ? {
7209
+ calls: Number(renderInfo.calls || 0),
7210
+ triangles: Number(renderInfo.triangles || 0),
7211
+ points: Number(renderInfo.points || 0),
7212
+ lines: Number(renderInfo.lines || 0),
7213
+ backgroundThemeHidden: hiddenEarlyCameraMotionThemeObject ? true : undefined,
7214
+ uaEarlyCameraOnly: true,
7215
+ webglCanvasCameraBootstrap: true
7216
+ } : null;
7158
7217
  }
7159
- this._recordWebglRenderedCameraState();
7160
- const renderInfo = this.renderer?.info?.render || null;
7161
- this._lastWebglRenderInfo = renderInfo ? {
7162
- calls: Number(renderInfo.calls || 0),
7163
- triangles: Number(renderInfo.triangles || 0),
7164
- points: Number(renderInfo.points || 0),
7165
- lines: Number(renderInfo.lines || 0),
7166
- backgroundThemeHidden: hiddenEarlyCameraMotionThemeObject ? true : undefined,
7167
- uaEarlyCameraOnly: true,
7168
- webglCanvasCameraBootstrap: true
7169
- } : null;
7170
7218
  } else {
7171
7219
  this._lastWebglRenderInfo = {
7172
7220
  calls: 0,
@@ -8000,33 +8048,40 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
8000
8048
  webglCanvasCameraTransform: true
8001
8049
  };
8002
8050
  } else {
8003
- this._clearWebglCanvasCameraTransform();
8004
- if (shouldHideBackgroundThemeDuringCameraNavigation) {
8005
- hiddenCameraMotionThemeObject = this.currentThemeObject;
8006
- hiddenCameraMotionThemeObject.visible = false;
8007
- }
8008
- try {
8009
- this.renderer.render(this.scene, this.camera);
8010
- } finally {
8011
- if (hiddenCameraMotionThemeObject) {
8012
- hiddenCameraMotionThemeObject.visible = true;
8051
+ if (shouldFreezeWebglSurfaceForZoom(this) === true) {
8052
+ markWebglSurfaceFrozenForZoom(this, 'normalWebglRender');
8053
+ } else {
8054
+ this._clearWebglCanvasCameraTransform();
8055
+ if (shouldHideBackgroundThemeDuringCameraNavigation) {
8056
+ hiddenCameraMotionThemeObject = this.currentThemeObject;
8057
+ hiddenCameraMotionThemeObject.visible = false;
8058
+ }
8059
+ try {
8060
+ this.renderer.render(this.scene, this.camera);
8061
+ } finally {
8062
+ if (hiddenCameraMotionThemeObject) {
8063
+ hiddenCameraMotionThemeObject.visible = true;
8064
+ }
8013
8065
  }
8066
+ this._recordWebglRenderedCameraState();
8067
+ const renderInfo = this.renderer?.info?.render || null;
8068
+ this._lastWebglRenderInfo = renderInfo ? {
8069
+ calls: Number(renderInfo.calls || 0),
8070
+ triangles: Number(renderInfo.triangles || 0),
8071
+ points: Number(renderInfo.points || 0),
8072
+ lines: Number(renderInfo.lines || 0),
8073
+ backgroundThemeHidden: hiddenCameraMotionThemeObject ? true : undefined
8074
+ } : null;
8014
8075
  }
8015
- this._recordWebglRenderedCameraState();
8016
- const renderInfo = this.renderer?.info?.render || null;
8017
- this._lastWebglRenderInfo = renderInfo ? {
8018
- calls: Number(renderInfo.calls || 0),
8019
- triangles: Number(renderInfo.triangles || 0),
8020
- points: Number(renderInfo.points || 0),
8021
- lines: Number(renderInfo.lines || 0),
8022
- backgroundThemeHidden: hiddenCameraMotionThemeObject ? true : undefined
8023
- } : null;
8024
8076
  }
8025
8077
  } else if (isWebglRenderEnabled) {
8026
8078
  if (isPureCss3dCameraMotionFrame === true) {
8027
8079
  this._webglCameraMotionDeferred = true;
8028
8080
  }
8081
+ const shouldFreezeWebglCanvasTransformForZoom =
8082
+ shouldFreezeWebglSurfaceForZoom(this) === true;
8029
8083
  if (isCameraNavigationOnlyInteractiveFrame === true &&
8084
+ shouldFreezeWebglCanvasTransformForZoom !== true &&
8030
8085
  canUseWebglCanvasTransformForCameraMotion(this) === true) {
8031
8086
  usedWebglCanvasCameraTransform = this._applyWebglCanvasCameraTransform() === true;
8032
8087
  } else {
@@ -8038,7 +8093,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
8038
8093
  points: 0,
8039
8094
  lines: 0,
8040
8095
  skipped: true,
8041
- webglCanvasCameraTransform: usedWebglCanvasCameraTransform || undefined
8096
+ webglCanvasCameraTransform: usedWebglCanvasCameraTransform || undefined,
8097
+ webglSurfaceFrozenForZoom: shouldFreezeWebglCanvasTransformForZoom || undefined
8042
8098
  };
8043
8099
  } else if (isBoardLoading) {
8044
8100
  this._clearWebglCanvasCameraTransform();
@@ -6,7 +6,7 @@ window.MindMapInteractions = (function () {
6
6
  const MOTION_DOM_FANOUT_DELAY_MS = 180;
7
7
  const MOTION_DOM_FANOUT_ENABLED = false;
8
8
  const MOTION_WILL_CHANGE_ENABLE_DELAY_MS = 240;
9
- const WHEEL_ZOOM_TARGET_UPDATE_MODE = 'direct';
9
+ const WHEEL_ZOOM_TARGET_UPDATE_MODE = 'raf-coalesced-direct';
10
10
  const PRIMARY_CLICK_DELAY_MS = 280;
11
11
  const BACKGROUND_PRIMARY_CLICK_DELAY_MS = 320;
12
12
  const eventHandlers = new WeakMap();
@@ -6036,12 +6036,29 @@ window.MindMapInteractions = (function () {
6036
6036
  lastClientY: 0, // 마지막 마우스 Y 위치
6037
6037
  pending: false, // rAF 대기 중 여부
6038
6038
  notchPending: false, // 계단식 zoom rAF 대기 중 여부
6039
- frameId: null // rAF ID
6039
+ frameId: null, // rAF ID
6040
+ eventCount: 0
6040
6041
  });
6041
- }
6042
+ }
6042
6043
  return wheelBuffers.get(module);
6043
6044
  }
6044
6045
 
6046
+ function scheduleWheelZoomFrame(module, wheelBuffer, callback) {
6047
+ if (!module || !wheelBuffer || wheelBuffer.pending === true) {
6048
+ return;
6049
+ }
6050
+
6051
+ wheelBuffer.pending = true;
6052
+ const scheduleFrame = typeof requestAnimationFrame === 'function'
6053
+ ? requestAnimationFrame
6054
+ : (cb) => setTimeout(() => cb(performance.now()), 16);
6055
+ wheelBuffer.frameId = scheduleFrame(() => {
6056
+ wheelBuffer.pending = false;
6057
+ wheelBuffer.frameId = null;
6058
+ callback?.();
6059
+ });
6060
+ }
6061
+
6045
6062
  function matchesLetterShortcut(e, code, fallbackKey) {
6046
6063
  if (!e) {
6047
6064
  return false;
@@ -6303,35 +6320,38 @@ window.MindMapInteractions = (function () {
6303
6320
  return;
6304
6321
  }
6305
6322
 
6306
- wheelBuffer.deltaY = 0;
6307
- wheelBuffer.pending = false;
6308
- wheelBuffer.frameId = null;
6309
- wheelBuffer.lastClientX = e.clientX;
6310
- wheelBuffer.lastClientY = e.clientY;
6311
- performCameraZoomBuffered(module, deltaY, e.clientX, e.clientY);
6312
- }
6313
-
6314
- function bufferSteppedWheelZoomEvent(module, e, analysis = null) {
6315
- const wheelBuffer = getWheelBuffer(module);
6316
- const normalizedDeltaY = Number((analysis || getWheelEventAnalysis(module, e)).deltaY || 0);
6317
- const notchDeltaY = e?.deltaMode === 0
6318
- ? normalizedDeltaY
6319
- : Math.sign(normalizedDeltaY) * WHEEL_ZOOM_NOTCH_DELTA;
6320
- wheelBuffer.notchDeltaY += notchDeltaY;
6323
+ wheelBuffer.deltaY += deltaY;
6321
6324
  wheelBuffer.lastClientX = e.clientX;
6322
6325
  wheelBuffer.lastClientY = e.clientY;
6326
+ wheelBuffer.eventCount = Math.min(1000, Number(wheelBuffer.eventCount || 0) + 1);
6327
+
6328
+ scheduleWheelZoomFrame(module, wheelBuffer, () => {
6329
+ const accumulatedDeltaY = Number(wheelBuffer.deltaY || 0);
6330
+ const clientX = wheelBuffer.lastClientX;
6331
+ const clientY = wheelBuffer.lastClientY;
6332
+ const eventCount = Number(wheelBuffer.eventCount || 0);
6333
+ wheelBuffer.deltaY = 0;
6334
+ wheelBuffer.eventCount = 0;
6335
+ if (Math.abs(accumulatedDeltaY) <= 0.001) {
6336
+ return;
6337
+ }
6323
6338
 
6324
- wheelBuffer.notchPending = false;
6339
+ performCameraZoomBuffered(module, accumulatedDeltaY, clientX, clientY, {
6340
+ coalescedWheelEvents: eventCount
6341
+ });
6342
+ });
6343
+ }
6325
6344
 
6326
- const absDelta = Math.abs(wheelBuffer.notchDeltaY);
6327
- if (absDelta < WHEEL_ZOOM_NOTCH_DELTA) {
6345
+ function flushSteppedWheelZoomBuffer(module, wheelBuffer) {
6346
+ const nextAbsDelta = Math.abs(Number(wheelBuffer?.notchDeltaY || 0));
6347
+ if (nextAbsDelta < WHEEL_ZOOM_NOTCH_DELTA) {
6328
6348
  return;
6329
6349
  }
6330
6350
 
6331
6351
  const direction = Math.sign(wheelBuffer.notchDeltaY);
6332
6352
  const notchCount = Math.min(
6333
6353
  WHEEL_ZOOM_MAX_NOTCHES_PER_FRAME,
6334
- Math.max(1, Math.floor(absDelta / WHEEL_ZOOM_NOTCH_DELTA))
6354
+ Math.max(1, Math.floor(nextAbsDelta / WHEEL_ZOOM_NOTCH_DELTA))
6335
6355
  );
6336
6356
  wheelBuffer.notchDeltaY -= direction * notchCount * WHEEL_ZOOM_NOTCH_DELTA;
6337
6357
 
@@ -6340,8 +6360,33 @@ window.MindMapInteractions = (function () {
6340
6360
  direction * notchCount * WHEEL_ZOOM_NOTCH_DELTA,
6341
6361
  wheelBuffer.lastClientX,
6342
6362
  wheelBuffer.lastClientY,
6343
- { fixedZoomStep: direction * notchCount * WHEEL_ZOOM_NOTCH_STEP }
6363
+ {
6364
+ fixedZoomStep: direction * notchCount * WHEEL_ZOOM_NOTCH_STEP,
6365
+ coalescedWheelEvents: notchCount
6366
+ }
6344
6367
  );
6368
+
6369
+ if (Math.abs(Number(wheelBuffer.notchDeltaY || 0)) >= WHEEL_ZOOM_NOTCH_DELTA) {
6370
+ scheduleWheelZoomFrame(module, wheelBuffer, () => flushSteppedWheelZoomBuffer(module, wheelBuffer));
6371
+ }
6372
+ }
6373
+
6374
+ function bufferSteppedWheelZoomEvent(module, e, analysis = null) {
6375
+ const wheelBuffer = getWheelBuffer(module);
6376
+ const normalizedDeltaY = Number((analysis || getWheelEventAnalysis(module, e)).deltaY || 0);
6377
+ const notchDeltaY = e?.deltaMode === 0
6378
+ ? normalizedDeltaY
6379
+ : Math.sign(normalizedDeltaY) * WHEEL_ZOOM_NOTCH_DELTA;
6380
+ wheelBuffer.notchDeltaY += notchDeltaY;
6381
+ wheelBuffer.lastClientX = e.clientX;
6382
+ wheelBuffer.lastClientY = e.clientY;
6383
+
6384
+ const absDelta = Math.abs(wheelBuffer.notchDeltaY);
6385
+ if (absDelta < WHEEL_ZOOM_NOTCH_DELTA) {
6386
+ return;
6387
+ }
6388
+
6389
+ scheduleWheelZoomFrame(module, wheelBuffer, () => flushSteppedWheelZoomBuffer(module, wheelBuffer));
6345
6390
  }
6346
6391
 
6347
6392
  /**
@@ -7,8 +7,8 @@
7
7
  <title>MindExec | Business Execution OS for solo builders</title>
8
8
  <meta name="description" content="MindExec is an AI business execution OS for solo builders who want to turn notes, research, assets, and repeatable execution Skills into revenue-producing work." />
9
9
  <base href="/" />
10
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-local-grid-zoom-fastpath-v692" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-local-grid-zoom-fastpath-v692" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-wheel-zoom-coalesced-v694" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-wheel-zoom-coalesced-v694" />
12
12
  <!-- ?占썩뼹??Font Awesome (local) ?占썩뼹??-->
13
13
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
14
14
  <!-- ?占썩뼯??-->
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260620-local-grid-zoom-fastpath-v692';
582
+ const scriptVersion = '20260620-wheel-zoom-coalesced-v694';
583
583
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
584
584
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
585
585
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "V9ycITdg",
2
+ "version": "pBArUTe0",
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-F2DLnC1W9MpqQpN9fQ+jhytH0yY5qXSVR6Zte8MlE1U=",
81
+ "hash": "sha256-pWrwCuH6PnP3EM14iVUcyqO/wvWqdP27TAjX1u8Oi9s=",
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
83
83
  },
84
84
  {
@@ -106,7 +106,7 @@
106
106
  "url": "_content/MindExecution.Shared/js/mind-map-glow-shader.js"
107
107
  },
108
108
  {
109
- "hash": "sha256-GjdoWt5yAo2TwVMIWucHvHnXrpWproSpGT6fc3C/vVo=",
109
+ "hash": "sha256-uuicDvKUL3Xr/yyKQAMMyH+0wvMeVU6WyGzfQ5z2mec=",
110
110
  "url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
111
111
  },
112
112
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-Vjm3aIREm7YeZlXHlJrl1enYS2ao7Pq65n8gpVqnSyQ=",
837
+ "hash": "sha256-NSGGz12RIgG18+CRXfF2nzP9qDBUAL3ORI7FboWsJa0=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: V9ycITdg */
1
+ /* Manifest version: pBArUTe0 */
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