@mindexec/cli 0.2.449 → 0.2.450

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 +204 -199
  3. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +12 -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.450",
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-v857';
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,153 @@ ${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 patternPeriod = Math.max(
3548
+ 1,
3549
+ Math.round(Number(this._lastLocalSnapGridPatternPeriodPx || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX))
3550
+ );
3551
+ const positiveModulo = (value, size) => ((value % size) + size) % size;
3552
+ const gridPhaseX = Math.round(positiveModulo(
3553
+ LOCAL_SNAP_GRID_TILE_OVERSCAN_PX - spotlightLeft,
3554
+ patternPeriod
3555
+ ));
3556
+ const gridPhaseY = Math.round(positiveModulo(
3557
+ LOCAL_SNAP_GRID_TILE_OVERSCAN_PX - spotlightTop,
3558
+ patternPeriod
3559
+ ));
3560
+ if (DEBUG) {
3561
+ const fixedPhaseX = positiveModulo(
3562
+ spotlightLeft - LOCAL_SNAP_GRID_TILE_OVERSCAN_PX + gridPhaseX,
3563
+ patternPeriod
3564
+ );
3565
+ const fixedPhaseY = positiveModulo(
3566
+ spotlightTop - LOCAL_SNAP_GRID_TILE_OVERSCAN_PX + gridPhaseY,
3567
+ patternPeriod
3568
+ );
3569
+ window.MindCanvasDevGuards?.assert?.(
3570
+ fixedPhaseX === 0 && fixedPhaseY === 0,
3571
+ 'local-snap-grid-phase-drift',
3572
+ { spotlightLeft, spotlightTop, gridPhaseX, gridPhaseY, patternPeriod }
3573
+ );
3574
+ }
3575
+ const transformKey = `${spotlightLeft}|${spotlightTop}|${patternPeriod}|${gridPhaseX}|${gridPhaseY}`;
3576
+ if (transformKey === this._lastLocalSnapGridTransformKey) {
3577
+ return false;
3578
+ }
3579
+ this._lastLocalSnapGridTransformKey = transformKey;
3580
+ spotlight.style.transform = `translate3d(${spotlightLeft}px, ${spotlightTop}px, 0)`;
3581
+ if (this._localSnapGridLayer) {
3582
+ this._localSnapGridLayer.style.transform =
3583
+ `translate3d(${gridPhaseX}px, ${gridPhaseY}px, 0)`;
3584
+ }
3585
+ return true;
3586
+ }
3587
+
3526
3588
  _getLocalSnapGridStyleKind() {
3527
3589
  const themeName = String(this.currentThemeName || '').trim();
3528
3590
  return themeName === 'SpatialGrid2D' ? 'dot' : 'line';
3529
3591
  }
3530
3592
 
3531
- _drawLocalSnapGridBitmap(canvas, styleKind, smallStepPx, majorStepPx) {
3593
+ _drawLocalSnapGridTile(canvas, styleKind, smallStepPx, majorStepPx) {
3532
3594
  if (!canvas || typeof canvas.getContext !== 'function') {
3533
3595
  return false;
3534
3596
  }
@@ -3538,105 +3600,60 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3538
3600
  return false;
3539
3601
  }
3540
3602
 
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;
3603
+ const smallStep = Math.max(LOCAL_SNAP_GRID_MIN_STEP_PX, Number(smallStepPx) || LOCAL_SNAP_GRID_DEFAULT_STEP_PX);
3604
+ const majorStep = Math.max(
3605
+ smallStep,
3606
+ Math.min(
3607
+ LOCAL_SNAP_GRID_TILE_OVERSCAN_PX,
3608
+ Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX
3609
+ )
3610
+ );
3611
+ const tileSize = Math.max(1, Math.round(majorStep));
3612
+ if (canvas.width !== tileSize) {
3613
+ canvas.width = tileSize;
3545
3614
  }
3546
- if (canvas.height !== size) {
3547
- canvas.height = size;
3615
+ if (canvas.height !== tileSize) {
3616
+ canvas.height = tileSize;
3548
3617
  }
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
- };
3618
+ ctx.clearRect(0, 0, tileSize, tileSize);
3561
3619
 
3562
3620
  if (styleKind === 'dot') {
3563
3621
  ctx.fillStyle = 'rgba(58, 69, 88, 0.46)';
3564
3622
  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
- }
3623
+ for (let y = 0; y < tileSize; y += smallStep) {
3624
+ for (let x = 0; x < tileSize; x += smallStep) {
3573
3625
  ctx.beginPath();
3574
3626
  ctx.arc(x, y, dotRadius, 0, Math.PI * 2);
3575
3627
  ctx.fill();
3576
- });
3577
- });
3628
+ }
3629
+ }
3578
3630
 
3579
3631
  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
