@likec4/diagram 1.27.1 → 1.27.3

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 (123) hide show
  1. package/bundle/index.js +2152 -6757
  2. package/dist/LikeC4Diagram.js +1 -1
  3. package/dist/LikeC4Diagram.props.d.ts +5 -3
  4. package/dist/StaticLikeC4Diagram.js +1 -1
  5. package/dist/_virtual/set.js +5 -0
  6. package/dist/_virtual/set2.js +3 -0
  7. package/dist/base/BaseXYFlow.d.ts +2 -1
  8. package/dist/base/primitives/compound/CompoundNodeContainer.d.ts +1 -1
  9. package/dist/base/primitives/compound/CompoundNodeContainer.js +0 -1
  10. package/dist/base/primitives/edge/EdgeLabelContainer.js +3 -2
  11. package/dist/base/primitives/element/ElementActionButtons.js +8 -11
  12. package/dist/base/primitives/element/ElementNodeContainer.css.js +4 -4
  13. package/dist/base/updateEdges.js +1 -9
  14. package/dist/base/updateNodes.js +1 -12
  15. package/dist/bundle/LikeC4View.js +2 -2
  16. package/dist/bundle/LikeC4View.props.d.ts +7 -7
  17. package/dist/hooks/useCurrentViewId.js +8 -2
  18. package/dist/hooks/useDiagram.d.ts +1522 -685
  19. package/dist/hooks/useDiagram.js +21 -24
  20. package/dist/likec4diagram/DiagramXYFlow.js +6 -6
  21. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +3 -3
  22. package/dist/likec4diagram/ui/notation/NotationPanel.js +10 -4
  23. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/set.js +369 -0
  24. package/dist/overlays/Overlays.js +3 -1
  25. package/dist/overlays/element-details/actor.d.ts +2769 -173
  26. package/dist/overlays/overlay/Overlay.css.d.ts +26 -2
  27. package/dist/overlays/overlay/Overlay.css.js +66 -18
  28. package/dist/overlays/overlay/Overlay.d.ts +7 -6
  29. package/dist/overlays/overlay/Overlay.js +12 -10
  30. package/dist/overlays/overlaysActor.js +2 -2
  31. package/dist/overlays/relationship-details/RelationshipDetails.js +113 -70
  32. package/dist/overlays/relationship-details/SelectEdge.d.ts +1 -1
  33. package/dist/overlays/relationship-details/SelectEdge.js +15 -9
  34. package/dist/overlays/relationship-details/_types.d.ts +4 -1
  35. package/dist/overlays/relationship-details/actor.d.ts +425 -128
  36. package/dist/overlays/relationship-details/actor.js +157 -53
  37. package/dist/overlays/relationship-details/compute.d.ts +12 -0
  38. package/dist/overlays/relationship-details/compute.js +139 -0
  39. package/dist/overlays/relationship-details/custom/ElementActions.js +27 -5
  40. package/dist/overlays/relationship-details/custom/edgeTypes.js +1 -1
  41. package/dist/overlays/relationship-details/custom/nodeTypes.d.ts +2 -1
  42. package/dist/overlays/relationship-details/hooks.d.ts +336 -6
  43. package/dist/overlays/relationship-details/hooks.js +11 -12
  44. package/dist/overlays/relationship-details/layout-to-xyflow.d.ts +12 -0
  45. package/dist/overlays/relationship-details/layout-to-xyflow.js +145 -0
  46. package/dist/overlays/relationship-details/layout.d.ts +22 -0
  47. package/dist/overlays/relationship-details/layout.js +314 -0
  48. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +3 -1
  49. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +2 -2
  50. package/dist/overlays/relationships-browser/_types.d.ts +2 -0
  51. package/dist/overlays/relationships-browser/actor.d.ts +130 -14
  52. package/dist/overlays/relationships-browser/actor.js +30 -16
  53. package/dist/overlays/relationships-browser/custom/ElementActions.js +5 -3
  54. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +3 -1
  55. package/dist/overlays/relationships-browser/custom/edgeTypes.js +1 -1
  56. package/dist/overlays/relationships-browser/hooks.d.ts +3 -1
  57. package/dist/overlays/relationships-browser/hooks.js +6 -9
  58. package/dist/overlays/relationships-browser/{-useRelationshipsView.d.ts → layout.d.ts} +3 -1
  59. package/dist/overlays/relationships-browser/{-useRelationshipsView.js → layout.js} +21 -8
  60. package/dist/overlays/relationships-browser/useViewToNodesEdges.d.ts +1 -1
  61. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +3 -1
  62. package/dist/packages/core/src/compute-view/relationships-view/compute.js +1 -1
  63. package/dist/packages/core/src/model/connection/model/ConnectionModel.js +121 -0
  64. package/dist/packages/core/src/model/connection/model/find.js +39 -0
  65. package/dist/packages/core/src/model/connection/ops.js +7 -0
  66. package/dist/packages/core/src/utils/const.js +3 -0
  67. package/dist/packages/core/src/utils/fqn.js +9 -1
  68. package/dist/packages/core/src/utils/iterable/find.js +21 -0
  69. package/dist/packages/core/src/utils/iterable/some.js +21 -0
  70. package/dist/packages/core/src/utils/set.js +48 -0
  71. package/dist/packages/core/src/utils/string-hash.js +13 -0
  72. package/dist/state/diagram-machine.d.ts +1552 -703
  73. package/dist/state/diagram-machine.js +39 -3
  74. package/dist/state/syncManualLayoutActor.d.ts +1 -1
  75. package/dist/styles.css.js +1 -1
  76. package/dist/utils/index.d.ts +0 -1
  77. package/package.json +11 -11
  78. package/src/LikeC4Diagram.props.ts +7 -3
  79. package/src/LikeC4Diagram.tsx +1 -1
  80. package/src/StaticLikeC4Diagram.tsx +1 -1
  81. package/src/base/BaseXYFlow.tsx +2 -1
  82. package/src/base/primitives/compound/CompoundNodeContainer.tsx +0 -2
  83. package/src/base/primitives/edge/EdgeLabelContainer.tsx +7 -5
  84. package/src/base/primitives/element/ElementActionButtons.tsx +10 -11
  85. package/src/base/primitives/element/ElementNodeContainer.css.ts +4 -4
  86. package/src/base/updateEdges.ts +8 -8
  87. package/src/base/updateNodes.ts +11 -11
  88. package/src/bundle/LikeC4View.props.ts +7 -7
  89. package/src/bundle/LikeC4View.tsx +2 -2
  90. package/src/hooks/useCurrentViewId.ts +4 -2
  91. package/src/hooks/useDiagram.ts +22 -24
  92. package/src/likec4diagram/DiagramXYFlow.tsx +6 -6
  93. package/src/likec4diagram/ui/notation/NotationPanel.css.ts +2 -2
  94. package/src/likec4diagram/ui/notation/NotationPanel.tsx +8 -6
  95. package/src/overlays/Overlays.tsx +4 -2
  96. package/src/overlays/overlay/Overlay.css.ts +67 -17
  97. package/src/overlays/overlay/Overlay.tsx +27 -24
  98. package/src/overlays/overlaysActor.ts +1 -1
  99. package/src/overlays/relationship-details/RelationshipDetails.tsx +131 -68
  100. package/src/overlays/relationship-details/SelectEdge.tsx +19 -12
  101. package/src/overlays/relationship-details/_types.ts +3 -1
  102. package/src/overlays/relationship-details/actor.ts +212 -68
  103. package/src/overlays/relationship-details/compute.ts +186 -0
  104. package/src/overlays/relationship-details/custom/ElementActions.tsx +27 -18
  105. package/src/overlays/relationship-details/custom/edgeTypes.tsx +1 -1
  106. package/src/overlays/relationship-details/hooks.ts +12 -13
  107. package/src/overlays/relationship-details/layout-to-xyflow.ts +172 -0
  108. package/src/overlays/relationship-details/layout.ts +470 -0
  109. package/src/overlays/relationships-browser/RelationshipsBrowser.tsx +2 -2
  110. package/src/overlays/relationships-browser/_types.ts +2 -0
  111. package/src/overlays/relationships-browser/actor.ts +39 -14
  112. package/src/overlays/relationships-browser/custom/ElementActions.tsx +5 -3
  113. package/src/overlays/relationships-browser/custom/edgeTypes.tsx +1 -1
  114. package/src/overlays/relationships-browser/hooks.ts +7 -10
  115. package/src/overlays/relationships-browser/{-useRelationshipsView.ts → layout.ts} +26 -33
  116. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +3 -1
  117. package/src/state/diagram-machine.ts +51 -6
  118. package/src/utils/index.ts +0 -1
  119. package/dist/overlays/relationship-details/useLayoutedDetails.d.ts +0 -19
  120. package/dist/overlays/relationship-details/useLayoutedDetails.js +0 -267
  121. package/dist/utils/types.d.ts +0 -8
  122. package/src/overlays/relationship-details/useLayoutedDetails.ts +0 -376
  123. package/src/utils/types.ts +0 -6
