@mindexec/cli 0.2.230 → 0.2.231
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 +224 -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-v678';
|
|
9
9
|
const CanvasPhase = Object.freeze({
|
|
10
10
|
Booting: 'booting',
|
|
11
11
|
BoardFileLoading: 'board-file-loading',
|
|
@@ -103,6 +103,10 @@
|
|
|
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;
|
|
106
110
|
const CAMERA_MOTION_PARTIAL_FRAME_SKIP_ENABLED = false;
|
|
107
111
|
const CAMERA_MOTION_VISUAL_ONLY_FAST_PATH_ENABLED = true;
|
|
108
112
|
const CAMERA_MOTION_WEBGL_CANVAS_TRANSFORM_ENABLED = true;
|
|
@@ -1435,6 +1439,7 @@
|
|
|
1435
1439
|
}
|
|
1436
1440
|
|
|
1437
1441
|
module._syncMotionGridLayerForCameraNavigation?.(usedWebglCanvasCameraTransform);
|
|
1442
|
+
module._syncLocalSnapGridLayer?.(true);
|
|
1438
1443
|
module.cssRenderer.renderCamera(module.camera);
|
|
1439
1444
|
|
|
1440
1445
|
syncBusinessAutomationEdgesForCameraNavigation(module);
|
|
@@ -1654,6 +1659,7 @@
|
|
|
1654
1659
|
}
|
|
1655
1660
|
|
|
1656
1661
|
module._syncMotionGridLayerForCameraNavigation?.(usedWebglCanvasCameraTransform);
|
|
1662
|
+
module._syncLocalSnapGridLayer?.(true);
|
|
1657
1663
|
if (canRenderCss3dCamera === true) {
|
|
1658
1664
|
module.cssRenderer.renderCamera(module.camera);
|
|
1659
1665
|
}
|
|
@@ -3594,6 +3600,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
3594
3600
|
this._motionGridVisible = false;
|
|
3595
3601
|
this._motionGridHideTimer = null;
|
|
3596
3602
|
this._lastMotionGridKey = '';
|
|
3603
|
+
this._localSnapGridLayer = null;
|
|
3604
|
+
this._localSnapGridVisible = false;
|
|
3605
|
+
this._lastLocalSnapGridKey = '';
|
|
3606
|
+
this._lastLocalSnapGridTransformKey = '';
|
|
3607
|
+
this._lastSnapGridClientX = null;
|
|
3608
|
+
this._lastSnapGridClientY = null;
|
|
3597
3609
|
this._animationIdleTimerId = null;
|
|
3598
3610
|
this._animationLoopCallback = null;
|
|
3599
3611
|
this._animationLoopExecuting = false;
|
|
@@ -3643,6 +3655,208 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
3643
3655
|
themeName === 'SpinningBoxes';
|
|
3644
3656
|
}
|
|
3645
3657
|
|
|
3658
|
+
_isLocalSnapGridThemeEnabled() {
|
|
3659
|
+
const themeName = String(this.currentThemeName || '').trim();
|
|
3660
|
+
return themeName === 'SpatialGrid2D' ||
|
|
3661
|
+
themeName === 'XYGrid' ||
|
|
3662
|
+
themeName === 'GridPlane';
|
|
3663
|
+
}
|
|
3664
|
+
|
|
3665
|
+
setLocalSnapGridClientPoint(clientX, clientY) {
|
|
3666
|
+
const nextX = Number(clientX);
|
|
3667
|
+
const nextY = Number(clientY);
|
|
3668
|
+
if (!Number.isFinite(nextX) || !Number.isFinite(nextY)) {
|
|
3669
|
+
return false;
|
|
3670
|
+
}
|
|
3671
|
+
|
|
3672
|
+
const roundedX = Math.round(nextX * 2) / 2;
|
|
3673
|
+
const roundedY = Math.round(nextY * 2) / 2;
|
|
3674
|
+
if (this._lastSnapGridClientX === roundedX &&
|
|
3675
|
+
this._lastSnapGridClientY === roundedY) {
|
|
3676
|
+
return false;
|
|
3677
|
+
}
|
|
3678
|
+
|
|
3679
|
+
this._lastSnapGridClientX = roundedX;
|
|
3680
|
+
this._lastSnapGridClientY = roundedY;
|
|
3681
|
+
this._lastLocalSnapGridTransformKey = '';
|
|
3682
|
+
return true;
|
|
3683
|
+
}
|
|
3684
|
+
|
|
3685
|
+
_ensureLocalSnapGridLayer() {
|
|
3686
|
+
if (!this.container || typeof document === 'undefined') {
|
|
3687
|
+
return null;
|
|
3688
|
+
}
|
|
3689
|
+
if (this._localSnapGridLayer?.isConnected) {
|
|
3690
|
+
return this._localSnapGridLayer;
|
|
3691
|
+
}
|
|
3692
|
+
|
|
3693
|
+
const layer = document.createElement('div');
|
|
3694
|
+
layer.className = 'mindcanvas-local-snap-grid-layer';
|
|
3695
|
+
layer.setAttribute('aria-hidden', 'true');
|
|
3696
|
+
layer.style.position = 'absolute';
|
|
3697
|
+
layer.style.left = '0';
|
|
3698
|
+
layer.style.top = '0';
|
|
3699
|
+
layer.style.width = `${LOCAL_SNAP_GRID_DIAMETER_PX}px`;
|
|
3700
|
+
layer.style.height = `${LOCAL_SNAP_GRID_DIAMETER_PX}px`;
|
|
3701
|
+
layer.style.zIndex = '0';
|
|
3702
|
+
layer.style.pointerEvents = 'none';
|
|
3703
|
+
layer.style.display = 'none';
|
|
3704
|
+
layer.style.opacity = '0';
|
|
3705
|
+
layer.style.backgroundRepeat = 'repeat';
|
|
3706
|
+
layer.style.backgroundColor = 'transparent';
|
|
3707
|
+
layer.style.borderRadius = '50%';
|
|
3708
|
+
layer.style.contain = 'strict';
|
|
3709
|
+
layer.style.willChange = 'transform, opacity';
|
|
3710
|
+
layer.style.transform = 'translate3d(0, 0, 0)';
|
|
3711
|
+
layer.style.transition = 'opacity 90ms linear';
|
|
3712
|
+
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%)';
|
|
3713
|
+
layer.style.maskImage = mask;
|
|
3714
|
+
layer.style.webkitMaskImage = mask;
|
|
3715
|
+
|
|
3716
|
+
const cssElement = this.cssRenderer?.domElement;
|
|
3717
|
+
if (cssElement?.parentNode === this.container) {
|
|
3718
|
+
this.container.insertBefore(layer, cssElement);
|
|
3719
|
+
} else {
|
|
3720
|
+
this.container.appendChild(layer);
|
|
3721
|
+
}
|
|
3722
|
+
|
|
3723
|
+
this._localSnapGridLayer = layer;
|
|
3724
|
+
this._lastLocalSnapGridKey = '';
|
|
3725
|
+
this._lastLocalSnapGridTransformKey = '';
|
|
3726
|
+
return layer;
|
|
3727
|
+
}
|
|
3728
|
+
|
|
3729
|
+
_setLocalSnapGridVisible(visible) {
|
|
3730
|
+
const layer = this._localSnapGridLayer;
|
|
3731
|
+
if (!layer) {
|
|
3732
|
+
return;
|
|
3733
|
+
}
|
|
3734
|
+
|
|
3735
|
+
if (visible === true) {
|
|
3736
|
+
if (this._localSnapGridVisible !== true) {
|
|
3737
|
+
this._localSnapGridVisible = true;
|
|
3738
|
+
if (layer.style.display !== 'block') {
|
|
3739
|
+
layer.style.display = 'block';
|
|
3740
|
+
}
|
|
3741
|
+
}
|
|
3742
|
+
if (layer.style.opacity !== '1') {
|
|
3743
|
+
layer.style.opacity = '1';
|
|
3744
|
+
}
|
|
3745
|
+
return;
|
|
3746
|
+
}
|
|
3747
|
+
|
|
3748
|
+
if (this._localSnapGridVisible !== true && layer.style.display === 'none') {
|
|
3749
|
+
return;
|
|
3750
|
+
}
|
|
3751
|
+
|
|
3752
|
+
this._localSnapGridVisible = false;
|
|
3753
|
+
if (layer.style.opacity !== '0') {
|
|
3754
|
+
layer.style.opacity = '0';
|
|
3755
|
+
}
|
|
3756
|
+
if (layer.style.display !== 'none') {
|
|
3757
|
+
layer.style.display = 'none';
|
|
3758
|
+
}
|
|
3759
|
+
}
|
|
3760
|
+
|
|
3761
|
+
_syncLocalSnapGridLayer(visible = true) {
|
|
3762
|
+
if (visible !== true || !this._isLocalSnapGridThemeEnabled()) {
|
|
3763
|
+
this._setLocalSnapGridVisible(false);
|
|
3764
|
+
return false;
|
|
3765
|
+
}
|
|
3766
|
+
|
|
3767
|
+
if (!this.container || !this.camera?.isPerspectiveCamera) {
|
|
3768
|
+
this._setLocalSnapGridVisible(false);
|
|
3769
|
+
return false;
|
|
3770
|
+
}
|
|
3771
|
+
|
|
3772
|
+
const layer = this._ensureLocalSnapGridLayer();
|
|
3773
|
+
if (!layer) {
|
|
3774
|
+
return false;
|
|
3775
|
+
}
|
|
3776
|
+
|
|
3777
|
+
const viewportMetrics = getCachedViewportMetrics(this);
|
|
3778
|
+
const width = Math.max(1, Number(viewportMetrics.width || 0));
|
|
3779
|
+
const height = Math.max(1, Number(viewportMetrics.height || 0));
|
|
3780
|
+
const left = Number(viewportMetrics.left || 0);
|
|
3781
|
+
const top = Number(viewportMetrics.top || 0);
|
|
3782
|
+
const hasPointer =
|
|
3783
|
+
Number.isFinite(Number(this._lastSnapGridClientX)) &&
|
|
3784
|
+
Number.isFinite(Number(this._lastSnapGridClientY));
|
|
3785
|
+
const centerX = hasPointer
|
|
3786
|
+
? Math.max(0, Math.min(width, Number(this._lastSnapGridClientX) - left))
|
|
3787
|
+
: width / 2;
|
|
3788
|
+
const centerY = hasPointer
|
|
3789
|
+
? Math.max(0, Math.min(height, Number(this._lastSnapGridClientY) - top))
|
|
3790
|
+
: height / 2;
|
|
3791
|
+
const layerLeft = centerX - LOCAL_SNAP_GRID_RADIUS_PX;
|
|
3792
|
+
const layerTop = centerY - LOCAL_SNAP_GRID_RADIUS_PX;
|
|
3793
|
+
|
|
3794
|
+
const camera = this.camera;
|
|
3795
|
+
const cameraZ = Math.max(1, Number(camera.position?.z || 1));
|
|
3796
|
+
const vfov = (Number(camera.fov || 45) * Math.PI) / 180;
|
|
3797
|
+
const viewHeight = 2 * Math.tan(vfov / 2) * cameraZ;
|
|
3798
|
+
const pxPerWorld = height / Math.max(1, viewHeight);
|
|
3799
|
+
const worldGrid = Math.max(1, Number(this.GRID_SIZE || 10));
|
|
3800
|
+
const smallStepPx = Math.max(
|
|
3801
|
+
LOCAL_SNAP_GRID_MIN_STEP_PX,
|
|
3802
|
+
Math.min(LOCAL_SNAP_GRID_MAX_STEP_PX, worldGrid * pxPerWorld)
|
|
3803
|
+
);
|
|
3804
|
+
const majorStepPx = smallStepPx * 10;
|
|
3805
|
+
const originX = width / 2 - Number(camera.position?.x || 0) * pxPerWorld;
|
|
3806
|
+
const originY = height / 2 + Number(camera.position?.y || 0) * pxPerWorld;
|
|
3807
|
+
const positiveModulo = (value, size) => ((value % size) + size) % size;
|
|
3808
|
+
const smallOffsetX = positiveModulo(originX - layerLeft, smallStepPx);
|
|
3809
|
+
const smallOffsetY = positiveModulo(originY - layerTop, smallStepPx);
|
|
3810
|
+
const majorOffsetX = positiveModulo(originX - layerLeft, majorStepPx);
|
|
3811
|
+
const majorOffsetY = positiveModulo(originY - layerTop, majorStepPx);
|
|
3812
|
+
const themeName = String(this.currentThemeName || '').trim();
|
|
3813
|
+
const styleKind = themeName === 'SpatialGrid2D' ? 'dot' : 'line';
|
|
3814
|
+
const opacity = Math.max(0.34, Math.min(0.82, cameraZ <= 1800 ? 0.72 : 0.72 - ((cameraZ - 1800) / 36000)));
|
|
3815
|
+
const localGridKey = [
|
|
3816
|
+
styleKind,
|
|
3817
|
+
Math.round(smallStepPx * 100),
|
|
3818
|
+
Math.round(majorStepPx * 100),
|
|
3819
|
+
Math.round(smallOffsetX * 100),
|
|
3820
|
+
Math.round(smallOffsetY * 100),
|
|
3821
|
+
Math.round(majorOffsetX * 100),
|
|
3822
|
+
Math.round(majorOffsetY * 100),
|
|
3823
|
+
Math.round(opacity * 100)
|
|
3824
|
+
].join('|');
|
|
3825
|
+
|
|
3826
|
+
if (localGridKey !== this._lastLocalSnapGridKey) {
|
|
3827
|
+
this._lastLocalSnapGridKey = localGridKey;
|
|
3828
|
+
if (styleKind === 'dot') {
|
|
3829
|
+
layer.style.backgroundImage = [
|
|
3830
|
+
'radial-gradient(circle at 0 0, rgba(68, 78, 94, 0.34) 1px, transparent 1.55px)',
|
|
3831
|
+
'radial-gradient(circle at 0 0, rgba(44, 55, 74, 0.5) 1.7px, transparent 2.2px)'
|
|
3832
|
+
].join(', ');
|
|
3833
|
+
} else {
|
|
3834
|
+
layer.style.backgroundImage = [
|
|
3835
|
+
'linear-gradient(to right, rgba(70, 82, 100, 0.22) 1px, transparent 1px)',
|
|
3836
|
+
'linear-gradient(to bottom, rgba(70, 82, 100, 0.22) 1px, transparent 1px)',
|
|
3837
|
+
'linear-gradient(to right, rgba(42, 55, 75, 0.36) 1px, transparent 1px)',
|
|
3838
|
+
'linear-gradient(to bottom, rgba(42, 55, 75, 0.36) 1px, transparent 1px)'
|
|
3839
|
+
].join(', ');
|
|
3840
|
+
}
|
|
3841
|
+
layer.style.backgroundSize = styleKind === 'dot'
|
|
3842
|
+
? `${smallStepPx.toFixed(3)}px ${smallStepPx.toFixed(3)}px, ${majorStepPx.toFixed(3)}px ${majorStepPx.toFixed(3)}px`
|
|
3843
|
+
: `${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`;
|
|
3844
|
+
layer.style.backgroundPosition = styleKind === 'dot'
|
|
3845
|
+
? `${smallOffsetX.toFixed(3)}px ${smallOffsetY.toFixed(3)}px, ${majorOffsetX.toFixed(3)}px ${majorOffsetY.toFixed(3)}px`
|
|
3846
|
+
: `${smallOffsetX.toFixed(3)}px 0, 0 ${smallOffsetY.toFixed(3)}px, ${majorOffsetX.toFixed(3)}px 0, 0 ${majorOffsetY.toFixed(3)}px`;
|
|
3847
|
+
layer.style.opacity = opacity.toFixed(3);
|
|
3848
|
+
}
|
|
3849
|
+
|
|
3850
|
+
const transformKey = `${Math.round(layerLeft * 2)}|${Math.round(layerTop * 2)}`;
|
|
3851
|
+
if (transformKey !== this._lastLocalSnapGridTransformKey) {
|
|
3852
|
+
this._lastLocalSnapGridTransformKey = transformKey;
|
|
3853
|
+
layer.style.transform = `translate3d(${layerLeft.toFixed(2)}px, ${layerTop.toFixed(2)}px, 0)`;
|
|
3854
|
+
}
|
|
3855
|
+
|
|
3856
|
+
this._setLocalSnapGridVisible(true);
|
|
3857
|
+
return true;
|
|
3858
|
+
}
|
|
3859
|
+
|
|
3646
3860
|
_ensureMotionGridLayer() {
|
|
3647
3861
|
if (!this.container) {
|
|
3648
3862
|
return null;
|
|
@@ -4497,6 +4711,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4497
4711
|
if (this.scene) this.scene.remove(this.currentThemeObject);
|
|
4498
4712
|
}
|
|
4499
4713
|
this._syncMotionGridLayer(false);
|
|
4714
|
+
this._syncLocalSnapGridLayer(false);
|
|
4500
4715
|
this.currentThemeObject = newTheme.create(this.scene, this.renderer);
|
|
4501
4716
|
if (this.currentThemeObject) this.scene.add(this.currentThemeObject);
|
|
4502
4717
|
this.currentThemeName = themeName;
|
|
@@ -7515,6 +7730,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
7515
7730
|
isCameraNavigationOnlyInteractiveFrame === true) {
|
|
7516
7731
|
this._syncMotionGridLayerForCameraNavigation(usedWebglCanvasCameraTransform);
|
|
7517
7732
|
}
|
|
7733
|
+
this._syncLocalSnapGridLayer(true);
|
|
7518
7734
|
if (shouldRenderWebglFrame === true &&
|
|
7519
7735
|
this._motionGridVisible === true &&
|
|
7520
7736
|
isPureCss3dCameraMotionFrame !== true &&
|
|
@@ -8197,6 +8413,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
8197
8413
|
this._lastMotionGridKey = '';
|
|
8198
8414
|
this._lastMotionGridTransformKey = '';
|
|
8199
8415
|
}
|
|
8416
|
+
if (this._localSnapGridLayer) {
|
|
8417
|
+
this._localSnapGridLayer.remove();
|
|
8418
|
+
this._localSnapGridLayer = null;
|
|
8419
|
+
this._localSnapGridVisible = false;
|
|
8420
|
+
this._lastLocalSnapGridKey = '';
|
|
8421
|
+
this._lastLocalSnapGridTransformKey = '';
|
|
8422
|
+
}
|
|
8200
8423
|
removeCursorDomElement(this);
|
|
8201
8424
|
if (this._viewStatePersistTimer) {
|
|
8202
8425
|
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-v678" />
|
|
11
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-local-snap-grid-v678" />
|
|
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-v678';
|
|
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": "0fNd45RW",
|
|
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-cgRnT3AuM8Mw82hw1iBUqvEjFE3RPDTdFRA0hTl2MRw=",
|
|
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-CkeAh51//UYmSeCRJEi3nfSHsdn1/1M6oxHS4TrYXss=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|