@likec4/diagram 1.29.1 → 1.31.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 (266) hide show
  1. package/README.md +324 -5
  2. package/bundle/chunk-BBzMXzCg.js +21383 -0
  3. package/bundle/custom.js +62 -0
  4. package/bundle/index.js +17459 -38163
  5. package/dist/LikeC4CustomColors.js +2 -2
  6. package/dist/LikeC4Diagram.d.ts +1 -1
  7. package/dist/LikeC4Diagram.js +4 -2
  8. package/dist/LikeC4Diagram.props.d.ts +6 -1
  9. package/dist/LikeC4ModelProvider.d.ts +3 -3
  10. package/dist/LikeC4ModelProvider.js +0 -1
  11. package/dist/StaticLikeC4Diagram.d.ts +1 -1
  12. package/dist/base/BaseXYFlow.js +3 -3
  13. package/dist/base/primitives/compound/CompoundActionButton.d.ts +3 -2
  14. package/dist/base/primitives/compound/CompoundDetailsButton.d.ts +3 -2
  15. package/dist/base/primitives/compound/CompoundNodeContainer.d.ts +7 -3
  16. package/dist/base/primitives/compound/CompoundNodeContainer.js +3 -2
  17. package/dist/base/primitives/customEdge.d.ts +2 -35
  18. package/dist/base/primitives/customEdge.js +2 -2
  19. package/dist/base/primitives/customNode.d.ts +2 -2
  20. package/dist/base/primitives/customNode.js +9 -2
  21. package/dist/base/primitives/edge/EdgeContainer.js +0 -1
  22. package/dist/base/primitives/edge/EdgeLabel.js +0 -1
  23. package/dist/base/primitives/edge/EdgeLabelContainer.js +0 -2
  24. package/dist/base/primitives/edge/EdgePath.js +2 -2
  25. package/dist/base/primitives/element/ElementNodeContainer.d.ts +24 -22
  26. package/dist/base/primitives/element/ElementNodeContainer.js +66 -68
  27. package/dist/base/primitives/element/ElementShape.d.ts +8 -4
  28. package/dist/base/primitives/element/ElementShape.js +4 -3
  29. package/dist/base/primitives/element/ElementTitle.css.d.ts +1 -1
  30. package/dist/base/primitives/element/ElementTitle.js +0 -1
  31. package/dist/base/types.d.ts +5 -5
  32. package/dist/bundle/LikeC4View.js +6 -3
  33. package/dist/bundle/LikeC4View.props.d.ts +5 -1
  34. package/dist/bundle/ReactLikeC4.js +1 -2
  35. package/dist/bundle/ShadowRoot.js +3 -3
  36. package/dist/bundle/custom.d.ts +1 -0
  37. package/dist/bundle/index.d.ts +3 -1
  38. package/dist/bundle/index.js +9 -0
  39. package/dist/bundle/styles.css.js +5 -5
  40. package/dist/components/SearchControl.js +2 -2
  41. package/dist/context/ControlsCustomLayout.js +0 -1
  42. package/dist/context/DiagramEventHandlers.js +5 -5
  43. package/dist/context/DiagramFeatures.d.ts +2 -4
  44. package/dist/context/DiagramFeatures.js +15 -16
  45. package/dist/context/EnsureMantine.js +9 -4
  46. package/dist/context/FramerMotionConfig.js +0 -1
  47. package/dist/context/IconRenderer.js +7 -7
  48. package/dist/context/ReduceGraphics.js +6 -6
  49. package/dist/context/RootContainer.js +5 -5
  50. package/dist/context/index.d.ts +1 -1
  51. package/dist/custom/components.d.ts +5 -0
  52. package/dist/custom/customNodes.d.ts +218 -0
  53. package/dist/custom/hooks.d.ts +10 -0
  54. package/dist/custom/index.d.ts +4 -0
  55. package/dist/hooks/safeContext.js +3 -3
  56. package/dist/hooks/useCurrentViewId.d.ts +5 -1
  57. package/dist/hooks/useCurrentViewId.js +1 -2
  58. package/dist/hooks/useDiagram.d.ts +14 -12544
  59. package/dist/hooks/useDiagram.js +3 -5
  60. package/dist/hooks/useMantinePortalProps.js +2 -2
  61. package/dist/hooks/useSetState.js +3 -3
  62. package/dist/hooks/useUpdateEffect.js +0 -1
  63. package/dist/hooks/useXYFlow.d.ts +64 -64
  64. package/dist/hooks/useXYFlow.js +2 -2
  65. package/dist/index.d.ts +2 -4
  66. package/dist/index.js +8 -3
  67. package/dist/likec4diagram/DiagramUI.js +2 -2
  68. package/dist/likec4diagram/DiagramXYFlow.d.ts +1 -1
  69. package/dist/likec4diagram/DiagramXYFlow.js +25 -7
  70. package/dist/likec4diagram/custom/edges/NotePopover.js +2 -2
  71. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +9 -13
  72. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +8 -8
  73. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +14 -12
  74. package/dist/likec4diagram/custom/index.d.ts +15 -19
  75. package/dist/likec4diagram/custom/index.js +3 -3
  76. package/dist/likec4diagram/custom/nodes/CompoundActions.js +2 -2
  77. package/dist/likec4diagram/custom/nodes/ElementActions.d.ts +27 -4
  78. package/dist/likec4diagram/custom/nodes/ElementActions.js +67 -53
  79. package/dist/likec4diagram/custom/nodes/index.d.ts +8 -0
  80. package/dist/likec4diagram/custom/nodes/nodes.d.ts +10 -0
  81. package/dist/likec4diagram/custom/nodes/{nodeTypes.js → nodes.js} +39 -39
  82. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +2 -2
  83. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +6 -7
  84. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +3 -3
  85. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.d.ts +3 -2
  86. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +2 -2
  87. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +2 -2
  88. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +2 -2
  89. package/dist/likec4diagram/types.d.ts +15 -7
  90. package/dist/likec4diagram/ui/controls/ChangeAutoLayoutButton.js +4 -4
  91. package/dist/likec4diagram/ui/controls/Controls.js +2 -2
  92. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.js +2 -2
  93. package/dist/likec4diagram/ui/notation/NotationPanel.js +6 -8
  94. package/dist/likec4diagram/ui/search/ElementsColumn.js +6 -7
  95. package/dist/likec4diagram/ui/search/LikeC4Search.js +3 -3
  96. package/dist/likec4diagram/ui/search/SearchInput.js +0 -1
  97. package/dist/likec4diagram/ui/search/_shared.css.d.ts +1 -1
  98. package/dist/likec4diagram/ui/search/state.js +3 -4
  99. package/dist/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.js +4 -4
  100. package/dist/likec4diagram/useLayoutConstraints.js +3 -4
  101. package/dist/likec4diagram/useViewToNodesEdges.js +2 -0
  102. package/dist/likec4model/LikeC4ModelContext.d.ts +2 -2
  103. package/dist/likec4model/LikeC4ModelContext.js +2 -2
  104. package/dist/likec4model/useLikeC4ElementsTree.d.ts +1 -1
  105. package/dist/likec4model/useLikeC4ElementsTree.js +3 -3
  106. package/dist/likec4model/useLikeC4Model.d.ts +1 -1
  107. package/dist/likec4model/useLikeC4Model.js +2 -2
  108. package/dist/overlays/Overlays.d.ts +2 -3
  109. package/dist/overlays/Overlays.js +5 -6
  110. package/dist/overlays/element-details/ElementDetailsCard.css.js +13 -9
  111. package/dist/overlays/element-details/ElementDetailsCard.js +98 -105
  112. package/dist/overlays/element-details/TabPanelDeployments.js +4 -4
  113. package/dist/overlays/element-details/TabPanelRelationships.js +2 -2
  114. package/dist/overlays/element-details/TabPanelStructure.js +3 -3
  115. package/dist/overlays/element-details/actor.d.ts +6905 -19690
  116. package/dist/overlays/element-details/actor.js +0 -2
  117. package/dist/overlays/element-details/actorContext.js +3 -3
  118. package/dist/overlays/overlay/Overlay.d.ts +11 -1
  119. package/dist/overlays/overlay/Overlay.js +8 -8
  120. package/dist/overlays/overlaysActor.d.ts +4 -2
  121. package/dist/overlays/overlaysActor.js +2 -1
  122. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +4 -8
  123. package/dist/overlays/relationship-details/RelationshipDetails.js +12 -12
  124. package/dist/overlays/relationship-details/SelectEdge.js +2 -3
  125. package/dist/overlays/relationship-details/_types.d.ts +6 -5
  126. package/dist/overlays/relationship-details/actor.d.ts +3 -3
  127. package/dist/overlays/relationship-details/compute.js +3 -3
  128. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +4 -8
  129. package/dist/overlays/relationship-details/custom/edgeTypes.js +2 -2
  130. package/dist/overlays/relationship-details/custom/nodeTypes.d.ts +3 -31
  131. package/dist/overlays/relationship-details/hooks.d.ts +27 -27
  132. package/dist/overlays/relationship-details/hooks.js +4 -4
  133. package/dist/overlays/relationship-details/layout.js +2 -3
  134. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +4 -8
  135. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +8 -8
  136. package/dist/overlays/relationships-browser/SelectElement.js +5 -5
  137. package/dist/overlays/relationships-browser/_types.d.ts +6 -5
  138. package/dist/overlays/relationships-browser/actor.d.ts +63 -428
  139. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +4 -8
  140. package/dist/overlays/relationships-browser/custom/edgeTypes.js +2 -2
  141. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +10 -14
  142. package/dist/overlays/relationships-browser/custom/nodeTypes.js +1 -2
  143. package/dist/overlays/relationships-browser/hooks.d.ts +4 -61
  144. package/dist/overlays/relationships-browser/hooks.js +4 -4
  145. package/dist/overlays/relationships-browser/layout.js +3 -4
  146. package/dist/state/DiagramActorProvider.js +3 -3
  147. package/dist/state/diagram-machine.d.ts +186 -10369
  148. package/dist/state/diagram-machine.js +2 -1
  149. package/dist/state/hotkeyActor.d.ts +4 -2
  150. package/dist/state/syncManualLayoutActor.d.ts +14 -3
  151. package/dist/state/syncManualLayoutActor.js +2 -1
  152. package/dist/state/types.d.ts +5 -4
  153. package/dist/state/utils.d.ts +1 -1
  154. package/dist/styles-font.css +1 -0
  155. package/dist/styles-min.css +1 -0
  156. package/dist/styles-xyflow.css +1 -0
  157. package/dist/styles.css +1 -0
  158. package/dist/styles.css2.js +3 -0
  159. package/package.json +46 -21
  160. package/panda.buildinfo.json +979 -0
  161. package/src/LikeC4Diagram.props.ts +7 -1
  162. package/src/LikeC4Diagram.tsx +2 -0
  163. package/src/LikeC4ModelProvider.tsx +3 -3
  164. package/src/StaticLikeC4Diagram.tsx +1 -0
  165. package/src/base/Background.tsx +0 -4
  166. package/src/base/primitives/compound/CompoundActionButton.tsx +7 -4
  167. package/src/base/primitives/compound/CompoundDetailsButton.tsx +7 -4
  168. package/src/base/primitives/compound/CompoundNodeContainer.tsx +8 -7
  169. package/src/base/primitives/customEdge.ts +1 -1
  170. package/src/base/primitives/{customNode.ts → customNode.tsx} +11 -3
  171. package/src/base/primitives/element/ElementNodeContainer.tsx +87 -80
  172. package/src/base/primitives/element/ElementShape.tsx +11 -10
  173. package/src/base/types.ts +28 -33
  174. package/src/bundle/LikeC4View.props.ts +6 -1
  175. package/src/bundle/LikeC4View.tsx +3 -0
  176. package/src/bundle/ReactLikeC4.tsx +1 -1
  177. package/src/bundle/custom.ts +1 -0
  178. package/src/bundle/index.ts +20 -1
  179. package/src/bundle/styles.css.ts +1 -1
  180. package/src/components/SearchControl.tsx +1 -1
  181. package/src/context/DiagramFeatures.tsx +12 -8
  182. package/src/context/EnsureMantine.tsx +13 -3
  183. package/src/context/IconRenderer.tsx +4 -2
  184. package/src/context/ReduceGraphics.tsx +6 -6
  185. package/src/context/index.ts +0 -1
  186. package/src/custom/components.ts +47 -0
  187. package/src/custom/customNodes.tsx +244 -0
  188. package/src/custom/hooks.ts +35 -0
  189. package/src/custom/index.ts +5 -0
  190. package/src/hooks/useCurrentViewId.ts +9 -1
  191. package/src/hooks/useDiagram.ts +30 -9
  192. package/src/index.ts +4 -8
  193. package/src/likec4diagram/DiagramXYFlow.tsx +28 -5
  194. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +1 -1
  195. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +9 -7
  196. package/src/likec4diagram/custom/{index.tsx → index.ts} +2 -2
  197. package/src/likec4diagram/custom/nodes/CompoundActions.tsx +2 -2
  198. package/src/likec4diagram/custom/nodes/ElementActions.tsx +100 -57
  199. package/src/likec4diagram/custom/nodes/index.ts +17 -0
  200. package/src/likec4diagram/custom/nodes/{nodeTypes.tsx → nodes.tsx} +52 -36
  201. package/src/likec4diagram/custom/nodes/toolbar/CompoundToolbar.tsx +3 -4
  202. package/src/likec4diagram/custom/nodes/toolbar/ElementToolbar.tsx +3 -3
  203. package/src/likec4diagram/custom/nodes/toolbar/Toolbar.tsx +5 -4
  204. package/src/likec4diagram/types.ts +19 -9
  205. package/src/likec4diagram/ui/diagram-title/DiagramTitlePanel.tsx +1 -1
  206. package/src/likec4diagram/ui/notation/NotationPanel.tsx +1 -2
  207. package/src/likec4diagram/ui/search/ElementsColumn.tsx +2 -4
  208. package/src/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.tsx +1 -1
  209. package/src/likec4diagram/useViewToNodesEdges.ts +2 -0
  210. package/src/likec4model/LikeC4ModelContext.ts +2 -2
  211. package/src/likec4model/useLikeC4ElementsTree.ts +3 -1
  212. package/src/likec4model/useLikeC4Model.ts +1 -1
  213. package/src/overlays/Overlays.tsx +2 -3
  214. package/src/overlays/element-details/ElementDetailsCard.css.ts +14 -22
  215. package/src/overlays/element-details/ElementDetailsCard.tsx +18 -16
  216. package/src/overlays/overlay/Overlay.tsx +3 -4
  217. package/src/overlays/overlaysActor.ts +4 -3
  218. package/src/overlays/relationship-details/RelationshipDetails.tsx +1 -1
  219. package/src/overlays/relationship-details/SelectEdge.tsx +0 -2
  220. package/src/overlays/relationship-details/_types.ts +16 -13
  221. package/src/overlays/relationship-details/custom/edgeTypes.tsx +2 -2
  222. package/src/overlays/relationships-browser/_types.ts +18 -15
  223. package/src/overlays/relationships-browser/actor.ts +2 -2
  224. package/src/overlays/relationships-browser/custom/edgeTypes.tsx +2 -2
  225. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +1 -2
  226. package/src/state/DiagramActorProvider.tsx +2 -2
  227. package/src/state/diagram-machine.ts +13 -8
  228. package/src/state/hotkeyActor.ts +4 -2
  229. package/src/state/syncManualLayoutActor.ts +9 -3
  230. package/src/state/types.ts +9 -3
  231. package/src/state/utils.ts +3 -3
  232. package/src/styles-min.css +2 -0
  233. package/src/styles-xyflow.css +1 -0
  234. package/dist/_virtual/_commonjsHelpers.js +0 -5
  235. package/dist/_virtual/default-map.js +0 -7
  236. package/dist/_virtual/index.js +0 -5
  237. package/dist/_virtual/index2.js +0 -3
  238. package/dist/_virtual/react.production.js +0 -3
  239. package/dist/_virtual/set.js +0 -5
  240. package/dist/_virtual/set2.js +0 -3
  241. package/dist/base/xyflowMachine.d.ts +0 -212
  242. package/dist/likec4diagram/custom/nodes/nodeTypes.d.ts +0 -8
  243. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/default-map.js +0 -172
  244. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/set.js +0 -369
  245. package/dist/node_modules/.pnpm/react@19.1.0/node_modules/react/cjs/react.production.js +0 -556
  246. package/dist/node_modules/.pnpm/react@19.1.0/node_modules/react/index.js +0 -15
  247. package/dist/packages/core/src/compute-view/relationships-view/compute.js +0 -123
  248. package/dist/packages/core/src/compute-view/relationships-view/utils.js +0 -68
  249. package/dist/packages/core/src/errors/index.js +0 -15
  250. package/dist/packages/core/src/model/connection/model/ConnectionModel.js +0 -121
  251. package/dist/packages/core/src/model/connection/model/find.js +0 -39
  252. package/dist/packages/core/src/model/connection/ops.js +0 -7
  253. package/dist/packages/core/src/utils/const.js +0 -3
  254. package/dist/packages/core/src/utils/fqn.js +0 -51
  255. package/dist/packages/core/src/utils/guards.js +0 -7
  256. package/dist/packages/core/src/utils/iterable/filter.js +0 -21
  257. package/dist/packages/core/src/utils/iterable/find.js +0 -21
  258. package/dist/packages/core/src/utils/iterable/map.js +0 -18
  259. package/dist/packages/core/src/utils/iterable/some.js +0 -21
  260. package/dist/packages/core/src/utils/iterable/to.js +0 -14
  261. package/dist/packages/core/src/utils/set.js +0 -48
  262. package/dist/packages/core/src/utils/string-hash.js +0 -13
  263. package/dist/styles.css.js +0 -3
  264. package/src/base/xyflowMachine.ts +0 -75
  265. /package/dist/{bundle/font.css.js → styles-font.css2.js} +0 -0
  266. /package/src/{bundle/font.css → styles-font.css} +0 -0
