@mindexec/cli 0.2.256 → 0.2.258

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.256",
3
+ "version": "0.2.258",
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-ua-wheel-zoom-direct-v703';
8
+ const MINDMAP_CORE_BUILD_ID = '20260620-local-grid-wheel-zoom-v705';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -109,6 +109,9 @@
109
109
  const LOCAL_SNAP_GRID_MAX_STEP_PX = 56;
110
110
  const LOCAL_SNAP_GRID_STEP_BUCKET_PX = 2;
111
111
  const LOCAL_SNAP_GRID_OPACITY_BUCKET = 0.04;
112
+ const LOCAL_SNAP_GRID_DEFAULT_STEP_PX = 24;
113
+ const LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX = 240;
114
+ const LOCAL_SNAP_GRID_DEFAULT_OPACITY = 0.42;
112
115
  const CAMERA_MOTION_PARTIAL_FRAME_SKIP_ENABLED = false;
113
116
  const CAMERA_MOTION_VISUAL_ONLY_FAST_PATH_ENABLED = true;
114
117
  const CAMERA_MOTION_WEBGL_CANVAS_TRANSFORM_ENABLED = true;
@@ -3886,6 +3889,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3886
3889
  this._animationIdleCadenceFrame = false;
3887
3890
  this._lastAnimationLoopDelayMs = 0;
3888
3891
  this._lastAnimationWakeReason = '';
3892
+ this._wheelZoomDirectSettleTimer = null;
3889
3893
  // ▲▲▲ [Optimization] ▲▲▲
3890
3894
 
3891
3895
  // ▼▼▼ [State] Loading flag (hide nodes during board load) ▼▼▼
@@ -3978,11 +3982,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3978
3982
  layer.style.backgroundRepeat = 'repeat';
3979
3983
  layer.style.backgroundColor = 'transparent';
3980
3984
  layer.style.borderRadius = '50%';
3985
+ layer.style.overflow = 'hidden';
3986
+ layer.style.clipPath = 'circle(500px at 500px 500px)';
3981
3987
  layer.style.contain = 'strict';
3982
3988
  layer.style.willChange = 'transform, opacity';
3983
3989
  layer.style.transform = 'translate3d(0, 0, 0)';
3984
3990
  layer.style.transition = 'opacity 90ms linear';
3985
- const mask = 'radial-gradient(circle at center, rgba(0,0,0,1) 0%, rgba(0,0,0,0.9) 28%, rgba(0,0,0,0.52) 50%, rgba(0,0,0,0.18) 70%, rgba(0,0,0,0.04) 86%, transparent 100%)';
3991
+ const mask = 'radial-gradient(circle at center, rgba(0,0,0,0.98) 0%, rgba(0,0,0,0.82) 34%, rgba(0,0,0,0.38) 56%, rgba(0,0,0,0.11) 74%, rgba(0,0,0,0.025) 88%, transparent 100%)';
3986
3992
  layer.style.maskImage = mask;
3987
3993
  layer.style.webkitMaskImage = mask;
3988
3994
 
@@ -4001,6 +4007,83 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4001
4007
  return layer;
4002
4008
  }
4003
4009
 
