@mindexec/cli 0.2.193 → 0.2.195

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.
@@ -218,8 +218,8 @@ body.is-zooming .css3d-resolution-wrapper.selected,
218
218
  body.is-panning .css3d-resolution-wrapper.selected,
219
219
  body.mindcanvas-is-moving .css3d-resolution-wrapper.selected,
220
220
  body.mindcanvas-is-dense .css3d-resolution-wrapper.selected {
221
- -webkit-filter: saturate(1.08) !important;
222
- filter: saturate(1.08) !important;
221
+ -webkit-filter: none !important;
222
+ filter: none !important;
223
223
  }
224
224
 
225
225
  body.is-resizing .css3d-resolution-wrapper {
@@ -1197,7 +1197,7 @@ body.is-node-dragging * {
1197
1197
 
1198
1198
  .map-node-note.selected {
1199
1199
  /* 선택 시에만 최소한의 glow */
1200
- box-shadow: 0 0 0 2px rgba(var(--mind-node-selection-glow-rgb), 0.14);
1200
+ box-shadow: none !important;
1201
1201
  }
1202
1202
 
1203
1203
  /* ▲▲▲ [Perf] ▲▲▲ */
@@ -1206,23 +1206,19 @@ body.is-node-dragging * {
1206
1206
 
1207
1207
  .map-node-bubble.selected {
1208
1208
  border-color: var(--mind-node-selection-edge) !important;
1209
- box-shadow: 0 0 0 2px rgba(var(--mind-node-selection-glow-rgb), 0.18),
1210
- 0 0 22px rgba(var(--mind-node-selection-glow-rgb), 0.18),
1211
- 0 10px 15px -3px rgba(0, 0, 0, 0.2) !important;
1209
+ box-shadow: none !important;
1212
1210
  overflow: hidden !important;
1213
1211
  }
1214
1212
 
1215
1213
  .map-node-note.selected,
1216
1214
  .map-node-note:focus-within {
1217
1215
  border-color: var(--mind-node-selection-edge) !important;
1218
- box-shadow:
1219
- 0 0 18px 0 rgba(var(--mind-node-selection-glow-rgb), 0.24),
1220
- 0 0 32px 0 rgba(var(--mind-node-selection-glow-soft-rgb), 0.16) !important;
1216
+ box-shadow: none !important;
1221
1217
  overflow: hidden !important;
1222
1218
  }
1223
1219
 
1224
1220
  /* Note/Image hard edge lives on the inner CSS3D card in app.css.
1225
- Keep the soft wrapper shadow, but strip the dark stroke from the card itself. */
1221
+ Node glow/shadow is retired; keep only crisp borders. */
1226
1222
  .map-node-note,
1227
1223
  .map-node-note.selected,
1228
1224
  .map-node-note:focus-within,
@@ -1236,61 +1232,38 @@ body.is-node-dragging * {
1236
1232
  }
1237
1233
 
1238
1234
  .css3d-resolution-wrapper.node-type-note {
1239
- -webkit-box-shadow:
1240
- 0 0 6px rgba(15, 23, 42, 0.25),
1241
- 0 0 16px rgba(15, 23, 42, 0.18),
1242
- 0 0 30px rgba(15, 23, 42, 0.12),
1243
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1244
- box-shadow:
1245
- 0 0 6px rgba(15, 23, 42, 0.25),
1246
- 0 0 16px rgba(15, 23, 42, 0.18),
1247
- 0 0 30px rgba(15, 23, 42, 0.12),
1248
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1235
+ -webkit-box-shadow: none !important;
1236
+ box-shadow: none !important;
1237
+ -webkit-filter: none !important;
1238
+ filter: none !important;
1249
1239
  }
1250
1240
 
1251
1241
  .css3d-resolution-wrapper.selected {
1252
1242
  outline: 1px solid rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.24) !important;
1253
- outline-offset: 1px;
1254
- -webkit-box-shadow:
1255
- 0 0 4px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.56),
1256
- 0 0 12px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.44),
1257
- 0 0 28px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.32),
1258
- 0 0 56px rgba(var(--node-selection-glow-rgb-soft, 191, 219, 254), 0.26) !important;
1259
- box-shadow:
1260
- 0 0 4px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.56),
1261
- 0 0 12px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.44),
1262
- 0 0 28px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.32),
1263
- 0 0 56px rgba(var(--node-selection-glow-rgb-soft, 191, 219, 254), 0.26) !important;
1264
- -webkit-filter: saturate(1.08) !important;
1265
- filter: saturate(1.08) !important;
1243
+ outline-offset: 0;
1244
+ -webkit-box-shadow: none !important;
1245
+ box-shadow: none !important;
1246
+ -webkit-filter: none !important;
1247
+ filter: none !important;
1266
1248
  }
1267
1249
 
