@mindexec/cli 0.2.291 → 0.2.293
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/wwwroot/_content/MindExecution.Shared/css/mind-map-overrides.css +4 -126
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +289 -47
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +7 -68
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +30 -38
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +28 -2
- package/wwwroot/_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js +4 -5
- package/wwwroot/index.html +17 -15
- package/wwwroot/service-worker-assets.js +8 -8
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
|
@@ -208,55 +208,11 @@ body.mind-debug-video-tint-layout .css3d-resolution-wrapper.node-type-video .vid
|
|
|
208
208
|
}
|
|
209
209
|
/* ▲▲▲ [Fix] ▲▲▲ */
|
|
210
210
|
|
|
211
|
-
body.is-zooming .css3d-resolution-wrapper,
|
|
212
|
-
body.is-panning .css3d-resolution-wrapper,
|
|
213
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper,
|
|
214
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper {
|
|
215
|
-
-webkit-transition: none !important;
|
|
216
|
-
transition: none !important;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
body.is-zooming .css3d-resolution-wrapper.selected,
|
|
220
|
-
body.is-panning .css3d-resolution-wrapper.selected,
|
|
221
|
-
body.mindcanvas-is-moving .css3d-resolution-wrapper.selected,
|
|
222
|
-
body.mindcanvas-is-dense .css3d-resolution-wrapper.selected,
|
|
223
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper.selected,
|
|
224
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper.selected,
|
|
225
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper.selected,
|
|
226
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .css3d-resolution-wrapper.selected {
|
|
227
|
-
-webkit-filter: none !important;
|
|
228
|
-
filter: none !important;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
211
|
body.is-resizing .css3d-resolution-wrapper {
|
|
232
212
|
-webkit-transition: none !important;
|
|
233
213
|
transition: none !important;
|
|
234
214
|
}
|
|
235
215
|
|
|
236
|
-
html.mindcanvas-platform-apple body.is-zooming .css3d-resolution-wrapper.selected,
|
|
237
|
-
html.mindcanvas-platform-apple body.is-panning .css3d-resolution-wrapper.selected,
|
|
238
|
-
html.mindcanvas-platform-apple body.mindcanvas-is-moving .css3d-resolution-wrapper.selected,
|
|
239
|
-
html.mindcanvas-platform-apple body.mindcanvas-is-dense .css3d-resolution-wrapper.selected {
|
|
240
|
-
-webkit-filter: none !important;
|
|
241
|
-
filter: none !important;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
body.is-zooming .node-menu-wrapper,
|
|
245
|
-
body.is-panning .node-menu-wrapper,
|
|
246
|
-
body.is-zooming .map-node-memo__icon-popover,
|
|
247
|
-
body.is-panning .map-node-memo__icon-popover,
|
|
248
|
-
#css3d-dom-wrapper.is-zooming .node-menu-wrapper,
|
|
249
|
-
#css3d-dom-wrapper.is-panning .node-menu-wrapper,
|
|
250
|
-
#css3d-dom-wrapper.is-zooming .map-node-memo__icon-popover,
|
|
251
|
-
#css3d-dom-wrapper.is-panning .map-node-memo__icon-popover {
|
|
252
|
-
-webkit-backdrop-filter: none !important;
|
|
253
|
-
backdrop-filter: none !important;
|
|
254
|
-
-webkit-box-shadow: none !important;
|
|
255
|
-
box-shadow: none !important;
|
|
256
|
-
-webkit-transition: none !important;
|
|
257
|
-
transition: none !important;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
216
|
.mindcanvas-node-toolbar,
|
|
261
217
|
.global-ai-input-shell {
|
|
262
218
|
position: relative;
|
|
@@ -1131,17 +1087,14 @@ body.is-panning .map-node-memo__icon-popover,
|
|
|
1131
1087
|
/* ▼▼▼ [CRITICAL] Zoom/Drag 중 포인터 이벤트 비활성화 ▼▼▼ */
|
|
1132
1088
|
/* Hover raycast is already short-circuited in JS during pan, so keep CSS hover/focus
|
|
1133
1089
|
intact while middle-button panning. We still suppress hit-testing for zoom/drag. */
|
|
1134
|
-
#css3d-dom-wrapper.is-dragging
|
|
1135
|
-
#css3d-dom-wrapper.is-zooming,
|
|
1136
|
-
body.is-zooming #css3d-dom-wrapper {
|
|
1090
|
+
#css3d-dom-wrapper.is-dragging {
|
|
1137
1091
|
pointer-events: none !important;
|
|
1138
1092
|
}
|
|
1139
1093
|
|
|
1140
1094
|
html.mindcanvas-browser-selection-locked,
|
|
1141
1095
|
body.mindcanvas-browser-selection-locked,
|
|
1142
1096
|
body.is-node-dragging,
|
|
1143
|
-
body.is-resizing
|
|
1144
|
-
body.is-zooming {
|
|
1097
|
+
body.is-resizing {
|
|
1145
1098
|
user-select: none !important;
|
|
1146
1099
|
-webkit-user-select: none !important;
|
|
1147
1100
|
}
|
|
@@ -1149,10 +1102,6 @@ body.is-zooming {
|
|
|
1149
1102
|
body.mindcanvas-browser-selection-locked *,
|
|
1150
1103
|
body.is-node-dragging *,
|
|
1151
1104
|
body.is-resizing *,
|
|
1152
|
-
#css3d-dom-wrapper.is-zooming *,
|
|
1153
|
-
body.is-zooming #css3d-dom-wrapper *,
|
|
1154
|
-
#css3d-dom-wrapper.is-panning,
|
|
1155
|
-
#css3d-dom-wrapper.is-panning *,
|
|
1156
1105
|
#css3d-dom-wrapper.is-dragging,
|
|
1157
1106
|
#css3d-dom-wrapper.is-dragging *,
|
|
1158
1107
|
.multi-select-overlay,
|
|
@@ -1172,13 +1121,7 @@ body.is-node-dragging .mind-map-text-overlay-v2-card *,
|
|
|
1172
1121
|
body.is-resizing .mind-map-text-overlay.mind-map-text-overlay-selectable .mind-map-text-overlay-fragment,
|
|
1173
1122
|
body.is-resizing .mind-map-text-overlay.mind-map-text-overlay-selectable .mind-map-text-overlay-fragment *,
|
|
1174
1123
|
body.is-resizing .mind-map-text-overlay-v2-card,
|
|
1175
|
-
body.is-resizing .mind-map-text-overlay-v2-card
|
|
1176
|
-
body.is-zooming .mind-map-text-overlay.mind-map-text-overlay-selectable .mind-map-text-overlay-fragment,
|
|
1177
|
-
body.is-zooming .mind-map-text-overlay.mind-map-text-overlay-selectable .mind-map-text-overlay-fragment *,
|
|
1178
|
-
#css3d-dom-wrapper.is-zooming .mind-map-text-overlay.mind-map-text-overlay-selectable .mind-map-text-overlay-fragment,
|
|
1179
|
-
#css3d-dom-wrapper.is-zooming .mind-map-text-overlay.mind-map-text-overlay-selectable .mind-map-text-overlay-fragment *,
|
|
1180
|
-
#css3d-dom-wrapper.is-panning .mind-map-text-overlay.mind-map-text-overlay-selectable .mind-map-text-overlay-fragment,
|
|
1181
|
-
#css3d-dom-wrapper.is-panning .mind-map-text-overlay.mind-map-text-overlay-selectable .mind-map-text-overlay-fragment * {
|
|
1124
|
+
body.is-resizing .mind-map-text-overlay-v2-card * {
|
|
1182
1125
|
user-select: none !important;
|
|
1183
1126
|
-webkit-user-select: none !important;
|
|
1184
1127
|
cursor: inherit !important;
|
|
@@ -1518,11 +1461,6 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
|
|
|
1518
1461
|
pointer-events: auto;
|
|
1519
1462
|
}
|
|
1520
1463
|
|
|
1521
|
-
body.is-panning .mind-map-text-overlay-v2-card.is-passive .mind-map-text-overlay-v2-body,
|
|
1522
|
-
#css3d-dom-wrapper.is-panning .mind-map-text-overlay-v2-card.is-passive .mind-map-text-overlay-v2-body {
|
|
1523
|
-
pointer-events: none !important;
|
|
1524
|
-
}
|
|
1525
|
-
|
|
1526
1464
|
.mind-map-text-overlay-v2-shell {
|
|
1527
1465
|
width: 100%;
|
|
1528
1466
|
height: 100%;
|
|
@@ -2456,14 +2394,7 @@ body.is-panning .mind-map-text-overlay-v2-card.is-passive .mind-map-text-overlay
|
|
|
2456
2394
|
/* Template launcher and Multi Desktop Monitor own their visual chrome on the
|
|
2457
2395
|
card itself. Keep the CSS3D wrapper neutral so motion CSS3D and the passive
|
|
2458
2396
|
DOM overlay do not stack different selection chrome. */
|
|
2459
|
-
.css3d-resolution-wrapper.node-type-templatelauncher.selected
|
|
2460
|
-
body.is-panning .css3d-resolution-wrapper.node-type-templatelauncher.selected,
|
|
2461
|
-
body.is-zooming .css3d-resolution-wrapper.node-type-templatelauncher.selected,
|
|
2462
|
-
body.mindcanvas-is-moving .css3d-resolution-wrapper.node-type-templatelauncher.selected,
|
|
2463
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper.node-type-templatelauncher.selected,
|
|
2464
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper.node-type-templatelauncher.selected,
|
|
2465
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper.node-type-templatelauncher.selected,
|
|
2466
|
-
body.mindcanvas-is-dense .css3d-resolution-wrapper.node-type-templatelauncher.selected {
|
|
2397
|
+
.css3d-resolution-wrapper.node-type-templatelauncher.selected {
|
|
2467
2398
|
outline: none !important;
|
|
2468
2399
|
-webkit-box-shadow: none !important;
|
|
2469
2400
|
box-shadow: none !important;
|
|
@@ -3348,59 +3279,6 @@ body.mindcanvas-is-dense .css3d-resolution-wrapper.node-type-templatelauncher.se
|
|
|
3348
3279
|
}
|
|
3349
3280
|
}
|
|
3350
3281
|
|
|
3351
|
-
/* Lightweight CSS3D motion path.
|
|
3352
|
-
Reference graph tools are useful here because they keep node DOM cheap:
|
|
3353
|
-
while the camera is moving, retain the canonical CSS3D surface but remove
|
|
3354
|
-
decorative compositor-heavy effects from every CSS3D node, including
|
|
3355
|
-
selected and agent-style nodes. */
|
|
3356
|
-
body.is-zooming .css3d-resolution-wrapper,
|
|
3357
|
-
body.is-panning .css3d-resolution-wrapper,
|
|
3358
|
-
body.is-node-dragging .css3d-resolution-wrapper,
|
|
3359
|
-
body.is-resizing .css3d-resolution-wrapper,
|
|
3360
|
-
body.mindcanvas-is-moving .css3d-resolution-wrapper,
|
|
3361
|
-
body.mindcanvas-is-dense .css3d-resolution-wrapper,
|
|
3362
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper,
|
|
3363
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper,
|
|
3364
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper,
|
|
3365
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .css3d-resolution-wrapper {
|
|
3366
|
-
-webkit-transition: none !important;
|
|
3367
|
-
transition: none !important;
|
|
3368
|
-
-webkit-filter: none !important;
|
|
3369
|
-
filter: none !important;
|
|
3370
|
-
-webkit-box-shadow: none !important;
|
|
3371
|
-
box-shadow: none !important;
|
|
3372
|
-
}
|
|
3373
|
-
|
|
3374
|
-
body.is-zooming .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3375
|
-
body.is-panning .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3376
|
-
body.is-node-dragging .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3377
|
-
body.is-resizing .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3378
|
-
body.mindcanvas-is-moving .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3379
|
-
body.mindcanvas-is-dense .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3380
|
-
body.is-zooming .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3381
|
-
body.is-panning .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3382
|
-
body.is-node-dragging .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3383
|
-
body.is-resizing .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3384
|
-
body.mindcanvas-is-moving .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3385
|
-
body.mindcanvas-is-dense .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3386
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3387
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3388
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3389
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
3390
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3391
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3392
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
3393
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .css3d-resolution-wrapper [id^="css3d-node-"] {
|
|
3394
|
-
-webkit-transition: none !important;
|
|
3395
|
-
transition: none !important;
|
|
3396
|
-
-webkit-filter: none !important;
|
|
3397
|
-
filter: none !important;
|
|
3398
|
-
-webkit-backdrop-filter: none !important;
|
|
3399
|
-
backdrop-filter: none !important;
|
|
3400
|
-
-webkit-box-shadow: none !important;
|
|
3401
|
-
box-shadow: none !important;
|
|
3402
|
-
}
|
|
3403
|
-
|
|
3404
3282
|
/* Temporary lightweight node visuals.
|
|
3405
3283
|
CSS3D and passive overlay node surfaces intentionally avoid shadows/glow.
|
|
3406
3284
|
Keep outlines, borders, and status color so selection and node state remain readable. */
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
const DEBUG = false;
|
|
6
6
|
const FPS_DEBUG = false;
|
|
7
7
|
const FRAME_PERF_DEBUG = false;
|
|
8
|
-
const MINDMAP_CORE_BUILD_ID = '20260620-css3d-flat-
|
|
8
|
+
const MINDMAP_CORE_BUILD_ID = '20260620-css3d-flat-pan-v750';
|
|
9
9
|
const CanvasPhase = Object.freeze({
|
|
10
10
|
Booting: 'booting',
|
|
11
11
|
BoardFileLoading: 'board-file-loading',
|
|
@@ -114,9 +114,9 @@
|
|
|
114
114
|
const LOCAL_SNAP_GRID_DEFAULT_OPACITY = 0.42;
|
|
115
115
|
const CAMERA_MOTION_PARTIAL_FRAME_SKIP_ENABLED = false;
|
|
116
116
|
const CAMERA_MOTION_VISUAL_ONLY_FAST_PATH_ENABLED = true;
|
|
117
|
-
const CAMERA_MOTION_WEBGL_CANVAS_TRANSFORM_ENABLED =
|
|
118
|
-
const CAMERA_MOTION_WEBGL_TRANSFORM_TRANSLATE_BUCKET_PX = 0.
|
|
119
|
-
const CAMERA_MOTION_WEBGL_TRANSFORM_SCALE_BUCKET = 0.
|
|
117
|
+
const CAMERA_MOTION_WEBGL_CANVAS_TRANSFORM_ENABLED = false;
|
|
118
|
+
const CAMERA_MOTION_WEBGL_TRANSFORM_TRANSLATE_BUCKET_PX = 0.001;
|
|
119
|
+
const CAMERA_MOTION_WEBGL_TRANSFORM_SCALE_BUCKET = 0.000001;
|
|
120
120
|
const CSS3D_FLAT_CAMERA_MOTION_ENABLED = true;
|
|
121
121
|
const CAMERA_STATIONARY_INTERACTION_FRAME_DELAY_MS = 48;
|
|
122
122
|
const CAMERA_ZOOM_END_DELAY_MS = 150;
|
|
@@ -606,6 +606,40 @@
|
|
|
606
606
|
return false;
|
|
607
607
|
}
|
|
608
608
|
|
|
609
|
+
function renderCss3dSceneForCurrentCamera(module, scene, camera, reason = 'css3d-render') {
|
|
610
|
+
const renderer = module?.cssRenderer || null;
|
|
611
|
+
if (!renderer || !scene || !camera) {
|
|
612
|
+
return false;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
const renderDebugFlags = module.renderDebugFlags || getRenderDebugFlagsSnapshot();
|
|
616
|
+
if (renderDebugFlags.enableCss3d === false) {
|
|
617
|
+
return false;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
if (typeof renderer.renderFlat === 'function' &&
|
|
621
|
+
canUseFlatCss3dCameraMotion(module, renderer, camera, renderDebugFlags) === true) {
|
|
622
|
+
const usedFlatSceneRender = renderer.renderFlat(scene, camera, {
|
|
623
|
+
translateBucketPx: CAMERA_MOTION_WEBGL_TRANSFORM_TRANSLATE_BUCKET_PX,
|
|
624
|
+
scaleBucket: CAMERA_MOTION_WEBGL_TRANSFORM_SCALE_BUCKET
|
|
625
|
+
});
|
|
626
|
+
if (usedFlatSceneRender === true) {
|
|
627
|
+
module._lastCss3dCameraMotionMode = 'flat';
|
|
628
|
+
module._lastCss3dCameraMotionReason = reason;
|
|
629
|
+
return true;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
if (typeof renderer.render === 'function') {
|
|
634
|
+
renderer.render(scene, camera);
|
|
635
|
+
module._lastCss3dCameraMotionMode = 'matrix3d';
|
|
636
|
+
module._lastCss3dCameraMotionReason = reason;
|
|
637
|
+
return true;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
return false;
|
|
641
|
+
}
|
|
642
|
+
|
|
609
643
|
function markWebglSurfaceFrozenForZoom(module, mode) {
|
|
610
644
|
if (!module) {
|
|
611
645
|
return false;
|
|
@@ -641,6 +675,64 @@
|
|
|
641
675
|
return true;
|
|
642
676
|
}
|
|
643
677
|
|
|
678
|
+
function shouldDeferFullResWebglForCss3dCameraMotion(module, options = {}) {
|
|
679
|
+
if (!module ||
|
|
680
|
+
module.isLoading === true ||
|
|
681
|
+
module.isDraggingNode === true ||
|
|
682
|
+
module.isDraggingMultipleNodes === true ||
|
|
683
|
+
module.isResizing === true ||
|
|
684
|
+
module.isWindowResizing === true ||
|
|
685
|
+
module.isSelecting === true) {
|
|
686
|
+
return false;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
const isCameraNavigationActive =
|
|
690
|
+
options.isCameraNavigationOnlyInteractiveFrame === true ||
|
|
691
|
+
module.isPanning === true ||
|
|
692
|
+
module.isZooming === true ||
|
|
693
|
+
module._cameraMovingThisFrame === true;
|
|
694
|
+
if (isCameraNavigationActive !== true) {
|
|
695
|
+
return false;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
if (options.isFullResMode === false ||
|
|
699
|
+
module.lodRenderer?.isInLODMode === true ||
|
|
700
|
+
options.isNodeInteracting === true ||
|
|
701
|
+
options.hasNonCameraNavigationForcedUpdate === true) {
|
|
702
|
+
return false;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
const renderer = module.cssRenderer || null;
|
|
706
|
+
const camera = module.camera || null;
|
|
707
|
+
const flags = options.renderDebugFlags || module.renderDebugFlags || getRenderDebugFlagsSnapshot();
|
|
708
|
+
return !!(
|
|
709
|
+
flags.enableCss3d !== false &&
|
|
710
|
+
renderer &&
|
|
711
|
+
camera &&
|
|
712
|
+
canUseFlatCss3dCameraMotion(module, renderer, camera, flags) === true
|
|
713
|
+
);
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
function markFullResWebglDeferredForCss3dCameraMotion(module, reason = 'fullres-css3d-camera-motion') {
|
|
717
|
+
if (!module) {
|
|
718
|
+
return false;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
module._clearWebglCanvasCameraTransform?.();
|
|
722
|
+
module._webglCameraMotionDeferred = true;
|
|
723
|
+
module._themeCameraMotionDeferred = true;
|
|
724
|
+
module._lastWebglRenderInfo = {
|
|
725
|
+
calls: 0,
|
|
726
|
+
triangles: 0,
|
|
727
|
+
points: 0,
|
|
728
|
+
lines: 0,
|
|
729
|
+
skipped: true,
|
|
730
|
+
webglDeferredForCss3dCameraMotion: true,
|
|
731
|
+
reason
|
|
732
|
+
};
|
|
733
|
+
return true;
|
|
734
|
+
}
|
|
735
|
+
|
|
644
736
|
function hasBusinessAutomationEdgeLayer(module) {
|
|
645
737
|
return !!(
|
|
646
738
|
module?._businessAutomationEdgeVisualLayer?.isConnected ||
|
|
@@ -1836,6 +1928,12 @@
|
|
|
1836
1928
|
markWebglSurfaceFrozenForZoom(module, 'uaUltraEarlyCameraOnly');
|
|
1837
1929
|
} else if (module.isZooming === true) {
|
|
1838
1930
|
deferWebglBootstrapForCameraMotion(module, 'uaUltraEarlyCameraOnly');
|
|
1931
|
+
} else if (shouldDeferFullResWebglForCss3dCameraMotion(module, {
|
|
1932
|
+
isCameraNavigationOnlyInteractiveFrame: true,
|
|
1933
|
+
isFullResMode: true,
|
|
1934
|
+
renderDebugFlags
|
|
1935
|
+
}) === true) {
|
|
1936
|
+
markFullResWebglDeferredForCss3dCameraMotion(module, 'uaUltraEarlyCameraOnly');
|
|
1839
1937
|
} else {
|
|
1840
1938
|
module._clearWebglCanvasCameraTransform?.();
|
|
1841
1939
|
module.renderer.render(module.scene, module.camera);
|
|
@@ -1943,7 +2041,10 @@
|
|
|
1943
2041
|
!module.lodRenderer ||
|
|
1944
2042
|
module.lodRenderer.isInLODMode !== true ||
|
|
1945
2043
|
typeof module.lodRenderer.canUseUltraResidentCameraOnlyFrame !== 'function' ||
|
|
1946
|
-
|
|
2044
|
+
module.lodRenderer.canUseUltraResidentCameraOnlyFrame(module.camera, module, {
|
|
2045
|
+
isCameraMoving,
|
|
2046
|
+
isCameraNavigationActive
|
|
2047
|
+
}) !== true) {
|
|
1947
2048
|
return false;
|
|
1948
2049
|
}
|
|
1949
2050
|
|
|
@@ -4019,6 +4120,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4019
4120
|
this._webglCameraMotionDeferred = false;
|
|
4020
4121
|
this._themeCameraMotionDeferred = false;
|
|
4021
4122
|
this._css3dVisualDeferredForMotion = false;
|
|
4123
|
+
this._backgroundGridLayerHost = null;
|
|
4022
4124
|
this._motionGridLayer = null;
|
|
4023
4125
|
this._motionGridVisible = false;
|
|
4024
4126
|
this._motionGridHideTimer = null;
|
|
@@ -4100,6 +4202,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4100
4202
|
|
|
4101
4203
|
const roundedX = Math.round(nextX * 2) / 2;
|
|
4102
4204
|
const roundedY = Math.round(nextY * 2) / 2;
|
|
4205
|
+
if (this.isZooming === true &&
|
|
4206
|
+
this._lastLocalSnapGridPointerSnapKey &&
|
|
4207
|
+
Math.abs(Number(this._lastSnapGridClientX || 0) - roundedX) < 0.001 &&
|
|
4208
|
+
Math.abs(Number(this._lastSnapGridClientY || 0) - roundedY) < 0.001) {
|
|
4209
|
+
this._localSnapGridStyleDeferredForZoom = true;
|
|
4210
|
+
return false;
|
|
4211
|
+
}
|
|
4103
4212
|
const fallbackGrid = Math.max(1, Number(this.GRID_SIZE || 10));
|
|
4104
4213
|
let pointerSnapKey = `screen:${Math.round(roundedX / fallbackGrid)}|${Math.round(roundedY / fallbackGrid)}`;
|
|
4105
4214
|
if (this.container && this.camera?.isPerspectiveCamera) {
|
|
@@ -4173,9 +4282,9 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4173
4282
|
};
|
|
4174
4283
|
}
|
|
4175
4284
|
|
|
4176
|
-
|
|
4177
|
-
if (!
|
|
4178
|
-
return
|
|
4285
|
+
_ensureBackgroundGridLayerHost() {
|
|
4286
|
+
if (!this.container || typeof document === 'undefined') {
|
|
4287
|
+
return null;
|
|
4179
4288
|
}
|
|
4180
4289
|
|
|
4181
4290
|
const webglElement = this.renderer?.domElement;
|
|
@@ -4187,16 +4296,64 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4187
4296
|
? cssElement
|
|
4188
4297
|
: null;
|
|
4189
4298
|
|
|
4299
|
+
let host = this._backgroundGridLayerHost;
|
|
4300
|
+
if (!host || !host.isConnected) {
|
|
4301
|
+
host = document.createElement('div');
|
|
4302
|
+
host.className = 'mindcanvas-background-hint-layer-host';
|
|
4303
|
+
host.setAttribute('aria-hidden', 'true');
|
|
4304
|
+
host.style.position = 'absolute';
|
|
4305
|
+
host.style.inset = '0';
|
|
4306
|
+
host.style.zIndex = '0';
|
|
4307
|
+
host.style.pointerEvents = 'none';
|
|
4308
|
+
host.style.overflow = 'visible';
|
|
4309
|
+
host.style.background = 'transparent';
|
|
4310
|
+
host.style.contain = 'layout style paint';
|
|
4311
|
+
host.style.transform = 'translate3d(0, 0, 0)';
|
|
4312
|
+
host.style.transition = 'none';
|
|
4313
|
+
this._backgroundGridLayerHost = host;
|
|
4314
|
+
}
|
|
4315
|
+
|
|
4316
|
+
if (this.container.style.isolation !== 'isolate') {
|
|
4317
|
+
this.container.style.isolation = 'isolate';
|
|
4318
|
+
}
|
|
4319
|
+
|
|
4190
4320
|
if (anchorElement) {
|
|
4191
|
-
if (
|
|
4192
|
-
|
|
4193
|
-
this.container.insertBefore(
|
|
4321
|
+
if (host.parentNode !== this.container ||
|
|
4322
|
+
host.nextSibling !== anchorElement) {
|
|
4323
|
+
this.container.insertBefore(host, anchorElement);
|
|
4194
4324
|
}
|
|
4195
|
-
} else if (
|
|
4196
|
-
this.container.insertBefore(
|
|
4325
|
+
} else if (host.parentNode !== this.container) {
|
|
4326
|
+
this.container.insertBefore(host, this.container.firstChild || null);
|
|
4197
4327
|
}
|
|
4198
4328
|
|
|
4199
|
-
|
|
4329
|
+
if (webglElement?.style && webglElement.style.zIndex !== '1') {
|
|
4330
|
+
webglElement.style.zIndex = '1';
|
|
4331
|
+
}
|
|
4332
|
+
if (cssElement?.style && cssElement.style.zIndex !== '2') {
|
|
4333
|
+
cssElement.style.zIndex = '2';
|
|
4334
|
+
}
|
|
4335
|
+
|
|
4336
|
+
return host.parentNode === this.container ? host : null;
|
|
4337
|
+
}
|
|
4338
|
+
|
|
4339
|
+
_placeBackgroundGridLayer(layer) {
|
|
4340
|
+
if (!layer || !this.container) {
|
|
4341
|
+
return false;
|
|
4342
|
+
}
|
|
4343
|
+
|
|
4344
|
+
const host = this._ensureBackgroundGridLayerHost();
|
|
4345
|
+
if (!host) {
|
|
4346
|
+
return false;
|
|
4347
|
+
}
|
|
4348
|
+
|
|
4349
|
+
if (layer.parentNode !== host) {
|
|
4350
|
+
host.appendChild(layer);
|
|
4351
|
+
}
|
|
4352
|
+
if (layer.style.zIndex !== '0') {
|
|
4353
|
+
layer.style.zIndex = '0';
|
|
4354
|
+
}
|
|
4355
|
+
|
|
4356
|
+
return layer.parentNode === host;
|
|
4200
4357
|
}
|
|
4201
4358
|
|
|
4202
4359
|
_ensureLocalSnapGridLayer() {
|
|
@@ -4478,10 +4635,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4478
4635
|
const layerTop = snappedCenter.centerY - LOCAL_SNAP_GRID_RADIUS_PX;
|
|
4479
4636
|
|
|
4480
4637
|
if (this.isZooming === true && !!this._lastLocalSnapGridKey) {
|
|
4481
|
-
const
|
|
4638
|
+
const snappedLayerLeft = Math.round(layerLeft);
|
|
4639
|
+
const snappedLayerTop = Math.round(layerTop);
|
|
4640
|
+
const transformKey = `${snappedLayerLeft}|${snappedLayerTop}`;
|
|
4482
4641
|
if (transformKey !== this._lastLocalSnapGridTransformKey) {
|
|
4483
4642
|
this._lastLocalSnapGridTransformKey = transformKey;
|
|
4484
|
-
layer.style.transform = `translate3d(${
|
|
4643
|
+
layer.style.transform = `translate3d(${snappedLayerLeft}px, ${snappedLayerTop}px, 0)`;
|
|
4485
4644
|
}
|
|
4486
4645
|
this._lastLocalSnapGridPositionRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
|
|
4487
4646
|
this._localSnapGridStyleDeferredForZoom = true;
|
|
@@ -4524,10 +4683,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4524
4683
|
this._localSnapGridStyleDeferredForZoom = true;
|
|
4525
4684
|
}
|
|
4526
4685
|
|
|
4527
|
-
const
|
|
4686
|
+
const snappedLayerLeft = Math.round(layerLeft);
|
|
4687
|
+
const snappedLayerTop = Math.round(layerTop);
|
|
4688
|
+
const transformKey = `${snappedLayerLeft}|${snappedLayerTop}`;
|
|
4528
4689
|
if (transformKey !== this._lastLocalSnapGridTransformKey) {
|
|
4529
4690
|
this._lastLocalSnapGridTransformKey = transformKey;
|
|
4530
|
-
layer.style.transform = `translate3d(${
|
|
4691
|
+
layer.style.transform = `translate3d(${snappedLayerLeft}px, ${snappedLayerTop}px, 0)`;
|
|
4531
4692
|
}
|
|
4532
4693
|
this._lastLocalSnapGridPositionRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
|
|
4533
4694
|
|
|
@@ -4586,11 +4747,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4586
4747
|
const snappedCenter = this._getLocalSnapGridSnappedScreenCenter(centerX, centerY, width, height, this.camera);
|
|
4587
4748
|
const layerLeft = snappedCenter.centerX - LOCAL_SNAP_GRID_RADIUS_PX;
|
|
4588
4749
|
const layerTop = snappedCenter.centerY - LOCAL_SNAP_GRID_RADIUS_PX;
|
|
4589
|
-
const
|
|
4750
|
+
const snappedLayerLeft = Math.round(layerLeft);
|
|
4751
|
+
const snappedLayerTop = Math.round(layerTop);
|
|
4752
|
+
const transformKey = `${snappedLayerLeft}|${snappedLayerTop}`;
|
|
4590
4753
|
|
|
4591
4754
|
if (transformKey !== this._lastLocalSnapGridTransformKey) {
|
|
4592
4755
|
this._lastLocalSnapGridTransformKey = transformKey;
|
|
4593
|
-
layer.style.transform = `translate3d(${
|
|
4756
|
+
layer.style.transform = `translate3d(${snappedLayerLeft}px, ${snappedLayerTop}px, 0)`;
|
|
4594
4757
|
}
|
|
4595
4758
|
this._lastLocalSnapGridPositionRevision = pointerRevision;
|
|
4596
4759
|
|
|
@@ -4796,8 +4959,15 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
4796
4959
|
get: () => this._forceUpdateFrameCount || 0,
|
|
4797
4960
|
set: (value) => {
|
|
4798
4961
|
const nextValue = Math.max(0, Math.floor(Number(value) || 0));
|
|
4962
|
+
const previousValue = Math.max(0, Math.floor(Number(this._forceUpdateFrameCount || 0)));
|
|
4799
4963
|
this._forceUpdateFrameCount = nextValue;
|
|
4800
|
-
|
|
4964
|
+
const needsWake =
|
|
4965
|
+
nextValue > 0 &&
|
|
4966
|
+
(
|
|
4967
|
+
nextValue > previousValue ||
|
|
4968
|
+
(!this.animationFrameId && !this._animationIdleTimerId)
|
|
4969
|
+
);
|
|
4970
|
+
if (needsWake) {
|
|
4801
4971
|
this.requestAnimationWake('force-update-frames');
|
|
4802
4972
|
}
|
|
4803
4973
|
}
|
|
@@ -5454,7 +5624,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
5454
5624
|
this.renderer.domElement.style.left = '0';
|
|
5455
5625
|
this.renderer.domElement.style.width = '100%';
|
|
5456
5626
|
this.renderer.domElement.style.height = '100%';
|
|
5457
|
-
this.renderer.domElement.style.zIndex = '
|
|
5627
|
+
this.renderer.domElement.style.zIndex = '1';
|
|
5458
5628
|
this.renderer.domElement.style.outline = 'none';
|
|
5459
5629
|
|
|
5460
5630
|
if (this.container) this.container.appendChild(this.renderer.domElement);
|
|
@@ -5474,7 +5644,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
5474
5644
|
cssEl.style.padding = '0';
|
|
5475
5645
|
cssEl.style.width = '100%';
|
|
5476
5646
|
cssEl.style.height = '100%';
|
|
5477
|
-
cssEl.style.zIndex = '
|
|
5647
|
+
cssEl.style.zIndex = '2';
|
|
5478
5648
|
cssEl.style.pointerEvents = 'auto'; // 마우스/휠 이벤트 수신
|
|
5479
5649
|
cssEl.id = 'css3d-dom-wrapper';
|
|
5480
5650
|
|
|
@@ -5722,6 +5892,10 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
5722
5892
|
const transformTranslateX = Math.round(translateX / translateBucket) * translateBucket;
|
|
5723
5893
|
const transformTranslateY = Math.round(translateY / translateBucket) * translateBucket;
|
|
5724
5894
|
const transformScale = Math.round(scale / scaleBucket) * scaleBucket;
|
|
5895
|
+
const originX = width * 0.5;
|
|
5896
|
+
const originY = height * 0.5;
|
|
5897
|
+
const matrixTranslateX = ((1 - transformScale) * originX) + transformTranslateX;
|
|
5898
|
+
const matrixTranslateY = ((1 - transformScale) * originY) + transformTranslateY;
|
|
5725
5899
|
const transformKey = [
|
|
5726
5900
|
Math.round(width),
|
|
5727
5901
|
Math.round(height),
|
|
@@ -5732,9 +5906,11 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
5732
5906
|
|
|
5733
5907
|
if (transformKey !== this._lastWebglCanvasMotionTransformKey) {
|
|
5734
5908
|
this._lastWebglCanvasMotionTransformKey = transformKey;
|
|
5735
|
-
|
|
5736
|
-
|
|
5737
|
-
|
|
5909
|
+
if (this._webglCanvasMotionTransformActive !== true) {
|
|
5910
|
+
element.style.transformOrigin = '0 0';
|
|
5911
|
+
element.style.willChange = 'transform';
|
|
5912
|
+
}
|
|
5913
|
+
element.style.transform = `matrix(${transformScale.toFixed(6)}, 0, 0, ${transformScale.toFixed(6)}, ${matrixTranslateX.toFixed(3)}, ${matrixTranslateY.toFixed(3)})`;
|
|
5738
5914
|
}
|
|
5739
5915
|
|
|
5740
5916
|
this._webglCanvasMotionTransformActive = true;
|
|
@@ -6835,7 +7011,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
6835
7011
|
|
|
6836
7012
|
if (this.isZooming && !isCameraMoving && timeSinceLastInput > CAMERA_ZOOM_END_DELAY_MS) {
|
|
6837
7013
|
this.isZooming = false;
|
|
6838
|
-
this.cssRenderer?.domElement?.classList?.remove?.('is-zooming');
|
|
6839
7014
|
if (FRAME_PERF_DEBUG) {
|
|
6840
7015
|
console.log(`[Perf] Zoom ended (${timeSinceLastInput.toFixed(0)}ms since last input)`);
|
|
6841
7016
|
}
|
|
@@ -7329,12 +7504,19 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
7329
7504
|
this._lastWebglRenderedCameraState &&
|
|
7330
7505
|
this.renderer?.domElement
|
|
7331
7506
|
);
|
|
7507
|
+
const shouldDeferFullResWebglForImmediateMotion =
|
|
7508
|
+
shouldDeferFullResWebglForCss3dCameraMotion(this, {
|
|
7509
|
+
isCameraNavigationOnlyInteractiveFrame: true,
|
|
7510
|
+
isFullResMode: true,
|
|
7511
|
+
renderDebugFlags
|
|
7512
|
+
}) === true;
|
|
7332
7513
|
if (canReuseWebglCanvasForImmediateMotion === true) {
|
|
7333
7514
|
deferContinuousThemeForCameraMotion(this);
|
|
7334
7515
|
}
|
|
7335
7516
|
if (this.isZooming !== true &&
|
|
7336
7517
|
shouldFreezeWebglCanvasForImmediateZoom !== true &&
|
|
7337
7518
|
!canReuseWebglCanvasForImmediateMotion &&
|
|
7519
|
+
shouldDeferFullResWebglForImmediateMotion !== true &&
|
|
7338
7520
|
renderDebugFlags.enableThemeAnimation !== false &&
|
|
7339
7521
|
isLocalSnapGridOnlyTheme(this) !== true &&
|
|
7340
7522
|
this.currentThemeObject &&
|
|
@@ -7374,6 +7556,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
7374
7556
|
markWebglSurfaceFrozenForZoom(this, 'uaVisualOnlyMotion');
|
|
7375
7557
|
} else if (this.isZooming === true) {
|
|
7376
7558
|
deferWebglBootstrapForCameraMotion(this, 'uaVisualOnlyMotion');
|
|
7559
|
+
} else if (shouldDeferFullResWebglForImmediateMotion === true) {
|
|
7560
|
+
markFullResWebglDeferredForCss3dCameraMotion(this, 'uaVisualOnlyMotion');
|
|
7377
7561
|
} else {
|
|
7378
7562
|
this._clearWebglCanvasCameraTransform();
|
|
7379
7563
|
this.renderer.render(this.scene, this.camera);
|
|
@@ -7512,12 +7696,19 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
7512
7696
|
this._lastWebglRenderedCameraState &&
|
|
7513
7697
|
this.renderer?.domElement
|
|
7514
7698
|
);
|
|
7699
|
+
const shouldDeferFullResWebglForStationaryMotion =
|
|
7700
|
+
shouldDeferFullResWebglForCss3dCameraMotion(this, {
|
|
7701
|
+
isCameraNavigationOnlyInteractiveFrame: true,
|
|
7702
|
+
isFullResMode: isFullResMode === true,
|
|
7703
|
+
renderDebugFlags
|
|
7704
|
+
}) === true;
|
|
7515
7705
|
if (canReuseWebglCanvasForStationaryMotion === true) {
|
|
7516
7706
|
deferContinuousThemeForCameraMotion(this);
|
|
7517
7707
|
}
|
|
7518
7708
|
if (this.isZooming !== true &&
|
|
7519
7709
|
shouldFreezeWebglCanvasForStationaryZoom !== true &&
|
|
7520
7710
|
!canReuseWebglCanvasForStationaryMotion &&
|
|
7711
|
+
shouldDeferFullResWebglForStationaryMotion !== true &&
|
|
7521
7712
|
renderDebugFlags.enableThemeAnimation !== false &&
|
|
7522
7713
|
isLocalSnapGridOnlyTheme(this) !== true &&
|
|
7523
7714
|
this.currentThemeObject &&
|
|
@@ -7557,6 +7748,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
7557
7748
|
markWebglSurfaceFrozenForZoom(this, 'uaStationaryVisualMotion');
|
|
7558
7749
|
} else if (this.isZooming === true) {
|
|
7559
7750
|
deferWebglBootstrapForCameraMotion(this, 'uaStationaryVisualMotion');
|
|
7751
|
+
} else if (shouldDeferFullResWebglForStationaryMotion === true) {
|
|
7752
|
+
markFullResWebglDeferredForCss3dCameraMotion(this, 'uaStationaryVisualMotion');
|
|
7560
7753
|
} else {
|
|
7561
7754
|
this._clearWebglCanvasCameraTransform();
|
|
7562
7755
|
this.renderer.render(this.scene, this.camera);
|
|
@@ -8765,8 +8958,17 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
8765
8958
|
isGpuParticleTheme &&
|
|
8766
8959
|
!isBoardLoading &&
|
|
8767
8960
|
allowContinuousThemeAnimationThisFrame === true;
|
|
8961
|
+
const shouldDeferFullResWebglForNormalCss3dMotion =
|
|
8962
|
+
shouldDeferFullResWebglForCss3dCameraMotion(this, {
|
|
8963
|
+
isCameraNavigationOnlyInteractiveFrame,
|
|
8964
|
+
isFullResMode: isFullResMode === true,
|
|
8965
|
+
isNodeInteracting,
|
|
8966
|
+
hasNonCameraNavigationForcedUpdate,
|
|
8967
|
+
renderDebugFlags
|
|
8968
|
+
}) === true;
|
|
8768
8969
|
let themeAnimatedThisFrame = false;
|
|
8769
8970
|
if (allowContinuousThemeAnimationThisFrame === true &&
|
|
8971
|
+
shouldDeferFullResWebglForNormalCss3dMotion !== true &&
|
|
8770
8972
|
(isThemeAnimationEnabled || shouldForceGpuParticleAnimation) &&
|
|
8771
8973
|
isLocalSnapGridOnlyTheme(this) !== true &&
|
|
8772
8974
|
this.currentThemeObject &&
|
|
@@ -8818,8 +9020,20 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
8818
9020
|
isCameraNavigationOnlyInteractiveFrame === true
|
|
8819
9021
|
? false
|
|
8820
9022
|
: (shouldUseAnimation60Fps === true || shouldUseAnimationLowFpsFrame === true);
|
|
9023
|
+
const shouldHoldWebglCanvasTransformDuringCameraNavigation = !!(
|
|
9024
|
+
isWebglRenderEnabled &&
|
|
9025
|
+
isCameraNavigationOnlyInteractiveFrame === true &&
|
|
9026
|
+
canUseWebglCanvasTransformForCameraMotion(this) === true &&
|
|
9027
|
+
!isBoardLoading &&
|
|
9028
|
+
this._lastWebglRenderedCameraState &&
|
|
9029
|
+
this.renderer?.domElement &&
|
|
9030
|
+
!isNodeInteracting &&
|
|
9031
|
+
!hasNonCameraNavigationForcedUpdate &&
|
|
9032
|
+
this.isWindowResizing !== true
|
|
9033
|
+
);
|
|
8821
9034
|
const shouldRenderWebglFrame =
|
|
8822
9035
|
isWebglRenderEnabled &&
|
|
9036
|
+
shouldHoldWebglCanvasTransformDuringCameraNavigation !== true &&
|
|
8823
9037
|
(
|
|
8824
9038
|
isBoardLoading === true ||
|
|
8825
9039
|
shouldUpdate === true ||
|
|
@@ -8828,6 +9042,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
8828
9042
|
shouldUseAnimationCadenceForWebglFrame === true ||
|
|
8829
9043
|
themeAnimatedThisFrame === true
|
|
8830
9044
|
) &&
|
|
9045
|
+
shouldDeferFullResWebglForNormalCss3dMotion !== true &&
|
|
8831
9046
|
(
|
|
8832
9047
|
isPureCss3dCameraMotionFrame !== true ||
|
|
8833
9048
|
themeAnimatedThisFrame === true ||
|
|
@@ -8873,6 +9088,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
8873
9088
|
themeAnimatedThisFrame !== true &&
|
|
8874
9089
|
shouldFinalizeWebglCanvasCameraTransform !== true) {
|
|
8875
9090
|
deferWebglBootstrapForCameraMotion(this, 'normalZoomCameraMotion');
|
|
9091
|
+
} else if (shouldDeferFullResWebglForNormalCss3dMotion === true) {
|
|
9092
|
+
markFullResWebglDeferredForCss3dCameraMotion(this, 'normalCss3dCameraMotion');
|
|
8876
9093
|
} else {
|
|
8877
9094
|
this._clearWebglCanvasCameraTransform();
|
|
8878
9095
|
if (shouldHideBackgroundThemeDuringCameraNavigation) {
|
|
@@ -8898,27 +9115,48 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
8898
9115
|
}
|
|
8899
9116
|
}
|
|
8900
9117
|
} else if (isWebglRenderEnabled) {
|
|
8901
|
-
if (
|
|
9118
|
+
if (shouldDeferFullResWebglForNormalCss3dMotion === true) {
|
|
9119
|
+
markFullResWebglDeferredForCss3dCameraMotion(this, 'normalCss3dCameraMotion');
|
|
9120
|
+
} else if (isPureCss3dCameraMotionFrame === true) {
|
|
8902
9121
|
this._webglCameraMotionDeferred = true;
|
|
8903
|
-
|
|
8904
|
-
|
|
8905
|
-
|
|
8906
|
-
|
|
8907
|
-
|
|
8908
|
-
|
|
8909
|
-
|
|
9122
|
+
const shouldFreezeWebglCanvasTransformForZoom =
|
|
9123
|
+
shouldFreezeWebglSurfaceForZoom(this) === true;
|
|
9124
|
+
if (isCameraNavigationOnlyInteractiveFrame === true &&
|
|
9125
|
+
shouldFreezeWebglCanvasTransformForZoom !== true &&
|
|
9126
|
+
canUseWebglCanvasTransformForCameraMotion(this) === true) {
|
|
9127
|
+
usedWebglCanvasCameraTransform = this._applyWebglCanvasCameraTransform() === true;
|
|
9128
|
+
} else {
|
|
9129
|
+
this._clearWebglCanvasCameraTransform();
|
|
9130
|
+
}
|
|
9131
|
+
this._lastWebglRenderInfo = {
|
|
9132
|
+
calls: 0,
|
|
9133
|
+
triangles: 0,
|
|
9134
|
+
points: 0,
|
|
9135
|
+
lines: 0,
|
|
9136
|
+
skipped: true,
|
|
9137
|
+
webglCanvasCameraTransform: usedWebglCanvasCameraTransform || undefined,
|
|
9138
|
+
webglSurfaceFrozenForZoom: shouldFreezeWebglCanvasTransformForZoom || undefined
|
|
9139
|
+
};
|
|
8910
9140
|
} else {
|
|
8911
|
-
|
|
9141
|
+
const shouldFreezeWebglCanvasTransformForZoom =
|
|
9142
|
+
shouldFreezeWebglSurfaceForZoom(this) === true;
|
|
9143
|
+
if (isCameraNavigationOnlyInteractiveFrame === true &&
|
|
9144
|
+
shouldFreezeWebglCanvasTransformForZoom !== true &&
|
|
9145
|
+
canUseWebglCanvasTransformForCameraMotion(this) === true) {
|
|
9146
|
+
usedWebglCanvasCameraTransform = this._applyWebglCanvasCameraTransform() === true;
|
|
9147
|
+
} else {
|
|
9148
|
+
this._clearWebglCanvasCameraTransform();
|
|
9149
|
+
}
|
|
9150
|
+
this._lastWebglRenderInfo = {
|
|
9151
|
+
calls: 0,
|
|
9152
|
+
triangles: 0,
|
|
9153
|
+
points: 0,
|
|
9154
|
+
lines: 0,
|
|
9155
|
+
skipped: true,
|
|
9156
|
+
webglCanvasCameraTransform: usedWebglCanvasCameraTransform || undefined,
|
|
9157
|
+
webglSurfaceFrozenForZoom: shouldFreezeWebglSurfaceForZoom(this) || undefined
|
|
9158
|
+
};
|
|
8912
9159
|
}
|
|
8913
|
-
this._lastWebglRenderInfo = {
|
|
8914
|
-
calls: 0,
|
|
8915
|
-
triangles: 0,
|
|
8916
|
-
points: 0,
|
|
8917
|
-
lines: 0,
|
|
8918
|
-
skipped: true,
|
|
8919
|
-
webglCanvasCameraTransform: usedWebglCanvasCameraTransform || undefined,
|
|
8920
|
-
webglSurfaceFrozenForZoom: shouldFreezeWebglCanvasTransformForZoom || undefined
|
|
8921
|
-
};
|
|
8922
9160
|
} else if (isBoardLoading) {
|
|
8923
9161
|
this._clearWebglCanvasCameraTransform();
|
|
8924
9162
|
this._lastWebglRenderInfo = { calls: 0, triangles: 0, points: 0, lines: 0 };
|
|
@@ -8968,7 +9206,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
8968
9206
|
cssEl.scrollLeft = 0;
|
|
8969
9207
|
}
|
|
8970
9208
|
|
|
8971
|
-
|
|
9209
|
+
renderCss3dSceneForCurrentCamera(this, this.cssScene || this.scene, this.camera, 'css3d-full-render');
|
|
8972
9210
|
this._css3dVisualChangedThisFrame = false;
|
|
8973
9211
|
this._css3dVisualChangedSinceLastRender = false;
|
|
8974
9212
|
}
|
|
@@ -9634,6 +9872,10 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
9634
9872
|
this._lastLocalSnapGridKey = '';
|
|
9635
9873
|
this._lastLocalSnapGridTransformKey = '';
|
|
9636
9874
|
}
|
|
9875
|
+
if (this._backgroundGridLayerHost) {
|
|
9876
|
+
this._backgroundGridLayerHost.remove();
|
|
9877
|
+
this._backgroundGridLayerHost = null;
|
|
9878
|
+
}
|
|
9637
9879
|
removeCursorDomElement(this);
|
|
9638
9880
|
if (this._viewStatePersistTimer) {
|
|
9639
9881
|
clearTimeout(this._viewStatePersistTimer);
|
|
@@ -9844,7 +10086,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
9844
10086
|
this.renderer.render(this.scene, this.camera);
|
|
9845
10087
|
this._recordWebglRenderedCameraState();
|
|
9846
10088
|
if (this.cssRenderer && typeof this.cssRenderer.render === 'function') {
|
|
9847
|
-
|
|
10089
|
+
renderCss3dSceneForCurrentCamera(this, this.cssScene || this.scene, this.camera, 'project-thumbnail-pre-capture');
|
|
9848
10090
|
}
|
|
9849
10091
|
} catch (error) {
|
|
9850
10092
|
console.warn('[ProjectThumbnail] render before capture failed:', error);
|
|
@@ -828,63 +828,18 @@
|
|
|
828
828
|
max-height: none !important;
|
|
829
829
|
}
|
|
830
830
|
|
|
831
|
-
/* Keep CSS3D nodes readable during camera motion, but drop expensive
|
|
832
|
-
decorative effects consistently across selected and agent-style nodes. */
|
|
833
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper,
|
|
834
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper,
|
|
835
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper,
|
|
836
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .css3d-resolution-wrapper {
|
|
837
|
-
transition: none !important;
|
|
838
|
-
-webkit-transition: none !important;
|
|
839
|
-
filter: none !important;
|
|
840
|
-
-webkit-filter: none !important;
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
844
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
845
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
846
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .css3d-resolution-wrapper .css3d-dynamic-node,
|
|
847
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
848
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
849
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper [id^="css3d-node-"],
|
|
850
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .css3d-resolution-wrapper [id^="css3d-node-"] {
|
|
851
|
-
box-shadow: none !important;
|
|
852
|
-
filter: none !important;
|
|
853
|
-
-webkit-filter: none !important;
|
|
854
|
-
backdrop-filter: none !important;
|
|
855
|
-
-webkit-backdrop-filter: none !important;
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
#css3d-dom-wrapper.is-zooming .embed-content iframe,
|
|
859
|
-
#css3d-dom-wrapper.is-zooming .embed-iframe-host iframe,
|
|
860
|
-
#css3d-dom-wrapper.is-zooming .embed-card,
|
|
861
|
-
#css3d-dom-wrapper.is-zooming .embed-card *,
|
|
862
|
-
#css3d-dom-wrapper.is-zooming .embed-action,
|
|
863
|
-
#css3d-dom-wrapper.is-zooming .embed-play-button,
|
|
864
831
|
body.is-node-dragging .embed-content iframe,
|
|
865
832
|
body.is-node-dragging .embed-iframe-host iframe,
|
|
866
833
|
body.is-node-dragging .embed-card,
|
|
867
834
|
body.is-node-dragging .embed-card *,
|
|
868
835
|
body.is-node-dragging .embed-action,
|
|
869
836
|
body.is-node-dragging .embed-play-button,
|
|
870
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .embed-content iframe,
|
|
871
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .embed-iframe-host iframe,
|
|
872
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .embed-card,
|
|
873
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .embed-card *,
|
|
874
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .embed-action,
|
|
875
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .embed-play-button,
|
|
876
837
|
.is-dragging .embed-content iframe,
|
|
877
838
|
.is-dragging .embed-iframe-host iframe,
|
|
878
839
|
.is-dragging .embed-card,
|
|
879
840
|
.is-dragging .embed-card *,
|
|
880
841
|
.is-dragging .embed-action,
|
|
881
|
-
.is-dragging .embed-play-button
|
|
882
|
-
.is-panning .embed-content iframe,
|
|
883
|
-
.is-panning .embed-iframe-host iframe,
|
|
884
|
-
.is-panning .embed-card,
|
|
885
|
-
.is-panning .embed-card *,
|
|
886
|
-
.is-panning .embed-action,
|
|
887
|
-
.is-panning .embed-play-button {
|
|
842
|
+
.is-dragging .embed-play-button {
|
|
888
843
|
pointer-events: none !important;
|
|
889
844
|
}
|
|
890
845
|
|
|
@@ -903,32 +858,13 @@
|
|
|
903
858
|
pointer-events: auto !important;
|
|
904
859
|
}
|
|
905
860
|
|
|
906
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host,
|
|
907
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host iframe,
|
|
908
861
|
body.is-node-dragging .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host,
|
|
909
862
|
body.is-node-dragging .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host iframe,
|
|
910
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host,
|
|
911
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host iframe,
|
|
912
863
|
.is-dragging .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host,
|
|
913
|
-
.is-dragging .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host iframe
|
|
914
|
-
.is-panning .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host,
|
|
915
|
-
.is-panning .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host iframe {
|
|
864
|
+
.is-dragging .css3d-resolution-wrapper.node-type-embed .embed-content[data-iframe-interacting="true"] .embed-iframe-host iframe {
|
|
916
865
|
pointer-events: none !important;
|
|
917
866
|
}
|
|
918
867
|
|
|
919
|
-
#css3d-dom-wrapper.is-zooming .ai-loading-row.ai-loading-row-media,
|
|
920
|
-
#css3d-dom-wrapper.is-panning .ai-loading-row.ai-loading-row-media,
|
|
921
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .ai-loading-row.ai-loading-row-media,
|
|
922
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .ai-loading-row.ai-loading-row-media,
|
|
923
|
-
#css3d-dom-wrapper.is-zooming .css3d-resolution-wrapper .map-node-memo__agent-console-panel,
|
|
924
|
-
#css3d-dom-wrapper.is-panning .css3d-resolution-wrapper .map-node-memo__agent-console-panel,
|
|
925
|
-
#css3d-dom-wrapper.mindcanvas-is-moving .css3d-resolution-wrapper .map-node-memo__agent-console-panel,
|
|
926
|
-
#css3d-dom-wrapper.mindcanvas-is-dense .css3d-resolution-wrapper .map-node-memo__agent-console-panel {
|
|
927
|
-
box-shadow: none !important;
|
|
928
|
-
backdrop-filter: none !important;
|
|
929
|
-
-webkit-backdrop-filter: none !important;
|
|
930
|
-
}
|
|
931
|
-
|
|
932
868
|
.ai-loading-row {
|
|
933
869
|
display: flex;
|
|
934
870
|
align-items: center;
|
|
@@ -9832,8 +9768,11 @@
|
|
|
9832
9768
|
const transform = `translate3d(${translateX.toFixed(3)}px, ${translateY.toFixed(3)}px, 0) scale(${scale.toFixed(5)})`;
|
|
9833
9769
|
for (const layer of [visualLayer, hitLayer]) {
|
|
9834
9770
|
if (!layer?.style) continue;
|
|
9835
|
-
|
|
9836
|
-
|
|
9771
|
+
if (module._businessAutomationEdgeCameraTransformActive !== true ||
|
|
9772
|
+
layer.style.willChange !== 'transform') {
|
|
9773
|
+
layer.style.transformOrigin = '50% 50%';
|
|
9774
|
+
layer.style.willChange = 'transform';
|
|
9775
|
+
}
|
|
9837
9776
|
layer.style.transform = transform;
|
|
9838
9777
|
}
|
|
9839
9778
|
module._lastBusinessAutomationEdgeTransformKey = transformKey;
|
|
@@ -2,7 +2,6 @@ window.MindMapInteractions = (function () {
|
|
|
2
2
|
const WHEEL_DEBUG = false;
|
|
3
3
|
const WHEEL_PERF_DEBUG = false;
|
|
4
4
|
const CTRL_WHEEL_SCROLL_EDGE_EPSILON = 2;
|
|
5
|
-
const PAN_LIVE_REFRESH_FORCE_FRAMES = 2;
|
|
6
5
|
const MOTION_DOM_FANOUT_DELAY_MS = 180;
|
|
7
6
|
const MOTION_DOM_FANOUT_ENABLED = false;
|
|
8
7
|
const MOTION_WILL_CHANGE_ENABLE_DELAY_MS = 240;
|
|
@@ -26,11 +25,7 @@ window.MindMapInteractions = (function () {
|
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
function isBrowserSelectionLocked() {
|
|
29
|
-
|
|
30
|
-
return browserSelectionLockReasons.size > 0 ||
|
|
31
|
-
css3dWrapper?.classList?.contains?.('is-panning') === true ||
|
|
32
|
-
css3dWrapper?.classList?.contains?.('is-zooming') === true ||
|
|
33
|
-
css3dWrapper?.classList?.contains?.('is-dragging') === true;
|
|
28
|
+
return browserSelectionLockReasons.size > 0;
|
|
34
29
|
}
|
|
35
30
|
|
|
36
31
|
function handleBrowserSelectStart(event) {
|
|
@@ -97,11 +92,9 @@ window.MindMapInteractions = (function () {
|
|
|
97
92
|
}
|
|
98
93
|
|
|
99
94
|
function scheduleZoomMotionChrome(module) {
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (MOTION_DOM_FANOUT_ENABLED !== true) {
|
|
104
|
-
clearZoomMotionChrome(module);
|
|
95
|
+
if (MOTION_DOM_FANOUT_ENABLED !== true ||
|
|
96
|
+
!module ||
|
|
97
|
+
typeof document === 'undefined') {
|
|
105
98
|
return;
|
|
106
99
|
}
|
|
107
100
|
|
|
@@ -111,13 +104,17 @@ window.MindMapInteractions = (function () {
|
|
|
111
104
|
const targetElement = module?.cssRenderer?.domElement || null;
|
|
112
105
|
if (module.isZooming === true) {
|
|
113
106
|
targetElement?.classList?.add?.('is-zooming');
|
|
107
|
+
module._zoomMotionChromeApplied = true;
|
|
114
108
|
}
|
|
115
109
|
}, MOTION_DOM_FANOUT_DELAY_MS);
|
|
116
110
|
}
|
|
117
111
|
|
|
118
112
|
function clearZoomMotionChrome(module) {
|
|
119
113
|
clearModuleTimer(module, '_zoomMotionChromeTimer');
|
|
120
|
-
module?.
|
|
114
|
+
if (module?._zoomMotionChromeApplied === true) {
|
|
115
|
+
module.cssRenderer?.domElement?.classList?.remove?.('is-zooming');
|
|
116
|
+
module._zoomMotionChromeApplied = false;
|
|
117
|
+
}
|
|
121
118
|
}
|
|
122
119
|
|
|
123
120
|
function getPanMotionClassElement(module) {
|
|
@@ -125,12 +122,11 @@ window.MindMapInteractions = (function () {
|
|
|
125
122
|
}
|
|
126
123
|
|
|
127
124
|
function schedulePanMotionChrome(module) {
|
|
128
|
-
|
|
129
|
-
if (!module || !element) {
|
|
125
|
+
if (MOTION_DOM_FANOUT_ENABLED !== true) {
|
|
130
126
|
return;
|
|
131
127
|
}
|
|
132
|
-
|
|
133
|
-
|
|
128
|
+
const element = getPanMotionClassElement(module);
|
|
129
|
+
if (!module || !element) {
|
|
134
130
|
return;
|
|
135
131
|
}
|
|
136
132
|
|
|
@@ -140,13 +136,17 @@ window.MindMapInteractions = (function () {
|
|
|
140
136
|
const targetElement = getPanMotionClassElement(module);
|
|
141
137
|
if (module.isPanning === true && targetElement) {
|
|
142
138
|
targetElement.classList.add('is-panning');
|
|
139
|
+
module._panMotionChromeApplied = true;
|
|
143
140
|
}
|
|
144
141
|
}, MOTION_DOM_FANOUT_DELAY_MS);
|
|
145
142
|
}
|
|
146
143
|
|
|
147
144
|
function clearPanMotionChrome(module) {
|
|
148
145
|
clearModuleTimer(module, '_panMotionChromeTimer');
|
|
149
|
-
module?.
|
|
146
|
+
if (module?._panMotionChromeApplied === true) {
|
|
147
|
+
module.cssRenderer?.domElement?.classList?.remove?.('is-panning');
|
|
148
|
+
module._panMotionChromeApplied = false;
|
|
149
|
+
}
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
function scheduleMotionWillChangeEnable(module) {
|
|
@@ -572,22 +572,9 @@ window.MindMapInteractions = (function () {
|
|
|
572
572
|
}
|
|
573
573
|
|
|
574
574
|
function requestPanLiveRefreshFrames(module) {
|
|
575
|
-
if (!module
|
|
575
|
+
if (!module) {
|
|
576
576
|
return;
|
|
577
577
|
}
|
|
578
|
-
|
|
579
|
-
module._forceUpdateFrames = Math.max(
|
|
580
|
-
Number(module._forceUpdateFrames || 0),
|
|
581
|
-
PAN_LIVE_REFRESH_FORCE_FRAMES
|
|
582
|
-
);
|
|
583
|
-
module._panLiveRefreshForceFrames = Math.max(
|
|
584
|
-
Number(module._panLiveRefreshForceFrames || 0),
|
|
585
|
-
PAN_LIVE_REFRESH_FORCE_FRAMES
|
|
586
|
-
);
|
|
587
|
-
module._cameraNavigationForceFrames = Math.max(
|
|
588
|
-
Number(module._cameraNavigationForceFrames || 0),
|
|
589
|
-
PAN_LIVE_REFRESH_FORCE_FRAMES
|
|
590
|
-
);
|
|
591
578
|
wakeCameraNavigationAnimation(module, 'pan-input');
|
|
592
579
|
}
|
|
593
580
|
|
|
@@ -6320,8 +6307,6 @@ window.MindMapInteractions = (function () {
|
|
|
6320
6307
|
module.targetY -= normalizedDeltaY * panFactor;
|
|
6321
6308
|
const panInputAt = performance.now();
|
|
6322
6309
|
module._lastPanInputAt = panInputAt;
|
|
6323
|
-
module._forceUpdateFrames = Math.max(module._forceUpdateFrames || 0, 2);
|
|
6324
|
-
module._cameraNavigationForceFrames = Math.max(module._cameraNavigationForceFrames || 0, 2);
|
|
6325
6310
|
module._deferPassiveOverlayRefresh = true;
|
|
6326
6311
|
module._cameraNavigationOverlayInputTime = panInputAt;
|
|
6327
6312
|
wakeCameraNavigationAnimation(module, 'trackpad-pan-input');
|
|
@@ -6372,18 +6357,18 @@ window.MindMapInteractions = (function () {
|
|
|
6372
6357
|
* - 기존 performCameraZoom과 동일하지만 event 객체 대신 누적된 값 사용
|
|
6373
6358
|
*/
|
|
6374
6359
|
function performCameraZoomBuffered(module, deltaY, clientX, clientY, options = {}) {
|
|
6360
|
+
if (!module || !module.camera || !module.container) {
|
|
6361
|
+
/*
|
|
6375
6362
|
// ▼▼▼ [Fix] 안전 검사 추가 ▼▼▼
|
|
6376
6363
|
if (!module || !module.camera || !module.container) {
|
|
6364
|
+
*/
|
|
6377
6365
|
console.warn('[Wheel Buffer] Module, camera, or container not ready');
|
|
6378
6366
|
return;
|
|
6379
6367
|
}
|
|
6368
|
+
/*
|
|
6380
6369
|
// ▲▲▲ [Fix] ▲▲▲
|
|
6381
6370
|
if (module._isLocalSnapGridThemeEnabled?.() === true ||
|
|
6382
|
-
|
|
6383
|
-
module._localSnapGridLayer?.isConnected === true) {
|
|
6384
|
-
module.setLocalSnapGridClientPoint?.(clientX, clientY);
|
|
6385
|
-
}
|
|
6386
|
-
|
|
6371
|
+
*/
|
|
6387
6372
|
let t0 = 0;
|
|
6388
6373
|
let cameraZ = '?';
|
|
6389
6374
|
if (WHEEL_PERF_DEBUG) {
|
|
@@ -6402,6 +6387,13 @@ window.MindMapInteractions = (function () {
|
|
|
6402
6387
|
}
|
|
6403
6388
|
}
|
|
6404
6389
|
// ▼▼▼ [Fix] 휠 입력 시간 기록 (줌 종료 타이밍 계산용) ▼▼▼
|
|
6390
|
+
// Keep wheel zoom in the cheap active-zoom local grid branch when the
|
|
6391
|
+
// pointer has not moved. Exact grid style is reconciled after settle.
|
|
6392
|
+
if (module._isLocalSnapGridThemeEnabled?.() === true ||
|
|
6393
|
+
module._localSnapGridVisible === true ||
|
|
6394
|
+
module._localSnapGridLayer?.isConnected === true) {
|
|
6395
|
+
module.setLocalSnapGridClientPoint?.(clientX, clientY);
|
|
6396
|
+
}
|
|
6405
6397
|
module._zoomInputTime = Number(options?.inputTime || 0) > 0
|
|
6406
6398
|
? Number(options.inputTime)
|
|
6407
6399
|
: performance.now();
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
// ▲▲▲ [Usage] ▲▲▲
|
|
52
52
|
|
|
53
53
|
// Procedural line rendering settings
|
|
54
|
-
const LOD_RENDERER_BUILD_ID = '
|
|
54
|
+
const LOD_RENDERER_BUILD_ID = '20260620-css3d-flat-pan-v750';
|
|
55
55
|
const DirtyKind = Object.freeze({
|
|
56
56
|
ResidentFullRebuild: 'resident-full-rebuild',
|
|
57
57
|
ResidentPatch: 'resident-patch',
|
|
@@ -2903,7 +2903,7 @@
|
|
|
2903
2903
|
(this.imageInstanceData?.nodeIds?.length || 0) > 0;
|
|
2904
2904
|
}
|
|
2905
2905
|
|
|
2906
|
-
canUseUltraResidentCameraOnlyFrame(camera = this._module?.camera, module = this._module) {
|
|
2906
|
+
canUseUltraResidentCameraOnlyFrame(camera = this._module?.camera, module = this._module, options = {}) {
|
|
2907
2907
|
if (FORCE_RESIDENT_INSTANCES_IN_MID_FAR !== true || !camera || !module) {
|
|
2908
2908
|
return false;
|
|
2909
2909
|
}
|
|
@@ -2931,7 +2931,15 @@
|
|
|
2931
2931
|
const multiSelectedIds = module?.multiSelectedNodeIds || new Set();
|
|
2932
2932
|
const selectedNodeId = module?.selectedNodeIdJs || null;
|
|
2933
2933
|
const selectionKey = buildLodSelectionKey(multiSelectedIds, selectedNodeId);
|
|
2934
|
+
const isCameraNavigationActive = options?.isCameraNavigationActive === true ||
|
|
2935
|
+
options?.isCameraMoving === true ||
|
|
2936
|
+
module?.isPanning === true ||
|
|
2937
|
+
module?.isZooming === true;
|
|
2934
2938
|
if (this._lastAppliedLodSelectionKey !== selectionKey) {
|
|
2939
|
+
if (isCameraNavigationActive === true) {
|
|
2940
|
+
this._residentCameraOnlyDeferredVisualWork = true;
|
|
2941
|
+
return true;
|
|
2942
|
+
}
|
|
2935
2943
|
return false;
|
|
2936
2944
|
}
|
|
2937
2945
|
|
|
@@ -2955,6 +2963,24 @@
|
|
|
2955
2963
|
this._residentCameraOnlyDeferredVisualWork = true;
|
|
2956
2964
|
}
|
|
2957
2965
|
|
|
2966
|
+
if (isCameraNavigationActive === true) {
|
|
2967
|
+
const hasOnlyDeferrableVisualWork = !!(
|
|
2968
|
+
pendingSelectionCount > 0 ||
|
|
2969
|
+
this._residentRebuildPending === true
|
|
2970
|
+
);
|
|
2971
|
+
const hasStructuralResidentDirtyWork = !!(
|
|
2972
|
+
this._instancesDirty === true ||
|
|
2973
|
+
this._imageInstancesDirty === true ||
|
|
2974
|
+
this._positionsOnlyDirty === true ||
|
|
2975
|
+
this._isNodeArrayDirty === true ||
|
|
2976
|
+
dirtyPositionCount > 0
|
|
2977
|
+
);
|
|
2978
|
+
if (hasOnlyDeferrableVisualWork === true && hasStructuralResidentDirtyWork !== true) {
|
|
2979
|
+
this._residentCameraOnlyDeferredVisualWork = true;
|
|
2980
|
+
return true;
|
|
2981
|
+
}
|
|
2982
|
+
}
|
|
2983
|
+
|
|
2958
2984
|
return !(
|
|
2959
2985
|
this._instancesDirty === true ||
|
|
2960
2986
|
this._imageInstancesDirty === true ||
|
|
@@ -55,12 +55,10 @@
|
|
|
55
55
|
var cameraZ = Math.max(1, Number(position.z || 1));
|
|
56
56
|
var cameraX = Number(position.x || 0);
|
|
57
57
|
var cameraY = Number(position.y || 0);
|
|
58
|
-
var
|
|
59
|
-
if (!Number.isFinite(cameraX) || !Number.isFinite(cameraY) || !Number.isFinite(cameraZ) || !Number.isFinite(
|
|
58
|
+
var projectionScale = Number(camera.projectionMatrix && camera.projectionMatrix.elements ? camera.projectionMatrix.elements[5] : 0);
|
|
59
|
+
if (!Number.isFinite(cameraX) || !Number.isFinite(cameraY) || !Number.isFinite(cameraZ) || !Number.isFinite(projectionScale) || projectionScale <= 0) return false;
|
|
60
60
|
if (Math.abs(Number(rotation.x || 0)) > 1e-5 || Math.abs(Number(rotation.y || 0)) > 1e-5 || Math.abs(Number(rotation.z || 0)) > 1e-5) return false;
|
|
61
|
-
var
|
|
62
|
-
var viewHeight = 2 * Math.tan(vfov / 2) * cameraZ;
|
|
63
|
-
var scale = _height / Math.max(1, viewHeight);
|
|
61
|
+
var scale = (projectionScale * _heightHalf) / cameraZ;
|
|
64
62
|
var translateX = _widthHalf - cameraX * scale;
|
|
65
63
|
var translateY = _heightHalf + cameraY * scale;
|
|
66
64
|
var translateBucket = Math.max(0.001, Number(options && options.translateBucketPx || 0.25));
|
|
@@ -82,6 +80,7 @@
|
|
|
82
80
|
}
|
|
83
81
|
this.renderCamera = function(camera){ renderCameraOnly(this, camera); };
|
|
84
82
|
this.renderFlatCamera = function(camera, options){ return renderFlatCameraOnly(this, camera, options); };
|
|
83
|
+
this.renderFlat = function(scene, camera, options){ if (scene.autoUpdate===true) scene.updateMatrixWorld(); if (renderFlatCameraOnly(this, camera, options)!==true) return false; renderObject(scene, scene, camera, null); return true; };
|
|
85
84
|
this.render = function(scene, camera){ if (scene.autoUpdate===true) scene.updateMatrixWorld(); var cameraCSSMatrix=renderCameraOnly(this, camera); renderObject(scene, scene, camera, cameraCSSMatrix); };
|
|
86
85
|
}
|
|
87
86
|
|
package/wwwroot/index.html
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
|
|
4
4
|
<head>
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
<title>MindExec | Business Execution OS for solo builders</title>
|
|
8
8
|
<meta name="description" content="MindExec is an AI business execution OS for solo builders who want to turn notes, research, assets, and repeatable execution Skills into revenue-producing work." />
|
|
9
9
|
<base href="/" />
|
|
10
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-css3d-flat-
|
|
11
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-css3d-flat-
|
|
12
|
-
<!--
|
|
10
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-css3d-flat-pan-v750" />
|
|
11
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-css3d-flat-pan-v750" />
|
|
12
|
+
<!-- ?占썩뼹??Font Awesome (local) ?占썩뼹??-->
|
|
13
13
|
<link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
|
|
14
|
-
<!--
|
|
14
|
+
<!-- ?占썩뼯??-->
|
|
15
15
|
<style>
|
|
16
16
|
#app {
|
|
17
17
|
min-height: 100vh;
|
|
@@ -180,7 +180,7 @@
|
|
|
180
180
|
function adjustTextareaHeight(element) {
|
|
181
181
|
if (!element) return;
|
|
182
182
|
|
|
183
|
-
//
|
|
183
|
+
// ?占썩뼹??[Change] Add jitter-prevention logic ?占썩뼹??
|
|
184
184
|
// Compare the previous text length. When content grows, skip the 'auto' reset.
|
|
185
185
|
// Only reset to 'auto' when shrinking (during deletion).
|
|
186
186
|
const currentLength = element.value.length;
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
element.dataset.prevLength = currentLength; // store current length
|
|
194
|
-
//
|
|
194
|
+
// ?占썩뼯??[Change] ?占썩뼯??
|
|
195
195
|
|
|
196
196
|
const computedStyles = window.getComputedStyle(element);
|
|
197
197
|
const lineHeight = parseFloat(computedStyles.lineHeight || '24') || 24;
|
|
@@ -284,11 +284,11 @@
|
|
|
284
284
|
// Prevent default page-level DnD behavior
|
|
285
285
|
document.addEventListener('dragover', (e) => {
|
|
286
286
|
e.preventDefault();
|
|
287
|
-
//
|
|
287
|
+
// ?占썩뼹??[Change] Remove/avoid stopPropagation (do not disrupt event flow) ?占썩뼹??
|
|
288
288
|
// e.stopPropagation();
|
|
289
|
-
//
|
|
289
|
+
// ?占썩뼯??[Change] ?占썩뼯??
|
|
290
290
|
|
|
291
|
-
//
|
|
291
|
+
// ?占썩뼹??[Change] Default is 'none', but only apply when not handled by children ?占썩뼹??
|
|
292
292
|
// (If MindMapDnD handles it, this code won't run or will be ignored)
|
|
293
293
|
// e.dataTransfer.dropEffect = 'none';
|
|
294
294
|
}, false);
|
|
@@ -428,7 +428,7 @@
|
|
|
428
428
|
window.__matchesMarketingToolHost(host, location.host || '')
|
|
429
429
|
);
|
|
430
430
|
</script>
|
|
431
|
-
<!--
|
|
431
|
+
<!-- ?占썩뼹??[Upgrade] Three.js r168 via ESM ?占썩뼹??-->
|
|
432
432
|
<script type="importmap">
|
|
433
433
|
{
|
|
434
434
|
"imports": {
|
|
@@ -579,7 +579,7 @@
|
|
|
579
579
|
}
|
|
580
580
|
|
|
581
581
|
const base = '_content/MindExecution.Shared/js/';
|
|
582
|
-
const scriptVersion = '20260620-css3d-flat-
|
|
582
|
+
const scriptVersion = '20260620-css3d-flat-pan-v750';
|
|
583
583
|
const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
|
|
584
584
|
console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
|
|
585
585
|
const criticalScripts = [
|
|
@@ -590,7 +590,7 @@
|
|
|
590
590
|
'background-themes.js',
|
|
591
591
|
'mind-map-logic-workers.js',
|
|
592
592
|
// Troika removed
|
|
593
|
-
'texture-worker-manager.js', // ??Web Worker
|
|
593
|
+
'texture-worker-manager.js', // ??Web Worker ?占쎌뒪占??占쎌꽦
|
|
594
594
|
'mind-map-texture-factory.js',
|
|
595
595
|
'mind-map-glow-shader.js', // ??SDF Glow (no textures, GPU only)
|
|
596
596
|
'mind-map-css3d-manager.js',
|
|
@@ -603,7 +603,7 @@
|
|
|
603
603
|
'mind-map-interactions.js',
|
|
604
604
|
'mind-map-dnd.js',
|
|
605
605
|
'mind-map-lod-renderer.js',
|
|
606
|
-
'mind-map-text-lod-system.js', // ??Text LOD
|
|
606
|
+
'mind-map-text-lod-system.js', // ??Text LOD ?占쎌뒪??(?占쎌쟻 ?占쎌뒪占??占쎌쭏)
|
|
607
607
|
'mind-map-core.js',
|
|
608
608
|
'mindmap-toolbar.js',
|
|
609
609
|
'token-manager.js',
|
|
@@ -722,7 +722,7 @@
|
|
|
722
722
|
window.showBlazorBootError('The page could not finish loading. Reload and try again.');
|
|
723
723
|
});
|
|
724
724
|
</script>
|
|
725
|
-
<!--
|
|
725
|
+
<!-- ?占썩뼯??[Upgrade] ?占썩뼯??-->
|
|
726
726
|
</body>
|
|
727
727
|
|
|
728
728
|
</html>
|
|
@@ -732,3 +732,5 @@
|
|
|
732
732
|
|
|
733
733
|
|
|
734
734
|
|
|
735
|
+
|
|
736
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
self.assetsManifest = {
|
|
2
|
-
"version": "
|
|
2
|
+
"version": "Mc/DXRDi",
|
|
3
3
|
"assets": [
|
|
4
4
|
{
|
|
5
5
|
"hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"url": "_content/MindExecution.Shared/css/app.css"
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
|
-
"hash": "sha256-
|
|
45
|
+
"hash": "sha256-zsNb+3FjEoGDJ9DgMdmdUDcqtZZutCCxWLOD11C0c00=",
|
|
46
46
|
"url": "_content/MindExecution.Shared/css/mind-map-overrides.css"
|
|
47
47
|
},
|
|
48
48
|
{
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"url": "_content/MindExecution.Shared/js/marked.min.js"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
|
-
"hash": "sha256-
|
|
81
|
+
"hash": "sha256-I3V3gWKzxo7MOYoHmrw4xLebf6DAoBDbOKyi/Yf1ygg=",
|
|
82
82
|
"url": "_content/MindExecution.Shared/js/mind-map-core.js"
|
|
83
83
|
},
|
|
84
84
|
{
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"url": "_content/MindExecution.Shared/js/mind-map-core.js.backup"
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
|
-
"hash": "sha256-
|
|
89
|
+
"hash": "sha256-EhlES5jLPO7cMczX09TDrcP1PC/KgkF86AYsA+Oap4I=",
|
|
90
90
|
"url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
|
|
91
91
|
},
|
|
92
92
|
{
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"url": "_content/MindExecution.Shared/js/mind-map-glow-shader.js"
|
|
107
107
|
},
|
|
108
108
|
{
|
|
109
|
-
"hash": "sha256-
|
|
109
|
+
"hash": "sha256-zEddte5cBTtErNAKwTTpVx4/HQVQpkkF460AYsYe/28=",
|
|
110
110
|
"url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
|
|
111
111
|
},
|
|
112
112
|
{
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
"url": "_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js"
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
|
-
"hash": "sha256-
|
|
117
|
+
"hash": "sha256-xlxha7eUDEjfMacqCq0ovCZPd3+Nxyj1MPdVt8iNNDM=",
|
|
118
118
|
"url": "_content/MindExecution.Shared/js/mind-map-lod-renderer.js"
|
|
119
119
|
},
|
|
120
120
|
{
|
|
@@ -182,7 +182,7 @@
|
|
|
182
182
|
"url": "_content/MindExecution.Shared/js/plan-master.js"
|
|
183
183
|
},
|
|
184
184
|
{
|
|
185
|
-
"hash": "sha256-
|
|
185
|
+
"hash": "sha256-uNsEEhPWF3LWiI7eGK5Fft6Rw/XSu+PrxGcu5ZcK1MA=",
|
|
186
186
|
"url": "_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js"
|
|
187
187
|
},
|
|
188
188
|
{
|
|
@@ -834,7 +834,7 @@
|
|
|
834
834
|
"url": "image-manifest.json"
|
|
835
835
|
},
|
|
836
836
|
{
|
|
837
|
-
"hash": "sha256-
|
|
837
|
+
"hash": "sha256-Ob3HKDlRurLtR1gJlYEo/2kPD1z2E+ymjO49AfrDA+M=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|