4010
+ _getLocalSnapGridStyleKind() {
4011
+ const themeName = String(this.currentThemeName || '').trim();
4012
+ return themeName === 'SpatialGrid2D' ? 'dot' : 'line';
4013
+ }
4014
+
4015
+ _applyLocalSnapGridStyle(layer, styleKind, smallStepPx, majorStepPx, opacity, keyPrefix = 'style') {
4016
+ if (!layer) {
4017
+ return false;
4018
+ }
4019
+
4020
+ const safeStyleKind = styleKind === 'dot' ? 'dot' : 'line';
4021
+ const safeSmallStep = Math.max(
4022
+ LOCAL_SNAP_GRID_MIN_STEP_PX,
4023
+ Math.min(LOCAL_SNAP_GRID_MAX_STEP_PX, Number(smallStepPx) || LOCAL_SNAP_GRID_DEFAULT_STEP_PX)
4024
+ );
4025
+ const safeMajorStep = Math.max(safeSmallStep, Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX);
4026
+ const safeOpacity = Math.max(0.2, Math.min(0.56, Number(opacity) || LOCAL_SNAP_GRID_DEFAULT_OPACITY));
4027
+ const localGridKey = [
4028
+ keyPrefix,
4029
+ safeStyleKind,
4030
+ Math.round(safeSmallStep * 100),
4031
+ Math.round(safeMajorStep * 100),
4032
+ Math.round(safeOpacity * 100)
4033
+ ].join('|');
4034
+
4035
+ if (localGridKey === this._lastLocalSnapGridKey) {
4036
+ return false;
4037
+ }
4038
+
4039
+ this._lastLocalSnapGridKey = localGridKey;
4040
+ const opacityValue = safeOpacity.toFixed(3);
4041
+ this._lastLocalSnapGridOpacity = opacityValue;
4042
+ if (safeStyleKind === 'dot') {
4043
+ layer.style.backgroundImage = [
4044
+ 'radial-gradient(circle at 0 0, rgba(58, 69, 88, 0.28) 1px, transparent 1.45px)',
4045
+ 'radial-gradient(circle at 0 0, rgba(30, 41, 59, 0.4) 1.6px, transparent 2.05px)'
4046
+ ].join(', ');
4047
+ layer.style.backgroundSize = `${safeSmallStep.toFixed(3)}px ${safeSmallStep.toFixed(3)}px, ${safeMajorStep.toFixed(3)}px ${safeMajorStep.toFixed(3)}px`;
4048
+ layer.style.backgroundPosition = '0 0, 0 0';
4049
+ } else {
4050
+ layer.style.backgroundImage = [
4051
+ 'linear-gradient(to right, rgba(51, 65, 85, 0.16) 1px, transparent 1px)',
4052
+ 'linear-gradient(to bottom, rgba(51, 65, 85, 0.16) 1px, transparent 1px)',
4053
+ 'linear-gradient(to right, rgba(15, 23, 42, 0.28) 1px, transparent 1px)',
4054
+ 'linear-gradient(to bottom, rgba(15, 23, 42, 0.28) 1px, transparent 1px)'
4055
+ ].join(', ');
4056
+ layer.style.backgroundSize = `${safeSmallStep.toFixed(3)}px ${safeSmallStep.toFixed(3)}px, ${safeSmallStep.toFixed(3)}px ${safeSmallStep.toFixed(3)}px, ${safeMajorStep.toFixed(3)}px ${safeMajorStep.toFixed(3)}px, ${safeMajorStep.toFixed(3)}px ${safeMajorStep.toFixed(3)}px`;
4057
+ layer.style.backgroundPosition = '0 0, 0 0, 0 0, 0 0';
4058
+ }
4059
+ if (layer.style.opacity !== opacityValue) {
4060
+ layer.style.opacity = opacityValue;
4061
+ }
4062
+ return true;
4063
+ }
4064
+
4065
+ _ensureLocalSnapGridBaseStyle(layer = null) {
4066
+ const targetLayer = layer || this._ensureLocalSnapGridLayer();
4067
+ if (!targetLayer) {
4068
+ return false;
4069
+ }
4070
+
4071
+ if (this._lastLocalSnapGridKey) {
4072
+ return true;
4073
+ }
4074
+
4075
+ this._applyLocalSnapGridStyle(
4076
+ targetLayer,
4077
+ this._getLocalSnapGridStyleKind(),
4078
+ LOCAL_SNAP_GRID_DEFAULT_STEP_PX,
4079
+ LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX,
4080
+ LOCAL_SNAP_GRID_DEFAULT_OPACITY,
4081
+ 'base'
4082
+ );
4083
+ this._localSnapGridStyleDeferredForZoom = true;
4084
+ return true;
4085
+ }
4086
+
4004
4087
  _setLocalSnapGridVisible(visible, targetOpacity = null) {
4005
4088
  const layer = this._localSnapGridLayer;
4006
4089
  if (!layer) {
@@ -4099,51 +4182,19 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4099
4182
  )
4100
4183
  );
