@mindexec/cli 0.2.446 → 0.2.447

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 (31) hide show
  1. package/README.md +2 -2
  2. package/package.json +2 -2
  3. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  4. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  5. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  6. package/remote-hub.js +1 -1
  7. package/scripts/remote-fleet-render-smoke.mjs +74 -36
  8. package/scripts/remote-hub-smoke.mjs +7 -0
  9. package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +1 -3
  10. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +199 -100
  11. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-hotpath.js +902 -0
  12. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +56 -385
  13. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +90 -134
  14. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +167 -24
  15. package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +92 -50
  16. package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +35 -12
  17. package/wwwroot/_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js +35 -2
  18. package/wwwroot/_framework/{MindExecution.Core.djyzj5mxyk.dll → MindExecution.Core.mswl4wlkm9.dll} +0 -0
  19. package/wwwroot/_framework/{MindExecution.Kernel.6e5cj9aijz.dll → MindExecution.Kernel.zupeldfptg.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Plugins.Admin.siulh9tfrf.dll → MindExecution.Plugins.Admin.hq0vyqnqtn.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Plugins.Business.8cjtrc7qd3.dll → MindExecution.Plugins.Business.pucw3o7rno.dll} +0 -0
  22. package/wwwroot/_framework/{MindExecution.Plugins.Concept.rpp78mc75u.dll → MindExecution.Plugins.Concept.557tzzkrrx.dll} +0 -0
  23. package/wwwroot/_framework/{MindExecution.Plugins.Directory.wfv0ff9v4u.dll → MindExecution.Plugins.Directory.zh1ddg1fn6.dll} +0 -0
  24. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.jdppnbd6g4.dll → MindExecution.Plugins.PlanMaster.0z9pzynpu9.dll} +0 -0
  25. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.a43f2q3pkw.dll → MindExecution.Plugins.YouTube.y8g77r54fa.dll} +0 -0
  26. package/wwwroot/_framework/{MindExecution.Shared.gwtyj0e9lw.dll → MindExecution.Shared.1ymsdbwid2.dll} +0 -0
  27. package/wwwroot/_framework/{MindExecution.Web.j3zaapcxtt.dll → MindExecution.Web.bb1txupuv0.dll} +0 -0
  28. package/wwwroot/_framework/blazor.boot.json +21 -21
  29. package/wwwroot/index.html +2 -1
  30. package/wwwroot/service-worker-assets.js +35 -31
  31. package/wwwroot/service-worker.js +1 -1
@@ -1364,7 +1364,11 @@
1364
1364
  metricsSnapshotAgeMs: 0,
1365
1365
  metricsSnapshotPeakMs: 0,
1366
1366
  visibilityCullingProfile: null,
1367
- renderPlanDiagnostics: null
1367
+ renderPlanDiagnostics: null,
1368
+ nearCss3dPerf: null,
1369
+ css3dRendererCounters: null,
1370
+ renderQueueMetrics: null,
1371
+ lastCss3dVisibilityPatch: null
1368
1372
  };
1369
1373
  }
1370
1374
 
@@ -1490,7 +1494,11 @@
1490
1494
  metricsSnapshotAgeMs: 0,
1491
1495
  metricsSnapshotPeakMs: Number((moduleInstance._renderDebugMetricsSnapshotPeakMs || 0).toFixed(2)),
1492
1496
  visibilityCullingProfile: moduleInstance._lastVisibilityCullingProfile || null,
1493
- renderPlanDiagnostics: window.MindMapRenderPlan?.getDiagnostics?.(moduleInstance.lodRenderer) || null
1497
+ renderPlanDiagnostics: window.MindMapRenderPlan?.getDiagnostics?.(moduleInstance.lodRenderer) || null,
1498
+ nearCss3dPerf: window.MindMapCss3dHotPath?.getPerfSnapshot?.(moduleInstance) || null,
1499
+ css3dRendererCounters: moduleInstance.cssRenderer?.getDebugCounters?.() || null,
1500
+ renderQueueMetrics: window.MindMapPipeline?.getQueueDebugMetrics?.() || null,
1501
+ lastCss3dVisibilityPatch: moduleInstance._lastCss3dVisibilityPatch || null
1494
1502
  };
