@likec4/diagram 1.5.0 → 1.6.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 (34) hide show
  1. package/LICENSE +1 -1
  2. package/dist/LikeC4Diagram.d.ts +1 -1
  3. package/dist/LikeC4Diagram.props.d.ts +18 -3
  4. package/dist/StaticLikeC4Diagram.d.ts +1 -1
  5. package/dist/index.mjs +3097 -3090
  6. package/dist/state/DiagramContext.d.ts +18 -9
  7. package/dist/state/diagramStore.d.ts +12 -2
  8. package/dist/style.css +149 -85
  9. package/dist/xyflow/nodes/element/ElementShapeSvg.d.ts +5 -0
  10. package/dist/xyflow/nodes/element/element.css.d.ts +4 -2
  11. package/package.json +13 -13
  12. package/src/LikeC4Diagram.props.ts +21 -3
  13. package/src/LikeC4Diagram.tsx +4 -1
  14. package/src/StaticLikeC4Diagram.tsx +1 -0
  15. package/src/state/DiagramContext.tsx +1 -1
  16. package/src/state/diagramStore.ts +8 -1
  17. package/src/ui/BackwardForwardPanel.tsx +1 -1
  18. package/src/xyflow/FitviewOnDiagramChange.tsx +1 -1
  19. package/src/xyflow/SelectEdgesOnNodeFocus.tsx +1 -1
  20. package/src/xyflow/SyncWithDiagram.tsx +1 -1
  21. package/src/xyflow/XYFlow.tsx +2 -1
  22. package/src/xyflow/XYFlowEvents.tsx +1 -1
  23. package/src/xyflow/XYFlowInner.tsx +1 -1
  24. package/src/xyflow/edges/RelationshipEdge.tsx +3 -3
  25. package/src/xyflow/edges/edges.css.ts +6 -6
  26. package/src/xyflow/hooks/useLayoutConstraints.ts +1 -1
  27. package/src/xyflow/nodes/compound/CompoundNode.tsx +1 -1
  28. package/src/xyflow/nodes/element/ElementLink.tsx +2 -1
  29. package/src/xyflow/nodes/element/ElementNode.tsx +70 -22
  30. package/src/xyflow/nodes/element/ElementShapeSvg.tsx +2 -2
  31. package/src/xyflow/nodes/element/element.css.ts +126 -54
  32. package/src/xyflow/nodes/shared/NavigateToBtn.tsx +1 -1
  33. package/dist/xyflow/nodes/element/ElementIcon.d.ts +0 -7
  34. package/src/xyflow/nodes/element/ElementIcon.tsx +0 -33
@@ -14,10 +14,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
14
14
  nodesDraggable: boolean;
15
15
  nodesSelectable: boolean;
16
16
  experimentalEdgeEditing: boolean;
17
+ renderIcon: import('..').ElementIconRenderer | null;
17
18
  getContainer: () => HTMLDivElement | null;
18
19
  viewSyncDebounceTimeout: number | null;
19
20
  xyflow: import('..').XYFlowInstance;
20
- xystore: import('../xyflow/hooks').XYStoreApi;
21
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
21
22
  initialized: boolean;
22
23
  xyflowSynced: boolean;
23
24
  activeDynamicViewStep: number | null;
@@ -75,10 +76,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
75
76
  nodesDraggable: boolean;
76
77
  nodesSelectable: boolean;
77
78
  experimentalEdgeEditing: boolean;
79
+ renderIcon: import('..').ElementIconRenderer | null;
78
80
  getContainer: () => HTMLDivElement | null;
79
81
  viewSyncDebounceTimeout: number | null;
80
82
  xyflow: import('..').XYFlowInstance;
81
- xystore: import('../xyflow/hooks').XYStoreApi;
83
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
82
84
  initialized: boolean;
83
85
  xyflowSynced: boolean;
84
86
  activeDynamicViewStep: number | null;
@@ -134,10 +136,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
134
136
  nodesDraggable: boolean;
135
137
  nodesSelectable: boolean;
136
138
  experimentalEdgeEditing: boolean;
139
+ renderIcon: import('..').ElementIconRenderer | null;
137
140
  getContainer: () => HTMLDivElement | null;
138
141
  viewSyncDebounceTimeout: number | null;
139
142
  xyflow: import('..').XYFlowInstance;
140
- xystore: import('../xyflow/hooks').XYStoreApi;
143
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
141
144
  initialized: boolean;
142
145
  xyflowSynced: boolean;
143
146
  activeDynamicViewStep: number | null;
@@ -194,10 +197,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
194
197
  nodesDraggable: boolean;