@@ -30,7 +30,7 @@ function LikeC4Diagram({
30
30
  view,
31
31
  className,
32
32
  fitView = true,
33
- fitViewPadding = 0,
33
+ fitViewPadding = "8px",
34
34
  readonly = true,
35
35
  pannable = true,
36
36
  zoomable = true,
@@ -27,6 +27,8 @@ export type ChangeEvent = {
27
27
  export type OnChange = (event: ChangeEvent) => void;
28
28
  export type LikeC4ColorScheme = 'light' | 'dark';
29
29
  export type OverrideReactFlowProps = Pick<XYFlowProps, 'paneClickDistance' | 'nodeClickDistance' | 'selectionKeyCode' | 'panActivationKeyCode' | 'multiSelectionKeyCode' | 'zoomActivationKeyCode' | 'snapToGrid' | 'snapGrid' | 'onlyRenderVisibleElements' | 'nodesDraggable' | 'nodesFocusable' | 'elementsSelectable' | 'selectNodesOnDrag' | 'panOnDrag' | 'preventScrolling' | 'zoomOnScroll' | 'zoomOnPinch' | 'panOnScroll' | 'panOnScrollSpeed' | 'panOnScrollMode' | 'zoomOnDoubleClick' | 'nodeDragThreshold'>;
30
+ export type PaddingUnit = 'px' | '%';
31
+ export type PaddingWithUnit = `${number}${PaddingUnit}` | number;
30
32
  export interface LikeC4DiagramProperties {
31
33
  view: DiagramView;
32
34
  className?: string | undefined;
@@ -57,10 +59,10 @@ export interface LikeC4DiagramProperties {
57
59
  */
58
60
  fitView?: boolean | undefined;
59
61
  /**
60
- * Seems like this is percentage of the view size
61
- * @default 0
62
+ * Padding around the diagram
63
+ * @default '8px'
62
64
  */
63
- fitViewPadding?: number | undefined;
65
+ fitViewPadding?: PaddingWithUnit | undefined;
64
66
  /**
65
67
  * @default false if readonly
66
68
  */
@@ -4,7 +4,7 @@ import { LikeC4Diagram } from './LikeC4Diagram.js';
4
4
  function StaticLikeC4Diagram({
5
5
  view,
6
6
  fitView = true,
7
- fitViewPadding = 0,
7
+ fitViewPadding = "8px",
8
8
  enableElementDetails = false,
9
9
  enableRelationshipDetails = false,
10
10
  enableRelationshipBrowser = enableRelationshipDetails,
@@ -0,0 +1,5 @@
1
+ import { __require as requireSet } from '../node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/set.js';
2
+
3
+ var setExports = /*@__PURE__*/ requireSet();
4
+
5
+ export { setExports as s };
@@ -0,0 +1,3 @@
1
+ var set = {};
2
+
3
+ export { set as __exports };
@@ -1,5 +1,6 @@
1
1
  import { ReactFlowProps } from '@xyflow/react';
2
2
  import { SetRequired, Simplify } from 'type-fest';
3
+ import { PaddingWithUnit } from '../LikeC4Diagram.props';
3
4
  import { XYBackground } from './Background';
4
5
  import { Base } from './types';
5
6
  export type BaseXYFlowProps<NodeType extends Base.Node, EdgeType extends Base.Edge> = Simplify<{
@@ -8,7 +9,7 @@ export type BaseXYFlowProps<NodeType extends Base.Node, EdgeType extends Base.Ed
8
9
  nodesSelectable?: boolean;
9
10
  nodesDraggable?: boolean;
10
11
  background?: 'transparent' | 'solid' | XYBackground;
11
- fitViewPadding?: number;
12
+ fitViewPadding?: PaddingWithUnit | undefined;
12
13
  onViewportResize?: undefined | (() => void);
13
14
  } & SetRequired<Omit<ReactFlowProps<NodeType, EdgeType>, 'defaultNodes' | 'defaultEdges' | 'onNodeDoubleClick' | 'onEdgeDoubleClick' | 'fitViewOptions'>, 'nodes' | 'edges' | 'onNodesChange' | 'onEdgesChange'>>;
14
15
  export declare const BaseXYFlow: <NodeType extends Base.Node, EdgeType extends Base.Edge>({ nodes, edges, onEdgesChange, onNodesChange, className, pannable, zoomable, nodesSelectable, nodesDraggable, background, children, colorMode, fitViewPadding, fitView, zoomOnDoubleClick, onViewportResize, onMoveEnd, ...props }: BaseXYFlowProps<NodeType, EdgeType>) => import("react/jsx-runtime").JSX.Element;
@@ -2,7 +2,7 @@ import { DiagramNode } from '@likec4/core';
2
2
  import { HTMLMotionProps } from 'framer-motion';
3
3
  import { PropsWithChildren } from 'react';
4
4
  import { NodeProps } from '../../types';
5
- type RequiredData = Pick<DiagramNode, 'color' | 'depth' | 'shape' | 'style'>;
5
+ type RequiredData = Pick<DiagramNode, 'color' | 'depth' | 'style'>;
6
6
  type CompoundNodeContainerProps = Omit<HTMLMotionProps<'div'>, 'children'> & PropsWithChildren<{
7
7
  nodeProps: NodeProps<RequiredData>;
8
8
  }>;
@@ -54,7 +54,6 @@ function CompoundNodeContainer({
54
54
  "data-likec4-hovered": isHovered,
55
55
  "data-likec4-color": data.color,
56
56
  "data-compound-depth": depth,
57
- "data-likec4-shape": data.shape,
58
57
  ...isTransparent && {
59
58
  "data-compound-transparent": true,
60
59
  "data-compound-title-inverse": opacity < 0.5
@@ -74,9 +74,10 @@ function EdgeLabelContainer({
74
74
  children: /* @__PURE__ */ jsx(
75
75
  "div",
76
76
  {
77
- className: css({
77
+ style: {
78
78
  display: "contents"
79
- }),
79
+ },
80
+ // Work around to keep same global selector data-likec4-dimmed
80
81
  ...isDimmed !== false && {
81
82
  "data-likec4-dimmed": isDimmed
82
83
  },
@@ -56,22 +56,19 @@ function ElementActionButtons({
56
56
  "data-likec4-hovered": isHovered,
57
57
  className: cx("nodrag nopan", actionButtons),
58
58
  children: buttons.map((button, index) => /* @__PURE__ */ jsx(
59
- m.div,
59
+ ActionIcon,
60
60
  {
61
+ component: m.button,
62
+ layout: true,
63
+ className: actionBtn({}),
61
64
  initial: false,
62
65
  whileTap: { scale: 1 },
63
66
  whileHover: {
64
- scale: 1.35
67
+ scale: 1.3
65
68
  },
66
- children: /* @__PURE__ */ jsx(
67
- ActionIcon,
68
- {
69
- className: actionBtn({}),
70
- onClick: button.onClick,
71
- onDoubleClick: stopPropagation,
72
- children: button.icon
73
- }
74
- )
69
+ onClick: button.onClick,
70
+ onDoubleClick: stopPropagation,
71
+ children: button.icon
75
72
  },
76
73
  `action-button-${id}-${button.key ?? index}`
77
74
  ))
@@ -10,12 +10,12 @@ const container = css({
10
10
  alignItems: "center",
11
11
  justifyContent: "center",
12
12
  pointerEvents: "none",
13
- _after: {
13
+ _before: {
14
14
  content: '" "',
15
15
  position: "absolute",
16
- top: "100%",
16
+ top: "calc(100% - 4px)",
17
17
  left: 0,
18
- right: 0,
18
+ width: "100%",
19
19
  height: "24px",
20
20
  background: "[transparent]",
21
21
  pointerEvents: "all"
@@ -39,7 +39,7 @@ const container = css({
39
39
  // // filter: `grayscale(0.85) ${fallbackVar(vars.safariAnimationHook, 'blur(2px)')}`,
40
40
  // },
41
41
  _reduceGraphicsOnPan: {
42
- _after: {
42
+ _before: {
43
43
  display: "none"
44
44
  }
45
45
  },
@@ -1,5 +1,5 @@
1
1
  import { deepEqual } from 'fast-equals';
2
- import { isDefined, omit } from 'remeda';
2
+ import { isDefined } from 'remeda';
3
3
 
4
4
  function _update(current, update) {
5
5
  return update.map((next) => {
@@ -8,14 +8,6 @@ function _update(current, update) {
8
8
  if (deepEqual(existing.hidden ?? false, next.hidden ?? false) && deepEqual(existing.source, next.source) && deepEqual(existing.sourceHandle ?? null, next.sourceHandle ?? null) && deepEqual(existing.target, next.target) && deepEqual(existing.targetHandle ?? null, next.targetHandle ?? null) && deepEqual(existing.zIndex ?? 0, next.zIndex ?? 0) && deepEqual(existing.data, next.data)) {
9
9
  return existing;
10
10
  }
11
- return {
12
- ...omit(existing, ["hidden", "zIndex"]),
13
- ...next,
14
- data: {
15
- ...existing.data,
16
- ...next.data
17
- }
18
- };
19
11
  }
20
12
  return next;
21
13
  });
@@ -1,6 +1,6 @@
1
1
  import { getNodeDimensions } from '@xyflow/system';
2
2
  import { deepEqual } from 'fast-equals';
3
- import { isDefined, omit } from 'remeda';
3
+ import { isDefined } from 'remeda';
4
4
 
5
5
  function _update(current, updated) {
6
6
  return updated.map((update) => {
@@ -10,17 +10,6 @@ function _update(current, updated) {
10
10
  if (deepEqual(existing.type, update.type) && deepEqual(existingWidth, update.initialWidth) && deepEqual(existingHeight, update.initialHeight) && deepEqual(existing.parentId ?? null, update.parentId ?? null) && deepEqual(existing.hidden ?? false, update.hidden ?? false) && deepEqual(existing.zIndex ?? 0, update.zIndex ?? 0) && deepEqual(existing.position, update.position) && deepEqual(existing.data, update.data)) {
11
11
  return existing;
12
12
  }
13
- return {
14
- ...omit(existing, ["measured", "parentId", "hidden", "zIndex"]),
15
- ...update,
16
- // Force dimensions from update
17
- width: update.initialWidth,
18
- height: update.initialHeight,
19
- data: {
20
- ...existing.data,
21
- ...update.data
22
- }
23
- };
24
13
  }
25
14
  return update;
26
15
  });
@@ -40,7 +40,7 @@ const LikeC4ViewInner = memo(({
40
40
  injectFontCss = true,
41
41
  controls = false,
42
42
  fitView = true,
43
- fitViewPadding = 0.1,
43
+ fitViewPadding = "8px",
44
44
  background = "transparent",
45
45
  browser = true,
46
46
  showDiagramTitle = false,
@@ -147,7 +147,7 @@ const LikeC4ViewInner = memo(({
147
147
  controls: true,
148
148
  readonly: true,
149
149
  fitView: true,
150
- fitViewPadding,
150
+ fitViewPadding: "16px",
151
151
  ...props,
152
152
  ...browserProps,
153
153
  showNotations: (browserProps.showNotations ?? true) && (browserView.notation?.elements.length ?? 0) > 0
@@ -1,6 +1,6 @@
1
1
  import { WhereOperator } from '@likec4/core';
2
2
  import { CSSProperties } from 'react';
3
- import { ElementIconRenderer, OverrideReactFlowProps } from '../LikeC4Diagram.props';
3
+ import { ElementIconRenderer, OverrideReactFlowProps, PaddingWithUnit } from '../LikeC4Diagram.props';
4
4
  export interface LikeC4ViewProps<ViewId = string, Tag = string, Kind = string> {
5
5
  /**
6
6
  * View to display.
@@ -55,10 +55,10 @@ export interface LikeC4ViewProps<ViewId = string, Tag = string, Kind = string> {
55
55
  */
56
56
  fitView?: boolean | undefined;
57
57
  /**
58
- * Seems like this is percentage of the view size
59
- * @default 0.1
58
+ * Padding around the diagram
59
+ * @default '8px'
60
60
  */
61
- fitViewPadding?: number | undefined;
61
+ fitViewPadding?: PaddingWithUnit | undefined;
62
62
  /**
63
63
  * Display diagram title / description
64
64
  *
@@ -135,10 +135,10 @@ export interface LikeC4BrowserProps {
135
135
  */
136
136
  background?: 'dots' | 'lines' | 'cross' | 'transparent' | 'solid' | undefined;
137
137
  /**
138
- * Seems like this is percentage of the view size
139
- * @default 0.1
138
+ * Padding around the diagram
139
+ * @default '16px'
140
140
  */
141
- fitViewPadding?: number | undefined;
141
+ fitViewPadding?: PaddingWithUnit | undefined;
142
142
  /**
143
143
  * Show/hide panel with top left controls,
144
144
  * @default true
@@ -1,8 +1,14 @@
1
- import { useDiagramActorSnapshot } from './useDiagram.js';
1
+ import { useSelector } from '@xstate/react';
2
+ import '@likec4/core';
3
+ import '@mantine/hooks';
4
+ import 'fast-equals';
5
+ import 'react';
6
+ import { useDiagramActorRef } from './safeContext.js';
2
7
 
3
8
  const selectViewId = (s) => s.context.view.id;
4
9
  function useCurrentViewId() {
5
- return useDiagramActorSnapshot(selectViewId);
10
+ const actorRef = useDiagramActorRef();
11
+ return useSelector(actorRef, selectViewId);
6
12
  }
7
13
 
8
14
  export { useCurrentViewId };