- });
3632
+ ctx.beginPath();
3633
+ ctx.arc(0, 0, 1.85, 0, Math.PI * 2);
3634
+ ctx.fill();
3594
3635
  } else {
3595
3636
  const drawLines = (step, color, width) => {
3596
3637
  ctx.strokeStyle = color;
3597
3638
  ctx.lineWidth = width;
3598
3639
  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);
3640
+ for (let x = 0; x < tileSize; x += step) {
3606
3641
  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);
3642
+ ctx.moveTo(pixelX, 0);
3643
+ ctx.lineTo(pixelX, tileSize);
3644
+ }
3645
+ for (let y = 0; y < tileSize; y += step) {
3617
3646
  const pixelY = Math.round(y) + 0.5;
3618
- ctx.moveTo(center - span, pixelY);
3619
- ctx.lineTo(center + span, pixelY);
3620
- });
3647
+ ctx.moveTo(0, pixelY);
3648
+ ctx.lineTo(tileSize, pixelY);
3649
+ }
3621
3650
  ctx.stroke();
3622
3651
  };
3623
3652
 
3624
3653
  drawLines(smallStep, 'rgba(51, 65, 85, 0.24)', 1);
3625
3654
  drawLines(majorStep, 'rgba(15, 23, 42, 0.42)', 1);
3626
3655
  }
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;
3656
+ return tileSize;
3640
3657
  }
3641
3658
 
3642
3659
  _applyLocalSnapGridStyle(
@@ -3656,7 +3673,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3656
3673
  LOCAL_SNAP_GRID_MIN_STEP_PX,
3657
3674
  Math.min(LOCAL_SNAP_GRID_MAX_STEP_PX, Number(smallStepPx) || LOCAL_SNAP_GRID_DEFAULT_STEP_PX)
3658
3675
  );
3659
- const safeMajorStep = Math.max(safeSmallStep, Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX);
3676
+ const safeMajorStep = Math.max(
3677
+ safeSmallStep,
3678
+ Math.min(
3679
+ LOCAL_SNAP_GRID_TILE_OVERSCAN_PX,
3680
+ Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX
3681
+ )
3682
+ );
3660
3683
  const safeOpacity = Math.max(0.2, Math.min(0.56, Number(opacity) || LOCAL_SNAP_GRID_DEFAULT_OPACITY));
3661
3684
  const localGridKey = [
3662
3685
  keyPrefix,
@@ -3673,12 +3696,21 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3673
3696
  this._lastLocalSnapGridKey = localGridKey;
3674
3697
  const opacityValue = safeOpacity.toFixed(3);
3675
3698
  this._lastLocalSnapGridOpacity = opacityValue;
3676
- this._drawLocalSnapGridBitmap(
3677
- layer,
3699
+ const tileCanvas = this._localSnapGridTileCanvas || document.createElement('canvas');
3700
+ this._localSnapGridTileCanvas = tileCanvas;
3701
+ const tileSize = this._drawLocalSnapGridTile(
3702
+ tileCanvas,
3678
3703
  safeStyleKind,
3679
3704
  safeSmallStep,
3680
3705
  safeMajorStep
3681
3706
  );
3707
+ if (!Number.isFinite(tileSize) || tileSize <= 0) {
3708
+ return false;
3709
+ }
3710
+ this._lastLocalSnapGridPatternPeriodPx = tileSize;
3711
+ this._lastLocalSnapGridTransformKey = '';
3712
+ layer.style.backgroundImage = `url("${tileCanvas.toDataURL('image/png')}")`;
3713
+ layer.style.backgroundSize = `${tileSize}px ${tileSize}px`;
3682
3714
  if (layer.style.opacity !== opacityValue) {
3683
3715
  layer.style.opacity = opacityValue;
3684
3716
  }
@@ -3712,6 +3744,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3712
3744
  if (!layer) {
3713
3745
  return;
3714
3746
  }
3747
+ const spotlight = this._localSnapGridSpotlightLayer;
3715
3748
 
3716
3749
  if (visible === true) {
3717
3750
  const opacityValue = targetOpacity == null
@@ -3726,11 +3759,20 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3726
3759
  if (opacityValue && layer.style.opacity !== opacityValue) {
3727
3760
  layer.style.opacity = opacityValue;
3728
3761
  }
3762
+ if (spotlight) {
3763
+ if (spotlight.style.display !== 'block') {
3764
+ spotlight.style.display = 'block';
3765
+ }
3766
+ if (spotlight.style.opacity !== '1') {
3767
+ spotlight.style.opacity = '1';
3768
+ }
3769
+ }
3729
3770
  return;
3730
3771
  }
3731
3772
 
3732
3773
  if (this._localSnapGridVisible !== true &&
3733
- layer.style.display === 'none') {
3774
+ layer.style.display === 'none' &&
3775
+ (!spotlight || spotlight.style.display === 'none')) {
3734
3776
  return;
3735
3777
  }
3736
3778
 
@@ -3743,6 +3785,14 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3743
3785
  if (layer.style.display !== 'none') {
3744
3786
  layer.style.display = 'none';
3745
3787
  }
3788
+ if (spotlight) {
3789
+ if (spotlight.style.opacity !== '0') {
3790
+ spotlight.style.opacity = '0';
3791
+ }
3792
+ if (spotlight.style.display !== 'none') {
3793
+ spotlight.style.display = 'none';
3794
+ }
3795
+ }
3746
3796
  }
3747
3797
 
3748
3798
  _syncLocalSnapGridLayer(visible = true) {
@@ -3766,37 +3816,11 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3766
3816
  const height = Math.max(1, Number(viewportMetrics.height || 0));
3767
3817
  const left = Number(viewportMetrics.left || 0);
3768
3818
  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));
