@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.291",
3
+ "version": "0.2.293",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -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-wheel-v737';
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 = true;
118
- const CAMERA_MOTION_WEBGL_TRANSFORM_TRANSLATE_BUCKET_PX = 0.25;
119
- const CAMERA_MOTION_WEBGL_TRANSFORM_SCALE_BUCKET = 0.0005;
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
- module.lodRenderer.canUseUltraResidentCameraOnlyFrame(module.camera, module) !== true) {
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
- _placeBackgroundGridLayer(layer) {
4177
- if (!layer || !this.container) {
4178
- return false;
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 (layer.parentNode !== this.container ||
4192
- layer.nextSibling !== anchorElement) {
4193
- this.container.insertBefore(layer, anchorElement);
4321
+ if (host.parentNode !== this.container ||
4322
+ host.nextSibling !== anchorElement) {
4323
+ this.container.insertBefore(host, anchorElement);
4194
4324
  }
4195
- } else if (layer.parentNode !== this.container) {
4196
- this.container.insertBefore(layer, this.container.firstChild || null);
4325
+ } else if (host.parentNode !== this.container) {
4326
+ this.container.insertBefore(host, this.container.firstChild || null);
4197
4327
  }
4198
4328
 
4199
- return layer.parentNode === this.container;
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 transformKey = `${Math.round(layerLeft * 2)}|${Math.round(layerTop * 2)}`;
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(${layerLeft.toFixed(2)}px, ${layerTop.toFixed(2)}px, 0)`;
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 transformKey = `${Math.round(layerLeft * 2)}|${Math.round(layerTop * 2)}`;
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(${layerLeft.toFixed(2)}px, ${layerTop.toFixed(2)}px, 0)`;
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 transformKey = `${Math.round(layerLeft * 2)}|${Math.round(layerTop * 2)}`;
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(${layerLeft.toFixed(2)}px, ${layerTop.toFixed(2)}px, 0)`;
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
- if (nextValue > 0) {
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 = '0';
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 = '1';
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
- element.style.transformOrigin = '50% 50%';
5736
- element.style.willChange = 'transform';
5737
- element.style.transform = `translate3d(${transformTranslateX.toFixed(3)}px, ${transformTranslateY.toFixed(3)}px, 0) scale(${transformScale.toFixed(5)})`;
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 (isPureCss3dCameraMotionFrame === true) {
9118
+ if (shouldDeferFullResWebglForNormalCss3dMotion === true) {
9119
+ markFullResWebglDeferredForCss3dCameraMotion(this, 'normalCss3dCameraMotion');
9120
+ } else if (isPureCss3dCameraMotionFrame === true) {
8902
9121
  this._webglCameraMotionDeferred = true;
8903
- }
8904
- const shouldFreezeWebglCanvasTransformForZoom =
8905
- shouldFreezeWebglSurfaceForZoom(this) === true;
8906
- if (isCameraNavigationOnlyInteractiveFrame === true &&
8907
- shouldFreezeWebglCanvasTransformForZoom !== true &&
8908
- canUseWebglCanvasTransformForCameraMotion(this) === true) {
8909
- usedWebglCanvasCameraTransform = this._applyWebglCanvasCameraTransform() === true;
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
- this._clearWebglCanvasCameraTransform();
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
- this.cssRenderer.render(this.cssScene || this.scene, this.camera);
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
- this.cssRenderer.render(this.cssScene || this.scene, this.camera);
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
- layer.style.transformOrigin = '50% 50%';
9836
- layer.style.willChange = 'transform';
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
- const css3dWrapper = document?.getElementById?.('css3d-dom-wrapper');
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 (!module || typeof document === 'undefined') {
101
- return;
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?.cssRenderer?.domElement?.classList?.remove?.('is-zooming');
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
- const element = getPanMotionClassElement(module);
129
- if (!module || !element) {
125
+ if (MOTION_DOM_FANOUT_ENABLED !== true) {
130
126
  return;
131
127
  }
132
- if (MOTION_DOM_FANOUT_ENABLED !== true) {
133
- clearPanMotionChrome(module);
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?.cssRenderer?.domElement?.classList?.remove?.('is-panning');
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 || PAN_LIVE_REFRESH_FORCE_FRAMES <= 0) {
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
- module._localSnapGridVisible === true ||
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 = '20260614-remote-fleet-lod-css-v200';
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 fov = Number(camera.fov || 45);
59
- if (!Number.isFinite(cameraX) || !Number.isFinite(cameraY) || !Number.isFinite(cameraZ) || !Number.isFinite(fov)) return false;
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 vfov = fov * Math.PI / 180;
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
 
@@ -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-wheel-v733" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-css3d-flat-wheel-v733" />
12
- <!-- ?�▼??Font Awesome (local) ?�▼??-->
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
- // ?�▼??[Change] Add jitter-prevention logic ?�▼??
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
- // ?�▲??[Change] ?�▲??
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
- // ?�▼??[Change] Remove/avoid stopPropagation (do not disrupt event flow) ?�▼??
287
+ // ?占썩뼹??[Change] Remove/avoid stopPropagation (do not disrupt event flow) ?占썩뼹??
288
288
  // e.stopPropagation();
289
- // ?�▲??[Change] ?�▲??
289
+ // ?占썩뼯??[Change] ?占썩뼯??
290
290
 
291
- // ?�▼??[Change] Default is 'none', but only apply when not handled by children ?�▼??
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
- <!-- ?�▼??[Upgrade] Three.js r168 via ESM ?�▼??-->
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-wheel-v733';
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
- <!-- ?�▲??[Upgrade] ?�▲??-->
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": "++e3HCEL",
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-IsoaitVgDvGMpqVgxyFAW22yVRgrOb0iXaxNi3Sa6s4=",
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-bABeX8wANAaPRLG1o7ZxQkUkfqWUzChfMUTxUgLiyAA=",
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-apogDKTIevZkwck7bwJk6IdZUOmdroyMFIXuT/Lu7M0=",
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-AmkV3no3WRkpMZ4GO+XHpIMuWgixgiTmZjuR1FpgTA8=",
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-GV55pbSXnKE79f7Fvjh995B6wrzgPmh6BUWD26/RlCA=",
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-C7LU7nkx5+E0CFEAx0GNaL5EaiG8g8Cvg5QtDaWTuyo=",
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-f4OkG0Hf42cuV7+AZwsQiqZTLsxdeJjkvo1cJbRNTMs=",
837
+ "hash": "sha256-Ob3HKDlRurLtR1gJlYEo/2kPD1z2E+ymjO49AfrDA+M=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: ++e3HCEL */
1
+ /* Manifest version: Mc/DXRDi */
2
2
  // Hosted deployments should prefer the network over stale offline caches.
3
3
  // This service worker immediately clears old Blazor offline caches and unregisters itself.
4
4