1495
1503
  moduleInstance._lastRenderDebugMetricsSnapshot = snapshot;
1496
1504
  return snapshot;
@@ -3290,36 +3298,22 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3290
3298
 
3291
3299
  const roundedX = Math.round(nextX * 2) / 2;
3292
3300
  const roundedY = Math.round(nextY * 2) / 2;
3293
- if (this.isZooming === true &&
3294
- this._lastLocalSnapGridPointerSnapKey &&
3295
- Math.abs(Number(this._lastSnapGridClientX || 0) - roundedX) < 0.001 &&
3296
- Math.abs(Number(this._lastSnapGridClientY || 0) - roundedY) < 0.001) {
3297
- this._localSnapGridStyleDeferredForZoom = true;
3301
+ if (Math.abs(Number(this._lastSnapGridClientX ?? Number.NaN) - roundedX) < 0.001 &&
3302
+ Math.abs(Number(this._lastSnapGridClientY ?? Number.NaN) - roundedY) < 0.001) {
3303
+ if (this.isZooming === true) {
3304
+ this._localSnapGridStyleDeferredForZoom = true;
3305
+ }
3298
3306
  return false;
3299
3307
  }
3300
- const fallbackGrid = Math.max(1, Number(this.GRID_SIZE || 10));
3301
- let pointerSnapKey = `screen:${Math.round(roundedX / fallbackGrid)}|${Math.round(roundedY / fallbackGrid)}`;
3302
- if (this.container && this.camera?.isPerspectiveCamera) {
3303
- const viewportMetrics = getCachedViewportMetrics(this);
3304
- const width = Math.max(1, Number(viewportMetrics.width || 0));
3305
- const height = Math.max(1, Number(viewportMetrics.height || 0));
3306
- const left = Number(viewportMetrics.left || 0);
3307
- const top = Number(viewportMetrics.top || 0);
3308
- const centerX = Math.max(0, Math.min(width, roundedX - left));
3309
- const centerY = Math.max(0, Math.min(height, roundedY - top));
3310
- const snappedCenter = this._getLocalSnapGridSnappedScreenCenter(centerX, centerY, width, height, this.camera);
3311
- pointerSnapKey = snappedCenter.snapKey || pointerSnapKey;
3312
- }
3313
-
3314
- if (this._lastLocalSnapGridPointerSnapKey === pointerSnapKey) {
3315
- return false;
3308
+ if (this.isZooming === true) {
3309
+ this._localSnapGridStyleDeferredForZoom = true;
3316
3310
  }
3317
3311
 
3318
3312
  const previousX = this._lastSnapGridClientX;
3319
3313
  const previousY = this._lastSnapGridClientY;
3320
3314
  this._lastSnapGridClientX = roundedX;
3321
3315
  this._lastSnapGridClientY = roundedY;
3322
- this._lastLocalSnapGridPointerSnapKey = pointerSnapKey;
3316
+ this._lastLocalSnapGridPointerSnapKey = `screen:${roundedX}|${roundedY}`;
3323
3317
  this._localSnapGridPointerRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0)) + 1;
3324
3318
  this._lastLocalSnapGridTransformKey = '';
3325
3319
  if (previousX !== roundedX || previousY !== roundedY) {
@@ -3334,11 +3328,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3334
3328
  _getLocalSnapGridSnappedScreenCenter(rawCenterX, rawCenterY, width, height, camera = null) {
3335
3329
  const safeWidth = Math.max(1, Number(width || 0));
3336
3330
  const safeHeight = Math.max(1, Number(height || 0));
3337
- const fallbackGrid = Math.max(1, Number(this.GRID_SIZE || 10));
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)));
3338
3334
  const fallback = {
3339
- centerX: Math.max(0, Math.min(safeWidth, Number(rawCenterX || 0))),
3340
- centerY: Math.max(0, Math.min(safeHeight, Number(rawCenterY || 0))),
3341
- snapKey: `screen:${Math.round(Number(rawCenterX || 0) / fallbackGrid)}|${Math.round(Number(rawCenterY || 0) / fallbackGrid)}`
3335
+ centerX: fallbackCenterX,
3336
+ centerY: fallbackCenterY,
3337
+ snapKey: `screen:${Math.round(fallbackCenterX / grid)}|${Math.round(fallbackCenterY / grid)}`
3342
3338
  };
