@likec4/diagram 1.31.0 → 1.32.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 (264) hide show
  1. package/bundle/{chunk-BBzMXzCg.js → chunk-BvTQaUYl.js} +1675 -1207
  2. package/bundle/custom.js +50 -47
  3. package/bundle/index.js +2482 -2438
  4. package/dist/LikeC4CustomColors.d.ts +2 -7
  5. package/dist/LikeC4CustomColors.js +17 -6
  6. package/dist/LikeC4Diagram.d.ts +3 -2
  7. package/dist/LikeC4Diagram.js +10 -14
  8. package/dist/LikeC4Diagram.props.d.ts +28 -22
  9. package/dist/LikeC4ModelProvider.d.ts +5 -4
  10. package/dist/StaticLikeC4Diagram.d.ts +3 -2
  11. package/dist/StaticLikeC4Diagram.js +2 -2
  12. package/dist/base/BaseXYFlow.js +5 -5
  13. package/dist/base/const.d.ts +1 -1
  14. package/dist/base/const.js +1 -1
  15. package/dist/base/index.d.ts +2 -1
  16. package/dist/base/primitives/compound/CompoundActionButton.js +2 -1
  17. package/dist/base/primitives/compound/CompoundDetailsButton.js +2 -1
  18. package/dist/base/primitives/compound/CompoundTitle.d.ts +1 -1
  19. package/dist/base/primitives/compound/CompoundTitle.js +2 -1
  20. package/dist/base/primitives/edge/EdgeContainer.d.ts +1 -1
  21. package/dist/base/primitives/edge/EdgeLabel.css.js +1 -0
  22. package/dist/base/primitives/edge/EdgeLabel.d.ts +3 -3
  23. package/dist/base/primitives/edge/EdgeLabel.js +6 -4
  24. package/dist/base/primitives/edge/EdgeLabelContainer.d.ts +1 -1
  25. package/dist/base/primitives/edge/EdgeMarkers.d.ts +1 -1
  26. package/dist/base/primitives/edge/EdgePath.d.ts +1 -1
  27. package/dist/base/primitives/element/ElementActionButtons.js +10 -9
  28. package/dist/base/primitives/element/ElementDetailsButton.js +2 -1
  29. package/dist/base/primitives/element/ElementShape.d.ts +1 -1
  30. package/dist/base/primitives/element/ElementTags.d.ts +14 -0
  31. package/dist/base/primitives/element/ElementTags.js +176 -0
  32. package/dist/base/primitives/element/ElementTitle.d.ts +5 -4
  33. package/dist/base/primitives/element/ElementTitle.js +6 -6
  34. package/dist/base/primitives/index.d.ts +1 -0
  35. package/dist/base/types.Base.d.ts +54 -0
  36. package/dist/base/types.Base.js +48 -0
  37. package/dist/base/types.d.ts +2 -52
  38. package/dist/bundle/LikeC4View.d.ts +2 -1
  39. package/dist/bundle/LikeC4View.js +8 -6
  40. package/dist/bundle/LikeC4View.props.d.ts +15 -4
  41. package/dist/bundle/ReactLikeC4.d.ts +4 -7
  42. package/dist/bundle/ReactLikeC4.js +3 -2
  43. package/dist/bundle/index.js +1 -1
  44. package/dist/components/ErrorFallback.d.ts +2 -0
  45. package/dist/components/ErrorFallback.js +29 -0
  46. package/dist/context/DiagramEventHandlers.d.ts +6 -5
  47. package/dist/context/DiagramFeatures.d.ts +2 -2
  48. package/dist/context/DiagramFeatures.js +3 -31
  49. package/dist/context/EnsureMantine.js +1 -1
  50. package/dist/context/IconRenderer.js +1 -4
  51. package/dist/context/RootContainer.js +5 -1
  52. package/dist/context/TagStylesContext.d.ts +7 -0
  53. package/dist/context/TagStylesContext.js +85 -0
  54. package/dist/custom/components.d.ts +1 -1
  55. package/dist/custom/customNodes.d.ts +27 -17
  56. package/dist/custom/hooks.d.ts +1 -1
  57. package/dist/hooks/index.d.ts +1 -1
  58. package/dist/hooks/useDiagram.d.ts +73 -38
  59. package/dist/hooks/useDiagram.js +7 -3
  60. package/dist/hooks/useMantinePortalProps.d.ts +2 -2
  61. package/dist/hooks/useSearchActor.d.ts +2 -0
  62. package/dist/hooks/useSearchActor.js +10 -0
  63. package/dist/hooks/useUpdateEffect.js +3 -0
  64. package/dist/hooks/useXYFlow.d.ts +39 -37
  65. package/dist/hooks/useXYFlow.js +5 -1
  66. package/dist/index.js +1 -1
  67. package/dist/likec4diagram/DiagramUI.js +7 -2
  68. package/dist/likec4diagram/DiagramXYFlow.d.ts +4 -3
  69. package/dist/likec4diagram/DiagramXYFlow.js +104 -107
  70. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +7 -6
  71. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +8 -0
  72. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +7 -5
  73. package/dist/likec4diagram/custom/index.d.ts +7 -6
  74. package/dist/likec4diagram/custom/nodes/nodes.js +39 -26
  75. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +3 -3
  76. package/dist/likec4diagram/types.d.ts +5 -5
  77. package/dist/likec4diagram/ui/controls/Controls.js +12 -4
  78. package/dist/likec4diagram/ui/notation/NotationPanel.js +1 -1
  79. package/dist/likec4diagram/useViewToNodesEdges.d.ts +5 -3
  80. package/dist/likec4diagram/useViewToNodesEdges.js +20 -30
  81. package/dist/likec4model/LikeC4ModelContext.d.ts +2 -2
  82. package/dist/likec4model/useLikeC4ElementsTree.js +1 -1
  83. package/dist/likec4model/useLikeC4Model.d.ts +22 -10
  84. package/dist/likec4model/useLikeC4Model.js +11 -7
  85. package/dist/overlays/Overlays.js +4 -27
  86. package/dist/overlays/element-details/ElementDetailsCard.d.ts +1 -1
  87. package/dist/overlays/element-details/ElementDetailsCard.js +19 -12
  88. package/dist/overlays/element-details/TabPanelDeployments.d.ts +1 -1
  89. package/dist/overlays/element-details/TabPanelDeployments.js +1 -1
  90. package/dist/overlays/element-details/TabPanelRelationships.d.ts +1 -1
  91. package/dist/overlays/element-details/TabPanelStructure.d.ts +1 -1
  92. package/dist/overlays/element-details/actor.d.ts +288 -286
  93. package/dist/overlays/overlay/Overlay.css.d.ts +57 -2
  94. package/dist/overlays/overlay/Overlay.css.js +76 -39
  95. package/dist/overlays/overlay/Overlay.d.ts +12 -0
  96. package/dist/overlays/overlay/Overlay.js +36 -25
  97. package/dist/overlays/overlaysActor.d.ts +1 -1
  98. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +3 -2
  99. package/dist/overlays/relationship-details/RelationshipDetails.js +3 -3
  100. package/dist/overlays/relationship-details/_types.d.ts +2 -2
  101. package/dist/overlays/relationship-details/actor.js +7 -7
  102. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +3 -2
  103. package/dist/overlays/relationship-details/custom/nodeTypes.js +4 -0
  104. package/dist/overlays/relationship-details/hooks.d.ts +10 -9
  105. package/dist/overlays/relationship-details/layout-to-xyflow.js +1 -0
  106. package/dist/overlays/relationship-details/layout.js +3 -1
  107. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +3 -2
  108. package/dist/overlays/relationships-browser/SelectElement.js +1 -1
  109. package/dist/overlays/relationships-browser/_types.d.ts +2 -2
  110. package/dist/overlays/relationships-browser/actor.d.ts +1 -1
  111. package/dist/overlays/relationships-browser/actor.js +7 -7
  112. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +3 -2
  113. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +8 -5
  114. package/dist/overlays/relationships-browser/custom/nodeTypes.js +4 -0
  115. package/dist/overlays/relationships-browser/layout.d.ts +2 -2
  116. package/dist/overlays/relationships-browser/layout.js +10 -6
  117. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +4 -3
  118. package/dist/search/Search.d.ts +5 -0
  119. package/dist/search/Search.js +192 -0
  120. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.js +0 -1
  121. package/dist/search/components/ElementsColumn.d.ts +2 -0
  122. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.js +21 -19
  123. package/dist/search/components/PickView.d.ts +4 -0
  124. package/dist/search/components/PickView.js +135 -0
  125. package/dist/search/components/SearchByTags.d.ts +1 -0
  126. package/dist/search/components/SearchByTags.js +116 -0
  127. package/dist/search/components/SearchInput.d.ts +2 -0
  128. package/dist/{likec4diagram/ui/search → search/components}/SearchInput.js +53 -34
  129. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.d.ts +3 -2
  130. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.js +14 -13
  131. package/dist/{likec4diagram/ui/search → search/components}/_shared.css.js +26 -35
  132. package/dist/{likec4diagram/ui/search/LikeC4Search.css.d.ts → search/components/styles.css.d.ts} +0 -2
  133. package/dist/search/components/styles.css.js +60 -0
  134. package/dist/{likec4diagram/ui/search → search/components}/utils.d.ts +1 -0
  135. package/dist/{likec4diagram/ui/search → search/components}/utils.js +7 -1
  136. package/dist/search/hooks.d.ts +16 -0
  137. package/dist/search/hooks.js +35 -0
  138. package/dist/search/searchActor.d.ts +90 -0
  139. package/dist/search/searchActor.js +75 -0
  140. package/dist/state/DiagramActorProvider.d.ts +9 -7
  141. package/dist/state/DiagramActorProvider.js +24 -18
  142. package/dist/state/assign.d.ts +0 -1
  143. package/dist/state/assign.js +9 -19
  144. package/dist/state/diagram-machine.d.ts +430 -176
  145. package/dist/state/diagram-machine.js +119 -54
  146. package/dist/state/syncManualLayoutActor.d.ts +2 -2
  147. package/dist/state/types.d.ts +2 -0
  148. package/dist/state/utils.d.ts +2 -0
  149. package/dist/state/utils.js +3 -0
  150. package/dist/styles-min.css +1 -1
  151. package/dist/styles-xyflow.css +1 -1
  152. package/dist/styles.css +1 -1
  153. package/dist/styles.css2.js +1 -1
  154. package/package.json +18 -18
  155. package/panda.buildinfo.json +171 -148
  156. package/src/LikeC4CustomColors.tsx +21 -6
  157. package/src/LikeC4Diagram.props.ts +35 -30
  158. package/src/LikeC4Diagram.tsx +19 -20
  159. package/src/LikeC4ModelProvider.tsx +6 -5
  160. package/src/StaticLikeC4Diagram.tsx +8 -6
  161. package/src/base/const.ts +1 -1
  162. package/src/base/index.ts +2 -1
  163. package/src/base/primitives/compound/CompoundActionButton.tsx +2 -1
  164. package/src/base/primitives/compound/CompoundDetailsButton.tsx +2 -1
  165. package/src/base/primitives/compound/CompoundTitle.tsx +3 -2
  166. package/src/base/primitives/edge/EdgeContainer.tsx +2 -1
  167. package/src/base/primitives/edge/EdgeLabel.css.ts +1 -0
  168. package/src/base/primitives/edge/EdgeLabel.tsx +20 -15
  169. package/src/base/primitives/edge/EdgeLabelContainer.tsx +1 -1
  170. package/src/base/primitives/edge/EdgeMarkers.tsx +2 -1
  171. package/src/base/primitives/edge/EdgePath.tsx +1 -1
  172. package/src/base/primitives/element/ElementActionButtons.tsx +11 -10
  173. package/src/base/primitives/element/ElementDetailsButton.tsx +2 -1
  174. package/src/base/primitives/element/ElementShape.tsx +2 -1
  175. package/src/base/primitives/element/ElementTags.tsx +182 -0
  176. package/src/base/primitives/element/ElementTitle.tsx +21 -15
  177. package/src/base/primitives/index.ts +1 -0
  178. package/src/base/types.Base.ts +104 -0
  179. package/src/base/types.ts +2 -99
  180. package/src/bundle/LikeC4View.props.ts +17 -4
  181. package/src/bundle/LikeC4View.tsx +17 -19
  182. package/src/bundle/ReactLikeC4.tsx +14 -26
  183. package/src/components/ErrorFallback.tsx +30 -0
  184. package/src/context/DiagramEventHandlers.tsx +5 -4
  185. package/src/context/DiagramFeatures.tsx +3 -22
  186. package/src/context/EnsureMantine.tsx +1 -1
  187. package/src/context/IconRenderer.tsx +1 -4
  188. package/src/context/RootContainer.tsx +9 -3
  189. package/src/context/TagStylesContext.tsx +96 -0
  190. package/src/custom/components.ts +2 -0
  191. package/src/custom/customNodes.tsx +24 -14
  192. package/src/custom/hooks.ts +1 -0
  193. package/src/hooks/index.ts +1 -1
  194. package/src/hooks/useCurrentViewId.ts +1 -4
  195. package/src/hooks/useDiagram.ts +104 -12
  196. package/src/hooks/useMantinePortalProps.ts +10 -1
  197. package/src/hooks/useSearchActor.ts +11 -0
  198. package/src/hooks/useUpdateEffect.ts +7 -4
  199. package/src/hooks/useXYFlow.ts +5 -0
  200. package/src/likec4diagram/DiagramUI.tsx +5 -0
  201. package/src/likec4diagram/DiagramXYFlow.tsx +115 -118
  202. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +9 -0
  203. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +10 -9
  204. package/src/likec4diagram/custom/nodes/nodes.tsx +45 -43
  205. package/src/likec4diagram/custom/nodes/toolbar/_shared.tsx +11 -3
  206. package/src/likec4diagram/types.ts +5 -3
  207. package/src/likec4diagram/ui/controls/Controls.tsx +11 -4
  208. package/src/likec4diagram/ui/notation/NotationPanel.tsx +2 -2
  209. package/src/likec4diagram/useViewToNodesEdges.ts +34 -36
  210. package/src/likec4model/LikeC4ModelContext.ts +2 -2
  211. package/src/likec4model/useLikeC4ElementsTree.ts +1 -1
  212. package/src/likec4model/useLikeC4Model.ts +18 -16
  213. package/src/overlays/Overlays.tsx +5 -32
  214. package/src/overlays/element-details/ElementDetailsCard.tsx +25 -18
  215. package/src/overlays/element-details/TabPanelDeployments.tsx +3 -2
  216. package/src/overlays/element-details/TabPanelRelationships.tsx +2 -1
  217. package/src/overlays/element-details/TabPanelStructure.tsx +1 -1
  218. package/src/overlays/element-details/actor.ts +2 -2
  219. package/src/overlays/overlay/Overlay.css.ts +75 -38
  220. package/src/overlays/overlay/Overlay.tsx +43 -26
  221. package/src/overlays/overlaysActor.ts +1 -1
  222. package/src/overlays/relationship-details/RelationshipDetails.tsx +4 -4
  223. package/src/overlays/relationship-details/_types.ts +2 -1
  224. package/src/overlays/relationship-details/custom/nodeTypes.tsx +4 -0
  225. package/src/overlays/relationship-details/layout-to-xyflow.ts +1 -0
  226. package/src/overlays/relationship-details/layout.ts +3 -1
  227. package/src/overlays/relationships-browser/SelectElement.tsx +1 -1
  228. package/src/overlays/relationships-browser/_types.ts +2 -1
  229. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +4 -0
  230. package/src/overlays/relationships-browser/layout.ts +12 -7
  231. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +4 -4
  232. package/src/search/Search.tsx +237 -0
  233. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.css.ts +0 -29
  234. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.tsx +24 -22
  235. package/src/search/components/PickView.tsx +140 -0
  236. package/src/search/components/SearchByTags.tsx +109 -0
  237. package/src/{likec4diagram/ui/search → search/components}/SearchInput.tsx +63 -36
  238. package/src/{likec4diagram/ui/search → search/components}/ViewsColum.tsx +17 -18
  239. package/src/{likec4diagram/ui/search → search/components}/_shared.css.ts +26 -37
  240. package/src/{likec4diagram/ui/search/LikeC4Search.css.ts → search/components/styles.css.ts} +9 -36
  241. package/src/{likec4diagram/ui/search → search/components}/utils.ts +7 -0
  242. package/src/search/hooks.ts +41 -0
  243. package/src/search/searchActor.ts +99 -0
  244. package/src/state/DiagramActorProvider.tsx +36 -25
  245. package/src/state/assign.ts +10 -10
  246. package/src/state/diagram-machine.ts +115 -52
  247. package/src/state/syncManualLayoutActor.ts +1 -1
  248. package/src/state/types.ts +2 -0
  249. package/src/state/utils.ts +4 -0
  250. package/dist/base/types.js +0 -54
  251. package/dist/likec4diagram/ui/search/ElementsColumn.d.ts +0 -1
  252. package/dist/likec4diagram/ui/search/LikeC4Search.css.js +0 -87
  253. package/dist/likec4diagram/ui/search/LikeC4Search.d.ts +0 -2
  254. package/dist/likec4diagram/ui/search/LikeC4Search.js +0 -267
  255. package/dist/likec4diagram/ui/search/SearchInput.d.ts +0 -1
  256. package/dist/likec4diagram/ui/search/state.d.ts +0 -19
  257. package/dist/likec4diagram/ui/search/state.js +0 -63
  258. package/src/likec4diagram/ui/search/LikeC4Search.tsx +0 -301
  259. package/src/likec4diagram/ui/search/state.ts +0 -78
  260. /package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.d.ts +0 -0
  261. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.d.ts +0 -0
  262. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.js +0 -0
  263. /package/dist/{likec4diagram/ui/search → search/components}/_shared.css.d.ts +0 -0
  264. /package/src/{likec4diagram/ui/search → search/components}/ViewsColumn.css.ts +0 -0