1268
1250
  .css3d-resolution-wrapper.selection-style-agent.selected {
1269
1251
  outline: 1px solid rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.24) !important;
1270
- outline-offset: 1px;
1271
- -webkit-box-shadow:
1272
- 0 0 4px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.56),
1273
- 0 0 12px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.44),
1274
- 0 0 28px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.32),
1275
- 0 0 56px rgba(var(--node-selection-glow-rgb-soft, 191, 219, 254), 0.26) !important;
1276
- box-shadow:
1277
- 0 0 4px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.56),
1278
- 0 0 12px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.44),
1279
- 0 0 28px rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.32),
1280
- 0 0 56px rgba(var(--node-selection-glow-rgb-soft, 191, 219, 254), 0.26) !important;
1281
- -webkit-filter: saturate(1.08) !important;
1282
- filter: saturate(1.08) !important;
1252
+ outline-offset: 0;
1253
+ -webkit-box-shadow: none !important;
1254
+ box-shadow: none !important;
1255
+ -webkit-filter: none !important;
1256
+ filter: none !important;
1283
1257
  }
1284
1258
 
1285
- /* During resize, keep the crisp selection edge but drop the large blur shadow.
1286
- The blur bleeds underneath overlapping siblings and looks like a second glow. */
1259
+ /* During resize, keep the crisp selection edge and avoid decorative glow. */
1287
1260
  body.is-resizing .css3d-resolution-wrapper.selected,
1288
1261
  body.is-resizing .css3d-resolution-wrapper.node-type-note.selected,
1289
1262
  body.is-resizing .css3d-resolution-wrapper.node-type-image.selected,
1290
1263
  body.is-resizing .css3d-resolution-wrapper.node-type-video.selected,
1291
1264
  body.is-resizing .css3d-resolution-wrapper.node-type-embed.selected {
1292
1265
  outline: 1px solid rgba(var(--node-selection-glow-rgb, 59, 130, 246), 0.34) !important;
1293
- outline-offset: 1px;
1266
+ outline-offset: 0;
1294
1267
  -webkit-box-shadow: none !important;
1295
1268
  box-shadow: none !important;
1296
1269
  -webkit-filter: none !important;
@@ -1298,18 +1271,10 @@ body.is-resizing .css3d-resolution-wrapper.node-type-embed.selected {
1298
1271
  }
1299
1272
 
1300
1273
  .css3d-resolution-wrapper.node-type-note.selected {
1301
- -webkit-box-shadow:
1302
- 0 0 4px rgba(var(--node-selection-glow-rgb), 0.56),
1303
- 0 0 12px rgba(var(--node-selection-glow-rgb), 0.44),
1304
- 0 0 28px rgba(var(--node-selection-glow-rgb), 0.32),
1305
- 0 0 56px rgba(var(--node-selection-glow-rgb-soft), 0.26) !important;
1306
- box-shadow:
1307
- 0 0 4px rgba(var(--node-selection-glow-rgb), 0.56),
1308
- 0 0 12px rgba(var(--node-selection-glow-rgb), 0.44),
1309
- 0 0 28px rgba(var(--node-selection-glow-rgb), 0.32),
1310
- 0 0 56px rgba(var(--node-selection-glow-rgb-soft), 0.26) !important;
1311
- -webkit-filter: saturate(1.08) !important;
1312
- filter: saturate(1.08) !important;
1274
+ -webkit-box-shadow: none !important;
1275
+ box-shadow: none !important;
1276
+ -webkit-filter: none !important;
1277
+ filter: none !important;
1313
1278
  }
1314
1279
 
1315
1280
  html.mindcanvas-platform-apple .css3d-resolution-wrapper.selected,
@@ -1324,61 +1289,33 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1324
1289
  }
1325
1290
 
1326
1291
  .css3d-resolution-wrapper.node-type-image {
1327
- -webkit-box-shadow:
1328
- 0 0 6px rgba(15, 23, 42, 0.25),
1329
- 0 0 16px rgba(15, 23, 42, 0.18),
1330
- 0 0 30px rgba(15, 23, 42, 0.12),
1331
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1332
- box-shadow:
1333
- 0 0 6px rgba(15, 23, 42, 0.25),
1334
- 0 0 16px rgba(15, 23, 42, 0.18),
1335
- 0 0 30px rgba(15, 23, 42, 0.12),
1336
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1292
+ -webkit-box-shadow: none !important;
1293
+ box-shadow: none !important;
1294
+ -webkit-filter: none !important;
1295
+ filter: none !important;
1337
1296
  }
1338
1297
 
1339
1298
  .css3d-resolution-wrapper.node-type-video,
