@likec4/diagram 1.3.0 → 1.5.0

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 (95) hide show
  1. package/dist/LikeC4Diagram.css.d.ts +0 -1
  2. package/dist/LikeC4Diagram.d.ts +1 -1
  3. package/dist/LikeC4Diagram.props.d.ts +7 -2
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.mjs +1580 -1194
  6. package/dist/state/DiagramContext.d.ts +97 -4169
  7. package/dist/state/diagramStore.d.ts +98 -4172
  8. package/dist/state/hooks.d.ts +4 -0
  9. package/dist/state/index.d.ts +1 -3
  10. package/dist/state/useDiagramStore.d.ts +3 -4622
  11. package/dist/state/useNavigationHistory.d.ts +5 -0
  12. package/dist/style.css +217 -159
  13. package/dist/theme.css.d.ts +5 -0
  14. package/dist/ui/BackwardForwardPanel.css.d.ts +1 -0
  15. package/dist/ui/BackwardForwardPanel.d.ts +1 -0
  16. package/dist/ui/DiagramTitlePanel.css.d.ts +1 -1
  17. package/dist/ui/OptionsPanel.d.ts +1 -3
  18. package/dist/ui/options/EdgeOptions.d.ts +19 -0
  19. package/dist/ui/options/NodeOptions.d.ts +2 -2
  20. package/dist/xyflow/EdgeMarkers.d.ts +11 -0
  21. package/dist/xyflow/XYFlowEvents.d.ts +12 -9
  22. package/dist/xyflow/XYFlowInner.d.ts +1 -0
  23. package/dist/xyflow/const.d.ts +3 -3
  24. package/dist/xyflow/diagram-to-xyflow.d.ts +1 -1
  25. package/dist/xyflow/edges/RelationshipEdge.d.ts +4 -3
  26. package/dist/xyflow/edges/edges.css.d.ts +1 -0
  27. package/dist/xyflow/edges/utils.d.ts +1 -0
  28. package/dist/xyflow/hooks/index.d.ts +3 -2
  29. package/dist/xyflow/hooks/useXYFlow.d.ts +22 -21
  30. package/dist/xyflow/nodes/compound/CompoundNode.css.d.ts +1 -0
  31. package/dist/xyflow/nodes/element/ElementIcon.d.ts +1 -4
  32. package/dist/xyflow/nodes/element/element.css.d.ts +3 -1
  33. package/dist/xyflow/types.d.ts +2 -32
  34. package/package.json +21 -21
  35. package/src/LikeC4Diagram.css.ts +10 -8
  36. package/src/LikeC4Diagram.props.ts +12 -5
  37. package/src/LikeC4Diagram.tsx +43 -26
  38. package/src/globals.css.ts +11 -4
  39. package/src/index.ts +1 -1
  40. package/src/mantine.css.ts +2 -2
  41. package/src/state/DiagramContext.tsx +47 -16
  42. package/src/state/diagramStore.ts +89 -80
  43. package/src/state/hooks.ts +5 -0
  44. package/src/state/index.ts +1 -3
  45. package/src/state/useDiagramStore.ts +6 -13
  46. package/src/state/useNavigationHistory.ts +39 -0
  47. package/src/theme.css.ts +5 -0
  48. package/src/ui/BackwardForwardPanel.css.ts +22 -0
  49. package/src/ui/BackwardForwardPanel.tsx +59 -0
  50. package/src/ui/DiagramTitlePanel.css.ts +17 -6
  51. package/src/ui/DiagramTitlePanel.tsx +108 -94
  52. package/src/ui/DynamicViewWalkthrough.tsx +6 -4
  53. package/src/ui/OptionsPanel.tsx +37 -18
  54. package/src/ui/options/EdgeOptions.tsx +157 -0
  55. package/src/ui/options/NodeOptions.tsx +37 -29
  56. package/src/xyflow/EdgeMarkers.tsx +148 -0
  57. package/src/xyflow/FitviewOnDiagramChange.tsx +8 -4
  58. package/src/xyflow/SelectEdgesOnNodeFocus.tsx +59 -55
  59. package/src/xyflow/SyncWithDiagram.tsx +13 -20
  60. package/src/xyflow/XYFlow.tsx +2 -4
  61. package/src/xyflow/XYFlowEvents.tsx +48 -33
  62. package/src/xyflow/XYFlowInner.tsx +6 -3
  63. package/src/xyflow/const.ts +3 -3
  64. package/src/xyflow/diagram-to-xyflow.ts +18 -53
  65. package/src/xyflow/edges/RelationshipEdge.tsx +218 -126
  66. package/src/xyflow/edges/edges.css.ts +44 -26
  67. package/src/xyflow/edges/utils.ts +10 -0
  68. package/src/xyflow/hooks/index.ts +4 -2
  69. package/src/xyflow/hooks/useLayoutConstraints.ts +5 -5
  70. package/src/xyflow/hooks/useXYFlow.ts +28 -1
  71. package/src/xyflow/nodes/compound/CompoundNode.css.ts +41 -31
  72. package/src/xyflow/nodes/compound/CompoundNode.tsx +52 -53
  73. package/src/xyflow/nodes/element/ElementIcon.tsx +11 -22
  74. package/src/xyflow/nodes/element/ElementLink.tsx +11 -16
  75. package/src/xyflow/nodes/element/ElementNode.tsx +69 -114
  76. package/src/xyflow/nodes/element/element.css.ts +48 -15
  77. package/src/xyflow/nodes/shared/NavigateToBtn.tsx +1 -1
  78. package/src/xyflow/types.ts +2 -4
  79. package/src/xyflow/utils.ts +3 -6
  80. package/dist/KeepAspectRatioContainer.d.ts +0 -9
  81. package/dist/icons/Clipboard.d.ts +0 -3
  82. package/dist/icons/Link.d.ts +0 -3
  83. package/dist/icons/ZoomIn.d.ts +0 -3
  84. package/dist/icons/index.d.ts +0 -3
  85. package/dist/mantine/theme.d.ts +0 -3
  86. package/dist/state/WhenInitialized.d.ts +0 -3
  87. package/dist/ui/Camera.d.ts +0 -3
  88. package/src/KeepAspectRatioContainer.tsx +0 -36
  89. package/src/icons/Clipboard.tsx +0 -24
  90. package/src/icons/Link.tsx +0 -23
  91. package/src/icons/ZoomIn.tsx +0 -25
  92. package/src/icons/index.ts +0 -3
  93. package/src/mantine/theme.ts +0 -20
  94. package/src/state/WhenInitialized.tsx +0 -24
  95. package/src/ui/Camera.tsx +0 -174