3343
3339
  const activeCamera = camera || this.camera;
3344
3340
  if (!activeCamera?.isPerspectiveCamera) {
@@ -3355,17 +3351,20 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3355
3351
 
3356
3352
  const cameraX = Number(activeCamera.position?.x || 0);
3357
3353
  const cameraY = Number(activeCamera.position?.y || 0);
3358
- const worldX = cameraX + ((fallback.centerX / safeWidth) - 0.5) * viewWidth;
3359
- const worldY = cameraY + (0.5 - (fallback.centerY / safeHeight)) * viewHeight;
3360
- const grid = fallbackGrid;
3354
+ const worldX = cameraX + ((fallbackCenterX / safeWidth) - 0.5) * viewWidth;
3355
+ const worldY = cameraY + (0.5 - (fallbackCenterY / safeHeight)) * viewHeight;
3361
3356
  const snappedWorldX = Math.round(worldX / grid) * grid;
3362
3357
  const snappedWorldY = Math.round(worldY / grid) * grid;
3363
- const snappedCenterX = (((snappedWorldX - cameraX) / viewWidth) + 0.5) * safeWidth;
3364
- const snappedCenterY = (0.5 - ((snappedWorldY - cameraY) / viewHeight)) * safeHeight;
3365
3358
 
3366
3359
  return {
3367
- centerX: Math.max(0, Math.min(safeWidth, snappedCenterX)),
3368
- centerY: Math.max(0, Math.min(safeHeight, snappedCenterY)),
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
+ )),
3369
3368
  snapKey: `world:${Math.round(snappedWorldX / grid)}|${Math.round(snappedWorldY / grid)}`
3370
3369
  };
3371
3370
  }
@@ -3444,6 +3443,43 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3444
3443
  return layer.parentNode === host;
3445
3444
  }
3446
3445
 