1340
1299
  .css3d-resolution-wrapper.node-type-embed {
1341
- -webkit-box-shadow:
1342
- 0 0 6px rgba(15, 23, 42, 0.25),
1343
- 0 0 16px rgba(15, 23, 42, 0.18),
1344
- 0 0 30px rgba(15, 23, 42, 0.12),
1345
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1346
- box-shadow:
1347
- 0 0 6px rgba(15, 23, 42, 0.25),
1348
- 0 0 16px rgba(15, 23, 42, 0.18),
1349
- 0 0 30px rgba(15, 23, 42, 0.12),
1350
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1300
+ -webkit-box-shadow: none !important;
1301
+ box-shadow: none !important;
1302
+ -webkit-filter: none !important;
1303
+ filter: none !important;
1351
1304
  }
1352
1305
 
1353
1306
  .css3d-resolution-wrapper.node-type-image.selected {
1354
- -webkit-box-shadow:
1355
- 0 0 4px rgba(var(--node-selection-glow-rgb), 0.56),
1356
- 0 0 12px rgba(var(--node-selection-glow-rgb), 0.44),
1357
- 0 0 28px rgba(var(--node-selection-glow-rgb), 0.32),
1358
- 0 0 56px rgba(var(--node-selection-glow-rgb-soft), 0.26) !important;
1359
- box-shadow:
1360
- 0 0 4px rgba(var(--node-selection-glow-rgb), 0.56),
1361
- 0 0 12px rgba(var(--node-selection-glow-rgb), 0.44),
1362
- 0 0 28px rgba(var(--node-selection-glow-rgb), 0.32),
1363
- 0 0 56px rgba(var(--node-selection-glow-rgb-soft), 0.26) !important;
1364
- -webkit-filter: saturate(1.08) !important;
1365
- filter: saturate(1.08) !important;
1307
+ -webkit-box-shadow: none !important;
1308
+ box-shadow: none !important;
1309
+ -webkit-filter: none !important;
1310
+ filter: none !important;
1366
1311
  }
1367
1312
 
1368
1313
  .css3d-resolution-wrapper.node-type-video.selected,
1369
1314
  .css3d-resolution-wrapper.node-type-embed.selected {
1370
1315
  outline: 1px solid rgba(var(--node-selection-glow-rgb), 0.24) !important;
1371
- outline-offset: 1px;
1372
- -webkit-box-shadow:
1373
- 0 0 6px rgba(15, 23, 42, 0.25),
1374
- 0 0 16px rgba(15, 23, 42, 0.18),
1375
- 0 0 30px rgba(15, 23, 42, 0.12),
1376
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1377
- box-shadow:
1378
- 0 0 6px rgba(15, 23, 42, 0.25),
1379
- 0 0 16px rgba(15, 23, 42, 0.18),
1380
- 0 0 30px rgba(15, 23, 42, 0.12),
1381
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1316
+ outline-offset: 0;
1317
+ -webkit-box-shadow: none !important;
1318
+ box-shadow: none !important;
1382
1319
  -webkit-filter: none !important;
1383
1320
  filter: none !important;
1384
1321
  }
@@ -1386,16 +1323,8 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1386
1323
  .css3d-resolution-wrapper.node-type-video.selected-media-safe,
1387
1324
  .css3d-resolution-wrapper.node-type-embed.selected-media-safe {
1388
1325
  outline: none !important;
1389
- -webkit-box-shadow:
1390
- 0 0 6px rgba(15, 23, 42, 0.25),
1391
- 0 0 16px rgba(15, 23, 42, 0.18),
1392
- 0 0 30px rgba(15, 23, 42, 0.12),
1393
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1394
- box-shadow:
1395
- 0 0 6px rgba(15, 23, 42, 0.25),
1396
- 0 0 16px rgba(15, 23, 42, 0.18),
1397
- 0 0 30px rgba(15, 23, 42, 0.12),
1398
- 0 0 50px rgba(15, 23, 42, 0.08) !important;
1326
+ -webkit-box-shadow: none !important;
1327
+ box-shadow: none !important;
1399
1328
  -webkit-filter: none !important;
1400
1329
  filter: none !important;
1401
1330
  }
@@ -1403,13 +1332,9 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1403
1332
  .css3d-resolution-wrapper.node-type-video.selected-media-safe .map-node.selected,
1404
1333
  .css3d-resolution-wrapper.node-type-embed.selected-media-safe .map-node.selected {
1405
1334
  outline: 1px solid rgba(var(--node-selection-glow-rgb), 0.82) !important;
1406
- outline-offset: -1px;
1407
- -webkit-box-shadow:
1408
- 0 0 0 1px rgba(var(--node-selection-glow-rgb), 0.18) inset,
1409
- 0 0 0 1px rgba(var(--node-selection-glow-rgb-soft), 0.12) !important;
1410
- box-shadow:
1411
- 0 0 0 1px rgba(var(--node-selection-glow-rgb), 0.18) inset,
1412
- 0 0 0 1px rgba(var(--node-selection-glow-rgb-soft), 0.12) !important;
1335
+ outline-offset: 0;
1336
+ -webkit-box-shadow: none !important;
1337
+ box-shadow: none !important;
1413
1338
  }