195
198
  nodesSelectable: boolean;
196
199
  experimentalEdgeEditing: boolean;
200
+ renderIcon: import('..').ElementIconRenderer | null;
197
201
  getContainer: () => HTMLDivElement | null;
198
202
  viewSyncDebounceTimeout: number | null;
199
203
  xyflow: import('..').XYFlowInstance;
200
- xystore: import('../xyflow/hooks').XYStoreApi;
204
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
201
205
  initialized: boolean;
202
206
  xyflowSynced: boolean;
203
207
  activeDynamicViewStep: number | null;
@@ -261,10 +265,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
261
265
  nodesDraggable: boolean;
262
266
  nodesSelectable: boolean;
263
267
  experimentalEdgeEditing: boolean;
268
+ renderIcon: import('..').ElementIconRenderer | null;
264
269
  getContainer: () => HTMLDivElement | null;
265
270
  viewSyncDebounceTimeout: number | null;
266
271
  xyflow: import('..').XYFlowInstance;
267
- xystore: import('../xyflow/hooks').XYStoreApi;
272
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
268
273
  initialized: boolean;
269
274
  xyflowSynced: boolean;
270
275
  activeDynamicViewStep: number | null;
@@ -320,10 +325,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
320
325
  nodesDraggable: boolean;
321
326
  nodesSelectable: boolean;
322
327
  experimentalEdgeEditing: boolean;
328
+ renderIcon: import('..').ElementIconRenderer | null;
323
329
  getContainer: () => HTMLDivElement | null;
324
330
  viewSyncDebounceTimeout: number | null;
325
331
  xyflow: import('..').XYFlowInstance;
326
- xystore: import('../xyflow/hooks').XYStoreApi;
332
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
327
333
  initialized: boolean;
328
334
  xyflowSynced: boolean;
329
335
  activeDynamicViewStep: number | null;
@@ -379,10 +385,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
379
385
  nodesDraggable: boolean;
380
386
  nodesSelectable: boolean;
381
387
  experimentalEdgeEditing: boolean;
388
+ renderIcon: import('..').ElementIconRenderer | null;
382
389
  getContainer: () => HTMLDivElement | null;
383
390
  viewSyncDebounceTimeout: number | null;
384
391
  xyflow: import('..').XYFlowInstance;
385
- xystore: import('../xyflow/hooks').XYStoreApi;
392
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
386
393
  initialized: boolean;
387
394
  xyflowSynced: boolean;
388
395
  activeDynamicViewStep: number | null;
@@ -438,10 +445,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
438
445
  nodesDraggable: boolean;
439
446
  nodesSelectable: boolean;
440
447
  experimentalEdgeEditing: boolean;
448
+ renderIcon: import('..').ElementIconRenderer | null;
441
449
  getContainer: () => HTMLDivElement | null;
442
450
  viewSyncDebounceTimeout: number | null;
443
451
  xyflow: import('..').XYFlowInstance;
444
- xystore: import('../xyflow/hooks').XYStoreApi;
452
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
445
453
  initialized: boolean;
446
454
  xyflowSynced: boolean;
447
455
  activeDynamicViewStep: number | null;
