@mindexec/cli 0.2.230 → 0.2.232
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 +1 -1
- package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +27 -29
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +226 -1
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +6 -0
- package/wwwroot/index.html +3 -3
- package/wwwroot/service-worker-assets.js +5 -5
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
Continuous: 'continuous'
|
|
15
15
|
});
|
|
16
16
|
const THEME_ANIMATION_MODE_BY_NAME = Object.freeze({
|
|
17
|
-
SpatialGrid2D: THEME_ANIMATION_MODE.
|
|
18
|
-
GridPlane: THEME_ANIMATION_MODE.
|
|
19
|
-
XYGrid: THEME_ANIMATION_MODE.
|
|
17
|
+
SpatialGrid2D: THEME_ANIMATION_MODE.None,
|
|
18
|
+
GridPlane: THEME_ANIMATION_MODE.None,
|
|
19
|
+
XYGrid: THEME_ANIMATION_MODE.None,
|
|
20
20
|
SpinningBoxes: THEME_ANIMATION_MODE.Continuous,
|
|
21
21
|
Space3D: THEME_ANIMATION_MODE.Continuous,
|
|
22
22
|
SpiritFlow: THEME_ANIMATION_MODE.Continuous,
|
|
@@ -230,6 +230,15 @@
|
|
|
230
230
|
...options
|
|
231
231
|
};
|
|
232
232
|
|
|
233
|
+
if (settings.localCssOnly === true) {
|
|
234
|
+
overlayGroup.visible = false;
|
|
235
|
+
overlayGroup.userData.lightweightAdaptiveGrid = true;
|
|
236
|
+
overlayGroup.userData.localSnapGrid = true;
|
|
237
|
+
overlayGroup.userData.localSnapGridStyle = settings.localSnapGridStyle || 'line';
|
|
238
|
+
overlayGroup.animate = () => { };
|
|
239
|
+
return setThemeAnimationMode(overlayGroup, THEME_ANIMATION_MODE.None);
|
|
240
|
+
}
|
|
241
|
+
|
|
233
242
|
const grids = [
|
|
234
243
|
{
|
|
235
244
|
key: 'fine',
|
|
@@ -320,6 +329,8 @@
|
|
|
320
329
|
create: (scene) => {
|
|
321
330
|
scene.background = new THREE.Color(THEME_SURFACE_BG);
|
|
322
331
|
const grid = createAdaptiveXYGridOverlay(new THREE.Color(THEME_GRID_COLOR_SOFT), {
|
|
332
|
+
localCssOnly: true,
|
|
333
|
+
localSnapGridStyle: 'dot',
|
|
323
334
|
fineDistance: 42000,
|
|
324
335
|
coarseDistance: 120000,
|
|
325
336
|
farDistance: 320000,
|
|
@@ -337,34 +348,19 @@
|
|
|
337
348
|
dispose: (themeObject) => { disposeThemeObject(themeObject); }
|
|
338
349
|
},
|
|
339
350
|
|
|
340
|
-
// Theme 3: GridPlane (basic 2D grid -
|
|
341
|
-
'GridPlane': {
|
|
342
|
-
create: (scene) => {
|
|
351
|
+
// Theme 3: GridPlane (basic 2D grid - rendered by the local CSS snap grid)
|
|
352
|
+
'GridPlane': {
|
|
353
|
+
create: (scene) => {
|
|
343
354
|
scene.background = new THREE.Color(THEME_PLAIN_BG);
|
|
344
|
-
const
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
);
|
|
351
|
-
// ▼▼▼ [Change] Snap from 10 to 100 (align to large grid centers) ▼▼▼
|
|
352
|
-
const tmp = new THREE.Vector3();
|
|
353
|
-
const snap = 100; // size2 (large grid)
|
|
354
|
-
gridHelper.animate = (camera) => {
|
|
355
|
-
if (!camera) return;
|
|
356
|
-
tmp.copy(camera.position);
|
|
357
|
-
// axes = 'xzy' (XZ plane; Y is height)
|
|
358
|
-
tmp.y = -10; // Keep Y fixed below 0 (XZ plane)
|
|
359
|
-
tmp.x = Math.round(tmp.x / snap) * snap;
|
|
360
|
-
tmp.z = Math.round(tmp.z / snap) * snap;
|
|
361
|
-
gridHelper.position.copy(tmp);
|
|
362
|
-
};
|
|
363
|
-
// ▲▲▲ [Change] ▲▲▲
|
|
364
|
-
return setThemeAnimationMode(gridHelper, THEME_ANIMATION_MODE.Camera);
|
|
355
|
+
const grid = createAdaptiveXYGridOverlay(new THREE.Color(THEME_GRID_COLOR), {
|
|
356
|
+
localCssOnly: true,
|
|
357
|
+
localSnapGridStyle: 'line'
|
|
358
|
+
});
|
|
359
|
+
grid.userData.themeAlias = 'GridPlane';
|
|
360
|
+
return grid;
|
|
365
361
|
},
|
|
366
|
-
dispose: (themeObject) => { disposeThemeObject(themeObject); }
|
|
367
|
-
},
|
|
362
|
+
dispose: (themeObject) => { disposeThemeObject(themeObject); }
|
|
363
|
+
},
|
|
368
364
|
|
|
369
365
|
// Theme 4: SpinningBoxes (reuses 3d-model-viewer logic)
|
|
370
366
|
'SpinningBoxes': {
|
|
@@ -491,6 +487,8 @@
|
|
|
491
487
|
create: (scene) => {
|
|
492
488
|
scene.background = new THREE.Color(THEME_PLAIN_BG);
|
|
493
489
|
return createAdaptiveXYGridOverlay(new THREE.Color(THEME_GRID_COLOR), {
|
|
490
|
+
localCssOnly: true,
|
|
491
|
+
localSnapGridStyle: 'line',
|
|
494
492
|
fineDistance: 45000,
|
|
495
493
|
coarseDistance: 120000,
|
|
496
494
|
farDistance: 320000,
|
|
@@ -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-
|
|
8
|
+
const MINDMAP_CORE_BUILD_ID = '20260620-local-snap-grid-v679';
|
|
9
9
|
const CanvasPhase = Object.freeze({
|
|
10
10
|
Booting: 'booting',
|
|
11
11
|
BoardFileLoading: 'board-file-loading',
|
|
@@ -103,6 +103,12 @@
|
|
|
103
103
|
const CAMERA_MOTION_GRID_OVERSCAN_PX = 512;
|
|
104
104
|
const CAMERA_MOTION_GRID_Z_BUCKET_WORLD = 80;
|
|
105
105
|
const CAMERA_MOTION_GRID_FALLBACK_ENABLED = false;
|
|
106
|
+
const LOCAL_SNAP_GRID_RADIUS_PX = 500;
|
|
107
|
+
const LOCAL_SNAP_GRID_DIAMETER_PX = LOCAL_SNAP_GRID_RADIUS_PX * 2;
|
|
108
|
+
const LOCAL_SNAP_GRID_MIN_STEP_PX = 8;
|
|
109
|
+
const LOCAL_SNAP_GRID_MAX_STEP_PX = 56;
|
|
110
|
+
const LOCAL_SNAP_GRID_STEP_BUCKET_PX = 2;
|
|
111
|
+
const LOCAL_SNAP_GRID_OPACITY_BUCKET = 0.04;
|
|
106
112
|
const CAMERA_MOTION_PARTIAL_FRAME_SKIP_ENABLED = false;
|
|
107
113
|
const CAMERA_MOTION_VISUAL_ONLY_FAST_PATH_ENABLED = true;
|
|
108
114
|
const CAMERA_MOTION_WEBGL_CANVAS_TRANSFORM_ENABLED = true;
|
|
@@ -1435,6 +1441,7 @@
|
|
|
1435
1441
|
}
|
|
1436
1442
|
|
|
1437
1443
|
module._syncMotionGridLayerForCameraNavigation?.(usedWebglCanvasCameraTransform);
|
|
1444
|
+
module._syncLocalSnapGridLayer?.(true);
|
|
1438
1445
|
module.cssRenderer.renderCamera(module.camera);
|
|
1439
1446
|
|
|
1440
1447
|
syncBusinessAutomationEdgesForCameraNavigation(module);
|
|
@@ -1654,6 +1661,7 @@
|
|
|
1654
1661
|
}
|
|
1655
1662
|
|
|
1656
1663
|
module._syncMotionGridLayerForCameraNavigation?.(usedWebglCanvasCameraTransform);
|
|
1664
|
+
module._syncLocalSnapGridLayer?.(true);
|
|
1657
1665
|
if (canRenderCss3dCamera === true) {
|
|
1658
1666
|
module.cssRenderer.renderCamera(module.camera);
|
|
1659
1667
|
}
|
|
@@ -3594,6 +3602,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
3594
3602
|
this._motionGridVisible = false;
|
|
3595
3603
|
this._motionGridHideTimer = null;
|
|
3596
3604
|
this._lastMotionGridKey = '';
|
|
3605
|
+
this._localSnapGridLayer = null;
|
|
3606
|
+
this._localSnapGridVisible = false;
|
|
3607
|
+
this._lastLocalSnapGridKey = '';
|
|
3608
|
+
this._lastLocalSnapGridTransformKey = '';
|
|
3609
|
+
this._lastSnapGridClientX = null;
|
|
3610
|
+
this._lastSnapGridClientY = null;
|
|
3597
3611
|
this._animationIdleTimerId = null;
|
|
3598
3612
|
this._animationLoopCallback = null;
|
|
3599
3613
|
this._animationLoopExecuting = false;
|
|
@@ -3643,6 +3657,208 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
3643
3657
|
themeName === 'SpinningBoxes';
|
|
3644
3658
|
}
|
|
3645
3659
|
|
|
3660
|
+
_isLocalSnapGridThemeEnabled() {
|
|
3661
|
+
const themeName = String(this.currentThemeName || '').trim();
|
|
3662
|
+
return themeName === 'SpatialGrid2D' ||
|
|
3663
|
+
themeName === 'XYGrid' ||
|
|
3664
|
+
themeName === 'GridPlane';
|
|
3665
|
+
}
|
|
3666
|
+
|
|
3667
|
+
setLocalSnapGridClientPoint(clientX, clientY) {
|
|
3668
|
+
const nextX = Number(clientX);
|
|
3669
|
+
const nextY = Number(clientY);
|
|
3670
|
+
if (!Number.isFinite(nextX) || !Number.isFinite(nextY)) {
|
|
3671
|
+
return false;
|
|
3672
|
+
}
|
|
3673
|
+
|
|
3674
|
+
const roundedX = Math.round(nextX * 2) / 2;
|
|
3675
|
+
const roundedY = Math.round(nextY * 2) / 2;
|
|
3676
|
+
if (this._lastSnapGridClientX === roundedX &&
|
|
3677
|
+
this._lastSnapGridClientY === roundedY) {
|
|
3678
|
+
return false;
|
|
3679
|
+
}
|
|
3680
|
+
|
|
3681
|
+
this._lastSnapGridClientX = roundedX;
|
|
3682
|
+
this._lastSnapGridClientY = roundedY;
|
|
3683
|
+
this._lastLocalSnapGridTransformKey = '';
|
|
3684
|
+
return true;
|
|
3685
|
+
}
|
|
3686
|
+
|
|
3687
|
+
_ensureLocalSnapGridLayer() {
|
|
3688
|
+
if (!this.container || typeof document === 'undefined') {
|
|
3689
|
+
return null;
|
|
3690
|
+
}
|
|
3691
|
+
if (this._localSnapGridLayer?.isConnected) {
|
|
3692
|
+
return this._localSnapGridLayer;
|
|
3693
|
+
}
|
|
3694
|
+
|
|
3695
|
+
const layer = document.createElement('div');
|
|
3696
|
+
layer.className = 'mindcanvas-local-snap-grid-layer';
|
|
3697
|
+
layer.setAttribute('aria-hidden', 'true');
|
|
3698
|
+
layer.style.position = 'absolute';
|
|
3699
|
+
layer.style.left = '0';
|
|
3700
|
+
layer.style.top = '0';
|
|
3701
|
+
layer.style.width = `${LOCAL_SNAP_GRID_DIAMETER_PX}px`;
|
|
3702
|
+
layer.style.height = `${LOCAL_SNAP_GRID_DIAMETER_PX}px`;
|
|
3703
|
+
layer.style.zIndex = '0';
|
|
3704
|
+
layer.style.pointerEvents = 'none';
|
|
3705
|
+
layer.style.display = 'none';
|
|
3706
|
+
layer.style.opacity = '0';
|
|
3707
|
+
layer.style.backgroundRepeat = 'repeat';
|
|
3708
|
+
layer.style.backgroundColor = 'transparent';
|
|
3709
|
+
layer.style.borderRadius = '50%';
|
|
3710
|
+
layer.style.contain = 'strict';
|
|
3711
|
+
layer.style.willChange = 'transform, opacity';
|
|
3712
|
+
layer.style.transform = 'translate3d(0, 0, 0)';
|
|
3713
|
+
layer.style.transition = 'opacity 90ms linear';
|
|
3714
|
+
const mask = 'radial-gradient(circle at center, rgba(0,0,0,0.96) 0%, rgba(0,0,0,0.86) 48%, rgba(0,0,0,0.42) 70%, rgba(0,0,0,0.08) 88%, transparent 100%)';
|
|
3715
|
+
layer.style.maskImage = mask;
|
|
3716
|
+
layer.style.webkitMaskImage = mask;
|
|
3717
|
+
|
|
3718
|
+
const cssElement = this.cssRenderer?.domElement;
|
|
3719
|
+
if (cssElement?.parentNode === this.container) {
|
|
3720
|
+
this.container.insertBefore(layer, cssElement);
|
|
3721
|
+
} else {
|
|
3722
|
+
this.container.appendChild(layer);
|
|
3723
|
+
}
|
|
3724
|
+
|
|
3725
|
+
this._localSnapGridLayer = layer;
|
|
3726
|
+
this._lastLocalSnapGridKey = '';
|
|
3727
|
+
this._lastLocalSnapGridTransformKey = '';
|
|
3728
|
+
return layer;
|
|
3729
|
+
}
|
|
3730
|
+
|
|
3731
|
+
_setLocalSnapGridVisible(visible) {
|
|
3732
|
+
const layer = this._localSnapGridLayer;
|
|
3733
|
+
if (!layer) {
|
|
3734
|
+
return;
|
|
3735
|
+
}
|
|
3736
|
+
|
|
3737
|
+
if (visible === true) {
|
|
3738
|
+
if (this._localSnapGridVisible !== true) {
|
|
3739
|
+
this._localSnapGridVisible = true;
|
|
3740
|
+
if (layer.style.display !== 'block') {
|
|
3741
|
+
layer.style.display = 'block';
|
|
3742
|
+
}
|
|
3743
|
+
}
|
|
3744
|
+
if (layer.style.opacity !== '1') {
|
|
3745
|
+
layer.style.opacity = '1';
|
|
3746
|
+
}
|
|
3747
|
+
return;
|
|
3748
|
+
}
|
|
3749
|
+
|
|
3750
|
+
if (this._localSnapGridVisible !== true && layer.style.display === 'none') {
|
|
3751
|
+
return;
|
|
3752
|
+
}
|
|
3753
|
+
|
|
3754
|
+
this._localSnapGridVisible = false;
|
|
3755
|
+
if (layer.style.opacity !== '0') {
|
|
3756
|
+
layer.style.opacity = '0';
|
|
3757
|
+
}
|
|
3758
|
+
if (layer.style.display !== 'none') {
|
|
3759
|
+
layer.style.display = 'none';
|
|
3760
|
+
}
|
|
3761
|
+
}
|
|
3762
|
+
|
|
3763
|
+
_syncLocalSnapGridLayer(visible = true) {
|
|
3764
|
+
if (visible !== true || !this._isLocalSnapGridThemeEnabled()) {
|
|
3765
|
+
this._setLocalSnapGridVisible(false);
|
|
3766
|
+
return false;
|
|
3767
|
+
}
|
|
3768
|
+
|
|
3769
|
+
if (!this.container || !this.camera?.isPerspectiveCamera) {
|
|
3770
|
+
this._setLocalSnapGridVisible(false);
|
|
3771
|
+
return false;
|
|
3772
|
+
}
|
|
3773
|
+
|
|
3774
|
+
const layer = this._ensureLocalSnapGridLayer();
|
|
3775
|
+
if (!layer) {
|
|
3776
|
+
return false;
|
|
3777
|
+
}
|
|
3778
|
+
|
|
3779
|
+
const viewportMetrics = getCachedViewportMetrics(this);
|
|
3780
|
+
const width = Math.max(1, Number(viewportMetrics.width || 0));
|
|
3781
|
+
const height = Math.max(1, Number(viewportMetrics.height || 0));
|
|
3782
|
+
const left = Number(viewportMetrics.left || 0);
|
|
3783
|
+
const top = Number(viewportMetrics.top || 0);
|
|
3784
|
+
const hasPointer =
|
|
3785
|
+
Number.isFinite(Number(this._lastSnapGridClientX)) &&
|
|
3786
|
+
Number.isFinite(Number(this._lastSnapGridClientY));
|
|
3787
|
+
const centerX = hasPointer
|
|
3788
|
+
? Math.max(0, Math.min(width, Number(this._lastSnapGridClientX) - left))
|
|
3789
|
+
: width / 2;
|
|
3790
|
+
const centerY = hasPointer
|
|
3791
|
+
? Math.max(0, Math.min(height, Number(this._lastSnapGridClientY) - top))
|
|
3792
|
+
: height / 2;
|
|
3793
|
+
const layerLeft = centerX - LOCAL_SNAP_GRID_RADIUS_PX;
|
|
3794
|
+
const layerTop = centerY - LOCAL_SNAP_GRID_RADIUS_PX;
|
|
3795
|
+
|
|
3796
|
+
const camera = this.camera;
|
|
3797
|
+
const cameraZ = Math.max(1, Number(camera.position?.z || 1));
|
|
3798
|
+
const vfov = (Number(camera.fov || 45) * Math.PI) / 180;
|
|
3799
|
+
const viewHeight = 2 * Math.tan(vfov / 2) * cameraZ;
|
|
3800
|
+
const pxPerWorld = height / Math.max(1, viewHeight);
|
|
3801
|
+
const worldGrid = Math.max(1, Number(this.GRID_SIZE || 10));
|
|
3802
|
+
const rawSmallStepPx = Math.max(
|
|
3803
|
+
LOCAL_SNAP_GRID_MIN_STEP_PX,
|
|
3804
|
+
Math.min(LOCAL_SNAP_GRID_MAX_STEP_PX, worldGrid * pxPerWorld)
|
|
3805
|
+
);
|
|
3806
|
+
const smallStepPx = Math.max(
|
|
3807
|
+
LOCAL_SNAP_GRID_MIN_STEP_PX,
|
|
3808
|
+
Math.min(
|
|
3809
|
+
LOCAL_SNAP_GRID_MAX_STEP_PX,
|
|
3810
|
+
Math.round(rawSmallStepPx / LOCAL_SNAP_GRID_STEP_BUCKET_PX) * LOCAL_SNAP_GRID_STEP_BUCKET_PX
|
|
3811
|
+
)
|
|
3812
|
+
);
|
|
3813
|
+
const majorStepPx = smallStepPx * 10;
|
|
3814
|
+
const themeName = String(this.currentThemeName || '').trim();
|
|
3815
|
+
const styleKind = themeName === 'SpatialGrid2D' ? 'dot' : 'line';
|
|
3816
|
+
const rawOpacity = Math.max(0.34, Math.min(0.82, cameraZ <= 1800 ? 0.72 : 0.72 - ((cameraZ - 1800) / 36000)));
|
|
3817
|
+
const opacity = Math.max(
|
|
3818
|
+
0.34,
|
|
3819
|
+
Math.min(0.82, Math.round(rawOpacity / LOCAL_SNAP_GRID_OPACITY_BUCKET) * LOCAL_SNAP_GRID_OPACITY_BUCKET)
|
|
3820
|
+
);
|
|
3821
|
+
const localGridKey = [
|
|
3822
|
+
styleKind,
|
|
3823
|
+
Math.round(smallStepPx * 100),
|
|
3824
|
+
Math.round(majorStepPx * 100),
|
|
3825
|
+
Math.round(opacity * 100)
|
|
3826
|
+
].join('|');
|
|
3827
|
+
|
|
3828
|
+
if (localGridKey !== this._lastLocalSnapGridKey) {
|
|
3829
|
+
this._lastLocalSnapGridKey = localGridKey;
|
|
3830
|
+
if (styleKind === 'dot') {
|
|
3831
|
+
layer.style.backgroundImage = [
|
|
3832
|
+
'radial-gradient(circle at 0 0, rgba(68, 78, 94, 0.34) 1px, transparent 1.55px)',
|
|
3833
|
+
'radial-gradient(circle at 0 0, rgba(44, 55, 74, 0.5) 1.7px, transparent 2.2px)'
|
|
3834
|
+
].join(', ');
|
|
3835
|
+
} else {
|
|
3836
|
+
layer.style.backgroundImage = [
|
|
3837
|
+
'linear-gradient(to right, rgba(70, 82, 100, 0.22) 1px, transparent 1px)',
|
|
3838
|
+
'linear-gradient(to bottom, rgba(70, 82, 100, 0.22) 1px, transparent 1px)',
|
|
3839
|
+
'linear-gradient(to right, rgba(42, 55, 75, 0.36) 1px, transparent 1px)',
|
|
3840
|
+
'linear-gradient(to bottom, rgba(42, 55, 75, 0.36) 1px, transparent 1px)'
|
|
3841
|
+
].join(', ');
|
|
3842
|
+
}
|
|
3843
|
+
layer.style.backgroundSize = styleKind === 'dot'
|
|
3844
|
+
? `${smallStepPx.toFixed(3)}px ${smallStepPx.toFixed(3)}px, ${majorStepPx.toFixed(3)}px ${majorStepPx.toFixed(3)}px`
|
|
3845
|
+
: `${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`;
|
|
3846
|
+
layer.style.backgroundPosition = styleKind === 'dot'
|
|
3847
|
+
? '0 0, 0 0'
|
|
3848
|
+
: '0 0, 0 0, 0 0, 0 0';
|
|
3849
|
+
layer.style.opacity = opacity.toFixed(3);
|
|
3850
|
+
}
|
|
3851
|
+
|
|
3852
|
+
const transformKey = `${Math.round(layerLeft * 2)}|${Math.round(layerTop * 2)}`;
|
|
3853
|
+
if (transformKey !== this._lastLocalSnapGridTransformKey) {
|
|
3854
|
+
this._lastLocalSnapGridTransformKey = transformKey;
|
|
3855
|
+
layer.style.transform = `translate3d(${layerLeft.toFixed(2)}px, ${layerTop.toFixed(2)}px, 0)`;
|
|
3856
|
+
}
|
|
3857
|
+
|
|
3858
|
+
this._setLocalSnapGridVisible(true);
|
|
3859
|
+
return true;
|
|
3860
|
+
}
|
|
3861
|
+
|
|
3646
3862
|
_ensureMotionGridLayer() {
|
|
3647
3863
|
if (!this.container) {
|
|
3648
3864
|
return null;
|
|
@@ -4497,6 +4713,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4497
4713
|
if (this.scene) this.scene.remove(this.currentThemeObject);
|
|
4498
4714
|
}
|
|
4499
4715
|
this._syncMotionGridLayer(false);
|
|
4716
|
+
this._syncLocalSnapGridLayer(false);
|
|
4500
4717
|
this.currentThemeObject = newTheme.create(this.scene, this.renderer);
|
|
4501
4718
|
if (this.currentThemeObject) this.scene.add(this.currentThemeObject);
|
|
4502
4719
|
this.currentThemeName = themeName;
|
|
@@ -7515,6 +7732,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
7515
7732
|
isCameraNavigationOnlyInteractiveFrame === true) {
|
|
7516
7733
|
this._syncMotionGridLayerForCameraNavigation(usedWebglCanvasCameraTransform);
|
|
7517
7734
|
}
|
|
7735
|
+
this._syncLocalSnapGridLayer(true);
|
|
7518
7736
|
if (shouldRenderWebglFrame === true &&
|
|
7519
7737
|
this._motionGridVisible === true &&
|
|
7520
7738
|
isPureCss3dCameraMotionFrame !== true &&
|
|
@@ -8197,6 +8415,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
8197
8415
|
this._lastMotionGridKey = '';
|
|
8198
8416
|
this._lastMotionGridTransformKey = '';
|
|
8199
8417
|
}
|
|
8418
|
+
if (this._localSnapGridLayer) {
|
|
8419
|
+
this._localSnapGridLayer.remove();
|
|
8420
|
+
this._localSnapGridLayer = null;
|
|
8421
|
+
this._localSnapGridVisible = false;
|
|
8422
|
+
this._lastLocalSnapGridKey = '';
|
|
8423
|
+
this._lastLocalSnapGridTransformKey = '';
|
|
8424
|
+
}
|
|
8200
8425
|
removeCursorDomElement(this);
|
|
8201
8426
|
if (this._viewStatePersistTimer) {
|
|
8202
8427
|
clearTimeout(this._viewStatePersistTimer);
|
|
@@ -1461,6 +1461,11 @@ window.MindMapInteractions = (function () {
|
|
|
1461
1461
|
function setPointerFromClientPosition(module, clientX, clientY) {
|
|
1462
1462
|
if (!module?.pointer) return false;
|
|
1463
1463
|
|
|
1464
|
+
const localSnapGridMoved = module.setLocalSnapGridClientPoint?.(clientX, clientY) === true;
|
|
1465
|
+
if (localSnapGridMoved && module._isLocalSnapGridThemeEnabled?.() === true) {
|
|
1466
|
+
module.requestAnimationWake?.('local-snap-grid-pointer');
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1464
1469
|
const metrics = getCachedViewportMetrics(module);
|
|
1465
1470
|
if (!metrics || metrics.width <= 0 || metrics.height <= 0) {
|
|
1466
1471
|
return false;
|
|
@@ -6324,6 +6329,7 @@ window.MindMapInteractions = (function () {
|
|
|
6324
6329
|
return;
|
|
6325
6330
|
}
|
|
6326
6331
|
// ▲▲▲ [Fix] ▲▲▲
|
|
6332
|
+
module.setLocalSnapGridClientPoint?.(clientX, clientY);
|
|
6327
6333
|
|
|
6328
6334
|
let t0 = 0;
|
|
6329
6335
|
let cameraZ = '?';
|
package/wwwroot/index.html
CHANGED
|
@@ -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-
|
|
11
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-
|
|
10
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-local-snap-grid-v679" />
|
|
11
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-local-snap-grid-v679" />
|
|
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-
|
|
582
|
+
const scriptVersion = '20260620-local-snap-grid-v679';
|
|
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": "
|
|
2
|
+
"version": "ICqoIb6t",
|
|
3
3
|
"assets": [
|
|
4
4
|
{
|
|
5
5
|
"hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"url": "_content/MindExecution.Shared/js/agent-visualization.js"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
|
-
"hash": "sha256-
|
|
61
|
+
"hash": "sha256-esAVUETb0T9V8y/I4Ub8UpN2trCCyTgunOGhh/cTyfQ=",
|
|
62
62
|
"url": "_content/MindExecution.Shared/js/background-themes.js"
|
|
63
63
|
},
|
|
64
64
|
{
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"url": "_content/MindExecution.Shared/js/marked.min.js"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
|
-
"hash": "sha256-
|
|
81
|
+
"hash": "sha256-SJbkOw5njRyQJ+hWZvh77QpYXbjgsQAkgsp2E7eIrjc=",
|
|
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-
|
|
109
|
+
"hash": "sha256-c4m1kyotX9806YeHVrbh0M3lvEmn9kO8oyhZY8lD28M=",
|
|
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-
|
|
837
|
+
"hash": "sha256-vbtZ+Y2ONRk+P+CZYjw5DVWq8HXgqNBPqGjMIGw14zs=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|