1414
1339
 
1415
1340
  .map-node-memo.selected,
@@ -1420,9 +1345,7 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1420
1345
  .map-node-code.selected,
1421
1346
  .map-node-code:focus-within {
1422
1347
  border-color: var(--mind-node-selection-edge) !important;
1423
- box-shadow:
1424
- 0 0 18px 0 rgba(var(--mind-node-selection-glow-rgb), 0.24),
1425
- 0 0 32px 0 rgba(var(--mind-node-selection-glow-soft-rgb), 0.16) !important;
1348
+ box-shadow: none !important;
1426
1349
  overflow: hidden !important;
1427
1350
  }
1428
1351
 
@@ -1435,8 +1358,8 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1435
1358
  overflow: visible !important;
1436
1359
  }
1437
1360
 
1438
- /* Use the wrapper as the single source of truth for CSS3D selection glow.
1439
- Agent wrappers intentionally mirror the edit-state glow so selection/editing
1361
+ /* Use the wrapper as the single source of truth for CSS3D selection edge.
1362
+ Agent wrappers intentionally mirror the edit-state edge so selection/editing
1440
1363
  keep the same visual signature even when overlays swap in and out. */
1441
1364
  .css3d-resolution-wrapper.selected .map-node-bubble.selected,
1442
1365
  .css3d-resolution-wrapper.selected .map-node-code.selected,
@@ -1571,8 +1494,8 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1571
1494
 
1572
1495
  .mind-map-text-overlay-v2-card.is-passive {
1573
1496
  pointer-events: none;
1574
- /* CSS3D owns card background/edge/glow; passive overlay only contributes
1575
- readable text fragments and must never paint over the CSS3D glow. */
1497
+ /* CSS3D owns card background/edge; passive overlay only contributes
1498
+ readable text fragments and must never paint over CSS3D node chrome. */
1576
1499
  contain: layout style;
1577
1500
  overflow: visible;
1578
1501
  background: transparent !important;
@@ -2489,7 +2412,7 @@ body.is-panning .mind-map-text-overlay-v2-card.is-passive .mind-map-text-overlay
2489
2412
 
2490
2413
  /* Template launcher and Multi Desktop Monitor own their visual chrome on the
2491
2414
  card itself. Keep the CSS3D wrapper neutral so motion CSS3D and the passive
2492
- DOM overlay do not stack different selection glows. */
2415
+ DOM overlay do not stack different selection chrome. */
2493
2416
  .css3d-resolution-wrapper.node-type-templatelauncher.selected,
2494
2417
  body.is-panning .css3d-resolution-wrapper.node-type-templatelauncher.selected,
2495
2418
  body.is-zooming .css3d-resolution-wrapper.node-type-templatelauncher.selected,
@@ -3418,7 +3341,7 @@ body.mindcanvas-is-dense .css3d-resolution-wrapper [id^="css3d-node-"] {
3418
3341
  }
3419
3342
 
3420
3343
  /* Temporary lightweight node visuals.
3421
- CSS3D and passive overlay node surfaces intentionally avoid shadows/glow for now.
3344
+ CSS3D and passive overlay node surfaces intentionally avoid shadows/glow.
3422
3345
  Keep outlines, borders, and status color so selection and node state remain readable. */
3423
3346
  .css3d-resolution-wrapper,
3424
3347
  .css3d-resolution-wrapper.selected,
@@ -3451,7 +3374,7 @@ body.mindcanvas-is-dense .css3d-resolution-wrapper [id^="css3d-node-"] {
3451
3374
  filter: none !important;
3452
3375
  }
3453
3376
 
3454
- /* Strong tail guard for the temporary lightweight node-visuals phase.
3377
+ /* Strong tail guard for the no node-glow policy.
3455
3378
  This intentionally wins after idle/motion class cleanup and after older
3456
3379
  note/image/video/agent/remote rules that used selected-state glow. */
3457
3380
  html body .css3d-resolution-wrapper,
@@ -1192,8 +1192,8 @@
1192
1192
  opacity: 0;
1193
1193
  pointer-events: none !important;
1194
1194
  transform: var(--context-source-pin-transform, translate(0, 0)) scale(0.86);
1195
- transition: opacity 120ms ease, transform 120ms ease, filter 120ms ease;
1196
- filter: drop-shadow(0 8px 14px rgba(15, 23, 42, 0.14));
1195
+ transition: opacity 120ms ease, transform 120ms ease;
1196
+ filter: none;
1197
1197
  }
1198
1198
 