4101
4184
  const majorStepPx = smallStepPx * 10;
4102
- const themeName = String(this.currentThemeName || '').trim();
4103
- const styleKind = themeName === 'SpatialGrid2D' ? 'dot' : 'line';
4104
- const rawOpacity = Math.max(0.34, Math.min(0.82, cameraZ <= 1800 ? 0.72 : 0.72 - ((cameraZ - 1800) / 36000)));
4185
+ const styleKind = this._getLocalSnapGridStyleKind();
4186
+ const rawOpacity = Math.max(0.24, Math.min(0.54, cameraZ <= 1800 ? 0.48 : 0.48 - ((cameraZ - 1800) / 36000)));
4105
4187
  const opacity = Math.max(
4106
- 0.34,
4107
- Math.min(0.82, Math.round(rawOpacity / LOCAL_SNAP_GRID_OPACITY_BUCKET) * LOCAL_SNAP_GRID_OPACITY_BUCKET)
4188
+ 0.24,
4189
+ Math.min(0.54, Math.round(rawOpacity / LOCAL_SNAP_GRID_OPACITY_BUCKET) * LOCAL_SNAP_GRID_OPACITY_BUCKET)
4108
4190
  );
4109
- const localGridKey = [
4110
- styleKind,
4111
- Math.round(smallStepPx * 100),
4112
- Math.round(majorStepPx * 100),
4113
- Math.round(opacity * 100)
4114
- ].join('|');
4115
4191
  const shouldDeferLocalGridStyleForZoom =
4116
4192
  this.isZooming === true &&
4117
4193
  !!this._lastLocalSnapGridKey;
4118
4194
 
4119
- if (localGridKey !== this._lastLocalSnapGridKey &&
4120
- shouldDeferLocalGridStyleForZoom !== true) {
4195
+ if (shouldDeferLocalGridStyleForZoom !== true) {
4121
4196
  this._localSnapGridStyleDeferredForZoom = false;
4122
- this._lastLocalSnapGridKey = localGridKey;
4123
- const opacityValue = opacity.toFixed(3);
4124
- this._lastLocalSnapGridOpacity = opacityValue;
4125
- if (styleKind === 'dot') {
4126
- layer.style.backgroundImage = [
4127
- 'radial-gradient(circle at 0 0, rgba(68, 78, 94, 0.34) 1px, transparent 1.55px)',
4128
- 'radial-gradient(circle at 0 0, rgba(44, 55, 74, 0.5) 1.7px, transparent 2.2px)'
4129
- ].join(', ');
4130
- } else {
4131
- layer.style.backgroundImage = [
4132
- 'linear-gradient(to right, rgba(70, 82, 100, 0.22) 1px, transparent 1px)',
4133
- 'linear-gradient(to bottom, rgba(70, 82, 100, 0.22) 1px, transparent 1px)',
4134
- 'linear-gradient(to right, rgba(42, 55, 75, 0.36) 1px, transparent 1px)',
4135
- 'linear-gradient(to bottom, rgba(42, 55, 75, 0.36) 1px, transparent 1px)'
4136
- ].join(', ');
4137
- }
4138
- layer.style.backgroundSize = styleKind === 'dot'
4139
- ? `${smallStepPx.toFixed(3)}px ${smallStepPx.toFixed(3)}px, ${majorStepPx.toFixed(3)}px ${majorStepPx.toFixed(3)}px`
4140
- : `${smallStepPx.toFixed(3)}px ${smallStepPx.toFixed(3)}px, ${smallStepPx.toFixed(3)}px ${smallStepPx.toFixed(3)}px, ${majorStepPx.toFixed(3)}px ${majorStepPx.toFixed(3)}px, ${majorStepPx.toFixed(3)}px ${majorStepPx.toFixed(3)}px`;
4141
- layer.style.backgroundPosition = styleKind === 'dot'
4142
- ? '0 0, 0 0'
4143
- : '0 0, 0 0, 0 0, 0 0';
4144
- if (layer.style.opacity !== opacityValue) {
4145
- layer.style.opacity = opacityValue;
4146
- }
4197
+ this._applyLocalSnapGridStyle(layer, styleKind, smallStepPx, majorStepPx, opacity);
4147
4198
  } else if (shouldDeferLocalGridStyleForZoom === true) {
4148
4199
  this._localSnapGridStyleDeferredForZoom = true;
4149
4200
  }
@@ -4170,7 +4221,15 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4170
4221
  }
