@mindexec/cli 0.2.473 → 0.2.475

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/electron/source-smoke.mjs +1 -0
  2. package/package.json +1 -1
  3. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  4. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  5. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  6. package/wwwroot/_content/MindExecution.Shared/css/app.css +1 -1
  7. package/wwwroot/_content/MindExecution.Shared/css/mind-map-overrides.css +77 -0
  8. package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +5 -1
  9. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +20 -6
  10. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +14 -3
  11. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +6 -5
  12. package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +3 -18
  13. package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js +3 -4
  14. package/wwwroot/_framework/{MindExecution.Core.p242wvzbdm.dll → MindExecution.Core.5oz806gln6.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Kernel.fygh6o7ah1.dll → MindExecution.Kernel.jfsc26t6jl.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Plugins.Admin.slf5qsn9pe.dll → MindExecution.Plugins.Admin.4f1hhljks9.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Plugins.Business.hmmh2iarjz.dll → MindExecution.Plugins.Business.320s5nhcal.dll} +0 -0
  18. package/wwwroot/_framework/{MindExecution.Plugins.Concept.mxak1yilgh.dll → MindExecution.Plugins.Concept.mdxge25pcc.dll} +0 -0
  19. package/wwwroot/_framework/{MindExecution.Plugins.Directory.h0k33bgkfw.dll → MindExecution.Plugins.Directory.j0im38uwcb.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.ijbnd3xmt7.dll → MindExecution.Plugins.PlanMaster.agi5e28akr.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.aa5i2z7lvo.dll → MindExecution.Plugins.YouTube.dhjioxusa0.dll} +0 -0
  22. package/wwwroot/_framework/{MindExecution.Shared.jk6h3848ht.dll → MindExecution.Shared.2v0z3krjjz.dll} +0 -0
  23. package/wwwroot/_framework/{MindExecution.Web.s2oqn7b07d.dll → MindExecution.Web.cn6dtudfnb.dll} +0 -0
  24. package/wwwroot/_framework/blazor.boot.json +21 -21
  25. package/wwwroot/appsettings.json +81 -81
  26. package/wwwroot/index.html +2 -2
  27. package/wwwroot/service-worker-assets.js +900 -900
  28. package/wwwroot/service-worker.js +1 -1
@@ -65,6 +65,7 @@
65
65
 
66
66
  :root {
67
67
  --mind-node-selection-edge: #2563eb;
68
+ --mind-node-selected-hard-edge: #2563eb;
68
69
  --mind-node-selection-edge-rgb: 37, 99, 235;
69
70
  --mind-node-selection-glow-rgb: 59, 130, 246;
70
71
  --mind-node-selection-glow-soft-rgb: 191, 219, 254;
@@ -3646,6 +3647,19 @@ html body .css3d-resolution-wrapper:not(.lod-low).selection-style-agent.selected
3646
3647
  filter: saturate(1.08) !important;
3647
3648
  }
3648
3649
 
3650
+ /* Selection owns the saturated blue hard edge. Connected-node context remains
3651
+ a separate, muted hint and must never be easier to read than selection. */
3652
+ html body .css3d-resolution-wrapper:not(.lod-low).selected.node-type-text,
3653
+ html body .css3d-resolution-wrapper:not(.lod-low).selected.node-type-markdown,
3654
+ html body .css3d-resolution-wrapper:not(.lod-low).selected.node-type-note,
3655
+ html body .css3d-resolution-wrapper:not(.lod-low).selected.node-type-code,
3656
+ html body .css3d-resolution-wrapper:not(.lod-low).selected.node-type-memo,
3657
+ html body .css3d-resolution-wrapper:not(.lod-low).selected.node-type-agent,
3658
+ html body .css3d-resolution-wrapper:not(.lod-low).selected.node-type-automation {
3659
+ outline: 2px solid var(--mind-node-selected-hard-edge, #2563eb) !important;
3660
+ outline-offset: 0 !important;
3661
+ }
3662
+
3649
3663
  html body .css3d-resolution-wrapper:not(.lod-low).node-type-note,
3650
3664
  html body .css3d-resolution-wrapper:not(.lod-low).node-type-image,
3651
3665
  html body .css3d-resolution-wrapper:not(.lod-low).node-type-video,
@@ -3758,3 +3772,66 @@ html body .css3d-resolution-wrapper:not(.lod-low) > .map-node-code:focus-within
3758
3772
  0 0 18px 0 rgba(var(--mind-node-selection-glow-rgb), 0.24),
3759
3773
  0 0 32px 0 rgba(var(--mind-node-selection-glow-soft-rgb), 0.16) !important;
3760
3774
  }