package/dist/style.css CHANGED
@@ -598,13 +598,20 @@ svg.react-flow__connectionline {
598
598
  fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));
599
599
  }
600
600
  .likec4-diagram-root {
601
+ overflow: hidden;
602
+ position: relative;
603
+ width: 100%;
604
+ height: 100%;
605
+ padding: 0;
606
+ margin: 0;
607
+ box-sizing: border-box;
601
608
  -webkit-font-smoothing: var(--mantine-webkit-font-smoothing);
602
609
  -moz-osx-font-smoothing: var(--mantine-moz-font-smoothing);
603
610
  }
604
611
  .likec4-diagram-root {
605
612
  --likec4-font-family: var(--likec4-default-font-family,'ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"');
606
613
  --likec4-background-color: var(--mantine-color-body);
607
- --likec4-background-pattern-color: var(--mantine-color-dimmed);
614
+ --likec4-background-pattern-color: var(--mantine-color-dark-3);
608
615
  --likec4-compound-font-family: var(--likec4-font-family);
609
616
  --likec4-compound-title-color: var(--likec4-element-loContrast);
610
617
  --likec4-element-font-family: var(--likec4-font-family);
@@ -617,7 +624,7 @@ svg.react-flow__connectionline {
617
624
  --likec4-relation-labelColor: #cbd5e1;
618
625
  }
619
626
  :where([data-mantine-color-scheme='light']) .likec4-diagram-root {
620
- --likec4-background-pattern-color: var(--mantine-color-dark-3);
627
+ --likec4-background-pattern-color: var(--mantine-color-gray-6);
621
628
  }
622
629
  :where([data-likec4-color='primary']) {
623
630
  --likec4-element-fill: #3b82f6;
@@ -1256,30 +1263,28 @@ svg.react-flow__connectionline {
1256
1263
  :where([data-mantine-color-scheme='light']) :where([data-likec4-color='indigo'][data-compound-depth='6']) {
1257
1264
  --likec4-element-fill: #34369f;
1258
1265
  --likec4-element-stroke: #373287;
1259
- }._2h8g8h0 {
1260
- overflow: hidden;
1261
- position: relative;
1262
- width: 100%;
1263
- height: 100%;
1264
- padding: 0;
1265
- }
1266
- .react-flow._2h8g8h1 {
1266
+ }.react-flow._2h8g8h0 {
1267
1267
  --xy-background-color: var(--likec4-background-color);
1268
1268
  --xy-background-pattern-color: var(--likec4-background-pattern-color);
1269
1269
  }
1270
- .react-flow._2h8g8h1._2h8g8h3 {
1270
+ .react-flow._2h8g8h0._2h8g8h2 {
1271
1271
  --likec4-background-color: transparent !important;
1272
1272
  --xy-background-color: transparent !important;
1273
1273
  background-color: transparent !important;
1274
1274
  }
1275
- :where(._2h8g8h4, ._2h8g8h3) .react-flow__attribution {
1275
+ :where(._2h8g8h3, ._2h8g8h2) .react-flow__attribution {
1276
1276
  display: none;
1277
- }@keyframes bexn7q6 {
1277
+ }
1278
+ @supports (hanging-punctuation: first) and (font: -apple-system-body) and (-webkit-appearance: none) {
1279
+ ._2h8g8h0 {
1280
+ --likec4-safari-animation-hook: ;
1281
+ }
1282
+ }@keyframes bexn7q7 {
1278
1283
  from {
1279
- stroke-dashoffset: 36;
1284
+ stroke-dashoffset: 46;
1280
1285
  }
1281
1286
  to {
1282
- stroke-dashoffset: 1;
1287
+ stroke-dashoffset: 10;
1283
1288
  }
1284
1289
  }
1285
1290
  .bexn7q1 {
@@ -1287,24 +1292,24 @@ svg.react-flow__connectionline {
1287
1292
  --xy-edge-stroke: var(--likec4-relation-lineColor);
1288
1293
  --xy-edge-stroke-selected: color-mix(in srgb, var(--likec4-relation-lineColor), var(--bexn7q0) 35%);
1289
1294
  --xy-edge-label-color: color-mix(in srgb, var(--likec4-relation-labelColor), rgba(255 255 255 / 0.85) 20%);
1290
- --xy-edge-label-background-color: color-mix(in srgb, var(--likec4-relation-labelBg), transparent 35%);
1291
- --xy-edge-stroke-width: 2.2px;
1295
+ --xy-edge-label-background-color: color-mix(in srgb, var(--likec4-relation-labelBg), transparent 40%);
1296
+ --xy-edge-stroke-width: 3;
1292
1297
  }
1293
1298
  :where([data-mantine-color-scheme="dark"]) .bexn7q1 {
1294
1299
  --bexn7q0: white;
1295
1300
  --xy-edge-label-color: var(--likec4-relation-labelColor);
1296
- --xy-edge-label-background-color: color-mix(in srgb, var(--likec4-relation-labelBg), transparent 55%);
1301
+ --xy-edge-label-background-color: color-mix(in srgb, var(--likec4-relation-labelBg), transparent 50%);
1297
1302
  }
1298
1303
  :where(.react-flow__edge.selected) .bexn7q1 {
1299
1304
  --xy-edge-stroke: var(--xy-edge-stroke-selected);
1300
- --xy-edge-stroke-width: 3px;
1305
+ --xy-edge-stroke-width: 3;
1301
1306
  }
1302
1307
  .bexn7q1:is([data-edge-hovered='true'],[data-edge-active='true']) {
1303
1308
  --xy-edge-stroke: var(--xy-edge-stroke-selected);
1304
- --xy-edge-stroke-width: 3px;
1309
+ --xy-edge-stroke-width: 3;
1305
1310
  }
1306
1311
  :where(.react-flow__edge.selected) .bexn7q1[data-edge-hovered='true'] {
1307
- --xy-edge-stroke-width: 3.6px;
1312
+ --xy-edge-stroke-width: 4;
1308
1313
  }
1309
1314
  .react-flow__edges > svg {
1310
1315
  mix-blend-mode: screen;
@@ -1313,18 +1318,17 @@ svg.react-flow__connectionline {
1313
1318
  opacity: 0.8;
1314
1319
  transition: opacity 600ms ease-in-out, filter 600ms ease-in-out;
1315
1320
  transition-delay: 200ms;
1316
- filter: grayscale(0.85) blur(1px);
1321
+ filter: grayscale(0.85) var(--likec4-safari-animation-hook, blur(1px));
1317
1322
  will-change: opacity, filter;
1318
1323
  }
1319
1324
  .bexn7q3 {
1320
- stroke-width: var(--xy-edge-stroke-width);
1321
1325
  stroke-opacity: 0.08;
1322
1326
  transition-property: stroke-width, stroke-opacity;
1323
1327
  transition-duration: 155ms;
1324
1328
  transition-timing-function: ease-out;
1325
1329
  }
1326
1330
  :where(.react-flow__edge.selected, [data-edge-active='true'], [data-edge-hovered='true']) .bexn7q3 {
1327
- stroke-width: calc(var(--xy-edge-stroke-width) + 8px);
1331
+ stroke-width: calc(var(--xy-edge-stroke-width) + 8);
1328
1332
  stroke-opacity: 0.15;
1329
1333
  }
1330
1334
  .bexn7q4 {
@@ -1336,7 +1340,7 @@ svg.react-flow__connectionline {
1336
1340
  stroke: var(--xy-edge-stroke);
1337
1341
  fill-opacity: 0.75;
1338
1342
  stroke-width: 1;
1339
- cursor: grab;
1343
+ cursor: default;
1340
1344
  pointer-events: auto;
1341
1345
  visibility: hidden;
1342
1346
  }
@@ -1352,51 +1356,64 @@ svg.react-flow__connectionline {
1352
1356
  fill-opacity: 1;
1353
1357
  stroke-width: 5;
1354
1358
  }
1355
- .bexn7q7 {
1359
+ .bexn7q6 {
1360
+ cursor: grabbing;
1361
+ }
1362
+ .bexn7q6 * {
1363
+ cursor: grabbing;
1364
+ }
1365
+ .bexn7q8 {
1356
1366
  animation-duration: 800ms;
1357
1367
  animation-iteration-count: infinite;
1358
1368
  animation-timing-function: linear;
1369
+ animation-fill-mode: both;
1370
+ stroke-dashoffset: 10;
1359
1371
  }
1360
- :where([data-edge-hovered='true']) .bexn7q7 {
1361
- animation-name: bexn7q6;
1362
- animation-delay: 350ms;
1363
- transition: stroke,stroke-width 130ms ease-out;
1372
+ :where([data-edge-hovered='true']) .bexn7q8 {
1373
+ animation-name: bexn7q7;
1374
+ animation-delay: 450ms;
1375
+ transition: stroke 130ms ease-out,stroke-width 130ms ease-out;
1364
1376
  }
1365
- :where(.react-flow__edge.selected, [data-edge-active='true']) .bexn7q7 {
1366
- animation-name: bexn7q6;
1377
+ :where(.react-flow__edge.selected, [data-edge-active='true']) .bexn7q8 {
1378
+ animation-name: bexn7q7;
1367
1379
  animation-delay: 0ms;
1368
- transition: stroke,stroke-width 130ms ease-out;
1380
+ transition: stroke 130ms ease-out,stroke-width 130ms ease-out;
1369
1381
  }
1370
- :where([data-edge-dir='back']) .bexn7q7 {
1382
+ :where([data-edge-dir='back']) .bexn7q8 {
1371
1383
  animation-direction: reverse;
1372
1384
  }
1373
- .bexn7qb {
1374
- --bexn7qa: translate(var(--bexn7q8, -50%), var(--bexn7q9, -50%));
1385
+ .bexn7q2 .bexn7q8 {
1386
+ animation-play-state: paused;
1387
+ }
1388
+ .bexn7qc {
1389
+ --bexn7qb: translate(var(--bexn7q9, -50%), var(--bexn7qa, -50%));
1375
1390
  top: 0;
1376
1391
  left: 0;
1392
+ padding: 2px 4px 4px 4px;
1377
1393
  font-family: var(--likec4-font-family);
1378
1394
  position: absolute;
1379
1395
  pointer-events: all;
1380
1396
  cursor: pointer;
1397
+ width: fit-content;
1381
1398
  transform-origin: 50% 50%;
1382
1399
  mix-blend-mode: screen;
1383
1400
  color: var(--xy-edge-label-color);
1384
1401
  background-color: var(--xy-edge-label-background-color);
1385
1402
  border-radius: 3px;
1386
- transform: var(--bexn7qa);
1403
+ transform: var(--bexn7qb);
1387
1404
  }
1388
- .bexn7qb[data-edge-hovered="true"] {
1389
- transition: all 140ms ease-out;
1390
- transform: var(--bexn7qa) scale(1.1);
1405
+ .bexn7qc[data-edge-hovered="true"] {
1406
+ transition: all 140ms ease-in-out;
1407
+ transform: var(--bexn7qb) scale(1.12);
1391
1408
  }
1392
- .bexn7qb:is(.bexn7q2) {
1393
- opacity: 0.8;
1409
+ .bexn7qc:is(.bexn7q2) {
1410
+ opacity: 0.6;
1394
1411
  transition: opacity 600ms ease-in-out, filter 600ms ease-in-out;
1395
1412
  transition-delay: 200ms;
1396
- filter: grayscale(0.85) blur(2px);
1413
+ filter: grayscale(0.85) var(--likec4-safari-animation-hook, blur(1px));
1397
1414
  will-change: opacity, filter;
1398
1415
  }
1399
- .bexn7qc {
1416
+ .bexn7qd {
1400
1417
  position: absolute;
1401
1418
  top: -2px;
1402
1419
  left: -2px;
@@ -1412,16 +1429,16 @@ svg.react-flow__connectionline {
1412
1429
  transform: translateX(-100%);
1413
1430
  font-variant-numeric: tabular-nums;
1414
1431
  }
1415
- :where([data-edge-hovered="true"],[data-edge-active="true"]) .bexn7qc {
1432
+ :where([data-edge-hovered="true"],[data-edge-active="true"]) .bexn7qd {
1416
1433
  font-weight: 600;
1417
1434
  background-color: color-mix(in srgb, var(--likec4-relation-labelBg), transparent 5%);
1418
1435
  }
1419
- .bexn7qd {
1420
- padding: 2px 6px 4px 6px;
1436
+ .bexn7qe {
1421
1437
  text-align: left;
1422
- font-size: calc(0.78125rem * var(--mantine-scale));
1423
- line-height: 1.2;
1424
- }@keyframes lbtzdo9 {
1438
+ white-space-collapse: preserve-breaks;
1439
+ font-size: calc(0.875rem * var(--mantine-scale));
1440
+ line-height: 1.185;
1441
+ }@keyframes lbtzdoa {
1425
1442
  from {
1426
1443
  opacity: 0.6;
1427
1444
  }
@@ -1436,90 +1453,95 @@ svg.react-flow__connectionline {
1436
1453
  padding: 0;
1437
1454
  margin: 0;
1438
1455
  }
1439
- .react-flow__node-compound:has(.lbtzdo1) {
1456
+ .lbtzdo1 {
1457
+ top: 50%;
1458
+ left: 50%;
1459
+ visibility: hidden;
1460
+ }
1461
+ .react-flow__node-compound:has(.lbtzdo2) {
1440
1462
  opacity: 0.25;
1441
1463
  transition: opacity 600ms ease-in-out, filter 600ms ease-in-out;
1442
1464
  transition-delay: 200ms;
1443
- filter: grayscale(0.85) blur(1px);
1465
+ filter: grayscale(0.85) var(--likec4-safari-animation-hook, blur(1px));
1444
1466
  will-change: opacity, filter;
1445
1467
  }
1446
- .lbtzdo4 {
1468
+ .lbtzdo5 {
1447
1469
  width: 100%;
1448
1470
  height: 100%;
1449
1471
  position: relative;
1450
1472
  border-radius: 6px;
1451
1473
  box-shadow: 0 4px 10px 0.5px rgba(0,0,0,0.1) , 0 2px 2px -1px rgba(0,0,0,0.4);
1452
- padding: 8px;
1474
+ padding: 0;
1475
+ margin: 0;
1453
1476
  transition: all 200ms ease-out;
1477
+ background-clip: padding-box;
1478
+ overflow: hidden;
1479
+ cursor: default;
1454
1480
  }
1455
- .lbtzdo4:before {
1481
+ .lbtzdo5:before {
1456
1482
  content: " ";
1457
1483
  position: absolute;
1458
1484
  top: 0;
1459
1485
  left: 0;
1460
1486
  width: 100%;
1461
1487
  height: 100%;
1462
- border-radius: 6px;
1463
1488
  pointer-events: none;
1464
1489
  transition: background 175ms ease-out, opacity 175ms ease-out;
1465
1490
  background: var(--likec4-element-fill);
1466
- background-clip: padding-box;
1467
1491
  }
1468
- :where(.react-flow__node.selected) .lbtzdo4 {
1492
+ :where(.react-flow__node.selected) .lbtzdo5 {
1469
1493
  box-shadow: none;
1470
1494
  }
1471
- :where(.react-flow__node:focus-visible) .lbtzdo4 {
1495
+ :where(.react-flow__node:focus-visible) .lbtzdo5 {
1472
1496
  transition-duration: 0ms;
1473
1497
  outline: 3px solid var(--mantine-primary-color-outline, var(--mantine-primary-color-filled, var(--likec4-element-stroke)));
1474
1498
  outline-offset: calc(0.09375rem * var(--mantine-scale));
1475
1499
  }
1476
- .lbtzdo6 {
1477
- --lbtzdo5: 0;
1500
+ .lbtzdo7 {
1501
+ --lbtzdo6: 0;
1478
1502
  --ai-bg: color-mix(in srgb , var(--likec4-element-fill), transparent 99%);
1479
1503
  border-style: dashed;
1480
1504
  border-width: 3px;
1481
- padding: 6px;
1482
1505
  box-shadow: none;
1483
- border-color: color-mix(in srgb , var(--likec4-element-stroke), transparent var(--lbtzdo3, 10%));
1484
- background-clip: padding-box;
1485
- }
1486
- .lbtzdo6:before {
1487
- transition-delay: 200ms;
1488
- opacity: calc(var(--lbtzdo2, 1) + var(--lbtzdo5));
1506
+ border-color: color-mix(in srgb , var(--likec4-element-stroke), transparent var(--lbtzdo4, 10%));
1489
1507
  }
1490
- :where(.react-flow__node.selected) .lbtzdo6 {
1491
- --lbtzdo5: .05;
1508
+ .lbtzdo7:before {
1509
+ border-radius: unset;
1510
+ transition-delay: 100ms;
1511
+ opacity: calc(var(--lbtzdo3, 1) + var(--lbtzdo6));
1492
1512
  }
1493
- :where([data-hovered]) .lbtzdo6 {
1494
- --lbtzdo5: .1;
1513
+ :where([data-hovered]) .lbtzdo7 {
1514
+ --lbtzdo6: .08;
1495
1515
  }
1496
- .lbtzdo7 {
1516
+ .lbtzdo8 {
1497
1517
  font-family: var(--likec4-compound-font-family);
1498
- font-optical-sizing: auto;
1499
- font-style: normal;
1500
1518
  text-align: left;
1501
- display: inline-block;
1502
1519
  font-weight: 600;
1503
- font-size: 14px;
1520
+ font-size: calc(0.9375rem * var(--mantine-scale));
1504
1521
  text-transform: uppercase;
1505
1522
  letter-spacing: 0.2px;
1506
1523
  line-height: 1;
1507
- opacity: 0.75;
1508
1524
  color: var(--_compound-title-color,var(--likec4-compound-title-color));
1509
- padding-left: 12px;
1525
+ padding-left: 14px;
1526
+ padding-top: 13px;
1527
+ padding-bottom: 6px;
1528
+ mix-blend-mode: screen;
1510
1529
  }
1511
- .lbtzdo8 {
1512
- padding-left: 26px;
1530
+ :where(.react-flow__node.draggable) .lbtzdo8 {
1531
+ cursor: grab;
1532
+ }
1533
+ :where(.likec4-compound-transparent) .lbtzdo8 {
1534
+ padding-top: 10px;
1535
+ }
1536
+ .lbtzdo9 {
1537
+ padding-left: 32px;
1513
1538
  }
1514
1539
  :where([data-mantine-color-scheme='light'] .likec4-compound-transparent) {
1515
1540
  --_compound-title-color: var(--likec4-element-stroke);
1516
1541
  }
1517
- :where([data-mantine-color-scheme='light'] .likec4-compound-transparent) .lbtzdo7 {
1518
- opacity: 1;
1519
- }
1520
- .lbtzdoc {
1521
- --lbtzdoa: var(--likec4-element-loContrast);
1522
- --lbtzdob: 6;
1542
+ .lbtzdod {
1543
+ --lbtzdob: var(--likec4-element-loContrast);
1544
+ --lbtzdoc: 6;
1523
1545
  position: absolute;
1524
1546
  top: 0;
1525
1547
  left: 0;
@@ -1529,76 +1551,76 @@ svg.react-flow__connectionline {
1529
1551
  overflow: visible;
1530
1552
  visibility: hidden;
1531
1553
  }
1532
- :where(.react-flow__node.selected:not(:focus-visible)) .lbtzdoc {
1554
+ :where(.react-flow__node.selected:not(:focus-visible)) .lbtzdod {
1533
1555
  visibility: visible;
1534
1556
  }
1535
- :where(.react-flow__node:focus-within:not(.selected)) .lbtzdoc {
1536
- --lbtzdoa: color-mix(in srgb, var(--likec4-element-stroke) 30%, var(--likec4-element-loContrast));
1537
- --lbtzdob: 8;
1557
+ :where(.react-flow__node:focus-within:not(.selected)) .lbtzdod {
1558
+ --lbtzdob: color-mix(in srgb, var(--likec4-element-stroke) 30%, var(--likec4-element-loContrast));
1559
+ --lbtzdoc: 8;
1538
1560
  }
1539
- :where([data-mantine-color-scheme='light']) .lbtzdoc {
1540
- --lbtzdoa: color-mix(in srgb, var(--likec4-element-stroke) 80%, #000);
1561
+ :where([data-mantine-color-scheme='light']) .lbtzdod {
1562
+ --lbtzdob: color-mix(in srgb, var(--likec4-element-stroke) 80%, #000);
1541
1563
  }
1542
- .lbtzdoc rect {
1543
- stroke: var(--lbtzdoa);
1564
+ .lbtzdod rect {
1565
+ stroke: var(--lbtzdob);
1544
1566
  transform-origin: center center;
1545
- stroke-width: var(--lbtzdob);
1567
+ stroke-width: var(--lbtzdoc);
1546
1568
  animation-duration: 800ms;
1547
- animation-name: lbtzdo9;
1569
+ animation-name: lbtzdoa;
1548
1570
  animation-iteration-count: infinite;
1549
1571
  animation-direction: alternate;
1550
1572
  fill: none;
1551
1573
  }
1552
1574
  .lbtzdo0 {
1553
- --lbtzdod: var(--likec4-element-loContrast);
1575
+ --lbtzdoe: var(--likec4-element-loContrast);
1554
1576
  }
1555
1577
  :where([data-mantine-color-scheme='light'] .likec4-compound-transparent) {
1556
- --lbtzdod: var(--likec4-element-stroke);
1578
+ --lbtzdoe: var(--likec4-element-stroke);
1557
1579
  }
1558
- .lbtzdoe {
1580
+ .lbtzdof {
1559
1581
  --ai-bg: color-mix(in srgb , var(--likec4-element-fill), transparent 99%);
1560
1582
  --ai-bg-hover: color-mix(in srgb , var(--likec4-element-fill) 65%, var(--likec4-element-stroke));
1561
1583
  --ai-hover: color-mix(in srgb , var(--likec4-element-fill) 50%, var(--likec4-element-stroke));
1562
1584
  position: absolute;
1563
1585
  pointer-events: all;
1564
1586
  left: 3px;
1565
- top: 7px;
1587
+ top: 6px;
1566
1588
  cursor: pointer;
1567
- color: var(--_compound-title-color,var(--lbtzdod));
1568
- transform-origin: 90% 70%;
1589
+ color: var(--_compound-title-color,var(--lbtzdoe));
1590
+ transform-origin: 90% 50%;
1569
1591
  opacity: 0.75;
1570
1592
  transition: all 150ms ease-out;
1571
1593
  transition-delay: 0ms;
1572
1594
  background-color: var(--ai-bg);
1573
1595
  }
1574
- .lbtzdoe:hover {
1596
+ .lbtzdof:hover {
1575
1597
  box-shadow: var(--mantine-shadow-lg);
1576
- transform: scale(1.466);
1598
+ transform: scale(1.42);
1577
1599
  opacity: 1;
1578
1600
  transition-delay: 0;
1579
1601
  }
1580
- .lbtzdoe:active {
1602
+ .lbtzdof:active {
1581
1603
  transform: scale(1.1);
1582
1604
  opacity: 1;
1583
1605
  transition-delay: 0;
1584
1606
  }
1585
- :where([data-mantine-color-scheme='light'] .likec4-compound-transparent) .lbtzdoe {
1586
- --ai-bg-hover: color-mix(in srgb , var(--likec4-element-fill), transparent 50%);
1607
+ :where([data-mantine-color-scheme='light'] .likec4-compound-transparent) .lbtzdof {
1608
+ --ai-bg-hover: color-mix(in srgb , var(--likec4-element-fill), transparent 60%);
1587
1609
  --ai-hover: color-mix(in srgb , var(--likec4-element-fill), transparent 20%);
1588
1610
  opacity: 0.85;
1589
1611
  }
1590
- :where(.react-flow__node:not(.dragging) .lbtzdo0:hover) .lbtzdoe:not(:hover) {
1612
+ :where(.react-flow__node:not(.dragging) .lbtzdo0:hover) .lbtzdof:not(:hover) {
1591
1613
  --ai-bg: var(--ai-bg-hover);
1592
1614
  box-shadow: var(--mantine-shadow-lg);
1593
1615
  transform: scale(1.223);
1594
1616
  opacity: 1;
1595
1617
  transition-delay: 250ms;
1596
1618
  }
1597
- .lbtzdoe svg.icon {
1598
- width: 70%;
1599
- height: 70%;
1619
+ .lbtzdof svg.icon {
1620
+ width: 75%;
1621
+ height: 75%;
1600
1622
  stroke-width: 1.5;
1601
- }@keyframes _1b6tkn4 {
1623
+ }@keyframes _1b6tkn6 {
1602
1624
  from {
1603
1625
  opacity: 0.6;
1604
1626
  }
@@ -1615,60 +1637,80 @@ svg.react-flow__connectionline {
1615
1637
  display: flex;
1616
1638
  align-items: stretch;
1617
1639
  }
1618
- .react-flow__node-element:has(._1b6tkn3) {
1640
+ :where(.react-flow__node.selected) ._1b6tkn2 {
1641
+ will-change: transform;
1642
+ }
1643
+ ._1b6tkn2[data-hovered="true"] {
1644
+ will-change: transform;
1645
+ }
1646
+ ._1b6tkn3 {
1647
+ top: 50%;
1648
+ left: 50%;
1649
+ visibility: hidden;
1650
+ }
1651
+ ._1b6tkn4 {
1652
+ will-change: transform;
1653
+ }
1654
+ .react-flow__node-element:has(._1b6tkn5) {
1619
1655
  opacity: 0.25;
1620
1656
  transition: opacity 600ms ease-in-out, filter 600ms ease-in-out;
1621
1657
  transition-delay: 200ms;
1622
- filter: grayscale(0.85) blur(2px);
1658
+ filter: grayscale(0.85) var(--likec4-safari-animation-hook, blur(2px));
1623
1659
  will-change: opacity, filter;
1624
1660
  }
1625
- ._1b6tkn5 {
1626
- stroke: var(--likec4-element-loContrast);
1661
+ ._1b6tkn8 {
1662
+ --_1b6tkn7: var(--likec4-element-loContrast);
1663
+ stroke: var(--_1b6tkn7);
1664
+ fill: none;
1627
1665
  transform-origin: center center;
1628
1666
  stroke-width: 6;
1629
1667
  animation-duration: 800ms;
1630
- animation-name: _1b6tkn4;
1631
1668
  animation-iteration-count: infinite;
1632
1669
  animation-direction: alternate;
1670
+ opacity: 0.6;
1633
1671
  visibility: hidden;
1634
1672
  }
1635
- :where(.react-flow__node.selected) ._1b6tkn5 {
1673
+ :where(.react-flow__node.selected) ._1b6tkn8 {
1636
1674
  visibility: visible;
1675
+ animation-name: var(--likec4-safari-animation-hook, _1b6tkn6);
1637
1676
  }
1638
- :where(.react-flow__node:focus-visible, ._1b6tkn2:focus-visible) ._1b6tkn5 {
1639
- animation-name: none;
1677
+ :where(.react-flow__node:focus-visible, ._1b6tkn2:focus-visible) ._1b6tkn8 {
1640
1678
  stroke-width: 10;
1641
1679
  stroke: var(--mantine-primary-color-outline, var(--mantine-primary-color-filled, var(--likec4-element-stroke)));
1642
1680
  visibility: visible;
1643
1681
  }
1644
- :where([data-likec4-shape="queue"], [data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tkn5 {
1682
+ :where([data-likec4-shape="queue"], [data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tkn8 {
1645
1683
  stroke-width: 10;
1646
1684
  }
1647
- ._1b6tkn3 ._1b6tkn5 {
1685
+ :where([data-mantine-color-scheme='light']) ._1b6tkn8 {
1686
+ --_1b6tkn7: color-mix(in srgb, var(--likec4-element-fill) 60%, var(--likec4-element-loContrast));
1687
+ }
1688
+ ._1b6tkn5 ._1b6tkn8 {
1648
1689
  visibility: hidden;
1690
+ display: none;
1649
1691
  }
1650
- ._1b6tkn6 {
1692
+ ._1b6tkn9 {
1651
1693
  fill: var(--likec4-element-fill);
1652
1694
  }
1653
- ._1b6tkn7 {
1695
+ ._1b6tkna {
1654
1696
  fill: var(--likec4-element-stroke);
1655
1697
  }
1656
- ._1b6tkn8 {
1698
+ ._1b6tknb {
1657
1699
  fill: var(--_1b6tkn0);
1658
1700
  }
1659
- ._1b6tkn9 {
1701
+ ._1b6tknc {
1660
1702
  flex: 0 0 auto;
1661
1703
  font-family: var(--likec4-element-font-family);
1662
1704
  font-optical-sizing: auto;
1663
1705
  font-style: normal;
1664
1706
  text-align: center;
1665
1707
  font-weight: 500;
1666
- font-size: calc(1.1875rem * var(--mantine-scale));
1708
+ font-size: calc(1.21875rem * var(--mantine-scale));
1667
1709
  line-height: 1.2;
1668
1710
  text-wrap: balance;
1669
1711
  color: var(--likec4-element-hiContrast);
1670
1712
  }
1671
- ._1b6tkna {
1713
+ ._1b6tknd {
1672
1714
  flex: 0 1 auto;
1673
1715
  font-family: var(--likec4-element-font-family);
1674
1716
  font-optical-sizing: auto;
@@ -1683,7 +1725,7 @@ svg.react-flow__connectionline {
1683
1725
  text-overflow: ellipsis;
1684
1726
  overflow: hidden;
1685
1727
  }
1686
- ._1b6tknb {
1728
+ ._1b6tkne {
1687
1729
  flex: 0 0 auto;
1688
1730
  font-family: var(--likec4-element-font-family);
1689
1731
  font-optical-sizing: auto;
@@ -1696,10 +1738,10 @@ svg.react-flow__connectionline {
1696
1738
  opacity: 0.92;
1697
1739
  color: var(--likec4-element-loContrast);
1698
1740
  }
1699
- ._1b6tkn2:hover ._1b6tknb {
1741
+ ._1b6tkn2:hover ._1b6tkne {
1700
1742
  opacity: 1;
1701
1743
  }
1702
- ._1b6tknc {
1744
+ ._1b6tknf {
1703
1745
  --_1b6tkn1: calc(1.5rem * var(--mantine-scale));
1704
1746
  flex: 1;
1705
1747
  padding: var(--_1b6tkn1);
@@ -1710,42 +1752,41 @@ svg.react-flow__connectionline {
1710
1752
  overflow: hidden;
1711
1753
  gap: calc(0.5rem * var(--mantine-scale));
1712
1754
  }
1713
- ._1b6tknc:has(._1b6tkna):has(._1b6tknb) {
1755
+ ._1b6tknf:has(._1b6tknd):has(._1b6tkne) {
1714
1756
  gap: calc(0.375rem * var(--mantine-scale));
1715
1757
  }
1716
- :where([data-likec4-shape="queue"], [data-likec4-shape="mobile"]) ._1b6tknc {
1758
+ :where([data-likec4-shape="queue"], [data-likec4-shape="mobile"]) ._1b6tknf {
1717
1759
  padding-left: calc(2.5rem * var(--mantine-scale));
1718
1760
  padding-right: calc(1.25rem * var(--mantine-scale));
1719
1761
  }
1720
- :where([data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tknc {
1762
+ :where([data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tknf {
1721
1763
  padding-top: calc(2.125rem * var(--mantine-scale));
1722
1764
  }
1723
- :where([data-likec4-shape="browser"]) ._1b6tknc {
1765
+ :where([data-likec4-shape="browser"]) ._1b6tknf {
1724
1766
  padding-top: calc(2rem * var(--mantine-scale));
1725
1767
  padding-bottom: calc(1.75rem * var(--mantine-scale));
1726
1768
  }
1727
- ._1b6tkne {
1728
- --_1b6tknd: 30px;
1729
- flex: 0 1 var(--_1b6tknd);
1730
- max-height: var(--_1b6tknd);
1731
- margin-top: -8px;
1769
+ ._1b6tkni {
1770
+ --_1b6tknh: calc(var(--_1b6tkng) - 12px);
1771
+ flex: 0 1 var(--_1b6tknh);
1772
+ max-height: var(--_1b6tknh);
1732
1773
  position: relative;
1733
1774
  user-select: none;
1734
1775
  pointer-events: none;
1735
1776
  overflow: visible;
1736
1777
  mix-blend-mode: hard-light;
1737
1778
  }
1738
- ._1b6tkne img {
1779
+ ._1b6tkni img {
1739
1780
  position: absolute;
1740
1781
  left: 0;
1741
- bottom: 0;
1782
+ bottom: 4px;
1742
1783
  width: 100%;
1743
1784
  height: auto;
1744
1785
  object-fit: contain;
1745
- max-height: calc(var(--_1b6tknd) + 16px);
1786
+ max-height: var(--_1b6tkng);
1746
1787
  }
1747
- ._1b6tknh {
1748
- --_1b6tknf:
1788
+ ._1b6tknk {
1789
+ --_1b6tknj:
1749
1790
  drop-shadow(0 2px 1px rgba(0, 0, 0, 0.21))
1750
1791
  drop-shadow(0 1px 1px color-mix(in srgb, var(--likec4-element-stroke) 40%, transparent))
1751
1792
  drop-shadow(0 5px 3px rgba(0, 0, 0, 0.1))
@@ -1757,15 +1798,15 @@ svg.react-flow__connectionline {
1757
1798
  fill: var(--likec4-element-fill);
1758
1799
  stroke: var(--likec4-element-stroke);
1759
1800
  overflow: visible;
1760
- filter: var(--_1b6tkng, var(--_1b6tknf));
1801
+ filter: var(--_1b6tknj);
1761
1802
  transition: filter 300ms ease-out;
1762
1803
  transition-delay: 0ms;
1763
1804
  z-index: -1;
1764
1805
  }
1765
- :where(.react-flow__node.selected, .react-flow__node:focus-visible, ._1b6tkn2:focus-visible) ._1b6tknh {
1766
- filter: none;
1806
+ :where(.react-flow__node.selected, .react-flow__node:focus-visible, ._1b6tkn2:focus-visible) ._1b6tknk {
1807
+ --_1b6tknj: none;
1767
1808
  }
1768
- ._1b6tkni {
1809
+ ._1b6tknl {
1769
1810
  --ai-bg: color-mix(in srgb , var(--likec4-element-fill), transparent 99%);
1770
1811
  --ai-bg-hover: color-mix(in srgb , var(--likec4-element-fill) 65%, var(--likec4-element-stroke));
1771
1812
  --ai-hover: color-mix(in srgb , var(--likec4-element-fill) 50%, var(--likec4-element-stroke));
@@ -1783,28 +1824,28 @@ svg.react-flow__connectionline {
1783
1824
  transition-delay: 0ms;
1784
1825
  background-color: var(--ai-bg);
1785
1826
  }
1786
- ._1b6tkni:hover {
1827
+ ._1b6tknl:hover {
1787
1828
  box-shadow: var(--mantine-shadow-lg);
1788
1829
  transform: translate(-50%, 0) scale(1.35);
1789
1830
  opacity: 1;
1790
1831
  transition-delay: 0;
1791
1832
  }
1792
- ._1b6tkni:active {
1833
+ ._1b6tknl:active {
1793
1834
  transform: translate(-50%, 0) scale(1.02);
1794
1835
  opacity: 1;
1795
1836
  transition-delay: 0;
1796
1837
  }
1797
- :where([data-likec4-shape='browser']) ._1b6tkni {
1838
+ :where([data-likec4-shape='browser']) ._1b6tknl {
1798
1839
  bottom: 3px;
1799
1840
  }
1800
- :where(.react-flow__node:not(.dragging) ._1b6tkn2:hover) ._1b6tkni:not(:hover) {
1841
+ :where(.react-flow__node:not(.dragging) ._1b6tkn2:hover) ._1b6tknl:not(:hover) {
1801
1842
  --ai-bg: var(--ai-bg-hover);
1802
1843
  box-shadow: var(--mantine-shadow-lg);
1803
1844
  transform: translate(-50%, 0) scale(1.185);
1804
1845
  opacity: 1;
1805
1846
  transition-delay: 250ms;
1806
1847
  }
1807
- ._1b6tkni svg.icon {
1848
+ ._1b6tknl svg.icon {
1808
1849
  width: 65%;
1809
1850
  height: 65%;
1810
1851
  stroke-width: 1.5;
@@ -1859,6 +1900,13 @@ svg.react-flow__connectionline {
1859
1900
  }
1860
1901
  ._4ysv0o2 {
1861
1902
  text-align: left;
1903
+ }._19mimxc0 {
1904
+ top: var(--likec4-navigation-panel-top, 0.8rem);
1905
+ left: var(--likec4-navigation-panel-left, 1rem);
1906
+ margin: 0;
1907
+ }
1908
+ ._19mimxc0 .mantine-ActionIcon-root {
1909
+ --ai-size: var(--ai-size-lg);
1862
1910
  }.hbkbtj0 {
1863
1911
  bottom: 0;
1864
1912
  left: 0;
@@ -1867,11 +1915,14 @@ svg.react-flow__connectionline {
1867
1915
  }
1868
1916
  .hbkbtj1 {
1869
1917
  cursor: default;
1870
- min-width: 100px;
1918
+ min-width: 200px;
1871
1919
  max-width: calc(100vw - 16px);
1872
1920
  background-color: color-mix(in srgb, var(--mantine-color-body), transparent 20%);
1873
- -webkit-backdrop-filter: blur(8px);
1874
- backdrop-filter: blur(8px);
1921
+ -webkit-backdrop-filter: var(--likec4-safari-animation-hook, blur(8px));
1922
+ backdrop-filter: var(--likec4-safari-animation-hook, blur(8px));
1923
+ }
1924
+ :where([data-mantine-color-scheme='dark']) .hbkbtj1 {
1925
+ background-color: color-mix(in srgb, var(--mantine-color-dark-6), transparent 20%);
1875
1926
  }
1876
1927
  .hbkbtj3 {
1877
1928
  white-space-collapse: preserve-breaks;
@@ -1880,9 +1931,16 @@ svg.react-flow__connectionline {
1880
1931
  :where([data-mantine-color-scheme="dark"]) .hbkbtj3 {
1881
1932
  color: var(--mantine-color-gray-5);
1882
1933
  }
1934
+ @media (min-width: 48em) {
1935
+ .hbkbtj1 {
1936
+ min-width: 300px;
1937
+ max-width: 90vw;
1938
+ }
1939
+ }
1883
1940
  @media (min-width: 62em) {
1884
1941
  .hbkbtj1 {
1885
- max-width: 45vw;
1942
+ min-width: 400px;
1943
+ max-width: 70vw;
1886
1944
  }
1887
1945
  }._2jkb2y0 {
1888
1946
  position: absolute;