@@ -1,21 +1,16 @@
1
- import type { DiagramView, WhereOperator } from '@likec4/core'
2
- import { type CSSProperties } from 'react'
3
- import { ShadowRoot } from './ShadowRoot'
4
-
1
+ import type { Any, DiagramView } from '@likec4/core/types'
2
+ import type * as aux from '@likec4/core/types/aux'
5
3
  import { cx } from '@likec4/styles/css'
4
+ import { type CSSProperties } from 'react'
6
5
  import { isFunction, isString } from 'remeda'
7
6
  import { type LikeC4DiagramProps, LikeC4Diagram } from '../LikeC4Diagram'
8
- import type { OnNavigateTo } from '../LikeC4Diagram.props'
9
7
  import { useLikeC4Model } from '../likec4model/useLikeC4Model'
8
+ import { ShadowRoot } from './ShadowRoot'
10
9
  import { useColorScheme, useShadowRootStyle } from './styles.css'
11
10
  import { ErrorMessage, ViewNotFound } from './ViewNotFound'
12
11
 
13
- export type ReactLikeC4Props<
14
- ViewId = string,
15
- Tag = string,
16
- Kind = string,
17
- > = Omit<LikeC4DiagramProps, 'view' | 'where' | 'onNavigateTo'> & {
18
- viewId: ViewId
12
+ export type ReactLikeC4Props<A extends aux.Any> = Omit<LikeC4DiagramProps<A>, 'view'> & {
13
+ viewId: aux.ViewId<A>
19
14
 
20
15
  /**
21
16
  * Keep aspect ratio of the diagram
@@ -41,24 +36,16 @@ export type ReactLikeC4Props<
41
36
 
42
37
  style?: CSSProperties | undefined
43
38
 
44
- where?: WhereOperator<Tag, Kind> | undefined
45
-
46
- onNavigateTo?: OnNavigateTo<ViewId> | undefined
47
-
48
39
  mantineTheme?: any
49
40
 
50
41
  /** Function to generate nonce attribute added to all generated `<style />` tags */
51
42
  styleNonce?: string | (() => string) | undefined
52
43
  }
53
44
 
54
- export function ReactLikeC4<
55
- ViewId extends string = string,
56
- Tag = string,
57
- Kind = string,
58
- >({
45
+ export function ReactLikeC4<A extends aux.Any = aux.UnknownLayouted>({
59
46
  viewId,
60
47
  ...props
61
- }: ReactLikeC4Props<ViewId, Tag, Kind>) {
48
+ }: ReactLikeC4Props<A>) {
62
49
  const likec4model = useLikeC4Model()
63
50
  const view = likec4model?.findView(viewId)
64
51
 
@@ -85,10 +72,10 @@ export function ReactLikeC4<
85
72
  return <ReactLikeC4Inner view={view.$view} {...props} />
86
73
  }
87
74
 
88
- type ReactLikeC4InnerProps = Omit<ReactLikeC4Props<any, any, any>, 'viewId'> & {
89
- view: DiagramView
75
+ type ReactLikeC4InnerProps<A extends Any> = Omit<ReactLikeC4Props<A>, 'viewId'> & {
76
+ view: DiagramView<A>
90
77
  }
91
- function ReactLikeC4Inner({
78
+ function ReactLikeC4Inner<A extends Any>({
92
79
  className,
93
80
  view,
94
81
  colorScheme: explicitColorScheme,
@@ -101,12 +88,12 @@ function ReactLikeC4Inner({
101
88
  mantineTheme,
102
89
  styleNonce,
103
90
  ...props
104
- }: ReactLikeC4InnerProps) {
91
+ }: ReactLikeC4InnerProps<A>) {
105
92
  const colorScheme = useColorScheme(explicitColorScheme)
106
93
 
107
94
  const [shadowRootProps, cssstyle] = useShadowRootStyle(keepAspectRatio, view)
108
95
 
109
- const notations = view.notation?.elements ?? []
96
+ const notations = view.notation?.nodes ?? []
110
97
  const hasNotations = notations.length > 0
111
98
 
112
99
  let nonce
@@ -139,6 +126,7 @@ function ReactLikeC4Inner({
139
126
  showNotations={showNotations && hasNotations}
140
127
  onNavigateTo={onNavigateTo as any}
141
128
  background={background}
129
+ enableElementTags={false}
142
130
  {...props}
143
131
  />
144
132
  </ShadowRoot>
@@ -0,0 +1,30 @@
1
+ import { Box } from '@likec4/styles/jsx'
2
+ import { Button, Code, Group, Notification, ScrollAreaAutosize } from '@mantine/core'
3
+ import { IconX } from '@tabler/icons-react'
4
+ import type { FallbackProps } from 'react-error-boundary'
5
+
6
+ export function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) {
7
+ const errorString = error instanceof Error ? error.message : 'Unknown error'
8
+ return (
9
+ <Box pos={'fixed'} top={0} left={0} w={'100%'} p={0} style={{ zIndex: 1000 }}>
10
+ <Notification
11
+ icon={<IconX style={{ width: 16, height: 16 }} />}
12
+ styles={{
13
+ icon: {
14
+ alignSelf: 'flex-start',
15
+ },
16
+ }}
17
+ color={'red'}
18
+ title={'Oops, something went wrong'}
19
+ p={'xl'}
20
+ withCloseButton={false}>
21
+ <ScrollAreaAutosize maw={'100%'} mah={400}>
22
+ <Code block>{errorString}</Code>
23
+ </ScrollAreaAutosize>
24
+ <Group gap={'xs'} mt="xl">
25
+ <Button color="gray" size="xs" variant="light" onClick={() => resetErrorBoundary()}>Reset</Button>
26
+ </Group>
27
+ </Notification>
28
+ </Box>
29
+ )
30
+ }
@@ -1,3 +1,4 @@
1
+ import type { Any } from '@likec4/core/types'
1
2
  import { useSyncedRef } from '@react-hookz/web'
2
3
  import { type PropsWithChildren, type RefObject, createContext, useContext, useMemo } from 'react'
3
4
  import { isFunction, mapToObj } from 'remeda'
@@ -21,8 +22,8 @@ const HandlerNames = [
21
22
  'onCanvasDblClick',
22
23
  ] as const
23
24
 
24
- type DiagramEventHandlersContextValue = RequiredOrNull<LikeC4DiagramEventHandlers> & {
25
- handlersRef: RefObject<LikeC4DiagramEventHandlers>
25
+ type DiagramEventHandlersContextValue = RequiredOrNull<LikeC4DiagramEventHandlers<Any>> & {
26
+ handlersRef: RefObject<LikeC4DiagramEventHandlers<Any>>
26
27
  }
27
28
 
28
29
  const DiagramEventHandlersContext = createContext<DiagramEventHandlersContextValue>({
@@ -32,10 +33,10 @@ const DiagramEventHandlersContext = createContext<DiagramEventHandlersContextVal
32
33
  },
33
34
  })
34
35
 
35
- export function DiagramEventHandlers({
36
+ export function DiagramEventHandlers<A extends Any>({
36
37
  handlers,
37
38
  children,
38
- }: PropsWithChildren<{ handlers: LikeC4DiagramEventHandlers }>) {
39
+ }: PropsWithChildren<{ handlers: LikeC4DiagramEventHandlers<A> }>) {
39
40
  const handlersRef = useSyncedRef(handlers)
40
41
 
41
42
  const deps = HandlerNames.map((name) => isFunction(handlers[name]))
@@ -1,7 +1,7 @@
1
- import type { ExclusiveUnion, NonEmptyArray } from '@likec4/core'
1
+ import type { ExclusiveUnion } from '@likec4/core/types'
2
2
  import { shallowEqual } from 'fast-equals'
3
3
  import { type PropsWithChildren, createContext, useContext, useEffect, useState } from 'react'
4
- import { map, mapToObj, pick } from 'remeda'
4
+ import { mapToObj } from 'remeda'
5
5
 
6
6
  const FeatureNames = [
7
7
  'Controls',
@@ -18,14 +18,11 @@ const FeatureNames = [
18
18
  'EdgeEditing',
19
19
  'ViewTitle',
20
20
  'FitView',
21
- /**
22
- * LikeC4Model is available in context
23
- */
24
- 'LikeC4Model',
25
21
  /**
26
22
  * Running in VSCode
27
23
  */
28
24
  'Vscode',
25
+ 'ElementTags',
29
26
  ] as const
30
27
  export type FeatureName = typeof FeatureNames[number]
31
28
  export type EnabledFeatures = {
@@ -41,20 +38,9 @@ const DiagramFeaturesContext = createContext<EnabledFeatures>(AllDisabled)
41
38
  const validate = (features: EnabledFeatures) => {
42
39
  let {
43
40
  enableReadOnly,
44
- enableLikeC4Model,
45
- enableElementDetails,
46
- enableRelationshipDetails,
47
- enableRelationshipBrowser,
48
- enableSearch,
49
41
  enableEdgeEditing,
50
42
  ...rest
51
43
  } = features
52
- if (!enableLikeC4Model) {
53
- enableElementDetails = false
54
- enableRelationshipDetails = false
55
- enableRelationshipBrowser = false
56
- enableSearch = false
57
- }
58
44
 
59
45
  if (enableReadOnly) {
60
46
  enableEdgeEditing = false
@@ -62,11 +48,6 @@ const validate = (features: EnabledFeatures) => {
62
48
 
63
49
  return {
64
50
  enableReadOnly,
65
- enableLikeC4Model,
66
- enableElementDetails,
67
- enableRelationshipDetails,
68
- enableRelationshipBrowser,
69
- enableSearch,
70
51
  enableEdgeEditing,
71
52
  ...rest,
72
53
  }
@@ -14,7 +14,7 @@ export function EnsureMantine({ children }: EnsureMantineProps) {
14
14
 
15
15
  if (!mantineCtx) {
16
16
  return (
17
- <MantineProvider>
17
+ <MantineProvider defaultColorScheme="auto">
18
18
  {children}
19
19
  </MantineProvider>
20
20
  )
@@ -99,10 +99,7 @@ export function IconOrShapeRenderer({
99
99
  }
100
100
  className: string
101
101
  }) {
102
- const icon = IconRenderer({
103
- element,
104
- className,
105
- })
102
+ const icon = <IconRenderer element={element} className={className} />
106
103
  if (icon) {
107
104
  return icon
108
105
  }
@@ -1,7 +1,9 @@
1
1
  import { cx } from '@likec4/styles/css'
2
2
  import { Box } from '@likec4/styles/jsx'
3
+ import { useId } from '@mantine/hooks'
3
4
  import { type PropsWithChildren, createContext, createRef, useContext, useEffect, useRef } from 'react'
4
5
  import { usePanningAtom } from './ReduceGraphics'
6
+ import { TagStylesProvider } from './TagStylesContext'
5
7
 
6
8
  const RootContainerContext = createContext(createRef<HTMLDivElement>())
7
9
 
@@ -13,6 +15,7 @@ export function RootContainer({
13
15
  className?: string | undefined
14
16
  reduceGraphics?: boolean
15
17
  }>) {
18
+ const id = useId()
16
19
  const ref = useRef<HTMLDivElement>(null)
17
20
  const $isPanning = usePanningAtom()
18
21
 
@@ -28,14 +31,17 @@ export function RootContainer({
28
31
 
29
32
  return (
30
33
  <Box
34
+ id={id}
31
35
  className={cx('likec4-root', className)}
32
36
  ref={ref}
33
37
  {...reduceGraphics && {
34
38
  ['data-likec4-reduced-graphics']: true,
35
39
  }}>
36
- <RootContainerContext.Provider value={ref}>
37
- {children}
38
- </RootContainerContext.Provider>
40
+ <TagStylesProvider rootSelector={`#${id}`}>
41
+ <RootContainerContext.Provider value={ref}>
42
+ {children}
43
+ </RootContainerContext.Provider>
44
+ </TagStylesProvider>
39
45
  </Box>
40
46
  )
41
47
  }
@@ -0,0 +1,96 @@
1
+ import { type TagSpecification, isTagColorSpecified } from '@likec4/core'
2
+ import { useMantineStyleNonce } from '@mantine/core'
3
+ import { useDeepCompareMemo } from '@react-hookz/web'
4
+ import { type PropsWithChildren, createContext, useContext } from 'react'
5
+ import { entries, flatMap, join, pipe } from 'remeda'
6
+ import { useLikeC4Specification } from '../likec4model/useLikeC4Model'
7
+
8
+ const TagStylesContext = createContext<Record<string, TagSpecification>>({})
9
+
10
+ const radixColors = [
11
+ 'yellow',
12
+ 'orange',
13
+ 'amber',
14
+ 'tomato',
15
+ 'red',
16
+ 'ruby',
17
+ 'crimson',
18
+ 'pink',
19
+ 'pink',
20
+ 'purple',
21
+ 'violet',
22
+ 'indigo',
23
+ 'blue',
24
+ 'teal',
25
+ 'grass',
26
+ 'lime',
27
+ ]
28
+
29
+ const generateColorVars = (spec: TagSpecification) => {
30
+ const color = spec.color
31
+ if (isTagColorSpecified(spec)) {
32
+ return `
33
+ --colors-likec4-tag-bg: ${color};
34
+ --colors-likec4-tag-bg-hover: color-mix(in srgb, ${color}, var(--colors-likec4-mix-color) 20%);
35
+ `
36
+ }
37
+ if (!radixColors.includes(color)) {
38
+ return ''
39
+ }
40
+ let textcolor = '12'
41
+ if (['mint', 'grass', 'lime', 'yellow', 'amber'].includes(color)) {
42
+ textcolor = 'dark-2'
43
+ }
44
+ return `
45
+ --colors-likec4-tag-border: var(--colors-${color}-8);
46
+ --colors-likec4-tag-bg: var(--colors-${color}-9);
47
+ --colors-likec4-tag-bg-hover: var(--colors-${color}-10);
48
+ --colors-likec4-tag-text: var(--colors-${color}-${textcolor});
49
+ `
50
+ }
51
+
52
+ export function TagStylesProvider({ children, rootSelector }: PropsWithChildren<{ rootSelector: string }>) {
53
+ const tags = useLikeC4Specification().tags
54
+ const { specs, stylesheet } = useDeepCompareMemo(() => {
55
+ if (!tags) {
56
+ return { specs: {}, stylesheet: '' }
57
+ }
58
+ return {
59
+ specs: tags,
60
+ stylesheet: pipe(
61
+ entries(tags),
62
+ flatMap(([tag, spec]) => [
63
+ `:is(${rootSelector} [data-likec4-tag="${tag}"]) {`,
64
+ generateColorVars(spec),
65
+ '}',
66
+ ]),
67
+ join('\n'),
68
+ ),
69
+ }
70
+ }, [tags, rootSelector])
71
+
72
+ return (
73
+ <TagStylesContext.Provider value={specs}>
74
+ {stylesheet !== '' && <TagStylesheet stylesheet={stylesheet} />}
75
+ {children}
76
+ </TagStylesContext.Provider>
77
+ )
78
+ }
79
+
80
+ function TagStylesheet({ stylesheet }: { stylesheet: string }) {
81
+ const nonce = useMantineStyleNonce()?.()
82
+ return (
83
+ <style data-likec4-tag-stylesheet type="text/css" dangerouslySetInnerHTML={{ __html: stylesheet }} nonce={nonce} />
84
+ )
85
+ }
86
+
87
+ export function useTagSpecifications() {
88
+ return useContext(TagStylesContext)
89
+ }
90
+
91
+ export function useTagSpecification(tag: string): TagSpecification {
92
+ const specs = useContext(TagStylesContext)
93
+ return specs[tag] ?? {
94
+ color: 'tomato' as any,
95
+ }
96
+ }
@@ -8,6 +8,8 @@ export {
8
8
  ElementDetailsButton,
9
9
  ElementNodeContainer,
10
10
  ElementShape,
11
+ ElementTag,
12
+ ElementTags,
11
13
  ElementTitle,
12
14
  } from '../base/primitives'
13
15
 
@@ -1,5 +1,5 @@
1
- import type { AnyAux, DeployedInstanceModel, DeploymentNodeModel, NodeModel } from '@likec4/core/model'
2
- import type { DiagramView } from '@likec4/core/types'
1
+ import type { DeployedInstanceModel, DeploymentNodeModel, NodeModel } from '@likec4/core/model'
2
+ import type { Any } from '@likec4/core/types'
3
3
  import type { ReactNode } from 'react'
4
4
  import { customNode } from '../base/primitives'
5
5
  import type { NodeProps } from '../base/types'
@@ -9,22 +9,22 @@ import { useLikeC4Model } from '../likec4model/useLikeC4Model'
9
9
  function customDiagramNode<
10
10
  P extends {
11
11
  nodeProps: NodeProps<Types.NodeData>
12
- nodeModel: NodeModel<AnyAux>
12
+ nodeModel: NodeModel
13
13
  },
14
14
  >(
15
15
  Node: (props: P) => ReactNode,
16
16
  ): (props: P['nodeProps']) => ReactNode {
17
17
  return customNode((props) => {
18
- const viewModel = useLikeC4Model(true).view(props.data.viewId)
18
+ const viewModel = useLikeC4Model().view(props.data.viewId)
19
19
  const model = viewModel.node(props.id)
20
20
  // @ts-ignore
21
21
  return <Node nodeProps={props} nodeModel={model} />
22
22
  }) as (props: P['nodeProps']) => ReactNode
23
23
  }
24
24
 
25
- export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
25
+ export type CustomElementNodeProps<M extends Any = Any> = {
26
26
  nodeProps: NodeProps<Types.ElementNodeData, 'element'>
27
- nodeModel: NodeModel.WithElement<M, DiagramView>
27
+ nodeModel: NodeModel.WithElement<M>
28
28
  }
29
29
  /**
30
30
  * Node that will be used to render the element from the model.
@@ -34,6 +34,8 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
34
34
  * - `nodeProps`: props from XYFlow
35
35
  * - `nodeModel`: LikeC4 {@link NodeModel.WithElement}
36
36
  *
37
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
38
+ *
37
39
  * @example
38
40
  * ```tsx
39
41
  * import {
@@ -74,9 +76,9 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
74
76
  */
75
77
  export const elementNode = customDiagramNode<CustomElementNodeProps>
76
78
 
77
- export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
79
+ export type CustomDeploymentNodeProps<M extends Any = Any> = {
78
80
  nodeProps: NodeProps<Types.DeploymentElementNodeData, 'deployment'>
79
- nodeModel: NodeModel.WithDeploymentElement<M, DiagramView>
81
+ nodeModel: NodeModel.WithDeploymentElement<M>
80
82
  }
81
83
  /**
82
84
  * Node that will be used to render the element from deployment model.
@@ -87,6 +89,8 @@ export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
87
89
  * - `nodeProps`: props from XYFlow
88
90
  * - `nodeModel`: {@link NodeModel.WithDeploymentElement}
89
91
  *
92
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
93
+ *
90
94
  * @example
91
95
  * ```tsx
92
96
  * import {
@@ -126,9 +130,9 @@ export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
126
130
  */
127
131
  export const deploymentNode = customDiagramNode<CustomDeploymentNodeProps>
128
132
 
129
- export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
133
+ export type CustomCompoundElementNodeProps<M extends Any = Any> = {
130
134
  nodeProps: NodeProps<Types.CompoundElementNodeData, 'compound-element'>
131
- nodeModel: NodeModel.WithElement<M, DiagramView>
135
+ nodeModel: NodeModel.WithElement<M>
132
136
  }
133
137
  /**
134
138
  * Node that will be used to render the compound element from the model.
@@ -138,6 +142,8 @@ export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
138
142
  * - `nodeProps`: props from XYFlow
139
143
  * - `nodeModel`: LikeC4 {@link NodeModel.WithElement}
140
144
  *
145
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
146
+ *
141
147
  * @example
142
148
  * ```tsx
143
149
  * import {
@@ -168,9 +174,9 @@ export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
168
174
  */
169
175
  export const compoundElementNode = customDiagramNode<CustomCompoundElementNodeProps>
170
176
 
171
- export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
177
+ export type CustomCompoundDeploymentNodeProps<M extends Any = Any> = {
172
178
  nodeProps: NodeProps<Types.CompoundDeploymentNodeData, 'compound-deployment'>
173
- nodeModel: NodeModel.WithDeploymentElement<M, DiagramView>
179
+ nodeModel: NodeModel.WithDeploymentElement<M>
174
180
  }
175
181
  /**
176
182
  * Node that will be used to render the compound from the deployment model.
@@ -180,6 +186,8 @@ export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
180
186
  * - `nodeProps`: props from XYFlow
181
187
  * - `nodeModel`: LikeC4 {@link NodeModel.WithDeploymentElement}
182
188
  *
189
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
190
+ *
183
191
  * @example
184
192
  * ```tsx
185
193
  * import {
@@ -204,9 +212,9 @@ export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
204
212
  */
205
213
  export const compoundDeploymentNode = customDiagramNode<CustomCompoundDeploymentNodeProps>
206
214
 
207
- export type CustomViewGroupNodeProps<M extends AnyAux = AnyAux> = {
215
+ export type CustomViewGroupNodeProps<M extends Any = Any> = {
208
216
  nodeProps: NodeProps<Types.ViewGroupNodeData, 'view-group'>
209
- nodeModel: NodeModel.IsGroup<M, DiagramView>
217
+ nodeModel: NodeModel.IsGroup<M>
210
218
  }
211
219
  /**
212
220
  * Node that will be used to render the view group from the model.
@@ -215,6 +223,8 @@ export type CustomViewGroupNodeProps<M extends AnyAux = AnyAux> = {
215
223
  * - `nodeProps`: props from XYFlow
216
224
  * - `nodeModel`: LikeC4 {@link NodeModel.IsGroup}
217
225
  *
226
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
227
+ *
218
228
  * @example
219
229
  * ```tsx
220
230
  * import {
@@ -28,6 +28,7 @@ export {
28
28
 
29
29
  export {
30
30
  useLikeC4Model,
31
+ useLikeC4Specification,
31
32
  } from '../likec4model/useLikeC4Model'
32
33
 
33
34
  export { useMantinePortalProps } from '../hooks/useMantinePortalProps'
@@ -1,5 +1,5 @@
1
1
  export { useMantinePortalProps } from './useMantinePortalProps'
2
2
  export { useSetState } from './useSetState'
3
3
  export { useUpdateEffect } from './useUpdateEffect'
4
- export { useXYFlow, useXYInternalNode, useXYStore, useXYStoreApi } from './useXYFlow'
4
+ export { useCurrentZoom, useIsZoomTooSmall, useXYFlow, useXYInternalNode, useXYStore, useXYStoreApi } from './useXYFlow'
5
5
  export type { XYStoreApi } from './useXYFlow'
@@ -1,8 +1,5 @@
1
- import { invariant } from '@likec4/core'
2
- import type { AnyAux, LikeC4ViewModel } from '@likec4/core/model'
3
- import type { DiagramView, ViewId } from '@likec4/core/types'
1
+ import type { ViewId } from '@likec4/core/types'
4
2
  import { useSelector } from '@xstate/react'
5
- import { useLikeC4Model } from '../likec4model/useLikeC4Model'
6
3
  import type { DiagramActorSnapshot } from '../state/types'
7
4
  import { useDiagramActorRef } from './useDiagram'
8
5