1199
1199
  .css3d-resolution-wrapper.has-context-source-pins,
@@ -1245,20 +1245,14 @@
1245
1245
  }
1246
1246
 
1247
1247
  .map-node-memo__automation-pin.is-output.has-result .map-node-memo__automation-pin-dot {
1248
- box-shadow:
1249
- 0 0 0 1px #f97316,
1250
- 0 0 0 4px rgba(249, 115, 22, 0.18),
1251
- 0 0 16px rgba(249, 115, 22, 0.52),
1252
- 0 4px 9px rgba(15, 23, 42, 0.16) !important;
1248
+ border-color: #f97316 !important;
1249
+ box-shadow: none !important;
1253
1250
  }
1254
1251
 
1255
1252
  .map-node-memo__automation-pin.is-output.has-result .map-node-memo__automation-pin-label {
1256
1253
  background: rgba(255, 247, 237, 0.98) !important;
1257
- box-shadow:
1258
- 0 0 0 1px rgba(249, 115, 22, 0.20),
1259
- 0 0 18px rgba(249, 115, 22, 0.28),
1260
- 0 8px 16px rgba(15, 23, 42, 0.12),
1261
- inset 0 1px 0 rgba(255, 255, 255, 0.94) !important;
1254
+ border-color: rgba(249, 115, 22, 0.38) !important;
1255
+ box-shadow: none !important;
1262
1256
  }
1263
1257
 
1264
1258
  .mind-map-edit-overlay-active .node-content-wrapper,
@@ -2142,7 +2136,7 @@
2142
2136
  isSelected,
2143
2137
  {
2144
2138
  edgeVisible: false,
2145
- glowVisible: !cssIsVisible
2139
+ glowVisible: false
2146
2140
  }
2147
2141
  );
2148
2142
  if (cssIsVisible) {
@@ -2154,10 +2148,7 @@
2154
2148
 
2155
2149
  const glowMesh = group.getObjectByName?.('glow');
2156
2150
  if (glowMesh && window.MindMapGlowShader?.updateGlowSize) {
2157
- window.MindMapGlowShader.updateGlowSize(glowMesh, nextWidth, nextHeight, contentTypeLower || 'image');
2158
- window.MindMapGlowShader.updateGlowSelection?.(glowMesh, isSelected);
2159
- glowMesh.position.set(nextWidth / 2, -nextHeight / 2, 0);
2160
- glowMesh.visible = !cssIsVisible;
2151
+ glowMesh.visible = false;
2161
2152
  entry.glowMesh = glowMesh;
2162
2153
  }
2163
2154
  }
@@ -3922,8 +3913,8 @@
3922
3913
  });
3923
3914
  const NEUTRAL_SELECTION_GLOW_RGB = '59, 130, 246';
3924
3915
  const NEUTRAL_SELECTION_GLOW_RGB_SOFT = '191, 219, 254';
3925
- const CSS3D_WRAPPER_TRANSITION = 'box-shadow .22s ease, filter .22s ease';
3926
- const CSS3D_WRAPPER_WEBKIT_TRANSITION = '-webkit-box-shadow .22s ease, -webkit-filter .22s ease';
3916
+ const CSS3D_WRAPPER_TRANSITION = 'transform .22s ease, opacity .22s ease, border-color .22s ease';
3917
+ const CSS3D_WRAPPER_WEBKIT_TRANSITION = CSS3D_WRAPPER_TRANSITION;
3927
3918
  const TEXT_OVERLAY_SUPPORTED_TYPES = new Set(['text', 'markdown', 'note', 'code', 'memo', CSV_TABLE_CONTENT_TYPE]);
3928
3919
  const TEXT_SELECTION_OVERLAY_SUPPORTED_TYPES = new Set(['text', 'markdown']);
3929
3920
  const TEXT_INTERACTION_SCROLLABLE_SELECTORS = '.node-response, .note-content, .markdown-body, .prose, .note-textarea, .code-body, .code-content, .csv-table-scroll, .csv-table-scroll *, .pdf-content, .text-content, .file-content, .map-node-memo__body, .map-node-memo__body-view, .map-node-memo__agent-plan-body, .map-node-memo__agent-console-body, pre, code';
@@ -4132,7 +4123,7 @@
4132
4123
 
4133
4124
  if (getTextOverlayRenderMode(nodeEntry) === 'memo') {
4134
4125
  // Memo cards rely on the canonical CSS3D shell for their rounded
4135
- // body surface and selection glow. Passive readonly overlays only
4126
+ // body surface and selection edge. Passive readonly overlays only
4136
4127
  // duplicate text and can drift from that chrome during camera motion.
4137
4128
  return 'none';
4138
4129
  }
@@ -8638,7 +8629,7 @@
8638
8629
  border-radius: 999px;
8639
8630
  border: 2px solid rgba(255, 255, 255, 0.96);