3446
+ _syncLocalSnapGridBackgroundSurface() {
3447
+ if (!this.container) {
3448
+ return false;
3449
+ }
3450
+
3451
+ const isLocalSnapGridTheme = this.currentThemeObject?.userData?.localSnapGrid === true;
3452
+ if (isLocalSnapGridTheme !== true) {
3453
+ if (this.container.style.backgroundColor) {
3454
+ this.container.style.backgroundColor = '';
3455
+ }
3456
+ return false;
3457
+ }
3458
+
3459
+ const rawBackgroundColor = this.currentThemeObject?.userData?.localSnapGridBackgroundColor;
3460
+ let backgroundColor = '';
3461
+ if (rawBackgroundColor !== undefined && rawBackgroundColor !== null) {
3462
+ try {
3463
+ const themeColor = rawBackgroundColor?.isColor === true
3464
+ ? rawBackgroundColor
3465
+ : new THREE.Color(rawBackgroundColor);
3466
+ backgroundColor = `#${themeColor.getHexString()}`;
3467
+ } catch {
3468
+ backgroundColor = '';
3469
+ }
3470
+ }
3471
+
3472
+ // Local dot/line hints are DOM canvases below the transparent WebGL
3473
+ // resident surface. An opaque scene background would cover the hint.
3474
+ if (this.scene?.background) {
3475
+ this.scene.background = null;
3476
+ }
3477
+ if (this.container.style.backgroundColor !== backgroundColor) {
3478
+ this.container.style.backgroundColor = backgroundColor;
3479
+ }
3480
+ return true;
3481
+ }
3482
+
3447
3483
  _ensureLocalSnapGridLayer() {
3448
3484
  if (!this.container || typeof document === 'undefined') {
3449
3485
  return null;
@@ -3514,66 +3550,74 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3514
3550
  const smallStep = Math.max(LOCAL_SNAP_GRID_MIN_STEP_PX, Number(smallStepPx) || LOCAL_SNAP_GRID_DEFAULT_STEP_PX);
3515
3551
  const majorStep = Math.max(smallStep, Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX);
3516
3552
  ctx.clearRect(0, 0, size, size);
3517
- const radius = center;
3518
- const radiusSq = radius * radius;
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
+ };
3519
3561
 
3520
3562
  if (styleKind === 'dot') {
3521
3563
  ctx.fillStyle = 'rgba(58, 69, 88, 0.46)';
3522
3564
  const dotRadius = 1.15;
3523
- for (let y = 0; y <= size; y += smallStep) {
3565
+ forCenteredSteps(smallStep, y => {
3524
3566
  const dy = y - center;
3525
3567
  const dySq = dy * dy;
3526
- for (let x = 0; x <= size; x += smallStep) {
3568
+ forCenteredSteps(smallStep, x => {
3527
3569
  const dx = x - center;
3528
3570
  if ((dx * dx) + dySq > radiusSq) {
3529
- continue;
3571
+ return;
3530
3572
  }
3531
3573
  ctx.beginPath();
3532
3574
  ctx.arc(x, y, dotRadius, 0, Math.PI * 2);
3533
3575
  ctx.fill();
3534
- }
3535
- }
3576
+ });
3577
+ });
3536
3578
 
3537
3579
  ctx.fillStyle = 'rgba(15, 23, 42, 0.62)';
3538
3580
  const majorDotRadius = 1.85;
3539
- for (let y = 0; y <= size; y += majorStep) {
3581
+ forCenteredSteps(majorStep, y => {
3540
3582
  const dy = y - center;
3541
3583
  const dySq = dy * dy;
3542
- for (let x = 0; x <= size; x += majorStep) {
3584
+ forCenteredSteps(majorStep, x => {
3543
3585
  const dx = x - center;
3544
3586
  if ((dx * dx) + dySq > radiusSq) {
3545
- continue;
3587
+ return;
3546
3588
  }
3547
3589
  ctx.beginPath();
3548
3590
  ctx.arc(x, y, majorDotRadius, 0, Math.PI * 2);
3549
3591
  ctx.fill();
3550
- }
3551
- }
3592
+ });
3593
+ });
3552
3594
  } else {
3553
3595
  const drawLines = (step, color, width) => {
3554
3596
  ctx.strokeStyle = color;
3555
3597
  ctx.lineWidth = width;
3556
3598
  ctx.beginPath();
3557
- for (let x = 0.5; x <= size; x += step) {
3599
+ forCenteredSteps(step, x => {
3558
3600
  const dx = x - center;
3559
3601
  const spanSq = radiusSq - (dx * dx);
3560
3602
  if (spanSq <= 0) {
3561
- continue;
3603
+ return;
3562
3604
  }
3563
3605
  const span = Math.sqrt(spanSq);
3564
- ctx.moveTo(x, center - span);
3565
- ctx.lineTo(x, center + span);
3566
- }
3567
- for (let y = 0.5; y <= size; y += step) {
3606
+ const pixelX = Math.round(x) + 0.5;
3607
+ ctx.moveTo(pixelX, center - span);
3608
+ ctx.lineTo(pixelX, center + span);
3609
+ });
3610
+ forCenteredSteps(step, y => {
3568
3611
  const dy = y - center;
3569
3612
  const spanSq = radiusSq - (dy * dy);
3570
3613
  if (spanSq <= 0) {
3571
- continue;
3614
+ return;
3572
3615
  }
3573
3616
  const span = Math.sqrt(spanSq);
3574
- ctx.moveTo(center - span, y);
3575
- ctx.lineTo(center + span, y);
3576
- }
3617
+ const pixelY = Math.round(y) + 0.5;
3618
+ ctx.moveTo(center - span, pixelY);
3619
+ ctx.lineTo(center + span, pixelY);
3620
+ });
3577
3621
  ctx.stroke();
3578
3622
  };
3579
3623
 
@@ -3595,7 +3639,14 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3595
3639
  return true;
3596
3640
  }
3597
3641
 
3598
- _applyLocalSnapGridStyle(layer, styleKind, smallStepPx, majorStepPx, opacity, keyPrefix = 'style') {
3642
+ _applyLocalSnapGridStyle(
3643
+ layer,
3644
+ styleKind,
3645
+ smallStepPx,
3646
+ majorStepPx,
3647
+ opacity,
3648
+ keyPrefix = 'style'
3649
+ ) {
3599
3650
  if (!layer) {
3600
3651
  return false;
3601
3652
  }
@@ -3622,7 +3673,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3622
3673
  this._lastLocalSnapGridKey = localGridKey;
3623
3674
  const opacityValue = safeOpacity.toFixed(3);
3624
3675
  this._lastLocalSnapGridOpacity = opacityValue;
3625
- this._drawLocalSnapGridBitmap(layer, safeStyleKind, safeSmallStep, safeMajorStep);
3676
+ this._drawLocalSnapGridBitmap(
3677
+ layer,
3678
+ safeStyleKind,
3679
+ safeSmallStep,
3680
+ safeMajorStep
3681
+ );
3626
3682
  if (layer.style.opacity !== opacityValue) {
3627
3683
  layer.style.opacity = opacityValue;
3628
3684
  }
@@ -3673,7 +3729,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3673
3729
  return;
3674
3730
  }
3675
3731
 
3676
- if (this._localSnapGridVisible !== true && layer.style.display === 'none') {
3732
+ if (this._localSnapGridVisible !== true &&
3733
+ layer.style.display === 'none') {
3677
3734
  return;
3678
3735
  }
3679
3736
 
@@ -3722,19 +3779,24 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3722
3779
  const centerY = hasPointer
3723
3780
  ? Math.max(0, Math.min(height, Number(this._lastSnapGridClientY) - top))
3724
3781
  : height / 2;
3725
- const snappedCenter = this._getLocalSnapGridSnappedScreenCenter(centerX, centerY, width, height, this.camera);
3726
- const layerLeft = snappedCenter.centerX - LOCAL_SNAP_GRID_RADIUS_PX;
3727
- const layerTop = snappedCenter.centerY - LOCAL_SNAP_GRID_RADIUS_PX;
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));
3728
3798
 
3729
3799
  if (this.isZooming === true && !!this._lastLocalSnapGridKey) {
3730
- const snappedLayerLeft = Math.round(layerLeft);
3731
- const snappedLayerTop = Math.round(layerTop);
3732
- const transformKey = `${snappedLayerLeft}|${snappedLayerTop}`;
3733
- if (transformKey !== this._lastLocalSnapGridTransformKey) {
3734
- this._lastLocalSnapGridTransformKey = transformKey;
3735
- layer.style.transform = `translate3d(${snappedLayerLeft}px, ${snappedLayerTop}px, 0)`;
3736
- }
3737
- this._lastLocalSnapGridPositionRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
3738
3800
  this._localSnapGridStyleDeferredForZoom = true;
3739
3801
  this._setLocalSnapGridVisible(true, this._lastLocalSnapGridOpacity || null);
3740
3802
  return true;
@@ -3770,20 +3832,17 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3770
3832
 
3771
3833
  if (shouldDeferLocalGridStyleForZoom !== true) {
3772
3834
  this._localSnapGridStyleDeferredForZoom = false;
3773
- this._applyLocalSnapGridStyle(layer, styleKind, smallStepPx, majorStepPx, opacity);
3835
+ this._applyLocalSnapGridStyle(
3836
+ layer,
3837
+ styleKind,
3838
+ smallStepPx,
3839
+ majorStepPx,
3840
+ opacity
3841
+ );
3774
3842
  } else if (shouldDeferLocalGridStyleForZoom === true) {
3775
3843
  this._localSnapGridStyleDeferredForZoom = true;
3776
3844
  }
3777
3845
 
3778
- const snappedLayerLeft = Math.round(layerLeft);
3779
- const snappedLayerTop = Math.round(layerTop);
3780
- const transformKey = `${snappedLayerLeft}|${snappedLayerTop}`;
3781
- if (transformKey !== this._lastLocalSnapGridTransformKey) {
3782
- this._lastLocalSnapGridTransformKey = transformKey;
3783
- layer.style.transform = `translate3d(${snappedLayerLeft}px, ${snappedLayerTop}px, 0)`;
3784
- }
3785
- this._lastLocalSnapGridPositionRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
3786
-
3787
3846
  this._setLocalSnapGridVisible(true, this._lastLocalSnapGridOpacity || opacity.toFixed(3));
3788
3847
  return true;
3789
3848
  }
@@ -3813,15 +3872,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3813
3872
 
3814
3873
  const layer = this._localSnapGridLayer;
3815
3874
  const pointerRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
3816
- if (this.isZooming === true &&
3817
- this._localSnapGridVisible === true &&
3818
- this._lastLocalSnapGridKey &&
3819
- this._lastLocalSnapGridTransformKey &&
3820
- this._lastLocalSnapGridPositionRevision === pointerRevision) {
3821
- this._localSnapGridStyleDeferredForZoom = true;
3822
- return true;
3823
- }
3824
-
3825
3875
  const viewportMetrics = getCachedViewportMetrics(this);
3826
3876
  const width = Math.max(1, Number(viewportMetrics.width || 0));
3827
3877
  const height = Math.max(1, Number(viewportMetrics.height || 0));
@@ -3840,17 +3890,21 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3840
3890
  const centerY = hasPointer
3841
3891
  ? Math.max(0, Math.min(height, Number(this._lastSnapGridClientY) - top))
3842
3892
  : height / 2;
3843
- const snappedCenter = this._getLocalSnapGridSnappedScreenCenter(centerX, centerY, width, height, this.camera);
3844
- const layerLeft = snappedCenter.centerX - LOCAL_SNAP_GRID_RADIUS_PX;
3845
- const layerTop = snappedCenter.centerY - LOCAL_SNAP_GRID_RADIUS_PX;
3846
- const snappedLayerLeft = Math.round(layerLeft);
3847
- const snappedLayerTop = Math.round(layerTop);
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);
3848
3902
  const transformKey = `${snappedLayerLeft}|${snappedLayerTop}`;
