@mindexec/cli 0.2.257 → 0.2.259

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.257",
3
+ "version": "0.2.259",
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-settle-v704';
8
+ const MINDMAP_CORE_BUILD_ID = '20260620-css3d-flat-wheel-v707';
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;
@@ -1664,7 +1667,7 @@
1664
1667
  });
1665
1668
  }
1666
1669
 
1667
- updateCursorDomElement(module);
1670
+ module._cursorDomDeferredForMotion = true;
1668
1671
 
1669
1672
  const isWebglRenderEnabled = renderDebugFlags.enableWebglRender !== false;
1670
1673
  let usedWebglCanvasCameraTransform = false;
@@ -1890,7 +1893,7 @@
1890
1893
  });
1891
1894
  }
1892
1895
 
1893
- updateCursorDomElement(module);
1896
+ module._cursorDomDeferredForMotion = true;
1894
1897
 
1895
1898
  let usedWebglCanvasCameraTransform = false;
1896
1899
  if (isWebglRenderEnabled === true && module.renderer && module.scene && module.camera) {
@@ -3979,11 +3982,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3979
3982
  layer.style.backgroundRepeat = 'repeat';
3980
3983
  layer.style.backgroundColor = 'transparent';
3981
3984
  layer.style.borderRadius = '50%';
3985
+ layer.style.overflow = 'hidden';
3986
+ layer.style.clipPath = 'circle(500px at 500px 500px)';
3982
3987
  layer.style.contain = 'strict';
3983
3988
  layer.style.willChange = 'transform, opacity';
3984
3989
  layer.style.transform = 'translate3d(0, 0, 0)';
3985
3990
  layer.style.transition = 'opacity 90ms linear';
3986
- 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%)';
3987
3992
  layer.style.maskImage = mask;
3988
3993
  layer.style.webkitMaskImage = mask;
3989
3994
 
@@ -4002,6 +4007,83 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4002
4007
  return layer;
4003
4008
  }
4004
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
+
4005
4087
  _setLocalSnapGridVisible(visible, targetOpacity = null) {
4006
4088
  const layer = this._localSnapGridLayer;
4007
4089
  if (!layer) {
@@ -4100,51 +4182,19 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4100
4182
  )
4101
4183
  );
4102
4184
  const majorStepPx = smallStepPx * 10;
4103
- const themeName = String(this.currentThemeName || '').trim();
4104
- const styleKind = themeName === 'SpatialGrid2D' ? 'dot' : 'line';
4105
- 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)));
4106
4187
  const opacity = Math.max(
4107
- 0.34,
4108
- 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)
4109
4190
  );
4110
- const localGridKey = [
4111
- styleKind,
4112
- Math.round(smallStepPx * 100),
4113
- Math.round(majorStepPx * 100),
4114
- Math.round(opacity * 100)
4115
- ].join('|');
4116
4191
  const shouldDeferLocalGridStyleForZoom =
4117
4192
  this.isZooming === true &&
4118
4193
  !!this._lastLocalSnapGridKey;
4119
4194
 
4120
- if (localGridKey !== this._lastLocalSnapGridKey &&
4121
- shouldDeferLocalGridStyleForZoom !== true) {
4195
+ if (shouldDeferLocalGridStyleForZoom !== true) {
4122
4196
  this._localSnapGridStyleDeferredForZoom = false;
4123
- this._lastLocalSnapGridKey = localGridKey;
4124
- const opacityValue = opacity.toFixed(3);
4125
- this._lastLocalSnapGridOpacity = opacityValue;
4126
- if (styleKind === 'dot') {
4127
- layer.style.backgroundImage = [
4128
- 'radial-gradient(circle at 0 0, rgba(68, 78, 94, 0.34) 1px, transparent 1.55px)',
4129
- 'radial-gradient(circle at 0 0, rgba(44, 55, 74, 0.5) 1.7px, transparent 2.2px)'
4130
- ].join(', ');
4131
- } else {
4132
- layer.style.backgroundImage = [
4133
- 'linear-gradient(to right, rgba(70, 82, 100, 0.22) 1px, transparent 1px)',
4134
- 'linear-gradient(to bottom, rgba(70, 82, 100, 0.22) 1px, transparent 1px)',
4135
- 'linear-gradient(to right, rgba(42, 55, 75, 0.36) 1px, transparent 1px)',
4136
- 'linear-gradient(to bottom, rgba(42, 55, 75, 0.36) 1px, transparent 1px)'
4137
- ].join(', ');
4138
- }
4139
- layer.style.backgroundSize = styleKind === 'dot'
4140
- ? `${smallStepPx.toFixed(3)}px ${smallStepPx.toFixed(3)}px, ${majorStepPx.toFixed(3)}px ${majorStepPx.toFixed(3)}px`
4141
- : `${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`;
4142
- layer.style.backgroundPosition = styleKind === 'dot'
4143
- ? '0 0, 0 0'
4144
- : '0 0, 0 0, 0 0, 0 0';
4145
- if (layer.style.opacity !== opacityValue) {
4146
- layer.style.opacity = opacityValue;
4147
- }
4197
+ this._applyLocalSnapGridStyle(layer, styleKind, smallStepPx, majorStepPx, opacity);
4148
4198
  } else if (shouldDeferLocalGridStyleForZoom === true) {
4149
4199
  this._localSnapGridStyleDeferredForZoom = true;
4150
4200
  }
@@ -4171,7 +4221,15 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4171
4221
  }
