@mindexec/cli 0.2.449 → 0.2.451

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.
Files changed (20) hide show
  1. package/package.json +1 -1
  2. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +215 -200
  3. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +15 -2
  4. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +8 -8
  5. package/wwwroot/_framework/MindExecution.Core.9h7x2mjn0w.dll +0 -0
  6. package/wwwroot/_framework/{MindExecution.Kernel.fxnztqgsp3.dll → MindExecution.Kernel.8te3ay3qs6.dll} +0 -0
  7. package/wwwroot/_framework/{MindExecution.Plugins.Admin.vtp5nvymq9.dll → MindExecution.Plugins.Admin.imt43kggvu.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Business.o0bonn1p2f.dll → MindExecution.Plugins.Business.26yozgyvan.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Concept.1omsw5caki.dll → MindExecution.Plugins.Concept.k7fd1qvmfx.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Directory.imwo19wy9c.dll → MindExecution.Plugins.Directory.88ng22x3y0.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.hakp8m5rxg.dll → MindExecution.Plugins.PlanMaster.ll20yqlc09.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.2imuchw4ww.dll → MindExecution.Plugins.YouTube.gqu5xngvav.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Shared.9podjbu7w7.dll → MindExecution.Shared.6ivt1fatt3.dll} +0 -0
  14. package/wwwroot/_framework/MindExecution.Web.7tki7xqpt0.dll +0 -0
  15. package/wwwroot/_framework/blazor.boot.json +21 -21
  16. package/wwwroot/index.html +1 -1
  17. package/wwwroot/service-worker-assets.js +26 -26
  18. package/wwwroot/service-worker.js +1 -1
  19. package/wwwroot/_framework/MindExecution.Core.ocmk8xd0dx.dll +0 -0
  20. package/wwwroot/_framework/MindExecution.Web.rck7kmuixn.dll +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.449",
3
+ "version": "0.2.451",
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 = '20260629-wheel-zoom-immediate-lite-v855';
8
+ const MINDMAP_CORE_BUILD_ID = '20260727-fixed-phase-grid-spotlight-v858';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -112,6 +112,7 @@
112
112
  const LOCAL_SNAP_GRID_DEFAULT_STEP_PX = 24;
113
113
  const LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX = 240;
114
114
  const LOCAL_SNAP_GRID_DEFAULT_OPACITY = 0.42;
115
+ const LOCAL_SNAP_GRID_TILE_OVERSCAN_PX = LOCAL_SNAP_GRID_MAX_STEP_PX * 10;
115
116
  const CAMERA_STATIONARY_INTERACTION_FRAME_DELAY_MS = 48;
116
117
  const CAMERA_ZOOM_END_DELAY_MS = 150;
117
118
  const CAMERA_MOTION_GLOBAL_STYLE_CLASS_ENABLED = false;
@@ -3226,13 +3227,17 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3226
3227
  this._motionGridHideTimer = null;
3227
3228
  this._lastMotionGridKey = '';
3228
3229
  this._localSnapGridLayer = null;
3230
+ this._localSnapGridSpotlightLayer = null;
3229
3231
  this._localSnapGridVisible = false;
3230
3232
  this._lastLocalSnapGridKey = '';
3231
3233
  this._lastLocalSnapGridTransformKey = '';
3232
3234
  this._lastLocalSnapGridOpacity = '';
3235
+ this._lastLocalSnapGridPatternPeriodPx = LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX;
3236
+ this._localSnapGridTileCanvas = null;
3237
+ this._localSnapGridPointerRevision = 0;
3238
+ this._lastLocalSnapGridPositionRevision = -1;
3233
3239
  this._localSnapGridStyleDeferredForZoom = false;
3234
3240
  this._localSnapGridPointerWakeDeferredForZoom = false;
3235
- this._lastLocalSnapGridPointerSnapKey = '';
3236
3241
  this._lastSnapGridClientX = null;
3237
3242
  this._lastSnapGridClientY = null;
3238
3243
  this._animationIdleTimerId = null;
@@ -3313,7 +3318,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3313
3318
  const previousY = this._lastSnapGridClientY;
3314
3319
  this._lastSnapGridClientX = roundedX;
3315
3320
  this._lastSnapGridClientY = roundedY;
3316
- this._lastLocalSnapGridPointerSnapKey = `screen:${roundedX}|${roundedY}`;
3317
3321
  this._localSnapGridPointerRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0)) + 1;
3318
3322
  this._lastLocalSnapGridTransformKey = '';
3319
3323
  if (previousX !== roundedX || previousY !== roundedY) {
@@ -3325,50 +3329,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3325
3329
  return true;
3326
3330
  }
3327
3331
 