8640
8631
  background: ${theme.edge};
8641
- box-shadow: 0 0 0 1px ${theme.edge}, 0 4px 9px rgba(15, 23, 42, 0.16);
8632
+ box-shadow: none;
8642
8633
  box-sizing: border-box;
8643
8634
  pointer-events: none;
8644
8635
  `;
@@ -8656,7 +8647,7 @@
8656
8647
  border: 1px solid ${theme.edge};
8657
8648
  background: rgba(255, 255, 255, 0.94);
8658
8649
  color: #0f172a;
8659
- box-shadow: 0 6px 14px rgba(15, 23, 42, 0.10), inset 0 1px 0 rgba(255, 255, 255, 0.92);
8650
+ box-shadow: none;
8660
8651
  font-size: 9px;
8661
8652
  line-height: 20px;
8662
8653
  font-weight: 800;
@@ -8968,6 +8959,8 @@
8968
8959
  if (sourcePin) {
8969
8960
  sourcePin.classList.remove('is-connecting-source');
8970
8961
  sourcePin.style.filter = '';
8962
+ sourcePin.style.outline = '';
8963
+ sourcePin.style.outlineOffset = '';
8971
8964
  try {
8972
8965
  if (previous.pointerId != null) {
8973
8966
  sourcePin.releasePointerCapture?.(previous.pointerId);
@@ -8984,7 +8977,9 @@
8984
8977
  const sourcePin = findBusinessAutomationPinElement(_module, draft.sourceNodeId, draft.sourcePinId, 'output');
8985
8978
  if (sourcePin) {
8986
8979
  sourcePin.classList.add('is-connecting-source');
8987
- sourcePin.style.filter = 'drop-shadow(0 0 10px rgba(37, 99, 235, 0.72))';
8980
+ sourcePin.style.filter = 'none';
8981
+ sourcePin.style.outline = '2px solid rgba(37, 99, 235, 0.72)';
8982
+ sourcePin.style.outlineOffset = '2px';
8988
8983
  }
8989
8984
  scheduleBusinessAutomationEdgeRender(_module);
8990
8985
  }
@@ -10418,9 +10413,7 @@
10418
10413
  'stroke-width': isSelected ? '3.6' : (isRelationHighlighted ? (isContextEdge ? '2.45' : '2.65') : (isContextEdge ? '2.1' : '2.4')),
10419
10414
  opacity: isSelected ? '0.96' : (isRelationHighlighted ? (isContextEdge ? '0.72' : '0.78') : (isContextEdge ? '0.68' : '0.82')),
10420
10415
  'stroke-dasharray': isContextEdge ? '7 7' : '',
10421
- filter: isSelected
10422
- ? `drop-shadow(0 0 7px ${theme.edge})`
10423
- : (isRelationHighlighted ? `drop-shadow(0 0 3px ${theme.edge})` : '')
10416
+ filter: ''
10424
10417
  });
10425
10418
  path.style.pointerEvents = 'none';
10426
10419
  path.dataset.edgeId = edge.id;
@@ -21987,7 +21980,7 @@
21987
21980
  font-size: 14px;
21988
21981
  line-height: 1.6;
21989
21982
  color: #1f2937;
21990
- ${isMediaNode || isNoteNode ? 'box-shadow: none;' : 'box-shadow: 0 2px 8px rgba(0,0,0,0.1);'}
21983
+ box-shadow: none;
21991
21984
  `;
21992
21985
 
21993
21986
  // 콘텐츠 래퍼 생성
@@ -111,8 +111,8 @@
111
111
  const CSS3D_PREWARM_HEAVY_VISIBLE_THRESHOLD = 144;
112
112
  const CSS3D_PREWARM_EXTREME_VISIBLE_THRESHOLD = 240;
113
113
  const FREEZE_CONTENT_DRIVEN_LOD_LINES = false; // Recompute when content changes; resident instances make this affordable.
114
- const ENABLE_INSTANCED_BORDER_LINES = false; // Remove MID/FAR outline lines; keep body/halo/text lines.
115
- const ENABLE_INSTANCED_HALO = false; // Temporary lightweight node visuals: no resident shadow/glow halo.
114
+ const ENABLE_INSTANCED_BORDER_LINES = false; // Remove MID/FAR outline lines; keep body/text lines.
115
+ const ENABLE_INSTANCED_HALO = false; // Node halo/shadow is retired.
116
116
  const ENABLE_INSTANCED_TEXT_LINES = true; // Keep MID/FAR text silhouettes enabled.
117
117
  const SUSPEND_LOD_TEXT_LINES_DURING_PAN = false; // Keep MID line silhouettes visible during pan/wheel; only defer expensive refresh work.
118
118
  // NOTE: Distance-based line disable removed (lines always render by distance)