4171
4222
 
4172
4223
  if (!this._localSnapGridLayer?.isConnected || !this._lastLocalSnapGridKey) {
4173
- return this._syncLocalSnapGridLayer(visible);
4224
+ const layer = this._ensureLocalSnapGridLayer();
4225
+ if (!layer) {
4226
+ return false;
4227
+ }
4228
+ if (this.isZooming === true) {
4229
+ this._ensureLocalSnapGridBaseStyle(layer);
4230
+ } else {
4231
+ return this._syncLocalSnapGridLayer(visible);
4232
+ }
4174
4233
  }
4175
4234
 
4176
4235
  const layer = this._localSnapGridLayer;
@@ -4481,6 +4540,36 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4481
4540
  }
4482
4541
  }
4483
4542
 
4543
+ requestWheelZoomDirectSettle(delayMs = CAMERA_ZOOM_END_DELAY_MS + 18) {
4544
+ const safeDelayMs = Math.max(
4545
+ 16,
4546
+ Math.floor(Number(delayMs) || (CAMERA_ZOOM_END_DELAY_MS + 18))
4547
+ );
4548
+ this.clearWheelZoomDirectSettle();
4549
+ this._wheelZoomDirectSettleTimer = setTimeout(() => {
4550
+ this._wheelZoomDirectSettleTimer = null;
4551
+ if (this.isZooming !== true) {
4552
+ return;
4553
+ }
4554
+ if (this._animationLoopRunning === true) {
4555
+ this.requestAnimationWake('wheel-zoom-direct-finalize');
4556
+ } else {
4557
+ this.animate();
4558
+ }
4559
+ }, safeDelayMs);
4560
+ return true;
4561
+ }
4562
+
4563
+ clearWheelZoomDirectSettle() {
4564
+ if (!this._wheelZoomDirectSettleTimer) {
4565
+ return false;
4566
+ }
4567
+
4568
+ clearTimeout(this._wheelZoomDirectSettleTimer);
4569
+ this._wheelZoomDirectSettleTimer = null;
4570
+ return true;
4571
+ }
4572
+
4484
4573
  getCurrentBoardId() {
4485
4574
  return window.mindMap?.activeBoardId || _currentBoardId || null;
4486
4575
  }
@@ -8976,6 +9065,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
8976
9065
  clearTimeout(this._motionGridHideTimer);
8977
9066
  this._motionGridHideTimer = null;
8978
9067
  }