@@ -497,10 +505,11 @@ export declare const DiagramContext: import('react').Context<import('zustand/tra
497
505
  nodesDraggable: boolean;
498
506
  nodesSelectable: boolean;
499
507
  experimentalEdgeEditing: boolean;
508
+ renderIcon: import('..').ElementIconRenderer | null;
500
509
  getContainer: () => HTMLDivElement | null;
501
510
  viewSyncDebounceTimeout: number | null;
502
511
  xyflow: import('..').XYFlowInstance;
503
- xystore: import('../xyflow/hooks').XYStoreApi;
512
+ xystore: import('../xyflow/hooks/useXYFlow').XYStoreApi;
504
513
  initialized: boolean;
505
514
  xyflowSynced: boolean;
506
515
  activeDynamicViewStep: number | null;
@@ -2,7 +2,7 @@ import { DiagramNode, DiagramView, Fqn, ViewID } from '@likec4/core';
2
2
  import { XYPosition } from '@xyflow/react';
3
3
  import { MouseEvent as ReactMouseEvent } from 'react';
4
4
  import { Exact, Simplify } from 'type-fest';
5
- import { Changes, LikeC4DiagramEventHandlers } from '../LikeC4Diagram.props';
5
+ import { Changes, ElementIconRenderer, LikeC4DiagramEventHandlers } from '../LikeC4Diagram.props';
6
6
  import { XYStoreApi } from '../xyflow/hooks';
7
7
  import { XYFlowInstance } from '../xyflow/types';
8
8
 
@@ -18,6 +18,7 @@ export type DiagramStore = {
18
18
  nodesDraggable: boolean;
19
19
  nodesSelectable: boolean;
20
20
  experimentalEdgeEditing: boolean;
21
+ renderIcon: ElementIconRenderer | null;
21
22
  getContainer: () => HTMLDivElement | null;
22
23
  viewSyncDebounceTimeout: number | null;
23
24
  xyflow: XYFlowInstance;
@@ -41,7 +42,7 @@ export type DiagramStore = {
41
42
  };
42
43
  viewportChanged: boolean;
43
44
  } & Required<LikeC4DiagramEventHandlers>;
44
- export type DiagramInitialState = Pick<DiagramStore, 'view' | 'readonly' | 'showElementLinks' | 'fitViewEnabled' | 'fitViewPadding' | 'zoomable' | 'pannable' | 'nodesDraggable' | 'nodesSelectable' | 'experimentalEdgeEditing'> & LikeC4DiagramEventHandlers;
45
+ export type DiagramInitialState = Pick<DiagramStore, 'view' | 'renderIcon' | 'readonly' | 'showElementLinks' | 'fitViewEnabled' | 'fitViewPadding' | 'zoomable' | 'pannable' | 'nodesDraggable' | 'nodesSelectable' | 'experimentalEdgeEditing'> & LikeC4DiagramEventHandlers;
45
46
  interface DiagramStoreActions {
46
47
  isDynamicView: () => boolean;
47
48
  updateView: (view: DiagramView) => void;
@@ -74,6 +75,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
74
75
  nodesDraggable: boolean;
75
76
  nodesSelectable: boolean;
76
77
  experimentalEdgeEditing: boolean;
78
+ renderIcon: ElementIconRenderer | null;
77
79
  getContainer: () => HTMLDivElement | null;
78
80
  viewSyncDebounceTimeout: number | null;
79
81
  xyflow: XYFlowInstance;
@@ -135,6 +137,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
135
137
  nodesDraggable: boolean;
136
138
  nodesSelectable: boolean;
137
139
  experimentalEdgeEditing: boolean;
140
+ renderIcon: ElementIconRenderer | null;
138
141
  getContainer: () => HTMLDivElement | null;
139
142
  viewSyncDebounceTimeout: number | null;
140
143
  xyflow: XYFlowInstance;
@@ -194,6 +197,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
194
197
  nodesDraggable: boolean;
195
198
  nodesSelectable: boolean;
196
199
  experimentalEdgeEditing: boolean;
200
+ renderIcon: ElementIconRenderer | null;
197
201
  getContainer: () => HTMLDivElement | null;
198
202
  viewSyncDebounceTimeout: number | null;
199
203
  xyflow: XYFlowInstance;
@@ -254,6 +258,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
254
258
  nodesDraggable: boolean;
255
259
  nodesSelectable: boolean;
256
260
  experimentalEdgeEditing: boolean;
261
+ renderIcon: ElementIconRenderer | null;
257
262
  getContainer: () => HTMLDivElement | null;
258
263
  viewSyncDebounceTimeout: number | null;
259
264
  xyflow: XYFlowInstance;
@@ -321,6 +326,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
321
326
  nodesDraggable: boolean;
322
327
  nodesSelectable: boolean;
323
328
  experimentalEdgeEditing: boolean;
329
+ renderIcon: ElementIconRenderer | null;
324
330
  getContainer: () => HTMLDivElement | null;
325
331
  viewSyncDebounceTimeout: number | null;
326
332
  xyflow: XYFlowInstance;
@@ -380,6 +386,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
380
386
  nodesDraggable: boolean;
381
387
  nodesSelectable: boolean;
382
388
  experimentalEdgeEditing: boolean;
389
+ renderIcon: ElementIconRenderer | null;
383
390
  getContainer: () => HTMLDivElement | null;
384
391
  viewSyncDebounceTimeout: number | null;
385
392
  xyflow: XYFlowInstance;
@@ -439,6 +446,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
439
446
  nodesDraggable: boolean;
440
447
  nodesSelectable: boolean;
441
448
  experimentalEdgeEditing: boolean;
449
+ renderIcon: ElementIconRenderer | null;
442
450
  getContainer: () => HTMLDivElement | null;
443
451
  viewSyncDebounceTimeout: number | null;
444
452
  xyflow: XYFlowInstance;
@@ -498,6 +506,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
498
506
  nodesDraggable: boolean;
499
507
  nodesSelectable: boolean;
500
508
  experimentalEdgeEditing: boolean;
509
+ renderIcon: ElementIconRenderer | null;
501
510
  getContainer: () => HTMLDivElement | null;
502
511
  viewSyncDebounceTimeout: number | null;
503
512
  xyflow: XYFlowInstance;
@@ -557,6 +566,7 @@ export declare function createDiagramStore<T extends Exact<CreateDiagramStore, T
557
566
  nodesDraggable: boolean;
558
567
  nodesSelectable: boolean;
559
568
  experimentalEdgeEditing: boolean;
569
+ renderIcon: ElementIconRenderer | null;
560
570
  getContainer: () => HTMLDivElement | null;
561
571
  viewSyncDebounceTimeout: number | null;
562
572
  xyflow: XYFlowInstance;
package/dist/style.css CHANGED
@@ -1152,8 +1152,8 @@ svg.react-flow__connectionline {
1152
1152
  --likec4-element-fill: #A35829;
1153
1153
  --likec4-element-stroke: #7E451D;
1154
1154
  --likec4-element-hiContrast: #FFE0C2;
1155
- --likec4-element-loContrast: #FFA057;
1156
- --likec4-compound-title-color: #FFA057;
1155
+ --likec4-element-loContrast: #f9b27c;
1156
+ --likec4-compound-title-color: #f9b27c;
1157
1157
  --likec4-relation-lineColor: #b45309;
1158
1158
  --likec4-relation-labelBg: #78350f;
1159
1159
  --likec4-relation-labelColor: #FFE0C2;
@@ -1312,10 +1312,10 @@ svg.react-flow__connectionline {
1312
1312
  --xy-edge-stroke-width: 4;
1313
1313
  }
1314
1314
  .react-flow__edges > svg {
1315
- mix-blend-mode: screen;
1315
+ mix-blend-mode: plus-lighter;
1316
1316
  }
1317
1317
  .react-flow__edges > svg:has(.bexn7q2) {
1318
- opacity: 0.8;
1318
+ opacity: 0.6;
1319
1319
  transition: opacity 600ms ease-in-out, filter 600ms ease-in-out;
1320
1320
  transition-delay: 200ms;
1321
1321
  filter: grayscale(0.85) var(--likec4-safari-animation-hook, blur(1px));
@@ -1357,10 +1357,10 @@ svg.react-flow__connectionline {
1357
1357
  stroke-width: 5;
1358
1358
  }
1359
1359
  .bexn7q6 {
1360
- cursor: grabbing;
1360
+ cursor: grab;
1361
1361
  }
1362
1362
  .bexn7q6 * {
1363
- cursor: grabbing;
1363
+ cursor: grab;
1364
1364
  }
1365
1365
  .bexn7q8 {
1366
1366
  animation-duration: 800ms;
@@ -1396,7 +1396,7 @@ svg.react-flow__connectionline {
1396
1396
  cursor: pointer;
1397
1397
  width: fit-content;
1398
1398
  transform-origin: 50% 50%;
1399
- mix-blend-mode: screen;
1399
+ mix-blend-mode: plus-lighter;
1400
1400
  color: var(--xy-edge-label-color);
1401
1401
  background-color: var(--xy-edge-label-background-color);
1402
1402
  border-radius: 3px;
@@ -1407,7 +1407,7 @@ svg.react-flow__connectionline {
1407
1407
  transform: var(--bexn7qb) scale(1.12);
1408
1408
  }
1409
1409
  .bexn7qc:is(.bexn7q2) {
1410
- opacity: 0.6;
1410
+ opacity: 0.3;
1411
1411
  transition: opacity 600ms ease-in-out, filter 600ms ease-in-out;
1412
1412
  transition-delay: 200ms;
1413
1413
  filter: grayscale(0.85) var(--likec4-safari-animation-hook, blur(1px));
@@ -1620,193 +1620,257 @@ svg.react-flow__connectionline {
1620
1620
  width: 75%;
1621
1621
  height: 75%;
1622
1622
  stroke-width: 1.5;
1623
- }@keyframes _1b6tkn6 {
1623
+ }@keyframes _1b6tkn5 {
1624
1624
  from {
1625
- opacity: 0.6;
1625
+ stroke-opacity: 0.8;
1626
1626
  }
1627
1627
  to {
1628
- opacity: 0.4;
1628
+ stroke-opacity: 0.5;
1629
1629
  }
1630
1630
  }
1631
- ._1b6tkn2 {
1631
+ ._1b6tkn1 {
1632
1632
  --_1b6tkn0: color-mix(in srgb, var(--likec4-element-stroke) 90%, var(--likec4-element-fill));
1633
1633
  width: 100%;
1634
1634
  height: 100%;
1635
1635
  padding: 0;
1636
1636
  margin: 0;
1637
+ flex: 1;
1637
1638
  display: flex;
1638
- align-items: stretch;
1639
+ align-items: center;
1640
+ justify-content: center;
1639
1641
  }
1640
- :where(.react-flow__node.selected) ._1b6tkn2 {
1642
+ :where(.react-flow__node.selected) ._1b6tkn1 {
1641
1643
  will-change: transform;
1642
1644
  }
1643
- ._1b6tkn2[data-hovered="true"] {
1645
+ ._1b6tkn1[data-hovered="true"] {
1644
1646
  will-change: transform;
1645
1647
  }
1646
- ._1b6tkn3 {
1648
+ ._1b6tkn2 {
1647
1649
  top: 50%;
1648
1650
  left: 50%;
1649
1651
  visibility: hidden;
1650
1652
  }
1651
- ._1b6tkn4 {
1653
+ ._1b6tkn3 {
1652
1654
  will-change: transform;
1653
1655
  }
1654
- .react-flow__node-element:has(._1b6tkn5) {
1656
+ .react-flow__node-element:has(._1b6tkn4) {
1655
1657
  opacity: 0.25;
1656
1658
  transition: opacity 600ms ease-in-out, filter 600ms ease-in-out;
1657
1659
  transition-delay: 200ms;
1658
1660
  filter: grayscale(0.85) var(--likec4-safari-animation-hook, blur(2px));
1659
1661
  will-change: opacity, filter;
1660
1662
  }
1661
- ._1b6tkn8 {
1662
- --_1b6tkn7: var(--likec4-element-loContrast);
1663
- stroke: var(--_1b6tkn7);
1663
+ ._1b6tkn7 {
1664
+ --_1b6tkn6: var(--likec4-element-loContrast);
1665
+ stroke: var(--_1b6tkn6);
1664
1666
  fill: none;
1665
1667
  transform-origin: center center;
1666
1668
  stroke-width: 6;
1667
- animation-duration: 800ms;
1669
+ animation-duration: 1s;
1668
1670
  animation-iteration-count: infinite;
1669
1671
  animation-direction: alternate;
1670
- opacity: 0.6;
1672
+ stroke-opacity: 0.8;
1671
1673
  visibility: hidden;
1672
1674
  }
1673
- :where(.react-flow__node.selected) ._1b6tkn8 {
1675
+ :where(.react-flow__node.selected) ._1b6tkn7 {
1674
1676
  visibility: visible;
1675
- animation-name: var(--likec4-safari-animation-hook, _1b6tkn6);
1677
+ animation-name: var(--likec4-safari-animation-hook, _1b6tkn5);
1676
1678
  }
1677
- :where(.react-flow__node:focus-visible, ._1b6tkn2:focus-visible) ._1b6tkn8 {
1679
+ :where(.react-flow__node:focus-visible, ._1b6tkn1:focus-visible) ._1b6tkn7 {
1678
1680
  stroke-width: 10;
1679
1681
  stroke: var(--mantine-primary-color-outline, var(--mantine-primary-color-filled, var(--likec4-element-stroke)));
1680
1682
  visibility: visible;
1681
1683
  }
1682
- :where([data-likec4-shape="queue"], [data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tkn8 {
1684
+ :where([data-likec4-shape="queue"], [data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tkn7 {
1683
1685
  stroke-width: 10;
1684
1686
  }
1685
- :where([data-mantine-color-scheme='light']) ._1b6tkn8 {
1686
- --_1b6tkn7: color-mix(in srgb, var(--likec4-element-fill) 60%, var(--likec4-element-loContrast));
1687
+ :where([data-mantine-color-scheme='light']) ._1b6tkn7 {
1688
+ --_1b6tkn6: color-mix(in srgb, var(--likec4-element-fill) 50%, #3c3c3c);
1687
1689
  }
1688
- ._1b6tkn5 ._1b6tkn8 {
1690
+ ._1b6tkn4 ._1b6tkn7 {
1689
1691
  visibility: hidden;
1690
1692
  display: none;
1691
1693
  }
1692
- ._1b6tkn9 {
1694
+ ._1b6tkn8 {
1693
1695
  fill: var(--likec4-element-fill);
1694
1696
  }
1695
- ._1b6tkna {
1697
+ ._1b6tkn9 {
1696
1698
  fill: var(--likec4-element-stroke);
1697
1699
  }
1698
- ._1b6tknb {
1700
+ ._1b6tkna {
1699
1701
  fill: var(--_1b6tkn0);
1700
1702
  }
1701
- ._1b6tknc {
1703
+ ._1b6tkne {
1702
1704
  flex: 0 0 auto;
1703
1705
  font-family: var(--likec4-element-font-family);
1704
1706
  font-optical-sizing: auto;
1705
1707
  font-style: normal;
1706
- text-align: center;
1708
+ text-align: var(--_1b6tknc);
1707
1709
  font-weight: 500;
1708
- font-size: calc(1.21875rem * var(--mantine-scale));
1709
- line-height: 1.2;
1710
+ font-size: 19px;
1711
+ line-height: 1.15;
1710
1712
  text-wrap: balance;
1711
1713
  color: var(--likec4-element-hiContrast);
1712
1714
  }
1713
- ._1b6tknd {
1715
+ ._1b6tknf {
1714
1716
  flex: 0 1 auto;
1715
1717
  font-family: var(--likec4-element-font-family);
1716
1718
  font-optical-sizing: auto;
1717
1719
  font-style: normal;
1718
1720
  font-weight: 400;
1719
- font-size: calc(0.875rem * var(--mantine-scale));
1720
- line-height: 1.25;
1721
- text-align: center;
1721
+ font-size: 14px;
1722
+ line-height: 1.2;
1723
+ text-align: var(--_1b6tknc);
1722
1724
  text-wrap: pretty;
1723
1725
  color: var(--likec4-element-loContrast);
1724
1726
  white-space-collapse: preserve-breaks;
1725
1727
  text-overflow: ellipsis;
1726
1728
  overflow: hidden;
1727
1729
  }
1728
- ._1b6tkne {
1730
+ :where(._1b6tknb) ._1b6tknf {
1731
+ text-wrap: wrap;
1732
+ }
1733
+ ._1b6tkng {
1729
1734
  flex: 0 0 auto;
1730
1735
  font-family: var(--likec4-element-font-family);
1731
1736
  font-optical-sizing: auto;
1732
1737
  font-style: normal;
1733
1738
  font-weight: 400;
1734
- font-size: calc(0.75rem * var(--mantine-scale));
1739
+ font-size: 12px;
1735
1740
  line-height: 1.125;
1736
- text-align: center;
1741
+ text-align: var(--_1b6tknc);
1737
1742
  text-wrap: balance;
1738
1743
  opacity: 0.92;
1739
1744
  color: var(--likec4-element-loContrast);
1740
1745
  }
1741
- ._1b6tkn2:hover ._1b6tkne {
1746
+ ._1b6tkn1:hover ._1b6tkng {
1742
1747
  opacity: 1;
1743
1748
  }
1744
- ._1b6tknf {
1745
- --_1b6tkn1: calc(1.5rem * var(--mantine-scale));
1749
+ ._1b6tknh {
1750
+ --_1b6tknd: 48px;
1746
1751
  flex: 1;
1747
- padding: var(--_1b6tkn1);
1752
+ height: fit-content;
1753
+ display: flex;
1754
+ align-items: center;
1755
+ justify-content: center;
1756
+ flex-direction: row;
1757
+ padding: calc(1.5rem * var(--mantine-scale));
1758
+ overflow: hidden;
1759
+ gap: calc(0.625rem * var(--mantine-scale));
1760
+ }
1761
+ :where([data-likec4-shape="queue"], [data-likec4-shape="mobile"]) ._1b6tknh {
1762
+ padding-left: 40px;
1763
+ padding-right: 20px;
1764
+ }
1765
+ :where([data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tknh {
1766
+ padding-top: 30px;
1767
+ }
1768
+ :where([data-likec4-shape="browser"]) ._1b6tknh {
1769
+ padding-top: 32px;
1770
+ padding-bottom: 28px;
1771
+ }
1772
+ ._1b6tknh:is(._1b6tknb) {
1773
+ padding-right: 20px;
1774
+ }
1775
+ ._1b6tkn1:not(:is([data-likec4-shape="queue"],[data-likec4-shape="mobile"])) ._1b6tknh:is(._1b6tknb) {
1776
+ padding-left: 20px;
1777
+ }
1778
+ ._1b6tknh:has(._1b6tknf, ._1b6tkng) {
1779
+ --_1b6tknd: 60px;
1780
+ align-items: flex-start;
1781
+ gap: calc(1rem * var(--mantine-scale));
1782
+ }
1783
+ ._1b6tkni {
1784
+ --_1b6tknc: center;
1785
+ height: fit-content;
1786
+ width: max-content;
1748
1787
  display: flex;
1749
1788
  flex-direction: column;
1750
1789
  align-items: stretch;
1751
1790
  justify-content: center;
1791
+ flex-wrap: nowrap;
1752
1792
  overflow: hidden;
1753
1793
  gap: calc(0.5rem * var(--mantine-scale));
1754
1794
  }
1755
- ._1b6tknf:has(._1b6tknd):has(._1b6tkne) {
1795
+ ._1b6tkni:has(._1b6tknf):has(._1b6tkng) {
1756
1796
  gap: calc(0.375rem * var(--mantine-scale));
1757
1797
  }
1758
- :where([data-likec4-shape="queue"], [data-likec4-shape="mobile"]) ._1b6tknf {
1759
- padding-left: calc(2.5rem * var(--mantine-scale));
1760
- padding-right: calc(1.25rem * var(--mantine-scale));
1761
- }
1762
- :where([data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tknf {
1763
- padding-top: calc(2.125rem * var(--mantine-scale));
1764
- }
1765
- :where([data-likec4-shape="browser"]) ._1b6tknf {
1766
- padding-top: calc(2rem * var(--mantine-scale));
1767
- padding-bottom: calc(1.75rem * var(--mantine-scale));
1798
+ :where(._1b6tknb) ._1b6tkni {
1799
+ --_1b6tknc: left;
1800
+ min-width: calc(100% - 160px);
1801
+ align-items: flex-start;
1768
1802
  }
1769
- ._1b6tkni {
1770
- --_1b6tknh: calc(var(--_1b6tkng) - 12px);
1771
- flex: 0 1 var(--_1b6tknh);
1772
- max-height: var(--_1b6tknh);
1773
- position: relative;
1774
- user-select: none;
1775
- pointer-events: none;
1776
- overflow: visible;
1803
+ ._1b6tknj {
1804
+ flex: 0 0 var(--_1b6tknd);
1805
+ height: var(--_1b6tknd);
1806
+ width: var(--_1b6tknd);
1807
+ display: flex;
1808
+ align-items: center;
1809
+ justify-content: center;
1777
1810
  mix-blend-mode: hard-light;
1778
1811
  }
1779
- ._1b6tkni img {
1780
- position: absolute;
1781
- left: 0;
1782
- bottom: 4px;
1812
+ ._1b6tknj svg, ._1b6tknj img {
1783
1813
  width: 100%;
1784
1814
  height: auto;
1815
+ max-height: 100%;
1816
+ pointer-events: none;
1817
+ filter:
1818
+ drop-shadow(0 0 3px rgb(0 0 0 / 12%))
1819
+ drop-shadow(0 1px 8px rgb(0 0 0 / 8%))
1820
+ drop-shadow(1px 1px 16px rgb(0 0 0 / 3%))
1821
+ ;
1822
+ }
1823
+ ._1b6tknj img {
1785
1824
  object-fit: contain;
1786
- max-height: var(--_1b6tkng);
1787
1825
  }
1788
- ._1b6tknk {
1789
- --_1b6tknj:
1826
+ ._1b6tknl {
1827
+ top: 0;
1828
+ left: 0;
1829
+ position: absolute;
1830
+ pointer-events: none;
1831
+ transform-origin: 50% 50%;
1832
+ fill: var(--likec4-element-fill);
1833
+ stroke: none;
1834
+ z-index: -1;
1835
+ transition: opacity 500ms ease-out;
1836
+ transform: translate(8px,10px);
1837
+ opacity: 0.5;
1838
+ }
1839
+ :where(.react-flow__node.selected, .react-flow__node:focus-visible, ._1b6tkn1:focus-visible) ._1b6tknl {
1840
+ visibility: hidden;
1841
+ }
1842
+ :where([data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) ._1b6tknl {
1843
+ transform: translate(8px,8px);
1844
+ }
1845
+ :where([data-likec4-shape="queue"]) ._1b6tknl {
1846
+ transform: translate(-10px,8px);
1847
+ }
1848
+ :where([data-hovered="true"]) ._1b6tknl {
1849
+ transition: opacity 300ms ease-in;
1850
+ opacity: 0.2;
1851
+ }
1852
+ ._1b6tknm {
1853
+ --_1b6tknk:
1790
1854
  drop-shadow(0 2px 1px rgba(0, 0, 0, 0.21))
1791
1855
  drop-shadow(0 1px 1px color-mix(in srgb, var(--likec4-element-stroke) 40%, transparent))
1792
1856
  drop-shadow(0 5px 3px rgba(0, 0, 0, 0.1))
1793
1857
  ;
1794
- top: 0px;
1795
- left: 0px;
1858
+ top: 0;
1859
+ left: 0;
1796
1860
  position: absolute;
1797
1861
  pointer-events: none;
1798
1862
  fill: var(--likec4-element-fill);
1799
1863
  stroke: var(--likec4-element-stroke);
1800
1864
  overflow: visible;
1801
- filter: var(--_1b6tknj);
1865
+ filter: var(--_1b6tknk);
1802
1866
  transition: filter 300ms ease-out;
1803
1867
  transition-delay: 0ms;
1804
1868
  z-index: -1;
1805
1869
  }
1806
- :where(.react-flow__node.selected, .react-flow__node:focus-visible, ._1b6tkn2:focus-visible) ._1b6tknk {
1807
- --_1b6tknj: none;
1870
+ :where(.react-flow__node.selected, .react-flow__node:focus-visible, ._1b6tkn1:focus-visible) ._1b6tknm {
1871
+ --_1b6tknk: none;
1808
1872
  }
1809
- ._1b6tknl {
1873
+ ._1b6tknn {
1810
1874
  --ai-bg: color-mix(in srgb , var(--likec4-element-fill), transparent 99%);
1811
1875
  --ai-bg-hover: color-mix(in srgb , var(--likec4-element-fill) 65%, var(--likec4-element-stroke));
1812
1876
  --ai-hover: color-mix(in srgb , var(--likec4-element-fill) 50%, var(--likec4-element-stroke));
@@ -1824,28 +1888,28 @@ svg.react-flow__connectionline {
1824
1888
  transition-delay: 0ms;
1825
1889
  background-color: var(--ai-bg);
1826
1890
  }
1827
- ._1b6tknl:hover {
1891
+ ._1b6tknn:hover {
1828
1892
  box-shadow: var(--mantine-shadow-lg);
1829
1893
  transform: translate(-50%, 0) scale(1.35);
1830
1894
  opacity: 1;
1831
1895
  transition-delay: 0;
1832
1896
  }
1833
- ._1b6tknl:active {
1897
+ ._1b6tknn:active {
1834
1898
  transform: translate(-50%, 0) scale(1.02);
1835
1899
  opacity: 1;
1836
1900
  transition-delay: 0;
1837
1901
  }
1838
- :where([data-likec4-shape='browser']) ._1b6tknl {
1902
+ :where([data-likec4-shape='browser']) ._1b6tknn {
1839
1903
  bottom: 3px;
1840
1904
  }
1841
- :where(.react-flow__node:not(.dragging) ._1b6tkn2:hover) ._1b6tknl:not(:hover) {
1905
+ :where(.react-flow__node:not(.dragging) ._1b6tkn1:hover) ._1b6tknn:not(:hover) {
1842
1906
  --ai-bg: var(--ai-bg-hover);
1843
1907
  box-shadow: var(--mantine-shadow-lg);
1844
1908
  transform: translate(-50%, 0) scale(1.185);
1845
1909
  opacity: 1;
1846
1910
  transition-delay: 250ms;
1847
1911
  }
1848
- ._1b6tknl svg.icon {
1912
+ ._1b6tknn svg.icon {
1849
1913
  width: 65%;
1850
1914
  height: 65%;
1851
1915
  stroke-width: 1.5;
@@ -1,5 +1,10 @@
1
1
  import { ElementShape } from '@likec4/core';
2
2
 
3
+ export declare function cylinderSVGPath(diameter: number, height: number, tilt?: number): {
4
+ path: string;
5
+ ry: number;
6
+ rx: number;
7
+ };
3
8
  type ElementShapeSvgProps = {
4
9
  shape: ElementShape;
5
10
  w: number;
@@ -7,11 +7,13 @@ export declare const indicator: string;
7
7
  export declare const fillElementFill: string;
8
8
  export declare const fillElementStroke: string;
9
9
  export declare const fillMixStroke: string;
10
+ export declare const hasIcon: string;
10
11
  export declare const title: string;
11
12
  export declare const description: string;
12
13
  export declare const technology: string;
13
- export declare const element: string;
14
- export declare const iconOffsetY: `var(--${string})` | `var(--${string}, ${string})` | `var(--${string}, ${number})`;
14
+ export declare const elementDataContainer: string;
15
+ export declare const elementTextData: string;
15
16
  export declare const elementIcon: string;
17
+ export declare const cssShapeSvgMultiple: string;
16
18
  export declare const cssShapeSvg: string;
17
19
  export declare const cssNavigateBtn: string;