@@ -2834,7 +2834,7 @@
2834
2834
  ? visible
2835
2835
  : null;
2836
2836
  const edgeVisible = visibilityConfig ? !!visibilityConfig.edgeVisible : !!visible;
2837
- const glowVisible = visibilityConfig ? !!visibilityConfig.glowVisible : !!visible;
2837
+ const glowVisible = false;
2838
2838
  const imageMidEdge = entry.imageMidEdgeMesh || entry.glObject.getObjectByName('imageMidEdge');
2839
2839
  const imageMidGlow = entry.imageMidGlowMesh || entry.glObject.getObjectByName('imageMidGlow');
2840
2840
  entry.imageMidEdgeMesh = imageMidEdge || null;
@@ -3508,7 +3508,7 @@
3508
3508
  baseRenderOrder,
3509
3509
  isSelected: !!isNodeSelected,
3510
3510
  edgeVisible: false,
3511
- glowVisible: true
3511
+ glowVisible: false
3512
3512
  };
3513
3513
  const previousState = entry._imageLodVisualState || null;
3514
3514
  const needsDecorSync =
@@ -6,7 +6,7 @@
6
6
  const DEBUG = false;
7
7
  const log = DEBUG ? console.log.bind(console) : () => { };
8
8
  const warn = DEBUG ? console.warn.bind(console) : () => { };
9
- // Keep halo/glow in CSS selected styles; do not render WebGL glow meshes.
9
+ // Node glow/shadow is retired. Selection uses crisp outlines/borders only.
10
10
  const ENABLE_WEBGL_GLOW = false;
11
11
  const ENABLE_NODE_DECORATION_GLOW = false;
12
12
  function waitForNonVisualFrame(hiddenDelay = 16) {
@@ -825,110 +825,16 @@
825
825
  existingEdge.material?.dispose?.();
826
826
  }
827
827
  const existingGlow = group.getObjectByName('imageMidGlow');