3849
-
3850
3903
  if (transformKey !== this._lastLocalSnapGridTransformKey) {
3851
3904
  this._lastLocalSnapGridTransformKey = transformKey;
3852
3905
  layer.style.transform = `translate3d(${snappedLayerLeft}px, ${snappedLayerTop}px, 0)`;
3853
3906
  }
3907
+ this._lastLocalSnapGridPointerSnapKey = snappedCenter.snapKey;
3854
3908
  this._lastLocalSnapGridPositionRevision = pointerRevision;
3855
3909
 
3856
3910
  if (this.isZooming === true) {
@@ -4761,6 +4815,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4761
4815
  // 3. CSS3D Renderer (??
4762
4816
  if (globalThis.CSS3DRenderer) {
4763
4817
  this.cssRenderer = new globalThis.CSS3DRenderer();
4818
+ window.MindMapCss3dHotPath?.ensureCssRendererHooks?.(this);
4764
4819
  this.cssRenderer.setSize(this.container.clientWidth, this.container.clientHeight);
4765
4820
 
4766
4821
  const cssEl = this.cssRenderer.domElement;
@@ -4892,7 +4947,10 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4892
4947
  }
4893
4948
  if (isLocalSnapGridOnlyTheme === true) {
4894
4949
  this.currentThemeObject.visible = false;
4950
+ this._syncLocalSnapGridBackgroundSurface();
4895
4951
  this._syncLocalSnapGridLayer(true);
4952
+ } else {
4953
+ this._syncLocalSnapGridBackgroundSurface();
4896
4954
  }
4897
4955
  this._forceThemeAnimationFrame = true;
4898
4956
  this._forceUpdateFrames = Math.max(this._forceUpdateFrames || 0, 2);
@@ -6505,6 +6563,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6505
6563
  shouldUpdateResidentCssMediaFallback;
6506
6564
  const prevVisibilityVersion = Number(this._visibilityVersion || 0);
6507
6565
  const prevLodVisualEpoch = Number(this.lodRenderer?._lodVisualEpoch || 0);
6566
+ const css3dVisualChangedSinceLastRenderAtFrameStart =
6567
+ this._css3dVisualChangedSinceLastRender === true;
6508
6568
  this._css3dVisualChangedThisFrame = false;
6509
6569
  let shouldSyncCss3dTransforms = false;
6510
6570
  let lodUpdateCalledThisFrame = false;
@@ -6637,9 +6697,37 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6637
6697
  !hasNonCameraNavigationForcedUpdate &&
6638
6698
  !hasPendingNearCssWarmup &&
6639
6699
  !this.isWindowResizing;
6700
+ const hasExactVisibilityDiff =
6701
+ visibilityChangedThisFrame === true &&
6702
+ this._lastVisibilityDiffComplete === true &&
6703
+ Number(this._lastVisibilityDiffVersion ?? -1) === Number(this._visibilityVersion || 0);
6704
+ const canApplyCss3dVisibilityDiff =
6705
+ isFullResMode === true &&
6706
+ hasExactVisibilityDiff === true &&
6707
+ lodVisualEpochChangedThisFrame !== true &&
6708
+ css3dVisualChangedSinceLastRenderAtFrameStart !== true &&
6709
+ !isNodeInteracting &&
6710
+ !hasNonCameraNavigationForcedUpdate &&
6711
+ !hasPendingNearCssWarmup &&
6712
+ !this.isWindowResizing;
6713
+ const css3dVisibilityDiffResult = canApplyCss3dVisibilityDiff
6714
+ ? window.MindMapCss3DManager?.applyVisibilityDiff?.(
6715
+ this,
6716
+ this._lastVisibilityEnteredIds || [],
6717
+ this._lastVisibilityExitedIds || []
6718
+ )
6719
+ : null;
6720
+ const css3dVisibilityDiffAppliedThisFrame =
6721
+ css3dVisibilityDiffResult?.complete === true;
6722
+ this._lastCss3dVisibilityPatch = css3dVisibilityDiffResult || null;
6723
+ if (css3dVisibilityDiffAppliedThisFrame) {
6724
+ this._css3dVisualChangedThisFrame = false;
6725
+ this._css3dVisualChangedSinceLastRender = false;
6726
+ }
6640
6727
  const shouldSyncCss3dForVisibilityChange =
6641
6728
  visibilityChangedThisFrame === true &&
6642
- isIncrementalPanVisibilityFrame !== true;
6729
+ isIncrementalPanVisibilityFrame !== true &&
6730
+ css3dVisibilityDiffAppliedThisFrame !== true;
6643
6731
  if (useTextOverlayV2 && lodVisualEpochChangedThisFrame) {
6644
6732
  this._overlayDirty = true;
6645
6733
  }
@@ -6977,10 +7065,16 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6977
7065
  this._syncMotionGridLayerForCameraNavigation();
6978
7066
  }