3328
- _getLocalSnapGridSnappedScreenCenter(rawCenterX, rawCenterY, width, height, camera = null) {
3329
- const safeWidth = Math.max(1, Number(width || 0));
3330
- const safeHeight = Math.max(1, Number(height || 0));
3331
- const grid = Math.max(1, Number(this.GRID_SIZE || 10));
3332
- const fallbackCenterX = Math.max(0, Math.min(safeWidth, Number(rawCenterX || 0)));
3333
- const fallbackCenterY = Math.max(0, Math.min(safeHeight, Number(rawCenterY || 0)));
3334
- const fallback = {
3335
- centerX: fallbackCenterX,
3336
- centerY: fallbackCenterY,
3337
- snapKey: `screen:${Math.round(fallbackCenterX / grid)}|${Math.round(fallbackCenterY / grid)}`
3338
- };
3339
- const activeCamera = camera || this.camera;
3340
- if (!activeCamera?.isPerspectiveCamera) {
3341
- return fallback;
3342
- }
3343
-
3344
- const cameraZ = Math.max(1, Number(activeCamera.position?.z || 1));
3345
- const vfov = (Number(activeCamera.fov || 45) * Math.PI) / 180;
3346
- const viewHeight = 2 * Math.tan(vfov / 2) * cameraZ;
3347
- const viewWidth = viewHeight * Math.max(0.1, Number(activeCamera.aspect || (safeWidth / safeHeight) || 1));
3348
- if (viewWidth <= 0 || viewHeight <= 0) {
3349
- return fallback;
3350
- }
3351
-
3352
- const cameraX = Number(activeCamera.position?.x || 0);
3353
- const cameraY = Number(activeCamera.position?.y || 0);
3354
- const worldX = cameraX + ((fallbackCenterX / safeWidth) - 0.5) * viewWidth;
3355
- const worldY = cameraY + (0.5 - (fallbackCenterY / safeHeight)) * viewHeight;
3356
- const snappedWorldX = Math.round(worldX / grid) * grid;
3357
- const snappedWorldY = Math.round(worldY / grid) * grid;
3358
-
3359
- return {
3360
- centerX: Math.max(0, Math.min(
3361
- safeWidth,
3362
- (((snappedWorldX - cameraX) / viewWidth) + 0.5) * safeWidth
3363
- )),
3364
- centerY: Math.max(0, Math.min(
3365
- safeHeight,
3366
- (0.5 - ((snappedWorldY - cameraY) / viewHeight)) * safeHeight
3367
- )),
3368
- snapKey: `world:${Math.round(snappedWorldX / grid)}|${Math.round(snappedWorldY / grid)}`
3369
- };
3370
- }
3371
-
3372
3332
  _ensureBackgroundGridLayerHost() {
3373
3333
  if (!this.container || typeof document === 'undefined') {
3374
3334
  return null;
@@ -3484,51 +3444,163 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3484
3444
  if (!this.container || typeof document === 'undefined') {
3485
3445
  return null;
3486
3446
  }
3447
+
3448
+ const spotlight = this._ensureLocalSnapGridSpotlightLayer();
3449
+ if (!spotlight) {
3450
+ return null;
3451
+ }
3452
+
3487
3453
  if (this._localSnapGridLayer?.isConnected) {
3488
- this._placeBackgroundGridLayer(this._localSnapGridLayer);
3454
+ if (this._localSnapGridLayer.parentNode !== spotlight) {
3455
+ spotlight.appendChild(this._localSnapGridLayer);
3456
+ }
3489
3457
  return this._localSnapGridLayer;
3490
3458
  }
3491
3459
 
3492
- const layer = document.createElement('canvas');
3460
+ const layer = document.createElement('div');
3493
3461
  layer.className = 'mindcanvas-local-snap-grid-layer';
3494
3462
  layer.setAttribute('aria-hidden', 'true');
3495
- layer.width = LOCAL_SNAP_GRID_DIAMETER_PX;
3496
- layer.height = LOCAL_SNAP_GRID_DIAMETER_PX;
3497
3463
  layer.style.position = 'absolute';
3498
- layer.style.left = '0';
3499
- layer.style.top = '0';
3500
- layer.style.width = `${LOCAL_SNAP_GRID_DIAMETER_PX}px`;
3501
- layer.style.height = `${LOCAL_SNAP_GRID_DIAMETER_PX}px`;
3502
- layer.style.zIndex = '0';
3464
+ layer.style.left = `-${LOCAL_SNAP_GRID_TILE_OVERSCAN_PX}px`;
3465
+ layer.style.top = `-${LOCAL_SNAP_GRID_TILE_OVERSCAN_PX}px`;
3466
+ layer.style.width = `${LOCAL_SNAP_GRID_DIAMETER_PX + (LOCAL_SNAP_GRID_TILE_OVERSCAN_PX * 2)}px`;
3467
+ layer.style.height = `${LOCAL_SNAP_GRID_DIAMETER_PX + (LOCAL_SNAP_GRID_TILE_OVERSCAN_PX * 2)}px`;
3468
+ layer.style.zIndex = '1';
3503
3469
  layer.style.pointerEvents = 'none';
3504
- layer.style.display = 'none';
3470
+ layer.style.display = 'block';
3505
3471
  layer.style.opacity = '0';
3506
3472
  layer.style.backgroundColor = 'transparent';
3507
- layer.style.borderRadius = '0';
3508
- layer.style.overflow = 'visible';
3509
- layer.style.contain = 'strict';
3473
+ layer.style.backgroundRepeat = 'repeat';
3474
+ layer.style.contain = 'paint';
3510
3475
  layer.style.willChange = 'transform';
3511
3476
  layer.style.transform = 'translate3d(0, 0, 0)';
3512
3477
  layer.style.transition = 'none';
3513
3478
 
3514
- this._placeBackgroundGridLayer(layer);
3479
+ spotlight.appendChild(layer);
3515
3480
 
3516
3481
  this._localSnapGridLayer = layer;
3517
3482
  this._lastLocalSnapGridKey = '';
3518
3483
  this._lastLocalSnapGridTransformKey = '';
3519
3484
  this._lastLocalSnapGridPositionRevision = -1;
3520
- this._lastLocalSnapGridPointerSnapKey = '';
3521
3485
  this._lastLocalSnapGridOpacity = '';
3486
+ this._lastLocalSnapGridPatternPeriodPx = LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX;
3522
3487
  this._localSnapGridStyleDeferredForZoom = false;
3523
3488
  return layer;
3524
3489
  }
3525
3490
 
3491
+ _ensureLocalSnapGridSpotlightLayer() {
3492
+ if (!this.container || typeof document === 'undefined') {
3493
+ return null;
3494
+ }
3495
+ if (this._localSnapGridSpotlightLayer?.isConnected) {
3496
+ this._placeBackgroundGridLayer(this._localSnapGridSpotlightLayer);
3497
+ return this._localSnapGridSpotlightLayer;
3498
+ }
3499
+
3500
+ const spotlight = document.createElement('div');
3501
+ spotlight.className = 'mindcanvas-local-snap-grid-spotlight-layer';
3502
+ spotlight.setAttribute('aria-hidden', 'true');
3503
+ spotlight.style.position = 'absolute';
3504
+ spotlight.style.left = '0';
3505
+ spotlight.style.top = '0';
3506
+ spotlight.style.width = `${LOCAL_SNAP_GRID_DIAMETER_PX}px`;
3507
+ spotlight.style.height = `${LOCAL_SNAP_GRID_DIAMETER_PX}px`;
3508
+ spotlight.style.zIndex = '0';
3509
+ spotlight.style.pointerEvents = 'none';
3510
+ spotlight.style.display = 'none';
3511
+ spotlight.style.opacity = '0';
3512
+ spotlight.style.borderRadius = '50%';
3513
+ spotlight.style.overflow = 'hidden';
3514
+ spotlight.style.background = 'radial-gradient(circle, rgba(255,255,255,0.34) 0%, rgba(219,234,254,0.14) 52%, rgba(219,234,254,0) 78%)';
3515
+ const spotlightMask = 'radial-gradient(circle at center, #000 0%, rgba(0,0,0,0.96) 36%, rgba(0,0,0,0.62) 58%, rgba(0,0,0,0.16) 78%, transparent 100%)';
3516
+ spotlight.style.maskImage = spotlightMask;
3517
+ spotlight.style.webkitMaskImage = spotlightMask;
3518
+ spotlight.style.contain = 'strict';
3519
+ spotlight.style.willChange = 'transform';
3520
+ spotlight.style.transform = 'translate3d(0, 0, 0)';
3521
+ spotlight.style.transition = 'none';
3522
+ this._placeBackgroundGridLayer(spotlight);
3523
+ this._localSnapGridSpotlightLayer = spotlight;
3524
+ return spotlight;
3525
+ }
3526
+
3527
+ _syncLocalSnapGridSpotlightPosition(width, height, left = 0, top = 0) {
3528
+ const spotlight = this._ensureLocalSnapGridSpotlightLayer();
3529
+ if (!spotlight) {
3530
+ return false;
3531
+ }
3532
+ const hasPointer =
3533
+ this._lastSnapGridClientX !== null &&
3534
+ this._lastSnapGridClientX !== undefined &&
3535
+ this._lastSnapGridClientY !== null &&
3536
+ this._lastSnapGridClientY !== undefined &&
3537
+ Number.isFinite(Number(this._lastSnapGridClientX)) &&
3538
+ Number.isFinite(Number(this._lastSnapGridClientY));
3539
+ const centerX = hasPointer
3540
+ ? Math.max(0, Math.min(width, Number(this._lastSnapGridClientX) - left))
3541
+ : width / 2;
3542
+ const centerY = hasPointer
3543
+ ? Math.max(0, Math.min(height, Number(this._lastSnapGridClientY) - top))
3544
+ : height / 2;
3545
+ const spotlightLeft = Math.round(centerX - LOCAL_SNAP_GRID_RADIUS_PX);
3546
+ const spotlightTop = Math.round(centerY - LOCAL_SNAP_GRID_RADIUS_PX);
3547
+ const containerLeft = Math.round(Number(left) || 0);
3548
+ const containerTop = Math.round(Number(top) || 0);
3549
+ const patternPeriod = Math.max(
3550
+ 1,
3551
+ Math.round(Number(this._lastLocalSnapGridPatternPeriodPx || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX))
3552
+ );
3553
+ const positiveModulo = (value, size) => ((value % size) + size) % size;
3554
+ const gridPhaseX = Math.round(positiveModulo(
3555
+ LOCAL_SNAP_GRID_TILE_OVERSCAN_PX - containerLeft - spotlightLeft,
3556
+ patternPeriod
3557
+ ));
3558
+ const gridPhaseY = Math.round(positiveModulo(
3559
+ LOCAL_SNAP_GRID_TILE_OVERSCAN_PX - containerTop - spotlightTop,
3560
+ patternPeriod
3561
+ ));
3562
+ if (DEBUG) {
3563
+ const fixedPhaseX = positiveModulo(
3564
+ containerLeft + spotlightLeft - LOCAL_SNAP_GRID_TILE_OVERSCAN_PX + gridPhaseX,
3565
+ patternPeriod
3566
+ );
3567
+ const fixedPhaseY = positiveModulo(
3568
+ containerTop + spotlightTop - LOCAL_SNAP_GRID_TILE_OVERSCAN_PX + gridPhaseY,
3569
+ patternPeriod
3570
+ );
3571
+ window.MindCanvasDevGuards?.assert?.(
3572
+ fixedPhaseX === 0 && fixedPhaseY === 0,
3573
+ 'local-snap-grid-phase-drift',
3574
+ {
3575
+ containerLeft,
3576
+ containerTop,
3577
+ spotlightLeft,
3578
+ spotlightTop,
3579
+ gridPhaseX,
3580
+ gridPhaseY,
3581
+ patternPeriod
3582
+ }
3583
+ );
3584
+ }
3585
+ const transformKey = `${spotlightLeft}|${spotlightTop}|${patternPeriod}|${gridPhaseX}|${gridPhaseY}`;
3586
+ if (transformKey === this._lastLocalSnapGridTransformKey) {
3587
+ return false;
3588
+ }
3589
+ this._lastLocalSnapGridTransformKey = transformKey;
3590
+ spotlight.style.transform = `translate3d(${spotlightLeft}px, ${spotlightTop}px, 0)`;
3591
+ if (this._localSnapGridLayer) {
3592
+ this._localSnapGridLayer.style.transform =
3593
+ `translate3d(${gridPhaseX}px, ${gridPhaseY}px, 0)`;
3594
+ }
3595
+ return true;
3596
+ }
3597
+
3526
3598
  _getLocalSnapGridStyleKind() {
3527
3599
  const themeName = String(this.currentThemeName || '').trim();
3528
3600
  return themeName === 'SpatialGrid2D' ? 'dot' : 'line';
3529
3601
  }
3530
3602
 
3531
- _drawLocalSnapGridBitmap(canvas, styleKind, smallStepPx, majorStepPx) {
3603
+ _drawLocalSnapGridTile(canvas, styleKind, smallStepPx, majorStepPx) {
3532
3604
  if (!canvas || typeof canvas.getContext !== 'function') {
3533
3605
  return false;
3534
3606
  }
@@ -3538,105 +3610,60 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3538
3610
  return false;
3539
3611
  }
3540
3612
 
3541
- const size = LOCAL_SNAP_GRID_DIAMETER_PX;
3542
- const center = LOCAL_SNAP_GRID_RADIUS_PX;
3543
- if (canvas.width !== size) {
3544
- canvas.width = size;
3613
+ const smallStep = Math.max(LOCAL_SNAP_GRID_MIN_STEP_PX, Number(smallStepPx) || LOCAL_SNAP_GRID_DEFAULT_STEP_PX);
3614
+ const majorStep = Math.max(
3615
+ smallStep,
3616
+ Math.min(
3617
+ LOCAL_SNAP_GRID_TILE_OVERSCAN_PX,
3618
+ Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX
3619
+ )
3620
+ );
3621
+ const tileSize = Math.max(1, Math.round(majorStep));
3622
+ if (canvas.width !== tileSize) {
3623
+ canvas.width = tileSize;
3545
3624
  }
3546
- if (canvas.height !== size) {
3547
- canvas.height = size;
3625
+ if (canvas.height !== tileSize) {
3626
+ canvas.height = tileSize;
3548
3627
  }
3549
-
3550
- const smallStep = Math.max(LOCAL_SNAP_GRID_MIN_STEP_PX, Number(smallStepPx) || LOCAL_SNAP_GRID_DEFAULT_STEP_PX);
3551
- const majorStep = Math.max(smallStep, Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX);
3552
- ctx.clearRect(0, 0, size, size);
3553
- const radiusSq = center * center;
3554
- const forCenteredSteps = (step, callback) => {
3555
- callback(center);
3556
- for (let offset = step; offset <= center; offset += step) {
3557
- callback(center - offset);
3558
- callback(center + offset);
3559
- }
3560
- };
3628
+ ctx.clearRect(0, 0, tileSize, tileSize);
3561
3629
 
3562
3630
  if (styleKind === 'dot') {
3563
3631
  ctx.fillStyle = 'rgba(58, 69, 88, 0.46)';
3564
3632
  const dotRadius = 1.15;
3565
- forCenteredSteps(smallStep, y => {
3566
- const dy = y - center;
3567
- const dySq = dy * dy;
3568
- forCenteredSteps(smallStep, x => {
3569
- const dx = x - center;
3570
- if ((dx * dx) + dySq > radiusSq) {
3571
- return;
3572
- }
3633
+ for (let y = 0; y < tileSize; y += smallStep) {
3634
+ for (let x = 0; x < tileSize; x += smallStep) {
3573
3635
  ctx.beginPath();
3574
3636
  ctx.arc(x, y, dotRadius, 0, Math.PI * 2);
3575
3637
  ctx.fill();
3576
- });
3577
- });
3638
+ }
3639
+ }
3578
3640
 
3579
3641
  ctx.fillStyle = 'rgba(15, 23, 42, 0.62)';
3580
- const majorDotRadius = 1.85;
3581
- forCenteredSteps(majorStep, y => {
3582
- const dy = y - center;
3583
- const dySq = dy * dy;
3584
- forCenteredSteps(majorStep, x => {
3585
- const dx = x - center;
3586
- if ((dx * dx) + dySq > radiusSq) {
3587
- return;
3588
- }
3589
- ctx.beginPath();
3590
- ctx.arc(x, y, majorDotRadius, 0, Math.PI * 2);
3591
- ctx.fill();
3592
- });
3593
- });
3642
+ ctx.beginPath();
3643
+ ctx.arc(0, 0, 1.85, 0, Math.PI * 2);
3644
+ ctx.fill();
3594
3645
  } else {
3595
3646
  const drawLines = (step, color, width) => {
3596
3647
  ctx.strokeStyle = color;
3597
3648
  ctx.lineWidth = width;
3598
3649
  ctx.beginPath();
3599
- forCenteredSteps(step, x => {
3600
- const dx = x - center;
3601
- const spanSq = radiusSq - (dx * dx);
3602
- if (spanSq <= 0) {
3603
- return;
3604
- }
3605
- const span = Math.sqrt(spanSq);
3650
+ for (let x = 0; x < tileSize; x += step) {
3606
3651
  const pixelX = Math.round(x) + 0.5;
3607
- ctx.moveTo(pixelX, center - span);
3608
- ctx.lineTo(pixelX, center + span);
3609
- });
3610
- forCenteredSteps(step, y => {
3611
- const dy = y - center;
3612
- const spanSq = radiusSq - (dy * dy);
3613
- if (spanSq <= 0) {
3614
- return;
3615
- }
3616
- const span = Math.sqrt(spanSq);
3652
+ ctx.moveTo(pixelX, 0);
3653
+ ctx.lineTo(pixelX, tileSize);
3654
+ }
3655
+ for (let y = 0; y < tileSize; y += step) {
3617
3656
  const pixelY = Math.round(y) + 0.5;
3618
- ctx.moveTo(center - span, pixelY);
3619
- ctx.lineTo(center + span, pixelY);
3620
- });
3657
+ ctx.moveTo(0, pixelY);
3658
+ ctx.lineTo(tileSize, pixelY);
3659
+ }
3621
3660
  ctx.stroke();
3622
3661
  };
3623
3662
 
3624
3663
  drawLines(smallStep, 'rgba(51, 65, 85, 0.24)', 1);
3625
3664
  drawLines(majorStep, 'rgba(15, 23, 42, 0.42)', 1);
3626
3665
  }
3627
-
3628
- ctx.globalCompositeOperation = 'destination-in';
3629
- const fade = ctx.createRadialGradient(center, center, center * 0.18, center, center, center);
3630
- fade.addColorStop(0, 'rgba(0,0,0,1)');
3631
- fade.addColorStop(0.34, 'rgba(0,0,0,0.92)');
3632
- fade.addColorStop(0.56, 'rgba(0,0,0,0.48)');
3633
- fade.addColorStop(0.74, 'rgba(0,0,0,0.14)');
3634
- fade.addColorStop(0.88, 'rgba(0,0,0,0.035)');
3635
- fade.addColorStop(1, 'rgba(0,0,0,0)');
3636
- ctx.fillStyle = fade;
3637
- ctx.fillRect(0, 0, size, size);
3638
- ctx.globalCompositeOperation = 'source-over';
3639
- return true;
3666
+ return tileSize;
3640
3667
  }
3641
3668
 
3642
3669
  _applyLocalSnapGridStyle(
@@ -3656,7 +3683,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3656
3683
  LOCAL_SNAP_GRID_MIN_STEP_PX,
3657
3684
  Math.min(LOCAL_SNAP_GRID_MAX_STEP_PX, Number(smallStepPx) || LOCAL_SNAP_GRID_DEFAULT_STEP_PX)
3658
3685
  );
3659
- const safeMajorStep = Math.max(safeSmallStep, Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX);
3686
+ const safeMajorStep = Math.max(
3687
+ safeSmallStep,
3688
+ Math.min(
3689
+ LOCAL_SNAP_GRID_TILE_OVERSCAN_PX,
3690
+ Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX
3691
+ )
3692
+ );
3660
3693
  const safeOpacity = Math.max(0.2, Math.min(0.56, Number(opacity) || LOCAL_SNAP_GRID_DEFAULT_OPACITY));
3661
3694
  const localGridKey = [
3662
3695
  keyPrefix,
@@ -3670,15 +3703,24 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3670
3703
  return false;
3671
3704
  }
3672
3705
 
3673
- this._lastLocalSnapGridKey = localGridKey;
3674
3706
  const opacityValue = safeOpacity.toFixed(3);
3675
3707
  this._lastLocalSnapGridOpacity = opacityValue;
3676
- this._drawLocalSnapGridBitmap(
3677
- layer,
3708
+ const tileCanvas = this._localSnapGridTileCanvas || document.createElement('canvas');
3709
+ this._localSnapGridTileCanvas = tileCanvas;
3710
+ const tileSize = this._drawLocalSnapGridTile(
3711
+ tileCanvas,
3678
3712
  safeStyleKind,
3679
3713
  safeSmallStep,
3680
3714
  safeMajorStep
3681
3715
  );
3716
+ if (!Number.isFinite(tileSize) || tileSize <= 0) {
3717
+ return false;
3718
+ }
3719
+ this._lastLocalSnapGridKey = localGridKey;
3720
+ this._lastLocalSnapGridPatternPeriodPx = tileSize;
3721
+ this._lastLocalSnapGridTransformKey = '';
3722
+ layer.style.backgroundImage = `url("${tileCanvas.toDataURL('image/png')}")`;
3723
+ layer.style.backgroundSize = `${tileSize}px ${tileSize}px`;
3682
3724
  if (layer.style.opacity !== opacityValue) {
3683
3725
  layer.style.opacity = opacityValue;
3684
3726
  }
@@ -3712,6 +3754,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3712
3754
  if (!layer) {
3713
3755
  return;
3714
3756
  }
3757
+ const spotlight = this._localSnapGridSpotlightLayer;
3715
3758
 
3716
3759
  if (visible === true) {
3717
3760
  const opacityValue = targetOpacity == null
@@ -3726,11 +3769,20 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3726
3769
  if (opacityValue && layer.style.opacity !== opacityValue) {
3727
3770
  layer.style.opacity = opacityValue;
3728
3771
  }
3772
+ if (spotlight) {
3773
+ if (spotlight.style.display !== 'block') {
3774
+ spotlight.style.display = 'block';
3775
+ }
3776
+ if (spotlight.style.opacity !== '1') {
3777
+ spotlight.style.opacity = '1';
3778
+ }
3779
+ }
3729
3780
  return;
3730
3781
  }
3731
3782
 
3732
3783
  if (this._localSnapGridVisible !== true &&
3733
- layer.style.display === 'none') {
3784
+ layer.style.display === 'none' &&
3785
+ (!spotlight || spotlight.style.display === 'none')) {
3734
3786
  return;
3735
3787
  }
3736
3788
 
@@ -3743,6 +3795,14 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3743
3795
  if (layer.style.display !== 'none') {
3744
3796
  layer.style.display = 'none';
3745
3797
  }
3798
+ if (spotlight) {
3799
+ if (spotlight.style.opacity !== '0') {
3800
+ spotlight.style.opacity = '0';
3801
+ }
3802
+ if (spotlight.style.display !== 'none') {
3803
+ spotlight.style.display = 'none';
3804
+ }
3805
+ }
3746
3806
  }
3747
3807
 
3748
3808
  _syncLocalSnapGridLayer(visible = true) {
@@ -3766,37 +3826,11 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3766
3826
  const height = Math.max(1, Number(viewportMetrics.height || 0));
3767
3827
  const left = Number(viewportMetrics.left || 0);
3768
3828
  const top = Number(viewportMetrics.top || 0);
3769
- const hasPointer =
3770
- this._lastSnapGridClientX !== null &&
3771
- this._lastSnapGridClientX !== undefined &&
3772
- this._lastSnapGridClientY !== null &&
3773
- this._lastSnapGridClientY !== undefined &&
3774
- Number.isFinite(Number(this._lastSnapGridClientX)) &&
3775
- Number.isFinite(Number(this._lastSnapGridClientY));
3776
- const centerX = hasPointer
3777
- ? Math.max(0, Math.min(width, Number(this._lastSnapGridClientX) - left))
3778
- : width / 2;
3779
- const centerY = hasPointer
3780
- ? Math.max(0, Math.min(height, Number(this._lastSnapGridClientY) - top))
3781
- : height / 2;
3782
- const snappedCenter = this._getLocalSnapGridSnappedScreenCenter(
3783
- centerX,
3784
- centerY,
3785
- width,
3786
- height,
3787
- this.camera
3788
- );
3789
- const snappedLayerLeft = Math.round(snappedCenter.centerX - LOCAL_SNAP_GRID_RADIUS_PX);
3790
- const snappedLayerTop = Math.round(snappedCenter.centerY - LOCAL_SNAP_GRID_RADIUS_PX);
3791
- const transformKey = `${snappedLayerLeft}|${snappedLayerTop}`;
3792
- if (transformKey !== this._lastLocalSnapGridTransformKey) {
3793
- this._lastLocalSnapGridTransformKey = transformKey;
3794
- layer.style.transform = `translate3d(${snappedLayerLeft}px, ${snappedLayerTop}px, 0)`;
3795
- }
3796
- this._lastLocalSnapGridPointerSnapKey = snappedCenter.snapKey;
3797
- this._lastLocalSnapGridPositionRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
3829
+ const pointerRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
3798
3830
 
3799
3831
  if (this.isZooming === true && !!this._lastLocalSnapGridKey) {
3832
+ this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
3833
+ this._lastLocalSnapGridPositionRevision = pointerRevision;
3800
3834
  this._localSnapGridStyleDeferredForZoom = true;
3801
3835
  this._setLocalSnapGridVisible(true, this._lastLocalSnapGridOpacity || null);
3802
3836
  return true;
@@ -3843,6 +3877,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3843
3877
  this._localSnapGridStyleDeferredForZoom = true;
3844
3878
  }
3845
3879
 
3880
+ this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
3881
+ this._lastLocalSnapGridPositionRevision = pointerRevision;
3846
3882
  this._setLocalSnapGridVisible(true, this._lastLocalSnapGridOpacity || opacity.toFixed(3));
3847
3883
  return true;
3848
3884
  }
@@ -3877,34 +3913,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3877
3913
  const height = Math.max(1, Number(viewportMetrics.height || 0));
3878
3914
  const left = Number(viewportMetrics.left || 0);
3879
3915
  const top = Number(viewportMetrics.top || 0);
3880
- const hasPointer =
3881
- this._lastSnapGridClientX !== null &&
3882
- this._lastSnapGridClientX !== undefined &&
3883
- this._lastSnapGridClientY !== null &&
3884
- this._lastSnapGridClientY !== undefined &&
3885
- Number.isFinite(Number(this._lastSnapGridClientX)) &&
3886
- Number.isFinite(Number(this._lastSnapGridClientY));
3887
- const centerX = hasPointer
3888
- ? Math.max(0, Math.min(width, Number(this._lastSnapGridClientX) - left))
3889
- : width / 2;
3890
- const centerY = hasPointer
3891
- ? Math.max(0, Math.min(height, Number(this._lastSnapGridClientY) - top))
3892
- : height / 2;
3893
- const snappedCenter = this._getLocalSnapGridSnappedScreenCenter(
3894
- centerX,
3895
- centerY,
3896
- width,
3897
- height,
3898
- this.camera
3899
- );
3900
- const snappedLayerLeft = Math.round(snappedCenter.centerX - LOCAL_SNAP_GRID_RADIUS_PX);
3901
- const snappedLayerTop = Math.round(snappedCenter.centerY - LOCAL_SNAP_GRID_RADIUS_PX);
3902
- const transformKey = `${snappedLayerLeft}|${snappedLayerTop}`;
3903
- if (transformKey !== this._lastLocalSnapGridTransformKey) {
3904
- this._lastLocalSnapGridTransformKey = transformKey;
3905
- layer.style.transform = `translate3d(${snappedLayerLeft}px, ${snappedLayerTop}px, 0)`;
3906
- }
3907
- this._lastLocalSnapGridPointerSnapKey = snappedCenter.snapKey;
3916
+ this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
3908
3917
  this._lastLocalSnapGridPositionRevision = pointerRevision;
3909
3918
 
3910
3919
  if (this.isZooming === true) {
@@ -7845,7 +7854,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7845
7854
  this._localSnapGridVisible = false;
7846
7855
  this._lastLocalSnapGridKey = '';
7847
7856
  this._lastLocalSnapGridTransformKey = '';
7857
+ this._lastLocalSnapGridPatternPeriodPx = LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX;
7858
+ }
7859
+ if (this._localSnapGridSpotlightLayer) {
7860
+ this._localSnapGridSpotlightLayer.remove();
7861
+ this._localSnapGridSpotlightLayer = null;
7848
7862
  }
7863
+ this._localSnapGridTileCanvas = null;
7849
7864
  if (this._backgroundGridLayerHost) {
7850
7865
  this._backgroundGridLayerHost.remove();
7851
7866
  this._backgroundGridLayerHost = null;
@@ -245,6 +245,7 @@ window.MindMapInteractions = (function () {
245
245
  boundOnMouseUp: onMouseUp.bind(null, module),
246
246
  boundOnResizeHandleCapture: onResizeHandleCapture.bind(null, module),
247
247
  boundOnHoverMove: onHoverMove.bind(null, module),
248
+ boundOnLocalSnapGridPointerMove: e => updateLocalSnapGridPointer(module, e?.clientX, e?.clientY),
248
249
  boundOnKeyDown: onKeyDown.bind(null, module),
249
250
  boundOnKeyUp: onKeyUp.bind(null, module),
250
251
  boundOnWindowBlur: clearPhysicalWheelModifierState.bind(null, module),
@@ -1589,8 +1590,8 @@ window.MindMapInteractions = (function () {
1589
1590
  // ▲▲▲ [New] Scrollbar-drag helper functions ▲▲▲
1590
1591
 
1591
1592
  // ▼▼▼ [New] Centralized Pointer Update Helper ▼▼▼
1592
- function setPointerFromClientPosition(module, clientX, clientY) {
1593
- if (!module?.pointer) return false;
1593
+ function updateLocalSnapGridPointer(module, clientX, clientY) {
1594
+ if (!module) return false;
1594
1595
 
1595
1596
  const shouldUpdateLocalSnapGridPointer = !!(
1596
1597
  module._isLocalSnapGridThemeEnabled?.() === true ||
@@ -1606,6 +1607,13 @@ window.MindMapInteractions = (function () {
1606
1607
  module.requestAnimationWake?.('local-snap-grid-pointer');
1607
1608
  }
1608
1609
  }
1610
+ return localSnapGridMoved === true;
1611
+ }
1612
+
1613
+ function setPointerFromClientPosition(module, clientX, clientY) {
1614
+ if (!module?.pointer) return false;
1615
+
1616
+ updateLocalSnapGridPointer(module, clientX, clientY);
1609
1617
 
1610
1618
  const metrics = getCachedViewportMetrics(module);
1611
1619
  if (!metrics || metrics.width <= 0 || metrics.height <= 0) {
@@ -7032,6 +7040,9 @@ window.MindMapInteractions = (function () {
7032
7040
 
7033
7041
 
7034
7042
  function onHoverMove(module, e) {
7043
+ // Keep the cheap spotlight tracking before any hover/raycast early exit.
7044
+ updateLocalSnapGridPointer(module, e?.clientX, e?.clientY);
7045
+
7035
7046
  // Do not run hover raycasts or DOM hit checks while the camera is moving.
7036
7047
  if (
7037
7048
  module.isPanning ||
@@ -7737,6 +7748,7 @@ window.MindMapInteractions = (function () {
7737
7748
  moduleInstance.container.addEventListener('gesturechange', handlers.boundOnGestureChange, { passive: false });
7738
7749
  moduleInstance.container.addEventListener('gestureend', handlers.boundOnGestureEnd, { passive: false });
7739
7750
  }
7751
+ window.addEventListener('pointermove', handlers.boundOnLocalSnapGridPointerMove, { passive: true, capture: true });
7740
7752
  window.addEventListener('resize', handlers.boundOnResize);
7741
7753
  window.addEventListener('orientationchange', handlers.boundOnViewportMetricsChange);
7742
7754
  if (window.visualViewport) {
@@ -7811,6 +7823,7 @@ window.MindMapInteractions = (function () {
7811
7823
  moduleInstance.container.removeEventListener('gesturechange', handlers.boundOnGestureChange);
7812
7824
  moduleInstance.container.removeEventListener('gestureend', handlers.boundOnGestureEnd);
7813
7825
  }
7826
+ window.removeEventListener('pointermove', handlers.boundOnLocalSnapGridPointerMove, true);
7814
7827
  window.removeEventListener('resize', handlers.boundOnResize);
7815
7828
  window.removeEventListener('orientationchange', handlers.boundOnViewportMetricsChange);
7816
7829
  if (window.visualViewport) {
@@ -51,7 +51,7 @@
51
51
  // ▲▲▲ [Usage] ▲▲▲
52
52
 
53
53
  // Procedural line rendering settings
54
- const LOD_RENDERER_BUILD_ID = '20260725-cold-mid-line-restore-v846';
54
+ const LOD_RENDERER_BUILD_ID = '20260727-mid-line-invariant-v847';
55
55
  const DirtyKind = Object.freeze({
56
56
  ResidentFullRebuild: 'resident-full-rebuild',
57
57
  ResidentPatch: 'resident-patch',
@@ -2275,9 +2275,9 @@
2275
2275
  `,
2276
2276
  transparent: true,
2277
2277
  depthWrite: true, // Enable depth write to occlude grid
2278
- depthTest: true,
2279
- side: THREE.DoubleSide,
2280
- polygonOffset: true,
2278
+ depthTest: true,
2279
+ side: THREE.DoubleSide,
2280
+ polygonOffset: true,
2281
2281
  polygonOffsetFactor: -20.0, // Priority over Node(-10.0) -> -20.0
2282
2282
  polygonOffsetUnits: -20.0
2283
2283
  });
@@ -7354,7 +7354,7 @@
7354
7354
 
7355
7355
  _updateLineRenderState(cameraZ, currentTextLikeCount, lodBand = this._currentLodBand) {
7356
7356
  const disableByCount = currentTextLikeCount > LINE_DISABLE_THRESHOLD;
7357
- const deferPostLoadRestore = this._shouldDeferPostLoadLineRestore(lodBand);
7357
+ this._shouldDeferPostLoadLineRestore(lodBand);
7358
7358
  const interactionHot =
7359
7359
  this._module?.isDraggingNode === true ||
7360
7360
  this._module?.isDraggingMultipleNodes === true ||
@@ -7363,7 +7363,7 @@
7363
7363
  this.isDragging === true;
7364
7364
  this._suspendLinesForInteraction = interactionHot;
7365
7365
  // ▼▼▼ [Fix] Respect manual loading state override ▼▼▼
7366
- const shouldDisable = disableByCount || this.isLoading || deferPostLoadRestore || this._suspendLinesForInteraction === true;
7366
+ const shouldDisable = disableByCount || this.isLoading || this._suspendLinesForInteraction === true;
7367
7367
  // ▲▲▲ [Fix] ▲▲▲
7368
7368
 
7369
7369
  if (this._disableLineRender !== shouldDisable) {
@@ -7951,8 +7951,8 @@
7951
7951
  this._deferLineRestoreUntil = shouldDeferLineRestore
7952
7952
  ? (performance.now() + POST_LOAD_LINE_RESTORE_DELAY_MS)
7953
7953
  : 0;
7954
- this._lineDetailsPatchPending = false;
7955
- this._disableLineRender = shouldDeferLineRestore; // Let the expensive silhouette rebuild happen on the next quiet frame.
7954
+ this._lineDetailsPatchPending = shouldDeferLineRestore;
7955
+ this._disableLineRender = false;
7956
7956
  this.lineDataDirty = true;
7957
7957
  this._residentRebuildPending = !hasResidentInstances;
7958
7958
  this._residentRebuildDeferredUntil = hasResidentInstances
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-rIUrRgpr6xzEw1PUvcq/dqLcWhwwXeumbz+b+6ufbqc=",
4
+ "hash": "sha256-k4lwKbjJ9g84j895BOdrv32i+eUyBH6giaTuE3n/Wks=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -122,16 +122,16 @@
122
122
  "System.brmz7yk5qh.dll": "System.dll",
123
123
  "netstandard.b50t77veor.dll": "netstandard.dll",
124
124
  "System.Private.CoreLib.g6ztz7cmo2.dll": "System.Private.CoreLib.dll",
125
- "MindExecution.Core.ocmk8xd0dx.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.fxnztqgsp3.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.vtp5nvymq9.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.o0bonn1p2f.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.1omsw5caki.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.imwo19wy9c.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.hakp8m5rxg.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.2imuchw4ww.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.9podjbu7w7.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.rck7kmuixn.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.9h7x2mjn0w.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.8te3ay3qs6.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.imt43kggvu.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.26yozgyvan.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.k7fd1qvmfx.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.88ng22x3y0.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.ll20yqlc09.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.gqu5xngvav.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.6ivt1fatt3.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.7tki7xqpt0.dll": "MindExecution.Web.dll",
135
135
  "dotnet.native.566r55w3xu.js": "dotnet.native.js",
136
136
  "dotnet.native.x6q5aixc38.wasm": "dotnet.native.wasm",
137
137
  "dotnet.js": "dotnet.js",
@@ -276,18 +276,18 @@
276
276
  "System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
277
277
  "System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
278
278
  "netstandard.b50t77veor.dll": "sha256-//jQGOXjb8ET8WtXgOJrAxLx6E7zDJ5RjRRutwkvmxo=",
279
- "MindExecution.Core.ocmk8xd0dx.dll": "sha256-2FXw6tnaB0/3IkXDoePsiiqcGmcHX3LeE1GuncCxr8Q=",
280
- "MindExecution.Kernel.fxnztqgsp3.dll": "sha256-40iaOWToc1ctRFaSAXaeVHijLi+VaTIyB4H6/8TGPWc=",
281
- "MindExecution.Plugins.Business.o0bonn1p2f.dll": "sha256-OC/L2jc2qh7+9035z6ACMRRtBTEWPdpH3pPyuXzYths=",
282
- "MindExecution.Plugins.Concept.1omsw5caki.dll": "sha256-PwrTgqE0RBqe2i/f3hFgEZYE8+POdJJiYxVRzORsUYg=",
283
- "MindExecution.Plugins.PlanMaster.hakp8m5rxg.dll": "sha256-+WK2cgPTtZMvRGMKpAuQ2m7fSAiKWjbY4fTNS9Ahxa0=",
284
- "MindExecution.Shared.9podjbu7w7.dll": "sha256-TV3ZAh+AJ04cRtQ6MZbiYFUR5mj/NVm5DfoXi7XS5uA=",
285
- "MindExecution.Web.rck7kmuixn.dll": "sha256-NZHuPQtPEsixdPEg/MmooHjlv7OaK+m7JMubEQA9c2Q="
279
+ "MindExecution.Core.9h7x2mjn0w.dll": "sha256-4xFFMH5EUob9RXyohd+joGOoBTaarjSHyzY5kx3PRew=",
280
+ "MindExecution.Kernel.8te3ay3qs6.dll": "sha256-RND/bkb6ILP8m7z9LRP827D9tNbpZLIKIcrd5uzm8/w=",
281
+ "MindExecution.Plugins.Business.26yozgyvan.dll": "sha256-BhpTZtrJq26NpvKtYqHfYLKf2pJ93U0/R7WiPZMSedc=",
282
+ "MindExecution.Plugins.Concept.k7fd1qvmfx.dll": "sha256-QEcnhJgU5OshztWG/haRRIbg3NnykUuI0vEYkx2d9rU=",
283
+ "MindExecution.Plugins.PlanMaster.ll20yqlc09.dll": "sha256-KWcHEcj5l+QAGZXfxf7DCnyH1ACHwBwSVCgRReQPvyc=",
284
+ "MindExecution.Shared.6ivt1fatt3.dll": "sha256-Qp5kQWJBgQ7XXBot/X/66cV19jqiEwUFLd9b20Oamgw=",
285
+ "MindExecution.Web.7tki7xqpt0.dll": "sha256-JVtnGWCckZKnsid5V7G/01xTp3mnhCwxl112V16RTCg="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.vtp5nvymq9.dll": "sha256-/frs4e3qMXXun2/xZXUy/tuf/KSkQvTrCtB5UYAmXKU=",
289
- "MindExecution.Plugins.Directory.imwo19wy9c.dll": "sha256-1l+1/ia1THevruYKb5sFSryNetkpypac4SVWsvn3btw=",
290
- "MindExecution.Plugins.YouTube.2imuchw4ww.dll": "sha256-lsKWfrlYMBL/h0yTYVQ21r8YelZyZtwb12ARnPMJERw="
288
+ "MindExecution.Plugins.Admin.imt43kggvu.dll": "sha256-Bt7O2MFpDgzgB7CeUA4tB79feUGJiGvR7Zh4fUcGY+U=",
289
+ "MindExecution.Plugins.Directory.88ng22x3y0.dll": "sha256-mDOSQlu0aRlQ+9xQUmvcZAazdUkU4IFbPZ4yJjCegxs=",
290
+ "MindExecution.Plugins.YouTube.gqu5xngvav.dll": "sha256-KJg4t8mJDtKx8ElI66yv4H9Uw04BKb2g1d2RddYYhBk="
291
291
  }
292
292
  },
293
293
  "cacheBootResources": true,
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260726-codex-sdk-v946';
582
+ const scriptVersion = '20260727-fixed-phase-grid-v952';
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": "xPV8lHh4",
2
+ "version": "p8ssqnwY",
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-4eD2o9mTDubyz6mpk1N9GZ3MmCi09MaC923iYGCb348=",
81
+ "hash": "sha256-mQJAssSKsBPUgKPUA7JW2AKHvXnQT3RExAenuLL5+so=",
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
83
83
  },
84
84
  {
@@ -110,7 +110,7 @@
110
110
  "url": "_content/MindExecution.Shared/js/mind-map-glow-shader.js"
111
111
  },
112
112
  {
113
- "hash": "sha256-yU6+cCQmi+iqU9PH1W17Kpgbn4t9MUsgMSRbByeJebw=",
113
+ "hash": "sha256-wPZrXIRdM4Q6OME4+cmEMyZKC+gqlU9gGdGiHnSF7wk=",
114
114
  "url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
115
115
  },
116
116
  {
@@ -118,7 +118,7 @@
118
118
  "url": "_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js"
119
119
  },
120
120
  {
121
- "hash": "sha256-J3UC/3HMvDl2veveIbL0Dk9ziFXlxeaO1jNvTSfIFpE=",
121
+ "hash": "sha256-2s3onLoT9d7reE9vNyoHelc1PtXeHxfqYogeLE4QlT4=",
122
122
  "url": "_content/MindExecution.Shared/js/mind-map-lod-renderer.js"
123
123
  },
124
124
  {
@@ -430,44 +430,44 @@
430
430
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-2FXw6tnaB0/3IkXDoePsiiqcGmcHX3LeE1GuncCxr8Q=",
434
- "url": "_framework/MindExecution.Core.ocmk8xd0dx.dll"
433
+ "hash": "sha256-4xFFMH5EUob9RXyohd+joGOoBTaarjSHyzY5kx3PRew=",
434
+ "url": "_framework/MindExecution.Core.9h7x2mjn0w.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-40iaOWToc1ctRFaSAXaeVHijLi+VaTIyB4H6/8TGPWc=",
438
- "url": "_framework/MindExecution.Kernel.fxnztqgsp3.dll"
437
+ "hash": "sha256-RND/bkb6ILP8m7z9LRP827D9tNbpZLIKIcrd5uzm8/w=",
438
+ "url": "_framework/MindExecution.Kernel.8te3ay3qs6.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-/frs4e3qMXXun2/xZXUy/tuf/KSkQvTrCtB5UYAmXKU=",
442
- "url": "_framework/MindExecution.Plugins.Admin.vtp5nvymq9.dll"
441
+ "hash": "sha256-Bt7O2MFpDgzgB7CeUA4tB79feUGJiGvR7Zh4fUcGY+U=",
442
+ "url": "_framework/MindExecution.Plugins.Admin.imt43kggvu.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-OC/L2jc2qh7+9035z6ACMRRtBTEWPdpH3pPyuXzYths=",
446
- "url": "_framework/MindExecution.Plugins.Business.o0bonn1p2f.dll"
445
+ "hash": "sha256-BhpTZtrJq26NpvKtYqHfYLKf2pJ93U0/R7WiPZMSedc=",
446
+ "url": "_framework/MindExecution.Plugins.Business.26yozgyvan.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-PwrTgqE0RBqe2i/f3hFgEZYE8+POdJJiYxVRzORsUYg=",
450
- "url": "_framework/MindExecution.Plugins.Concept.1omsw5caki.dll"
449
+ "hash": "sha256-QEcnhJgU5OshztWG/haRRIbg3NnykUuI0vEYkx2d9rU=",
450
+ "url": "_framework/MindExecution.Plugins.Concept.k7fd1qvmfx.dll"
451
451
  },
452
452
  {
453
- "hash": "sha256-1l+1/ia1THevruYKb5sFSryNetkpypac4SVWsvn3btw=",
454
- "url": "_framework/MindExecution.Plugins.Directory.imwo19wy9c.dll"
453
+ "hash": "sha256-mDOSQlu0aRlQ+9xQUmvcZAazdUkU4IFbPZ4yJjCegxs=",
454
+ "url": "_framework/MindExecution.Plugins.Directory.88ng22x3y0.dll"
455
455
  },
456
456
  {
457
- "hash": "sha256-+WK2cgPTtZMvRGMKpAuQ2m7fSAiKWjbY4fTNS9Ahxa0=",
458
- "url": "_framework/MindExecution.Plugins.PlanMaster.hakp8m5rxg.dll"
457
+ "hash": "sha256-KWcHEcj5l+QAGZXfxf7DCnyH1ACHwBwSVCgRReQPvyc=",
458
+ "url": "_framework/MindExecution.Plugins.PlanMaster.ll20yqlc09.dll"
459
459
  },
460
460
  {
461
- "hash": "sha256-lsKWfrlYMBL/h0yTYVQ21r8YelZyZtwb12ARnPMJERw=",
462
- "url": "_framework/MindExecution.Plugins.YouTube.2imuchw4ww.dll"
461
+ "hash": "sha256-KJg4t8mJDtKx8ElI66yv4H9Uw04BKb2g1d2RddYYhBk=",
462
+ "url": "_framework/MindExecution.Plugins.YouTube.gqu5xngvav.dll"
463
463
  },
464
464
  {
465
- "hash": "sha256-TV3ZAh+AJ04cRtQ6MZbiYFUR5mj/NVm5DfoXi7XS5uA=",
466
- "url": "_framework/MindExecution.Shared.9podjbu7w7.dll"
465
+ "hash": "sha256-Qp5kQWJBgQ7XXBot/X/66cV19jqiEwUFLd9b20Oamgw=",
466
+ "url": "_framework/MindExecution.Shared.6ivt1fatt3.dll"
467
467
  },
468
468
  {
469
- "hash": "sha256-NZHuPQtPEsixdPEg/MmooHjlv7OaK+m7JMubEQA9c2Q=",
470
- "url": "_framework/MindExecution.Web.rck7kmuixn.dll"
469
+ "hash": "sha256-JVtnGWCckZKnsid5V7G/01xTp3mnhCwxl112V16RTCg=",
470
+ "url": "_framework/MindExecution.Web.7tki7xqpt0.dll"
471
471
  },
472
472
  {
473
473
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -786,7 +786,7 @@
786
786
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
787
787
  },
788
788
  {
789
- "hash": "sha256-dxIsVl01dT7vVmJ2ro3tKeBcFv6bsKrZLjLWpQAxbyk=",
789
+ "hash": "sha256-tnP0tykhBy53WYU4kCLMGRKT3Ta4jiR9a3SemKUepoA=",
790
790
  "url": "_framework/blazor.boot.json"
791
791
  },
792
792
  {
@@ -846,7 +846,7 @@
846
846
  "url": "icon-512.png"
847
847
  },
848
848
  {
849
- "hash": "sha256-8enUJGcw5hyeWpgh8eCSkgYdzWg3LoCoHlL3ifMMNy8=",
849
+ "hash": "sha256-6WXHglnUixqMAtvwh+KquCabhsGtEytTYIOPc8zOXJE=",
850
850
  "url": "index.html"
851
851
  },
852
852
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: xPV8lHh4 */
1
+ /* Manifest version: p8ssqnwY */
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