3819
+ const pointerRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
3798
3820
 
3799
3821
  if (this.isZooming === true && !!this._lastLocalSnapGridKey) {
3822
+ this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
3823
+ this._lastLocalSnapGridPositionRevision = pointerRevision;
3800
3824
  this._localSnapGridStyleDeferredForZoom = true;
3801
3825
  this._setLocalSnapGridVisible(true, this._lastLocalSnapGridOpacity || null);
3802
3826
  return true;
@@ -3843,6 +3867,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3843
3867
  this._localSnapGridStyleDeferredForZoom = true;
3844
3868
  }
3845
3869
 
3870
+ this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
3871
+ this._lastLocalSnapGridPositionRevision = pointerRevision;
3846
3872
  this._setLocalSnapGridVisible(true, this._lastLocalSnapGridOpacity || opacity.toFixed(3));
3847
3873
  return true;
3848
3874
  }
@@ -3877,34 +3903,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3877
3903
  const height = Math.max(1, Number(viewportMetrics.height || 0));
3878
3904
  const left = Number(viewportMetrics.left || 0);
3879
3905
  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;
3906
+ this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
3908
3907
  this._lastLocalSnapGridPositionRevision = pointerRevision;
3909
3908
 
3910
3909
  if (this.isZooming === true) {
@@ -7845,7 +7844,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7845
7844
  this._localSnapGridVisible = false;
7846
7845
  this._lastLocalSnapGridKey = '';
7847
7846
  this._lastLocalSnapGridTransformKey = '';
7847
+ this._lastLocalSnapGridPatternPeriodPx = LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX;
7848
+ }
7849
+ if (this._localSnapGridSpotlightLayer) {
7850
+ this._localSnapGridSpotlightLayer.remove();
7851
+ this._localSnapGridSpotlightLayer = null;
7848
7852
  }
7853
+ this._localSnapGridTileCanvas = null;
7849
7854
  if (this._backgroundGridLayerHost) {
7850
7855
  this._backgroundGridLayerHost.remove();
7851
7856
  this._backgroundGridLayerHost = null;
@@ -1589,8 +1589,8 @@ window.MindMapInteractions = (function () {
1589
1589
  // ▲▲▲ [New] Scrollbar-drag helper functions ▲▲▲
1590
1590
 
1591
1591
  // ▼▼▼ [New] Centralized Pointer Update Helper ▼▼▼
1592
- function setPointerFromClientPosition(module, clientX, clientY) {
1593
- if (!module?.pointer) return false;
1592
+ function updateLocalSnapGridPointer(module, clientX, clientY) {
1593
+ if (!module) return false;
1594
1594
 
1595
1595
  const shouldUpdateLocalSnapGridPointer = !!(
1596
1596
  module._isLocalSnapGridThemeEnabled?.() === true ||
@@ -1606,6 +1606,13 @@ window.MindMapInteractions = (function () {
1606
1606
  module.requestAnimationWake?.('local-snap-grid-pointer');
1607
1607
  }
1608
1608
  }
1609
+ return localSnapGridMoved === true;
1610
+ }
1611
+
1612
+ function setPointerFromClientPosition(module, clientX, clientY) {
1613
+ if (!module?.pointer) return false;
1614
+
1615
+ updateLocalSnapGridPointer(module, clientX, clientY);
1609
1616
 
1610
1617
  const metrics = getCachedViewportMetrics(module);
1611
1618
  if (!metrics || metrics.width <= 0 || metrics.height <= 0) {
@@ -7032,6 +7039,9 @@ window.MindMapInteractions = (function () {
7032
7039
 
7033
7040
 
7034
7041
  function onHoverMove(module, e) {
7042
+ // Keep the cheap spotlight tracking before any hover/raycast early exit.
7043
+ updateLocalSnapGridPointer(module, e?.clientX, e?.clientY);
7044
+
7035
7045
  // Do not run hover raycasts or DOM hit checks while the camera is moving.
7036
7046
  if (
7037
7047
  module.isPanning ||
@@ -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-v950';
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": "ILA9KwLq",
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-lPc30WYtXer88DsvAY5tCILPz0xFdfM0l3P+Ccw4wS8=",
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-gyHNM8wV2/nOJXh4raQFoWqfMh5mgd7xomr7BRf+UbQ=",
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-c2AIozfD07OWnpUIWdjEbUqRQ1OhNnipQpYAVd7zwC0=",
850
850
  "url": "index.html"
851
851
  },
852
852
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: xPV8lHh4 */
1
+ /* Manifest version: ILA9KwLq */
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