6979
7067
  }
7068
+ const localSnapGridPointerRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
7069
+ const hasPendingLocalSnapGridPointerMove =
7070
+ Number(this._lastLocalSnapGridPositionRevision ?? -1) !== localSnapGridPointerRevision;
6980
7071
  const shouldUseLocalSnapGridPositionOnly = !!(
6981
- isCameraNavigationOnlyInteractiveFrame === true &&
6982
7072
  this._localSnapGridLayer?.isConnected &&
6983
- this._lastLocalSnapGridKey
7073
+ this._lastLocalSnapGridKey &&
7074
+ (
7075
+ isCameraNavigationOnlyInteractiveFrame === true ||
7076
+ hasPendingLocalSnapGridPointerMove === true
7077
+ )
6984
7078
  );
6985
7079
  syncLocalSnapGridForCameraNavigation(this, shouldUseLocalSnapGridPositionOnly === true);
6986
7080
  if (shouldRenderWebglFrame === true &&
@@ -7669,7 +7763,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7669
7763
  this.setBackgroundTheme(desiredTheme);
7670
7764
  }
7671
7765
 
7672
- this.container.style.backgroundColor = '';
7766
+ this._syncLocalSnapGridBackgroundSurface();
7673
7767
  this.container.style.display = 'block';
7674
7768
 
7675
7769
  if (this.renderer?.domElement) {
@@ -9794,6 +9888,11 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
9794
9888
  }
9795
9889
  resetFramePerfPeakProfile(moduleInstance);
9796
9890
  moduleInstance._renderDebugMetricsSnapshotPeakMs = 0;
9891
+ window.MindMapCss3dHotPath?.resetPerfCounters?.(moduleInstance);
9892
+ moduleInstance.cssRenderer?.resetDebugCounters?.();
9893
+ window.MindMapPipeline?.resetQueueDebugMetrics?.();
9894
+ moduleInstance._lastRenderDebugMetricsSnapshot = null;
9895
+ moduleInstance._lastRenderDebugMetricsSnapshotAt = 0;
9797
9896
  return true;
9798
9897
  },
9799
9898
  getOverlayDebugSnapshot: () => window.MindMapTextOverlayV2?.getDebugSnapshot?.(moduleInstance) || null,