828
- if (!ENABLE_NODE_DECORATION_GLOW) {
829
- if (existingGlow) {
830
- existingGlow.parent?.remove?.(existingGlow);
831
- existingGlow.geometry?.dispose?.();
832
- existingGlow.material?.dispose?.();
833
- }
834
- if (group.userData) {
835
- delete group.userData.imageMidLodDecorState;
836
- }
837
- return { edge: null, glow: null };
838
- }
839
-
840
- const visibilityConfig =
841
- visible && typeof visible === 'object'
842
- ? visible
843
- : null;
844
- const edgeVisible = false;
845
- const glowVisible = visibilityConfig
846
- ? !!visibilityConfig.glowVisible
847
- : (visible === undefined ? (existingGlow?.visible ?? false) : !!visible);
848
- const previousState = group.userData?.imageMidLodDecorState || null;
849
-
850
- if (
851
- previousState &&
852
- previousState.width === width &&
853
- previousState.height === height &&
854
- previousState.baseRenderOrder === baseRenderOrder &&
855
- previousState.isSelected === !!isSelected &&
856
- previousState.edgeVisible === edgeVisible &&
857
- previousState.glowVisible === glowVisible &&
858
- ((existingGlow && existingGlow.visible === glowVisible) || (!existingGlow && glowVisible === false))
859
- ) {
860
- return { edge: null, glow: existingGlow || null };
861
- }
862
-
863
- group.userData.imageMidLodDecorState = {
864
- width,
865
- height,
866
- baseRenderOrder,
867
- isSelected: !!isSelected,
868
- edgeVisible,
869
- glowVisible
870
- };
871
-
872
- let glow = existingGlow;
873
- if (window.MindMapGlowShader?.createSDFGlowMesh) {
874
- glow = window.MindMapGlowShader.createSDFGlowMesh(width, height, false, 'image', glow || null);
875
- glow.name = 'imageMidGlow';
876
- glow.raycast = () => { };
877
- if (!glow.parent) {
878
- group.add(glow);
879
- }
880
- } else {
881
- const glowWidth = Math.max(1, width + 24);
882
- const glowHeight = Math.max(1, height + 24);
883
- if (!glow) {
884
- glow = new THREE.Mesh(
885
- new THREE.PlaneGeometry(glowWidth, glowHeight),
886
- new THREE.MeshBasicMaterial({
887
- color: IMAGE_MID_GLOW_COLOR,
888
- transparent: true,
889
- opacity: IMAGE_MID_GLOW_OPACITY,
890
- depthWrite: false,
891
- depthTest: false,
892
- side: THREE.DoubleSide
893
- })
894
- );
895
- glow.name = 'imageMidGlow';
896
- glow.raycast = () => { };
897
- group.add(glow);
898
- }
899
-
900
- const glowGeometry = glow.geometry?.parameters;
901
- if (!glowGeometry || glowGeometry.width !== glowWidth || glowGeometry.height !== glowHeight) {
902
- glow.geometry?.dispose?.();
903
- glow.geometry = new THREE.PlaneGeometry(glowWidth, glowHeight);
904
- }
828
+ if (existingGlow) {
829
+ existingGlow.parent?.remove?.(existingGlow);
830
+ existingGlow.geometry?.dispose?.();
831
+ existingGlow.material?.dispose?.();
905
832
  }
906
-
907
- if (glow) {
908
- const glowColor = isSelected ? IMAGE_SELECTION_SDF_GLOW_COLOR : IMAGE_MID_GLOW_COLOR;
909
- const glowOpacity = isSelected ? IMAGE_SELECTION_SDF_GLOW_OPACITY : IMAGE_MID_GLOW_OPACITY;
910
- glow.position.set(width / 2, -height / 2, -0.02);
911
- glow.renderOrder = Math.max(0, (baseRenderOrder || 1) - 3);
912
- glow.visible = glowVisible;
913
-
914
- if (glow.material?.uniforms) {
915
- glow.material.uniforms.color.value.setHex(glowColor);
916
- glow.material.uniforms.opacity.value = glowOpacity;
917
- glow.material.depthWrite = false;
918
- glow.material.depthTest = false;
919
- glow.material.transparent = true;
920
- glow.material.needsUpdate = true;
921
- } else if (glow.material) {
922
- glow.material.color.setHex(glowColor);
923
- glow.material.opacity = glowOpacity;
924
- glow.material.transparent = true;
925
- glow.material.depthWrite = false;
926
- glow.material.depthTest = false;
927
- glow.material.needsUpdate = true;
928
- }
833
+ if (group.userData) {
834
+ delete group.userData.imageMidLodDecorState;
929
835
  }
930
836
 
931
- return { edge: null, glow };
837
+ return { edge: null, glow: null };
932
838
  }
933
839
 
934
840
  function applyImageCoverUv(bodyMesh, nodeWidth, nodeHeight) {
@@ -2625,21 +2531,10 @@
2625
2531
  isSelected,
2626
2532
  {
2627
2533
  edgeVisible: false,
2628
- glowVisible: true
2534
+ glowVisible: false
2629
2535
  }
2630
2536
  );
2631
2537
 
2632
- // Optional WebGL glow (disabled by default)
2633
- if (ENABLE_WEBGL_GLOW && window.MindMapGlowShader) {
2634
- const glowMesh = window.MindMapGlowShader.createSDFGlowMesh(width, height, isSelected, nodeModel.contentType === 'video' || nodeModel.contentType === 'embed' ? 'text' : 'image');
2635
- glowMesh.position.set(width / 2, -height / 2, 0.0); // body(1.0)보다 뒤, 그리드(-10)보다 앞
2636
- glowMesh.renderOrder = baseRenderOrder - 5;
2637
- const cameraZ = module.camera?.position?.z ?? Infinity;
2638
- const threshold = 4000;
2639
- glowMesh.visible = cameraZ < threshold;
2640
- glObject.add(glowMesh);
2641
- }
2642
-
2643
2538
  // ▼▼▼ [FIX] Add corner resize handles to image nodes ▼▼▼
2644
2539
  // Image nodes use only corner hit-handles in WebGL; the visible affordance comes from the selection overlay.
2645
2540
  const HANDLE_SIZE = 16;
@@ -3457,7 +3352,7 @@
3457
3352
  const baseRenderOrder = entry.glObject.userData?.baseRenderOrder ?? body?.renderOrder ?? 1;
3458
3353
  const nodeWidth = entry.model.width || body?.geometry?.parameters?.width || 300;
3459
3354
  const nodeHeight = entry.model.height || body?.geometry?.parameters?.height || 300;
3460
- const showImageLodGlow = !usesCssView;
3355
+ const showImageLodGlow = false;
3461
3356
  syncImageSelectionGlow(entry.glObject, nodeWidth, nodeHeight, baseRenderOrder, false);
3462
3357
  syncImageMidLodDecorations(entry.glObject, nodeWidth, nodeHeight, baseRenderOrder, !!isSelected, {
3463
3358
  edgeVisible: false,
@@ -3517,7 +3412,7 @@
3517
3412
  }
3518
3413
  // ▲▲▲ [Fix] ▲▲▲
3519
3414
 
3520
- // ▼▼▼ [Fix] Sync CSS3D selection glow/border with the node's active theme ▼▼▼
3415
+ // ▼▼▼ [Fix] Sync CSS3D selection edge/border with the node's active theme ▼▼▼
3521
3416
  const cssElement = entry.cssObject?.element;
3522
3417
  if (cssElement) {
3523
3418
  const isEditing = !!(module.isEditingNote && module.selectedNodeIdJs === nodeId);