9068
+ this.clearWheelZoomDirectSettle();
8979
9069
  if (this._motionGridLayer) {
8980
9070
  this._motionGridLayer.remove();
8981
9071
  this._motionGridLayer = null;
@@ -6255,6 +6255,7 @@ window.MindMapInteractions = (function () {
6255
6255
  return;
6256
6256
  }
6257
6257
 
6258
+ module.clearWheelZoomDirectSettle?.();
6258
6259
  module.isZooming = false;
6259
6260
  clearZoomMotionChrome(module);
6260
6261
  clearMotionWillChangeEnable(module, { disableIfIdle: true });
@@ -6406,8 +6407,12 @@ window.MindMapInteractions = (function () {
6406
6407
  // ▼▼▼ [Perf] 줌 시작 시 isZooming 플래그 설정 및 will-change 활성화 ▼▼▼
6407
6408
  if (!module.isZooming) {
6408
6409
  module.isZooming = true;
6409
- scheduleZoomMotionChrome(module);
6410
- scheduleMotionWillChangeEnable(module);
6410
+ if (MOTION_DOM_FANOUT_ENABLED === true) {
6411
+ scheduleZoomMotionChrome(module);
6412
+ }
6413
+ if (module.renderDebugFlags?.enableCss3dWillChange === true) {
6414
+ scheduleMotionWillChangeEnable(module);
6415
+ }
6411
6416
  }
6412
6417
  // ▼▼▼ [Fix] 휠 입력 시간 기록 (줌 종료 타이밍 계산용) ▼▼▼
6413
6418
  module._zoomInputTime = performance.now();
@@ -6461,10 +6466,15 @@ window.MindMapInteractions = (function () {
6461
6466
  reason: 'wheel-zoom-direct',
6462
6467
  coalescedWheelEvents: Number(options.coalescedWheelEvents || 0)
6463
6468
  }) === true;
6464
- const settleFrames = presentedDirectly === true ? 1 : 2;
6465
- module._forceUpdateFrames = Math.max(Number(module._forceUpdateFrames || 0), settleFrames);
6466
- module._cameraNavigationForceFrames = Math.max(Number(module._cameraNavigationForceFrames || 0), settleFrames);
6467
- wakeCameraNavigationAnimation(module, presentedDirectly === true ? 'wheel-zoom-direct-settle' : 'wheel-zoom-input');
6469
+ const settleScheduled =
6470
+ presentedDirectly === true &&
6471
+ module.requestWheelZoomDirectSettle?.() === true;
6472
+ if (settleScheduled !== true) {
6473
+ const settleFrames = 2;
6474
+ module._forceUpdateFrames = Math.max(Number(module._forceUpdateFrames || 0), settleFrames);
6475
+ module._cameraNavigationForceFrames = Math.max(Number(module._cameraNavigationForceFrames || 0), settleFrames);
6476
+ wakeCameraNavigationAnimation(module, presentedDirectly === true ? 'wheel-zoom-direct-settle' : 'wheel-zoom-input');
6477
+ }
6468
6478
  // ▲▲▲ [Changed] ▲▲▲
6469
6479
 
6470
6480
  // ▼▼▼ [Perf] 줌 종료 감지 및 CSS3D 업데이트 타이머 ▼▼▼
@@ -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-ua-wheel-zoom-direct-v703" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-ua-wheel-zoom-direct-v703" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-local-grid-wheel-zoom-v705" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-local-grid-wheel-zoom-v705" />
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-ua-wheel-zoom-direct-v703';
582
+ const scriptVersion = '20260620-local-grid-wheel-zoom-v705';
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": "1LdoK7xQ",
2
+ "version": "iiECfCDe",
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-wk7TV857RImYllssWmYrGh0OAxXDQT1oq2VBYCPcS9c=",
81
+ "hash": "sha256-ZD4BuG/qNa9B6cje0Prf1T9lWdnLv3azcQDqcu4LWF4=",
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-+rd+m+8v5jsj9aJFxXoTsdnY9A4TLbvfgGwvkQ5/Rhk=",
109
+ "hash": "sha256-oHhdP4cltwUivQrUKDEMENUIE3cKk29F/IEk2Rg3JPM=",
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-WhrCEBoF7P15FvP1BrCFRsc6Hz4xCr5uVOLHvEjTlc8=",
837
+ "hash": "sha256-cT/4dyrhG2eQz7HKOf4fcBIn4qhPlMHdbA4tqQymjOQ=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: 1LdoK7xQ */
1
+ /* Manifest version: iiECfCDe */
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