4172
4222
 
4173
4223
  if (!this._localSnapGridLayer?.isConnected || !this._lastLocalSnapGridKey) {
4174
- 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
+ }
4175
4233
  }
4176
4234
 
4177
4235
  const layer = this._localSnapGridLayer;
@@ -5312,7 +5370,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5312
5370
  coalescedWheelEvents: Number(options?.coalescedWheelEvents || 0)
5313
5371
  });
5314
5372
 
5315
- updateCursorDomElement(this);
5373
+ this._cursorDomDeferredForMotion = true;
5316
5374
 
5317
5375
  let usedWebglCanvasCameraTransform = false;
5318
5376
  if (canRenderWebgl === true) {
@@ -6425,6 +6483,10 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6425
6483
  this._wasResizingLastFrame = this.isResizing === true;
6426
6484
  if (zoomEndedThisFrame || panEndedThisFrame || cameraEndedThisFrame || resizeEndedThisFrame) {
6427
6485
  this._lastMotionEndAt = frameStart;
6486
+ if (this._cursorDomDeferredForMotion === true) {
6487
+ updateCursorDomElement(this);
6488
+ this._cursorDomDeferredForMotion = false;
6489
+ }
6428
6490
  if (cameraEndedThisFrame) {
6429
6491
  this._cameraNavigationOverlayInputTime = 0;
6430
6492
  this._overlayDirty = true;
@@ -6759,7 +6821,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6759
6821
  });
6760
6822
  }
6761
6823
 
6762
- updateCursorDomElement(this);
6824
+ this._cursorDomDeferredForMotion = true;
6763
6825
  const shouldFreezeWebglCanvasForImmediateZoom =
6764
6826
  shouldFreezeWebglSurfaceForZoom(this) === true;
6765
6827
  const canReuseWebglCanvasForImmediateMotion = !!(
@@ -6934,7 +6996,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6934
6996
  this._deferPassiveOverlayRefresh = true;
6935
6997
  }
6936
6998
 
6937
- updateCursorDomElement(this);
6999
+ this._cursorDomDeferredForMotion = true;
6938
7000
  const shouldFreezeWebglCanvasForStationaryZoom =
6939
7001
  shouldFreezeWebglSurfaceForZoom(this) === true;
6940
7002
  const canReuseWebglCanvasForStationaryMotion = !!(
@@ -7124,7 +7186,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7124
7186
  });
7125
7187
  }
7126
7188
 
7127
- updateCursorDomElement(this);
7189
+ this._cursorDomDeferredForMotion = true;
7128
7190
  const shouldFreezeWebglCanvasForResidentZoom =
7129
7191
  shouldFreezeWebglSurfaceForZoom(this) === true;