3775
+
3776
+ /* Canonical selected-node chrome.
3777
+ The wrapper owns one neutral edge/glow for every node type so memo themes,
3778
+ media-safe surfaces, and ordinary cards cannot show different selection
3779
+ signatures. The direct node keeps its layout but drops selection-specific
3780
+ inner borders, outlines, filters, and shadows. */
3781
+ html body .css3d-resolution-wrapper[data-node-id]:not(.lod-low).selected,
3782
+ html body .css3d-resolution-wrapper[data-node-id]:not(.lod-low).selected-media-safe {
3783
+ outline: 2px solid var(--mind-node-selected-hard-edge, #2563eb) !important;
3784
+ outline-offset: 0 !important;
3785
+ -webkit-box-shadow:
3786
+ 0 0 0 1px rgba(var(--mind-node-selection-edge-rgb, 37, 99, 235), 0.1),
3787
+ 0 0 16px rgba(var(--mind-node-selection-glow-rgb, 59, 130, 246), 0.22),
3788
+ 0 14px 30px rgba(15, 23, 42, 0.16) !important;
3789
+ box-shadow:
3790
+ 0 0 0 1px rgba(var(--mind-node-selection-edge-rgb, 37, 99, 235), 0.1),
3791
+ 0 0 16px rgba(var(--mind-node-selection-glow-rgb, 59, 130, 246), 0.22),
3792
+ 0 14px 30px rgba(15, 23, 42, 0.16) !important;
3793
+ -webkit-filter: none !important;
3794
+ filter: none !important;
3795
+ }
3796
+
3797
+ html body .css3d-resolution-wrapper[data-node-id]:not(.lod-low).selected > [data-node-id],
3798
+ html body .css3d-resolution-wrapper[data-node-id]:not(.lod-low).selected-media-safe > [data-node-id] {
3799
+ border-color: transparent !important;
3800
+ outline: none !important;
3801
+ outline-offset: 0 !important;
3802
+ -webkit-box-shadow: none !important;
3803
+ box-shadow: none !important;
3804
+ -webkit-filter: none !important;
3805
+ filter: none !important;
3806
+ }
3807
+
3808
+ /* First-character native selection safety.
3809
+ Text begins 14px inside dynamic cards, while the normal 18px start-edge
3810
+ resize zones overlap that first glyph. Narrow only the top/left zones while
3811
+ native selection or an editor owns the node. Bottom-right resize keeps its
3812
+ full hit area. */
3813
+ html body .css3d-resolution-wrapper.is-text-selection-owner > .css3d-resize-hit-layer > .css3d-resize-handle.w,
3814
+ html body .css3d-resolution-wrapper:has(textarea:focus) > .css3d-resize-hit-layer > .css3d-resize-handle.w,
3815
+ html body .css3d-resolution-wrapper:has([contenteditable="true"]:focus) > .css3d-resize-hit-layer > .css3d-resize-handle.w {
3816
+ width: 8px !important;
3817
+ }
3818
+
3819
+ html body .css3d-resolution-wrapper.is-text-selection-owner > .css3d-resize-hit-layer > .css3d-resize-handle.n,
3820
+ html body .css3d-resolution-wrapper:has(textarea:focus) > .css3d-resize-hit-layer > .css3d-resize-handle.n,
3821
+ html body .css3d-resolution-wrapper:has([contenteditable="true"]:focus) > .css3d-resize-hit-layer > .css3d-resize-handle.n {
3822
+ height: 8px !important;
3823
+ }
3824
+
3825
+ html body .css3d-resolution-wrapper.is-text-selection-owner > .css3d-resize-hit-layer > .css3d-resize-handle.nw,
3826
+ html body .css3d-resolution-wrapper:has(textarea:focus) > .css3d-resize-hit-layer > .css3d-resize-handle.nw,
3827
+ html body .css3d-resolution-wrapper:has([contenteditable="true"]:focus) > .css3d-resize-hit-layer > .css3d-resize-handle.nw {
3828
+ width: 8px !important;
3829
+ height: 8px !important;
3830
+ }
3831
+
3832
+ html body .css3d-resolution-wrapper:has(textarea:focus) textarea:focus,
3833
+ html body .css3d-resolution-wrapper:has(input:focus) input:focus,
3834
+ html body .css3d-resolution-wrapper:has([contenteditable="true"]:focus) [contenteditable="true"]:focus {
3835
+ user-select: text !important;
3836
+ -webkit-user-select: text !important;
3837
+ }
@@ -987,7 +987,11 @@
987
987
  options.isCameraMoving === true ||
988
988
  options.isPanning === true ||
989
989
  options.isZooming === true;
990
- const simulationStepCount = isInteractiveMotionFrame ? 1 : simulationStepsPerTick;
990
+ const targetFps = Math.max(0, Number(options.targetFps || 0) || 0);
991
+ const steadySimulationStepCount = targetFps > 0
992
+ ? Math.max(1, Math.round(32 / targetFps))
993
+ : simulationStepsPerTick;
994
+ const simulationStepCount = isInteractiveMotionFrame ? 1 : steadySimulationStepCount;
991
995
 
992
996
  if (simulationReady) {
993
997
  const previousTarget = renderer.getRenderTarget ? renderer.getRenderTarget() : null;
@@ -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 = '20260819-grid-single-css-representation-v869';
8
+ const MINDMAP_CORE_BUILD_ID = '20260822-particle-idle-30fps-v870';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -89,6 +89,7 @@
89
89
  const CURSOR_WORLD_THICKNESS = 4;
90
90
  const RENDER_DEBUG_METRICS_CACHE_MS = 250;
91
91
  const ANIMATION_IDLE_LOW_FPS_DELAY_MS = 500;
92
+ const PARTICLE_THEME_IDLE_FRAME_DELAY_MS = 1000 / 30;
92
93
  const WHEEL_ZOOM_BURST_QUIET_FRAME_LIMIT = 12;
93
94
  const HOME_CAMERA_NORMAL_MID_Z = 8250;
94
95
  const HOME_DENSE_CLUSTER_MIN_CELL_SIZE = 1200;
@@ -6279,6 +6280,11 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6279
6280
  this.lodRenderer?.isInLODMode === true &&
6280
6281
  (frameStart - Number(this._lastLodPanVisibilityRefreshAt || 0)) >= LOD_PAN_VISIBILITY_REFRESH_INTERVAL_MS;
6281
6282
  const shouldUseAnimation60Fps = this.useAnimation60Fps === true && !isBoardLoading;
6283
+ const isGpuParticleTheme = this.currentThemeName === 'Space3D' || this.currentThemeName === 'SpiritFlow';
6284
+ const shouldUseParticleAnimation30Fps =
6285
+ isGpuParticleTheme === true &&
6286
+ shouldUseAnimation60Fps !== true &&
6287
+ !isBoardLoading;
6282
6288
  const shouldUseAnimationLowFpsFrame =
6283
6289
  shouldUseAnimation60Fps !== true &&
6284
6290
  isIdleCadenceFrame === true &&
@@ -6944,7 +6950,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6944
6950
 
6945
6951
  // 6. Theme Animation
6946
6952
  // ----------------------------------------------------------------
6947
- const isGpuParticleTheme = this.currentThemeName === 'Space3D' || this.currentThemeName === 'SpiritFlow';
6948
6953
  const shouldUseMotionGridThemeSubstitute =
6949
6954
  false &&
6950
6955
  isCameraNavigationOnlyInteractiveFrame === true &&
@@ -6983,12 +6988,15 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6983
6988
  const themeRunner = window.MindMapThemes?.runAnimationIfNeeded;
6984
6989
  if (typeof themeRunner === 'function') {
6985
6990
  themeAnimatedThisFrame = themeRunner(this.currentThemeName, this.currentThemeObject, this.camera, {
6986
- force: forceThemeCameraUpdate,
6991
+ force: forceThemeCameraUpdate,
6987
6992
  isCameraMoving: isCameraMoving === true,
6988
6993
  isPanning: this.isPanning === true,
6989
6994
  isZooming: this.isZooming === true,
6990
6995
  isResizing: this.isWindowResizing === true,
6991
- isInteractiveFrame: isInteractiveFrame === true
6996
+ isInteractiveFrame: isInteractiveFrame === true,
6997
+ targetFps: shouldUseAnimation60Fps === true
6998
+ ? 60
6999
+ : (shouldUseParticleAnimation30Fps === true ? 30 : null)
6992
7000
  });
6993
7001
  } else {
6994
7002
  this.currentThemeObject.animate(this.camera);
@@ -7566,7 +7574,11 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7566
7574
  shouldSyncTextOverlays !== true &&
7567
7575
  hasPendingAnimationWakeWork !== true;
7568
7576
  if (shouldParkIdleAnimationLoop) {
7569
- const idleAnimationDelayMs = this.useAnimation60Fps === true ? 0 : ANIMATION_IDLE_LOW_FPS_DELAY_MS;
7577
+ const idleAnimationDelayMs = this.useAnimation60Fps === true
7578
+ ? 0
7579
+ : (shouldUseParticleAnimation30Fps === true
7580
+ ? PARTICLE_THEME_IDLE_FRAME_DELAY_MS
7581
+ : ANIMATION_IDLE_LOW_FPS_DELAY_MS);
7570
7582
  this._lastAnimationLoopDelayMs = idleAnimationDelayMs;
7571
7583
  this._animationLoopExecuting = false;
7572
7584
  this._scheduleAnimationLoop(loop, idleAnimationDelayMs);
@@ -7579,7 +7591,9 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7579
7591
  shouldUpdate !== true &&
7580
7592
  hasPendingAnimationWakeWork !== true;
7581
7593
  if (shouldContinueLowFpsIdleCadence) {
7582
- nextAnimationLoopDelayMs = ANIMATION_IDLE_LOW_FPS_DELAY_MS;
7594
+ nextAnimationLoopDelayMs = shouldUseParticleAnimation30Fps === true
7595
+ ? PARTICLE_THEME_IDLE_FRAME_DELAY_MS
7596
+ : ANIMATION_IDLE_LOW_FPS_DELAY_MS;
7583
7597
  this._lastAnimationLoopDelayMs = nextAnimationLoopDelayMs;
7584
7598
  this._animationLoopExecuting = false;
7585
7599
  this._scheduleAnimationLoop(loop, nextAnimationLoopDelayMs);
@@ -3094,6 +3094,7 @@ window.MindMapInteractions = (function () {
3094
3094
 
3095
3095
  // [Changed] Reduce handle logic size from 24 to 16 to match visual CSS and WebGL mesh
3096
3096
  const RESIZE_HANDLE_SIZE = 16;
3097
+ const TEXT_SELECTION_START_EDGE_RESIZE_HANDLE_SIZE = 8;
3097
3098
  const NODE_HOVER_CURSOR = 'grab';
3098
3099
 
3099
3100
  function getResizeCursorForCorner(corner) {
@@ -3263,9 +3264,19 @@ window.MindMapInteractions = (function () {
3263
3264
  }
3264
3265
  // ▲▲▲ [Fix] ▲▲▲
3265
3266
 
3266
- const inLeft = relX < handleSize;
3267
- const inRight = relX > (nodeWidth - handleSize);
3268
- const inTop = relY < handleSize;
3267
+ const hasFocusedNativeTextEditor = !!nodeElement.querySelector?.(
3268
+ 'textarea:focus, input:focus, [contenteditable="true"]:focus'
3269
+ );
3270
+ const ownsNativeTextSelection =
3271
+ nodeElement.classList?.contains?.('is-text-selection-owner') === true ||
3272
+ hasFocusedNativeTextEditor;
3273
+ const startEdgeHandleSize = ownsNativeTextSelection
3274
+ ? TEXT_SELECTION_START_EDGE_RESIZE_HANDLE_SIZE
3275
+ : handleSize;
3276
+
3277
+ const inLeft = relX < startEdgeHandleSize;
3278
+ const inRight = relX > (nodeWidth - handleSize);
3279
+ const inTop = relY < startEdgeHandleSize;
3269
3280
  const inBottom = relY > (nodeHeight - handleSize);
3270
3281
 
3271
3282
  // ★ 내부 영역 (핸들 아님)
@@ -67,8 +67,8 @@
67
67
  const LINE_HEIGHT_PX = 21; // Match note textarea 14px * 1.5 line-height
68
68
  const LINE_PADDING_PX = 16; // Padding to match node layout
69
69
  const LOD_TEXT_LINE_HALF_THICKNESS_SCREEN_PX = 0.68; // Normalize MID line stroke by screen pixels, not world units.
70
- const LOD_NODE_BORDER_THICKNESS_SCREEN_PX = 1.25; // Keep MID/FAR resident node borders visually identical across bands and DPR/OS scaling.
71
- const LOD_SELECTED_IMAGE_BORDER_THICKNESS_SCREEN_PX = 2.7; // Selected image cards keep a thicker but screen-space-stable outline.
70
+ const LOD_NODE_BORDER_THICKNESS_SCREEN_PX = 1.25; // Stable across MID/FAR and display scaling.
71
+ const LOD_SELECTED_IMAGE_BORDER_THICKNESS_SCREEN_PX = 2.7; // Stable selected image edge.
72
72
  const LOD_TEXT_LINE_OPACITY_MID = 0.42; // MID text silhouettes are overview hints, not readable document text.
73
73
  const LOD_TEXT_LINE_OPACITY_FAR = 0.0; // FAR hides resident text lines by policy; keep the tone explicit for handoff paths.
74
74
  const LOD_NODE_BORDER_OPACITY_MID = 0.42; // Keep MID card edges present without turning the overview into black document frames.
@@ -1957,13 +1957,14 @@
1957
1957
  min(vSize.x - nodePx.x, vSize.y - nodePx.y)
1958
1958
  );
1959
1959
  float borderUnitsPerScreenPx = max(fwidth(edgeDist), 0.0001);
1960
- float borderPx = max(borderUnitsPerScreenPx * uNodeBorderThicknessPx, borderUnitsPerScreenPx * 0.9);
1960
+ float selected = vSelected;
1961
+ float borderPx = max(borderUnitsPerScreenPx * mix(uNodeBorderThicknessPx, 2.7, selected), borderUnitsPerScreenPx * 0.9);
1961
1962
  float borderAa = max(borderUnitsPerScreenPx * 0.95, 0.0001);
1962
1963
  float borderMask = 1.0 - smoothstep(borderPx - borderAa, borderPx + borderAa, edgeDist);
1963
1964
  float showFarInsetBorder = step(0.5, uShowFarInsetBorder);
1964
1965
  vec3 residentBorderColor = mix(uDefaultBorderColor, vBorderColor, useCustomColor);
1965
- vec3 borderColor = mix(residentBorderColor, uDefaultBorderColor, showFarInsetBorder);
1966
- color = mix(color, borderColor, borderMask * clamp(uNodeBorderOpacity, 0.0, 1.0));
1966
+ vec3 borderColor = mix(mix(residentBorderColor, uDefaultBorderColor, showFarInsetBorder), vec3(.145, .388, .92), selected);
1967
+ color = mix(color, borderColor, borderMask * mix(clamp(uNodeBorderOpacity, 0., 1.), .96, selected));
1967
1968
 
1968
1969
  gl_FragColor = vec4(color, 1.0);
1969
1970
  }
@@ -22,19 +22,6 @@
22
22
  }
23
23
  // ▲▲▲ [Perf] ▲▲▲
24
24
 
25
- const MEMO_SELECTION_THEMES = {
26
- coral: { border: 0xf7b08d, accent: 0xff8052 },
27
- amber: { border: 0xf4d06f, accent: 0xf59e0b },
28
- sun: { border: 0xe7d668, accent: 0xca8a04 },
29
- sage: { border: 0xbed79f, accent: 0x65a30d },
30
- mint: { border: 0x8fd8c1, accent: 0x10b981 },
31
- sky: { border: 0x9dc7f7, accent: 0x3b82f6 },
32
- indigo: { border: 0xbcc2ff, accent: 0x6366f1 },
33
- violet: { border: 0xd6b8ff, accent: 0x8b5cf6 },
34
- rose: { border: 0xf5b2c2, accent: 0xf43f5e },
35
- gray: { border: 0xd1d5db, accent: 0x6b7280 },
36
- slate: { border: 0xcbd5e1, accent: 0x64748b }
37
- };
38
25
  const NODE_TEXT_SELECTION_SELECTORS = '.node-response, .code-body, .text-content, .markdown-body, .csv-table-scroll, .csv-table-cell, textarea, .map-node-memo__title, .map-node-memo__body, .map-node-memo__body-view, .map-node-memo__body-view *';
39
26
  const NODE_INTERACTIVE_CONTENT_SELECTORS = `${NODE_TEXT_SELECTION_SELECTORS}, .embed-content, .embed-card, .embed-card *, .embed-action, .embed-play-button, iframe, .map-node-memo__icon-button, .map-node-memo__icon-option, .map-node-memo__icon-popover, .map-node-memo__agent-action, .map-node-memo__agent-result-link, .map-node-memo__agent-plan-panel, .map-node-memo__agent-plan-body, .map-node-memo__agent-plan-body *, .map-node-memo__agent-console-panel, .map-node-memo__agent-console-body, .map-node-memo__agent-console-body *, .map-node-memo__agent-console-resize, .map-node-memo__agent-console-resize *`;
40
27
  const MEMO_EDIT_ONLY_SELECTORS = '.map-node-memo__title, .map-node-memo__body, .map-node-memo__icon-button, .map-node-memo__icon-option, .map-node-memo__icon-popover';
@@ -285,14 +272,12 @@
285
272
  }
286
273
 
287
274
  function getSelectionBorderColorHex(nodeModel, isSelected) {
275
+ if (isSelected) return 0x2563eb;
288
276
  if (String(nodeModel?.contentType ?? nodeModel?.ContentType ?? '').toLowerCase() !== 'memo') {
289
- return isSelected ? 0x7b7ff2 : 0x374151;
277
+ return 0x374151;
290
278
  }
291
279
 
292
- const fallbackKey = 'coral';
293
- const key = String(getNodeMetadata(nodeModel)?.memoColor || fallbackKey).toLowerCase();
294
- const theme = MEMO_SELECTION_THEMES[key] || MEMO_SELECTION_THEMES[fallbackKey];
295
- return isSelected ? theme.accent : theme.border;
280
+ return window.MindMapObjectManager?.getMemoWebglTheme?.(nodeModel)?.border ?? 0xf7b08d;
296
281
  }
297
282
 
298
283
  function cloneNodeMetadata(nodeModel) {
@@ -152,14 +152,12 @@
152
152
  const HANDLE_SIZE = 16; // Changed from 36 to 16 to match CSS handles and prevent ghost touches
153
153
  const CORNER_RADIUS = 20;
154
154
  const DEFAULT_OUTLINE_COLOR = 0x374151;
155
- const SELECTED_OUTLINE_COLOR = 0x7b7ff2;
155
+ const SELECTED_OUTLINE_COLOR = 0x2563eb;
156
156
  const memoTheme = String(nodeModel?.contentType ?? '').toLowerCase() === 'memo' ? getMemoWebglTheme(nodeModel) : null;
157
157
  const defaultBorderHex = memoTheme ? memoTheme.border : DEFAULT_OUTLINE_COLOR;
158
158
  const bodyFillHex = memoTheme ? memoTheme.fill : 0xfefefe;
159
159
  const isSelected = module.multiSelectedNodeIds.has(nodeModel.id);
160
- const selectedBorderHex = isCss3dNode
161
- ? SELECTED_OUTLINE_COLOR
162
- : (memoTheme ? memoTheme.accent : SELECTED_OUTLINE_COLOR);
160
+ const selectedBorderHex = SELECTED_OUTLINE_COLOR;
163
161
  const outlineColor = isSelected ? selectedBorderHex : defaultBorderHex;
164
162
  const OUTLINE_SHRINK = 2;
165
163
  const OUTLINE_RADIUS = Math.max(1, CORNER_RADIUS - 1);
@@ -482,6 +480,7 @@
482
480
  window.MindMapObjectManager = {
483
481
  createOrUpdateCanvasTextureNode: createOrUpdateCanvasTextureNode,
484
482
  createDeferredNodeShell: createDeferredNodeShell,
483
+ getMemoWebglTheme: getMemoWebglTheme,
485
484
  createRoundedRectFilledGeometry: createRoundedRectFilledGeometry // For scrollbar resize in pipeline
486
485
  };
487
486
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-D9EahcFFgxk5/eXPM74VJn4OhgGs3BJoHsibOzLR/lk=",
4
+ "hash": "sha256-sDnKI4OUmJ72ejDB7f1Nz45Z59TiU/UmDappWg6tc/A=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -122,16 +122,16 @@
122
122
  "System.brmz7yk5qh.dll": "System.dll",
123
123
  "netstandard.b50t77veor.dll": "netstandard.dll",
124
124
  "System.Private.CoreLib.wflwsce1yq.dll": "System.Private.CoreLib.dll",
125
- "MindExecution.Core.p242wvzbdm.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.fygh6o7ah1.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.slf5qsn9pe.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.hmmh2iarjz.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.mxak1yilgh.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.h0k33bgkfw.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.ijbnd3xmt7.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.aa5i2z7lvo.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.jk6h3848ht.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.s2oqn7b07d.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.5oz806gln6.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.jfsc26t6jl.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.4f1hhljks9.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.320s5nhcal.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.mdxge25pcc.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.j0im38uwcb.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.agi5e28akr.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.dhjioxusa0.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.2v0z3krjjz.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.cn6dtudfnb.dll": "MindExecution.Web.dll",
135
135
  "dotnet.native.566r55w3xu.js": "dotnet.native.js",
136
136
  "dotnet.native.x6q5aixc38.wasm": "dotnet.native.wasm",
137
137
  "dotnet.js": "dotnet.js",
@@ -276,18 +276,18 @@
276
276
  "System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
277
277
  "System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
278
278
  "netstandard.b50t77veor.dll": "sha256-//jQGOXjb8ET8WtXgOJrAxLx6E7zDJ5RjRRutwkvmxo=",
279
- "MindExecution.Core.p242wvzbdm.dll": "sha256-35J/7FoILxPQctHJIIfSDpXaNJ1hRRcOKZ/yOaPupcI=",
280
- "MindExecution.Kernel.fygh6o7ah1.dll": "sha256-F4YioJkECmNVNtR0atEmyTrUhLW+jWT7MK4jsEZfh4M=",
281
- "MindExecution.Plugins.Business.hmmh2iarjz.dll": "sha256-ybbVj4ozR6BnnPorSfctSWFOTUF2Ia3WN05xk6KhoKE=",
282
- "MindExecution.Plugins.Concept.mxak1yilgh.dll": "sha256-Wj3Q0zd0N7QMWerW1nbDzJOjjNEFnwa1Q38RrgvzrRI=",
283
- "MindExecution.Plugins.PlanMaster.ijbnd3xmt7.dll": "sha256-LkOxdgVNd9shSW+6sl+XBJ2FJk8kUXXNwaxnLZSnbmI=",
284
- "MindExecution.Shared.jk6h3848ht.dll": "sha256-fYGO9haZvRyRfccPOxHv59jXkQtb1CuT8/5Vt8KQFzk=",
285
- "MindExecution.Web.s2oqn7b07d.dll": "sha256-nGDEW6izv5+xQxMuAlZMG5XFkRZNKPfUhNzeLLU5tAo="
279
+ "MindExecution.Core.5oz806gln6.dll": "sha256-lX7hqlSSiSRsuJzB7h6Up9SpU7P3aYrJzVUcRdRR+IE=",
280
+ "MindExecution.Kernel.jfsc26t6jl.dll": "sha256-74S9IXNNvnYGUwVboeyRuR6xqH/I4e2WffLD8UgpE7U=",
281
+ "MindExecution.Plugins.Business.320s5nhcal.dll": "sha256-tR/+xIus4mOecil69Maf6AGTHlumlk/dH5WZ/GEGtoU=",
282
+ "MindExecution.Plugins.Concept.mdxge25pcc.dll": "sha256-Bk0cG/bJei7/dkQaXTKuoJRwMKtRPnwB0jMS3S0fvhw=",
283
+ "MindExecution.Plugins.PlanMaster.agi5e28akr.dll": "sha256-Vv0YylupqDzMMjXQix5ftpGgiUDMu2eU5gTdlx4RE+Y=",
284
+ "MindExecution.Shared.2v0z3krjjz.dll": "sha256-HhIvs53kzsdIZmjzOS85TAGpqf02q5YkKPOBzhNDnp4=",
285
+ "MindExecution.Web.cn6dtudfnb.dll": "sha256-GJizZu6YwEC8/Eyah+zm2NKrLxiUFLhdyyaC2nulYE8="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.slf5qsn9pe.dll": "sha256-wCfsTv1BwU3xWC3J15exqZwwFPzPUiNIfBybFvl4Z24=",
289
- "MindExecution.Plugins.Directory.h0k33bgkfw.dll": "sha256-EXcBUzXs4gVFGFA+3BMOLWJLG45syPzmnwDfHxpvfNk=",
290
- "MindExecution.Plugins.YouTube.aa5i2z7lvo.dll": "sha256-vraXBaopWjmhqEDfBA0LATY8l9htFIhgFG44sQFuQIk="
288
+ "MindExecution.Plugins.Admin.4f1hhljks9.dll": "sha256-cHb6YLLKQ2QnzRL09Eux4VNMT1JsIEp26oC268O6nQA=",
289
+ "MindExecution.Plugins.Directory.j0im38uwcb.dll": "sha256-s+f1K8cPkx8ka/lb7avZJT3loPtovkl/qXJLkY3j31M=",
290
+ "MindExecution.Plugins.YouTube.dhjioxusa0.dll": "sha256-IU/ga79SCspsZ+TeN38Y/SBfu+mzhb0jtRu4gnlj9s4="
291
291
  }
292
292
  },
293
293
  "cacheBootResources": true,
@@ -1,83 +1,83 @@
1
1
  {
2
- "OpenRouter": {
3
- "ApiKey": ""
4
- },
5
- "Execution": {
6
- "Mode": "Concept",
7
- "Model": "openai/gpt-4o-mini"
8
- },
9
- "Supabase": {
10
- "Url": "https://otbyfkjxrkngvjziawki.supabase.co",
11
- "Key": "sb_publishable_NpUs0RDJH2YnllsqTKO6TQ_1jTdSsNQ"
12
- },
13
- "Bridge": {
14
- "Url": "app-origin",
15
- "FallbackPort": 5148,
16
- "AllowHostedLocalFallback": false
17
- },
18
- "ProjectStorage": {
19
- "Mode": "LocalOnly",
20
- "CloudProjectsEnabled": false
21
- },
22
- "CloudflareR2": {
23
- "ProxyUrl": "https://r2-auth-proxy.lovecrdm.workers.dev",
24
- "PublicBaseUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/public",
25
- "PrivateSignUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/sign",
26
- "PrivateBatchSignUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/sign-batch",
27
- "PrivateUrlTtlSeconds": 900
28
- },
29
- "CloudflareWebCapture": {
30
- "EndpointUrl": "https://web-capture-worker.lovecrdm.workers.dev/capture",
31
- "RequestTimeoutMs": 45000
32
- },
33
- "Payments": {
34
- "Provider": "dodo"
35
- },
36
- "DodoPayments": {
37
- "DefaultProductId": "",
38
- "StandardPriceId": "dodo_pro_monthly_v1",
39
- "EarlyPriceId": "dodo_pro_monthly_v1",
40
- "LtdPriceId": "dodo_ltd_launch_v1",
41
- "ReturnUrl": "https://mindexec.pages.dev/pricing",
42
- "Environment": "test_mode"
43
- },
44
- "Paddle": {
45
- "ClientToken": "",
46
- "ProMonthlyPriceId": ""
47
- },
48
- "ProductProfile": {
49
- "VariantKey": "platform",
50
- "Slug": "mindexec",
51
- "BrandName": "MindExec",
52
- "ProductName": "MindCanvas",
53
- "AppTitle": "MindExec",
54
- "WorkspaceNounSingular": "canvas",
55
- "WorkspaceNounPlural": "canvases",
56
- "SignInTitle": "Welcome Back",
57
- "SignUpTitle": "Create Account",
58
- "SignInSubtitle": "Sign in to access your MindCanvas workspace.",
59
- "SignUpSubtitle": "Sign up to start organizing your ideas on a visual canvas.",
60
- "PrimaryCheckoutProvider": "dodo",
61
- "CanonicalHost": "localhost",
62
- "DodoCatalog": {
63
- "StandardPriceId": "dodo_pro_monthly_v1",
64
- "EarlyPriceId": "dodo_pro_monthly_v1",
65
- "LtdPriceId": "dodo_ltd_launch_v1"
66
- },
67
- "MarketingTool": {
68
- "Enabled": false,
69
- "HideAppChrome": true,
70
- "AllowMindCanvasRoute": false,
71
- "HomeRoute": "/",
72
- "ToolKey": "",
73
- "HeroEyebrow": "Free local tool",
74
- "HeroTitle": "",
75
- "HeroSubtitle": "",
76
- "PrimaryCtaText": "Open MindCanvas",
77
- "PrimaryCtaHref": "/mindcanvas",
78
- "SecondaryCtaText": "",
79
- "SecondaryCtaHref": "",
80
- "PrivacyNote": "Runs locally in your browser. No login. No database storage."
81
- }
82
- }
2
+ "OpenRouter": {
3
+ "ApiKey": ""
4
+ },
5
+ "Execution": {
6
+ "Mode": "Concept",
7
+ "Model": "openai/gpt-4o-mini"
8
+ },
9
+ "Supabase": {
10
+ "Url": "https://otbyfkjxrkngvjziawki.supabase.co",
11
+ "Key": "sb_publishable_NpUs0RDJH2YnllsqTKO6TQ_1jTdSsNQ"
12
+ },
13
+ "Bridge": {
14
+ "Url": "app-origin",
15
+ "FallbackPort": 5148,
16
+ "AllowHostedLocalFallback": false
17
+ },
18
+ "ProjectStorage": {
19
+ "Mode": "LocalOnly",
20
+ "CloudProjectsEnabled": false
21
+ },
22
+ "CloudflareR2": {
23
+ "ProxyUrl": "https://r2-auth-proxy.lovecrdm.workers.dev",
24
+ "PublicBaseUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/public",
25
+ "PrivateSignUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/sign",
26
+ "PrivateBatchSignUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/sign-batch",
27
+ "PrivateUrlTtlSeconds": 900
28
+ },
29
+ "CloudflareWebCapture": {
30
+ "EndpointUrl": "https://web-capture-worker.lovecrdm.workers.dev/capture",
31
+ "RequestTimeoutMs": 45000
32
+ },
33
+ "Payments": {
34
+ "Provider": "dodo"
35
+ },
36
+ "DodoPayments": {
37
+ "DefaultProductId": "",
38
+ "StandardPriceId": "dodo_pro_monthly_v1",
39
+ "EarlyPriceId": "dodo_pro_monthly_v1",
40
+ "LtdPriceId": "dodo_ltd_launch_v1",
41
+ "ReturnUrl": "https://mindexec.pages.dev/pricing",
42
+ "Environment": "test_mode"
43
+ },
44
+ "Paddle": {
45
+ "ClientToken": "",
46
+ "ProMonthlyPriceId": ""
47
+ },
48
+ "ProductProfile": {
49
+ "VariantKey": "platform",
50
+ "Slug": "mindexec",
51
+ "BrandName": "MindExec",
52
+ "ProductName": "MindCanvas",
53
+ "AppTitle": "MindExec",
54
+ "WorkspaceNounSingular": "canvas",
55
+ "WorkspaceNounPlural": "canvases",
56
+ "SignInTitle": "Welcome Back",
57
+ "SignUpTitle": "Create Account",
58
+ "SignInSubtitle": "Sign in to access your MindCanvas workspace.",
59
+ "SignUpSubtitle": "Sign up to start organizing your ideas on a visual canvas.",
60
+ "PrimaryCheckoutProvider": "dodo",
61
+ "CanonicalHost": "localhost",
62
+ "DodoCatalog": {
63
+ "StandardPriceId": "dodo_pro_monthly_v1",
64
+ "EarlyPriceId": "dodo_pro_monthly_v1",
65
+ "LtdPriceId": "dodo_ltd_launch_v1"
66
+ },
67
+ "MarketingTool": {
68
+ "Enabled": false,
69
+ "HideAppChrome": true,
70
+ "AllowMindCanvasRoute": false,
71
+ "HomeRoute": "/",
72
+ "ToolKey": "",
73
+ "HeroEyebrow": "Free local tool",
74
+ "HeroTitle": "",
75
+ "HeroSubtitle": "",
76
+ "PrimaryCtaText": "Open MindCanvas",
77
+ "PrimaryCtaHref": "/mindcanvas",
78
+ "SecondaryCtaText": "",
79
+ "SecondaryCtaHref": "",
80
+ "PrivacyNote": "Runs locally in your browser. No login. No database storage."
81
+ }
82
+ }
83
83
  }
@@ -12,7 +12,7 @@
12
12
  <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png?v=20260815-app-icon-v2" />
13
13
  <link rel="manifest" href="manifest.webmanifest?v=20260815-app-icon-v2" />
14
14
  <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260629-ai-task-flow-v863" />
15
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260629-mdm-shadow-v856" />
15
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260822-selection-unified-v857" />
16
16
  <!-- ??좎뜦堉??Font Awesome (local) ??좎뜦堉??-->
17
17
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
18
18
  <!-- ??좎뜦堉??-->
@@ -614,7 +614,7 @@
614
614
  }
615
615
 
616
616
  const base = '_content/MindExecution.Shared/js/';
617
- const scriptVersion = '20260821-edge-zoom-sync-v979';
617
+ const scriptVersion = '20260822-selection-particle-title-v981';
618
618
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
619
619
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
620
620
  const criticalScripts = [