@@ -11,8 +11,9 @@ import type {
11
11
  import type { ReactFlowProps as XYFlowProps } from '@xyflow/react'
12
12
  import type { MouseEvent as ReactMouseEvent, ReactNode } from 'react'
13
13
  import type { ControlsCustomLayout } from './context/ControlsCustomLayout'
14
+ import type { CustomNodes } from './custom/customNodes'
14
15
 
15
- export type { WhereOperator }
16
+ export type { CustomNodes, WhereOperator }
16
17
 
17
18
  export type DiagramNodeWithNavigate<ID = ViewId> = Omit<DiagramNode, 'navigateTo'> & {
18
19
  navigateTo: ID
@@ -222,6 +223,11 @@ export interface LikeC4DiagramProperties {
222
223
  */
223
224
  renderControls?: ControlsCustomLayout | undefined
224
225
 
226
+ /**
227
+ * Override node renderers
228
+ */
229
+ renderNodes?: CustomNodes | undefined
230
+
225
231
  /**
226
232
  * Dynamic filter, applies both to nodes and edges
227
233
  */
@@ -59,6 +59,7 @@ export function LikeC4Diagram({
59
59
  renderControls,
60
60
  where,
61
61
  reactFlowProps = {},
62
+ renderNodes,
62
63
  children,
63
64
  }: LikeC4DiagramProps) {
64
65
  const hasLikec4model = !!useLikeC4Model()
@@ -149,6 +150,7 @@ export function LikeC4Diagram({
149
150
  nodesSelectable={nodesSelectable}
150
151
  background={background}
151
152
  reactFlowProps={reactFlowProps}
153
+ renderNodes={renderNodes}
152
154
  >
153
155
  {children}
154
156
  </LikeC4DiagramXYFlow>
@@ -1,9 +1,9 @@
1
- import type { LikeC4Model } from '@likec4/core'
1
+ import type { AnyAux, LikeC4Model } from '@likec4/core/model'
2
2
  import { type PropsWithChildren } from 'react'
3
3
  import { LikeC4ModelContext } from './likec4model/LikeC4ModelContext'
4
4
 
5
5
  export type LikeC4ModelProviderProps = PropsWithChildren<{
6
- likec4model: LikeC4Model
6
+ likec4model: LikeC4Model<AnyAux>
7
7
  }>
8
8
 
9
9
  /**
@@ -11,7 +11,7 @@ export type LikeC4ModelProviderProps = PropsWithChildren<{
11
11
  */
12
12
  export function LikeC4ModelProvider({
13
13
  children,
14
- likec4model
14
+ likec4model,
15
15
  }: LikeC4ModelProviderProps) {
16
16
  return (
17
17
  <LikeC4ModelContext.Provider value={likec4model}>
@@ -15,6 +15,7 @@ export type StaticLikeC4DiagramProps = Pick<
15
15
  | 'initialWidth'
16
16
  | 'initialHeight'
17
17
  | 'renderIcon'
18
+ | 'renderNodes'
18
19
  | 'where'
19
20
  >
20
21
 
@@ -1,14 +1,10 @@
1
1
  import { nonexhaustive } from '@likec4/core'
2
2
  import { type BackgroundProps, Background as XYFlowBackground, BackgroundVariant } from '@xyflow/react'
3
- import type { OverrideProperties } from 'type-fest'
4
3
 
5
4
  export type XYBackgroundVariant = 'dots' | 'lines' | 'cross'
6
5
  export type XYBackground =
7
6
  | XYBackgroundVariant
8
7
  | BackgroundProps
9
- // | OverrideProperties<BackgroundProps, {
10
- // variant: XYBackgroundVariant
11
- // }>
12
8
 
13
9
  export type XYBackgroundProps = {
14
10
  background: XYBackground
@@ -4,14 +4,17 @@ import { ActionIcon, Box } from '@mantine/core'
4
4
  import { useDebouncedValue } from '@mantine/hooks'
5
5
  import { IconZoomScan } from '@tabler/icons-react'
6
6
  import * as m from 'motion/react-m'
7
+ import type { Simplify } from 'type-fest'
7
8
  import { stopPropagation } from '../../../utils/xyflow'
8
9
  import type { NodeProps } from '../../types'
9
10
  import { compoundActionBtn } from './actionbtns.css'
10
11
 
11
- type CompoundActionButtonProps = NodeProps & {
12
- icon?: React.ReactNode
13
- onClick: (e: React.MouseEvent) => void
14
- }
12
+ type CompoundActionButtonProps = Simplify<
13
+ NodeProps<{}> & {
14
+ icon?: React.ReactNode
15
+ onClick: (e: React.MouseEvent) => void
16
+ }
17
+ >
15
18
 
16
19
  export function CompoundActionButton({
17
20
  data: {
@@ -4,14 +4,17 @@ import { ActionIcon, Box } from '@mantine/core'
4
4
  import { useDebouncedValue } from '@mantine/hooks'
5
5
  import { IconId } from '@tabler/icons-react'
6
6
  import * as m from 'motion/react-m'
7
+ import type { Simplify } from 'type-fest'
7
8
  import { stopPropagation } from '../../../utils/xyflow'
8
9
  import type { NodeProps } from '../../types'
9
10
  import { compoundActionBtn } from './actionbtns.css'
10
11
 
11
- type CompoundDetailsButtonProps = NodeProps & {
12
- icon?: React.ReactNode
13
- onClick: (e: React.MouseEvent) => void
14
- }
12
+ type CompoundDetailsButtonProps = Simplify<
13
+ NodeProps<{}> & {
14
+ icon?: React.ReactNode
15
+ onClick: (e: React.MouseEvent) => void
16
+ }
17
+ >
15
18
 
16
19
  export function CompoundDetailsButton({
17
20
  data: {
@@ -1,4 +1,4 @@
1
- import type { DiagramNode } from '@likec4/core'
1
+ import type { Color, ElementStyle } from '@likec4/core/types'
2
2
  import { css, cx } from '@likec4/styles/css'
3
3
  import { type HTMLMotionProps, m } from 'motion/react'
4
4
  import { type PropsWithChildren } from 'react'
@@ -7,12 +7,11 @@ import { useIsReducedGraphics } from '../../../hooks/useReducedGraphics'
7
7
  import type { NodeProps } from '../../types'
8
8
  import * as styles from './CompoundNodeContainer.css'
9
9
 
10
- type RequiredData = Pick<
11
- DiagramNode,
12
- | 'color'
13
- | 'depth'
14
- | 'style'
15
- >
10
+ export type RequiredData = {
11
+ color: Color
12
+ depth: number
13
+ style: ElementStyle
14
+ }
16
15
 
17
16
  type CompoundNodeContainerProps =
18
17
  & Omit<HTMLMotionProps<'div'>, 'children'>
@@ -29,6 +28,7 @@ export function CompoundNodeContainer({
29
28
  ...data
30
29
  },
31
30
  },
31
+ className,
32
32
  children,
33
33
  style,
34
34
  ...rest
@@ -67,6 +67,7 @@ export function CompoundNodeContainer({
67
67
  }),
68
68
  classes.root,
69
69
  'likec4-compound-node',
70
+ className,
70
71
  )}
71
72
  initial={false}
72
73
  data-likec4-hovered={isHovered}
@@ -29,6 +29,6 @@ export const edgePropsEqual = <P extends Record<string, unknown> = Base.EdgeData
29
29
 
30
30
  export function customEdge<P extends Record<string, unknown> = Base.NodeData>(
31
31
  Edge: FunctionComponent<EdgeProps<P>>,
32
- ) {
32
+ ): FunctionComponent<EdgeProps<P>> {
33
33
  return memo(Edge, edgePropsEqual)
34
34
  }
@@ -1,6 +1,7 @@
1
1
  import { deepEqual as eq } from 'fast-equals'
2
2
  import { type FunctionComponent, memo } from 'react'
3
3
  import type { Base, NodeProps } from '../types'
4
+ import { DefaultHandles } from './NodeHandles'
4
5
 
5
6
  export const nodePropsEqual = <P extends Record<string, unknown> = Base.NodeData>(
6
7
  prev: NodeProps<P>,
@@ -18,8 +19,15 @@ export const nodePropsEqual = <P extends Record<string, unknown> = Base.NodeData
18
19
  && eq(prev.data, next.data)
19
20
  )
20
21
 
21
- export function customNode<P extends Record<string, unknown> = Base.NodeData>(
22
- Node: FunctionComponent<NodeProps<P>>,
22
+ export function customNode<P extends Record<string, unknown> = {}, NodeType extends string = string>(
23
+ Node: FunctionComponent<NodeProps<P, NodeType>>,
23
24
  ) {
24
- return memo(Node, nodePropsEqual)
25
+ const NodeComponent = memo((props: NodeProps<P, NodeType>) => (
26
+ <>
27
+ <Node {...props} />
28
+ <DefaultHandles />
29
+ </>
30
+ ), nodePropsEqual)
31
+ NodeComponent.displayName = 'Node'
32
+ return NodeComponent
25
33
  }
@@ -1,29 +1,33 @@
1
1
  import {
2
- type DiagramNode,
2
+ type Color,
3
+ type ElementShape,
3
4
  type ElementStyle,
4
5
  DefaultPaddingSize,
5
6
  DefaultShapeSize,
6
7
  DefaultTextSize,
7
- } from '@likec4/core'
8
+ } from '@likec4/core/types'
8
9
  import { css, cx } from '@likec4/styles/css'
9
- import { type BoxProps, Box, createPolymorphicComponent } from '@mantine/core'
10
+ import type { LayoutProps } from 'motion/react'
10
11
  import * as m from 'motion/react-m'
11
- import { type PropsWithChildren, forwardRef } from 'react'
12
+ import { type CSSProperties, type ReactNode, forwardRef } from 'react'
12
13
  import type { NodeProps } from '../../types'
13
14
  import * as styles from './ElementNodeContainer.css'
14
15
 
15
- type RequiredData = Pick<
16
- DiagramNode,
17
- | 'color'
18
- | 'shape'
19
- | 'style'
20
- >
16
+ export type RequiredData = {
17
+ color: Color
18
+ shape: ElementShape
19
+ style?: ElementStyle
20
+ }
21
21
 
22
- type ElementNodeContainerProps =
23
- & BoxProps
24
- & PropsWithChildren<{
22
+ export type ElementNodeContainerProps =
23
+ & {
25
24
  nodeProps: NodeProps<RequiredData>
26
- }>
25
+ children?: ReactNode | undefined
26
+ className?: string | undefined
27
+ style?: CSSProperties | undefined
28
+ [key: `data-${string}`]: string | undefined
29
+ }
30
+ & LayoutProps
27
31
 
28
32
  export function nodeSizes({
29
33
  size,
@@ -49,73 +53,76 @@ export function nodeSizes({
49
53
  }
50
54
  }
51
55
 
52
- export const ElementNodeContainer = createPolymorphicComponent<'div', ElementNodeContainerProps>(
53
- forwardRef<HTMLDivElement, ElementNodeContainerProps>(({
54
- nodeProps: {
55
- selected = false,
56
- selectable = false,
57
- data: {
58
- hovered: isHovered = false,
59
- dimmed: isDimmed = false,
60
- ...data
61
- },
56
+ /**
57
+ * Top-level primitive to compose leaf nodes renderers.
58
+ * This container provides the state via data-* attributes
59
+ */
60
+ export const ElementNodeContainer = forwardRef<HTMLDivElement, ElementNodeContainerProps>(({
61
+ nodeProps: {
62
+ selected = false,
63
+ selectable = false,
64
+ data: {
65
+ hovered: isHovered = false,
66
+ dimmed: isDimmed = false,
67
+ ...data
62
68
  },
63
- style,
64
- children,
65
- ...rest
66
- }, ref) => {
67
- let scale = 1
68
- switch (true) {
69
- case isHovered:
70
- scale = 1.05
71
- break
72
- case selected:
73
- scale = 1.02
74
- break
75
- }
69
+ },
70
+ className,
71
+ style,
72
+ children,
73
+ ...rest
74
+ }, ref) => {
75
+ let scale = 1
76
+ switch (true) {
77
+ case isHovered:
78
+ scale = 1.05
79
+ break
80
+ case selected:
81
+ scale = 1.02
82
+ break
83
+ }
76
84
 
77
- const {
78
- size,
79
- padding,
80
- textSize,
81
- } = nodeSizes(data.style)
85
+ const {
86
+ size,
87
+ padding,
88
+ textSize,
89
+ } = nodeSizes(data.style ?? {})
82
90
 
83
- return (
84
- <Box
85
- component={m.div}
86
- ref={ref}
87
- className={cx(
88
- css({
89
- likec4Palette: data.color,
90
- }),
91
- styles.container,
92
- 'group',
93
- 'likec4-element-node',
94
- )}
95
- initial={false}
96
- {...selectable && {
97
- animate: {
98
- scale,
99
- },
100
- whileTap: { scale: 0.98 },
101
- }}
102
- data-likec4-hovered={isHovered}
103
- data-likec4-color={data.color}
104
- data-likec4-shape={data.shape}
105
- data-likec4-shape-size={size}
106
- data-likec4-spacing={padding}
107
- data-likec4-text-size={textSize}
108
- {...(isDimmed !== false && {
109
- 'data-likec4-dimmed': isDimmed,
110
- })}
111
- style={{
112
- ...style,
113
- }}
114
- {...rest}
115
- >
116
- {children}
117
- </Box>
118
- )
119
- }),
120
- )
91
+ return (
92
+ <m.div
93
+ ref={ref}
94
+ className={cx(
95
+ css({
96
+ likec4Palette: data.color,
97
+ }),
98
+ styles.container,
99
+ 'group',
100
+ 'likec4-element-node',
101
+ className,
102
+ )}
103
+ initial={false}
104
+ {...selectable && {
105
+ animate: {
106
+ scale,
107
+ },
108
+ whileTap: { scale: 0.98 },
109
+ }}
110
+ data-likec4-hovered={isHovered}
111
+ data-likec4-color={data.color}
112
+ data-likec4-shape={data.shape}
113
+ data-likec4-shape-size={size}
114
+ data-likec4-spacing={padding}
115
+ data-likec4-text-size={textSize}
116
+ {...(isDimmed !== false && {
117
+ 'data-likec4-dimmed': isDimmed,
118
+ })}
119
+ style={{
120
+ ...style as any,
121
+ }}
122
+ {...rest}
123
+ >
124
+ {children}
125
+ </m.div>
126
+ )
127
+ })
121
128
  ElementNodeContainer.displayName = 'ElementNodeContainer'
@@ -1,5 +1,5 @@
1
- import { type DiagramNode, type ElementShape, nonexhaustive } from '@likec4/core'
2
- import clsx from 'clsx'
1
+ import { type ElementShape, type ElementStyle, nonexhaustive } from '@likec4/core'
2
+ import { cx as clsx } from '@likec4/styles/css'
3
3
  import { toDomPrecision } from '../../../utils/xyflow'
4
4
  import * as css from './ElementShape.css'
5
5
 
@@ -157,19 +157,19 @@ function ElementShapeSvg({ shape, w, h }: ElementShapeProps) {
157
157
  }
158
158
  }
159
159
 
160
- type Data = Pick<
161
- DiagramNode,
162
- | 'shape'
163
- | 'width'
164
- | 'height'
165
- >
160
+ type Data = {
161
+ shape: ElementShape
162
+ width: number
163
+ height: number
164
+ style?: ElementStyle
165
+ }
166
166
 
167
167
  // type ElementShapePrimitiveProps = NodeProps<Data> & {
168
168
  type ElementShapePrimitiveProps = {
169
169
  data: Data
170
170
  width?: number
171
171
  height?: number
172
- isMultiple?: boolean | undefined
172
+ // isMultiple?: boolean | undefined
173
173
  /**
174
174
  * @default true
175
175
  */
@@ -177,10 +177,11 @@ type ElementShapePrimitiveProps = {
177
177
  }
178
178
 
179
179
  export function ElementShape(
180
- { data, width, height, isMultiple = false, withSelectedIndicator = true }: ElementShapePrimitiveProps,
180
+ { data, width, height, withSelectedIndicator = true }: ElementShapePrimitiveProps,
181
181
  ) {
182
182
  let w = !!width && width > 10 ? width : data.width
183
183
  let h = !!height && height > 10 ? height : data.height
184
+ const isMultiple = data.style?.multiple ?? false
184
185
  return (
185
186
  <>
186
187
  {isMultiple && (
package/src/base/types.ts CHANGED
@@ -40,8 +40,8 @@ export type NonOptional<T extends object, Keys extends OptionalKeysOf<T> = Optio
40
40
  /**
41
41
  * ReactFlow Custom Node properties with BaseNodeData at least
42
42
  */
43
- export type NodeProps<T extends Record<string, unknown> = {}> = ReactFlowNodeProps<
44
- RFNode<Base.NodeData & T, any>
43
+ export type NodeProps<T extends Record<string, unknown> = {}, NodeType extends string = string> = ReactFlowNodeProps<
44
+ RFNode<Base.NodeData & T, NodeType>
45
45
  >
46
46
 
47
47
  /**
@@ -68,41 +68,36 @@ export namespace Base {
68
68
  // 'immediate' means that the node is dimmed without delay
69
69
  export type Dimmed = 'immediate' | boolean
70
70
 
71
- export type NodeData<Data extends Record<string, unknown> = {}> = Simplify<
72
- Data & {
73
- /**
74
- * Whether the cursor is hovering over the node
75
- */
76
- hovered?: boolean
77
- /**
78
- * Whether the node is dimmed
79
- * 'immediate' means that the node is dimmed without delay
80
- */
81
- dimmed?: Dimmed
82
- }
83
- >
84
-
71
+ export type NodeData = {
72
+ /**
73
+ * Whether the cursor is hovering over the node
74
+ */
75
+ hovered?: boolean
76
+ /**
77
+ * Whether the node is dimmed
78
+ * 'immediate' means that the node is dimmed without delay
79
+ */
80
+ dimmed?: Dimmed
81
+ }
85
82
  export type Node = RFNode<NodeData>
86
83
 
87
84
  export type NodeProps = ReactFlowNodeProps<RFNode<Base.NodeData, any>>
88
85
 
89
- export type EdgeData<Data extends Record<string, unknown> = {}> = Simplify<
90
- Data & {
91
- /**
92
- * Whether the cursor is hovering over the edge
93
- */
94
- hovered?: boolean
95
- /**
96
- * Whether the edge is active (animated and highlighted)
97
- */
98
- active?: boolean
99
- /**
100
- * Whether the edge is dimmed
101
- * 'immediate' means that the edge is dimmed without delay
102
- */
103
- dimmed?: Dimmed
104
- }
105
- >
86
+ export type EdgeData = {
87
+ /**
88
+ * Whether the cursor is hovering over the edge
89
+ */
90
+ hovered?: boolean
91
+ /**
92
+ * Whether the edge is active (animated and highlighted)
93
+ */
94
+ active?: boolean
95
+ /**
96
+ * Whether the edge is dimmed
97
+ * 'immediate' means that the edge is dimmed without delay
98
+ */
99
+ dimmed?: Dimmed
100
+ }
106
101
 
107
102
  // export type Edge = SetRequired<ReactFlowEdge<EdgeData, 'relation'>, 'data' | 'type'>
108
103
  export type Edge = SetRequired<RFEdge<EdgeData>, 'data'>
@@ -1,6 +1,6 @@
1
1
  import type { WhereOperator } from '@likec4/core'
2
2
  import type { CSSProperties } from 'react'
3
- import type { ElementIconRenderer, OverrideReactFlowProps, PaddingWithUnit } from '../LikeC4Diagram.props'
3
+ import type { CustomNodes, ElementIconRenderer, OverrideReactFlowProps, PaddingWithUnit } from '../LikeC4Diagram.props'
4
4
 
5
5
  export interface LikeC4ViewProps<ViewId = string, Tag = string, Kind = string> {
6
6
  /**
@@ -148,6 +148,11 @@ export interface LikeC4ViewProps<ViewId = string, Tag = string, Kind = string> {
148
148
  /** Function to generate nonce attribute added to all generated `<style />` tags */
149
149
  styleNonce?: string | (() => string) | undefined
150
150
 
151
+ /**
152
+ * Override node renderers
153
+ */
154
+ renderNodes?: CustomNodes | undefined
155
+
151
156
  /**
152
157
  * Render custom icon for a node
153
158
  * By default, if icon is http:// or https://, it will be rendered as an image
@@ -77,6 +77,7 @@ const LikeC4ViewInner = memo<LikeC4ViewInnerProps>(({
77
77
  styleNonce,
78
78
  style,
79
79
  reactFlowProps = {},
80
+ renderNodes,
80
81
  ...props
81
82
  }) => {
82
83
  const likec4model = useLikeC4Model(true, 'layouted')
@@ -152,6 +153,7 @@ const LikeC4ViewInner = memo<LikeC4ViewInnerProps>(({
152
153
  onNodeClick: () => onNavigateTo(view.id),
153
154
  }}
154
155
  reactFlowProps={reactFlowProps}
156
+ renderNodes={renderNodes}
155
157
  {...props}
156
158
  />
157
159
  {browserView && (
@@ -170,6 +172,7 @@ const LikeC4ViewInner = memo<LikeC4ViewInnerProps>(({
170
172
  readonly
171
173
  fitView
172
174
  fitViewPadding={'16px'}
175
+ renderNodes={renderNodes}
173
176
  {...props}
174
177
  {...browserProps}
175
178
  showNotations={(browserProps.showNotations ?? true) &&
@@ -145,4 +145,4 @@ function ReactLikeC4Inner({
145
145
  </>
146
146
  )
147
147
  }
148
- ReactLikeC4.displayName = 'GenericReactLikeC4'
148
+ ReactLikeC4.displayName = 'ReactLikeC4'
@@ -0,0 +1 @@
1
+ export * from '../custom'
@@ -1,7 +1,26 @@
1
+ export type {
2
+ ChangeEvent,
3
+ CustomNodes,
4
+ DiagramNodeWithNavigate,
5
+ ElementIconRenderer,
6
+ LikeC4ColorScheme,
7
+ LikeC4DiagramEventHandlers,
8
+ OnCanvasClick,
9
+ OnChange,
10
+ OnEdgeClick,
11
+ OnNavigateTo,
12
+ OnNodeClick,
13
+ OpenSourceParams,
14
+ PaddingUnit,
15
+ PaddingWithUnit,
16
+ WhereOperator,
17
+ } from '../LikeC4Diagram.props'
1
18
  export { LikeC4View } from './LikeC4View'
2
- export type { LikeC4ViewProps } from './LikeC4View.props'
19
+ export type { LikeC4BrowserProps, LikeC4ViewProps } from './LikeC4View.props'
3
20
  export { ReactLikeC4, type ReactLikeC4Props } from './ReactLikeC4'
4
21
 
5
22
  export { LikeC4ModelProvider } from './LikeC4ModelProvider'
6
23
 
7
24
  export { ViewNotFound } from './ViewNotFound'
25
+
26
+ export * from '../custom/hooks'
@@ -10,8 +10,8 @@ import {
10
10
  import { useIsomorphicLayoutEffect } from '@react-hookz/web'
11
11
  import { useState } from 'react'
12
12
  import { first, isFunction, isString } from 'remeda'
13
+ import fontsCss from '../styles-font.css?inline'
13
14
  import inlinedStyles from '../styles.css?inline'
14
- import fontsCss from './font.css?inline'
15
15
 
16
16
  export const DefaultTheme = createTheme({
17
17
  autoContrast: true,
@@ -1,3 +1,4 @@
1
+ import { cx } from '@likec4/styles/css'
1
2
  import {
2
3
  type ElementProps,
3
4
  type UnstyledButtonProps,
@@ -7,7 +8,6 @@ import {
7
8
  } from '@mantine/core'
8
9
  import { IconSearch } from '@tabler/icons-react'
9
10
  import { isMacOs } from '@xyflow/system'
10
- import cx from 'clsx'
11
11
  import * as classes from './SearchControl.css'
12
12
 
13
13
  interface SearchControlProps extends UnstyledButtonProps, ElementProps<'button'> {}