7130
7192
  const canReuseWebglCanvasForResidentMotion = !!(
@@ -7372,7 +7434,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7372
7434
  let usedWebglCanvasCameraTransformEarly = false;
7373
7435
  if (shouldSampleWebglDuringCameraMotion &&
7374
7436
  shouldFreezeWebglCanvasForEarlyZoom !== true) {
7375
- updateCursorDomElement(this);
7437
+ this._cursorDomDeferredForMotion = true;
7376
7438
  if (isWebglRenderEnabled && this.renderer && this.scene && this.camera) {
7377
7439
  this._clearWebglCanvasCameraTransform();
7378
7440
  this.renderer.render(this.scene, this.camera);
@@ -8151,7 +8213,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
8151
8213
  const shouldSampleWebglDuringCameraMotion =
8152
8214
  renderDebugFlags.sampleWebglDuringCameraMotion === true &&
8153
8215
  (this.frameCount % CAMERA_MOTION_WEBGL_FRAME_INTERVAL) === 0;
8154
- if (!isPureCss3dCameraMotionFrame || shouldSampleWebglDuringCameraMotion) {
8216
+ if (isCameraNavigationOnlyInteractiveFrame === true ||
8217
+ this.isPanning === true ||
8218
+ this.isZooming === true ||
8219
+ isCameraMoving === true) {
8220
+ this._cursorDomDeferredForMotion = true;
8221
+ } else if (!isPureCss3dCameraMotionFrame || shouldSampleWebglDuringCameraMotion) {
8155
8222
  updateCursorDomElement(this);
8156
8223
  }
8157
8224
 
@@ -6407,8 +6407,12 @@ window.MindMapInteractions = (function () {
6407
6407
  // ▼▼▼ [Perf] 줌 시작 시 isZooming 플래그 설정 및 will-change 활성화 ▼▼▼
6408
6408
  if (!module.isZooming) {
6409
6409
  module.isZooming = true;
6410
- scheduleZoomMotionChrome(module);
6411
- scheduleMotionWillChangeEnable(module);
6410
+ if (MOTION_DOM_FANOUT_ENABLED === true) {
6411
+ scheduleZoomMotionChrome(module);
6412
+ }
6413
+ if (module.renderDebugFlags?.enableCss3dWillChange === true) {
6414
+ scheduleMotionWillChangeEnable(module);
6415
+ }
6412
6416
  }
6413
6417
  // ▼▼▼ [Fix] 휠 입력 시간 기록 (줌 종료 타이밍 계산용) ▼▼▼
6414
6418
  module._zoomInputTime = performance.now();
@@ -31,7 +31,7 @@
31
31
  }
32
32
 
33
33
  function CSS3DRenderer(){
34
- var _width, _height; var _widthHalf, _heightHalf; var cache = { camera:{ fov:0, style:'' }, objects: new WeakMap() };
34
+ var _width, _height; var _widthHalf, _heightHalf; var cache = { camera:{ fov:0, style:'', mode:'matrix3d' }, objects: new WeakMap() };
35
35
  var domElement = document.createElement('div'); domElement.style.overflow = 'hidden'; this.domElement = domElement;
36
36
  var cameraElement = document.createElement('div'); cameraElement.style.webkitTransformStyle = cameraElement.style.transformStyle = 'preserve-3d'; cameraElement.style.pointerEvents = 'none'; cameraElement.style.webkitTransformOrigin = cameraElement.style.transformOrigin = '0 0'; domElement.appendChild(cameraElement);
37
37
 
@@ -41,7 +41,13 @@
41
41
  function getCameraCSSMatrix(matrix){ var e=matrix.elements; return 'matrix3d('+epsilon(e[0])+','+epsilon(-e[1])+','+epsilon(e[2])+','+epsilon(e[3])+','+epsilon(e[4])+','+epsilon(-e[5])+','+epsilon(e[6])+','+epsilon(e[7])+','+epsilon(e[8])+','+epsilon(-e[9])+','+epsilon(e[10])+','+epsilon(e[11])+','+epsilon(e[12])+','+epsilon(-e[13])+','+epsilon(e[14])+','+epsilon(e[15])+')'; }
42
42
  function getObjectCSSMatrix(matrix){ var e=matrix.elements; var m='matrix3d('+epsilon(e[0])+','+epsilon(e[1])+','+epsilon(e[2])+','+epsilon(e[3])+','+epsilon(-e[4])+','+epsilon(-e[5])+','+epsilon(-e[6])+','+epsilon(-e[7])+','+epsilon(e[8])+','+epsilon(e[9])+','+epsilon(e[10])+','+epsilon(e[11])+','+epsilon(e[12])+','+epsilon(e[13])+','+epsilon(e[14])+','+epsilon(e[15])+')'; return m; }
43
43
  function renderObject(object, scene, camera, cameraCSSMatrix){ if (object.isCSS3DObject){ var style=getObjectCSSMatrix(object.matrixWorld); var display=object.visible ? '' : 'none'; var element=object.element; var cached=cache.objects.get(object); if (cached===undefined || cached.style!==style){ element.style.webkitTransform=element.style.transform=style; } if (cached===undefined || cached.display!==display){ element.style.display=display; } if (cached===undefined || cached.style!==style || cached.display!==display){ cache.objects.set(object, { style, display }); } if (element.parentNode !== cameraElement){ cameraElement.appendChild(element); } } for (var i=0,l=object.children.length;i<l;i++){ renderObject(object.children[i], scene, camera, cameraCSSMatrix); } }
44
- function renderCameraOnly(renderer, camera){ var fov=camera.projectionMatrix.elements[5]*_heightHalf; if (cache.camera.fov!==fov){ renderer.domElement.style.webkitPerspective=renderer.domElement.style.perspective=fov+'px'; cache.camera.fov=fov; } if (camera.parent===null && camera.matrixWorldNeedsUpdate===true) camera.updateMatrixWorld(); var cameraCSSMatrix='translateZ('+fov+'px)'+getCameraCSSMatrix(camera.matrixWorldInverse); var style=cameraCSSMatrix+'translate('+_widthHalf+'px,'+_heightHalf+'px)'; if (cache.camera.style!==style){ cameraElement.style.webkitTransform=cameraElement.style.transform=style; cache.camera.style=style; } return cameraCSSMatrix; }
44
+ function setCameraElementMode(mode){
45
+ if (cache.camera.mode === mode) return;
46
+ cache.camera.mode = mode;
47
+ var style = mode === 'flat' ? 'flat' : 'preserve-3d';
48
+ cameraElement.style.webkitTransformStyle = cameraElement.style.transformStyle = style;
49
+ }
50
+ function renderCameraOnly(renderer, camera){ setCameraElementMode('matrix3d'); var fov=camera.projectionMatrix.elements[5]*_heightHalf; if (cache.camera.fov!==fov){ renderer.domElement.style.webkitPerspective=renderer.domElement.style.perspective=fov+'px'; cache.camera.fov=fov; } if (camera.parent===null && camera.matrixWorldNeedsUpdate===true) camera.updateMatrixWorld(); var cameraCSSMatrix='translateZ('+fov+'px)'+getCameraCSSMatrix(camera.matrixWorldInverse); var style=cameraCSSMatrix+'translate('+_widthHalf+'px,'+_heightHalf+'px)'; if (cache.camera.style!==style){ cameraElement.style.webkitTransform=cameraElement.style.transform=style; cache.camera.style=style; } return cameraCSSMatrix; }
45
51
  function renderFlatCameraOnly(renderer, camera, options){
46
52
  if (!camera || !_width || !_height || !camera.isPerspectiveCamera) return false;
47
53
  var position = camera.position || {};
@@ -63,12 +69,13 @@
63
69
  var ty = Math.round(translateY / translateBucket) * translateBucket;
64
70
  var s = Math.round(scale / scaleBucket) * scaleBucket;
65
71
  var style = 'flat|'+Math.round(_width)+'|'+Math.round(_height)+'|'+Math.round(tx / translateBucket)+'|'+Math.round(ty / translateBucket)+'|'+Math.round(s / scaleBucket);
72
+ setCameraElementMode('flat');
66
73
  if (cache.camera.fov !== 0){
67
74
  renderer.domElement.style.webkitPerspective = renderer.domElement.style.perspective = '';
68
75
  cache.camera.fov = 0;
69
76
  }
70
77
  if (cache.camera.style !== style){
71
- cameraElement.style.webkitTransform = cameraElement.style.transform = 'translate3d('+tx.toFixed(3)+'px,'+ty.toFixed(3)+'px,0) scale('+s.toFixed(6)+','+(-s).toFixed(6)+')';
78
+ cameraElement.style.webkitTransform = cameraElement.style.transform = 'matrix('+s.toFixed(6)+',0,0,'+(-s).toFixed(6)+','+tx.toFixed(3)+','+ty.toFixed(3)+')';
72
79
  cache.camera.style = style;
73
80
  }
74
81
  return true;
@@ -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-settle-v704" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-ua-wheel-zoom-direct-settle-v704" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-css3d-flat-wheel-v707" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-css3d-flat-wheel-v707" />
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-settle-v704';
582
+ const scriptVersion = '20260620-css3d-flat-wheel-v707';
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": "sp0zMNR0",
2
+ "version": "7Mz0t211",
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-+tbg0oVHg45w3EqRroBtWvPm/O8xkG20ZhpQpNXUhPo=",
81
+ "hash": "sha256-Wh72NYCd8llyQcb9S1nu14LVriY/M65RGbAJV9Ewecg=",
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-7s3ZFEQXCE1cX+sTQ033CroYRxtD5lQ5Y+FGG9NpjEU=",
109
+ "hash": "sha256-oHhdP4cltwUivQrUKDEMENUIE3cKk29F/IEk2Rg3JPM=",
110
110
  "url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
111
111
  },
112
112
  {
@@ -182,7 +182,7 @@
182
182
  "url": "_content/MindExecution.Shared/js/plan-master.js"
183
183
  },
184
184
  {
185
- "hash": "sha256-zZ6nh8fh4HnO5rV//tfE4WB119Ez9Gjg26P7k0idcIE=",
185
+ "hash": "sha256-2IxneOfAhc2Sq8hl7ywEBzZaaFX22FZaW89WB0rAgUk=",
186
186
  "url": "_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js"
187
187
  },
188
188
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-M5iNp7FBVtopYOq0HzZUPgt+JDG+igkEAF8V6A3h2nY=",
837
+ "hash": "sha256-KjaPdEv6u95UkcfvQokggiqL/Q7CuMbn9BoghYBReYQ=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: sp0zMNR0 */
1
+ /* Manifest version: 7Mz0t211 */
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