@likec4/diagram 1.31.0 → 1.32.1

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 (269) hide show
  1. package/bundle/{chunk-BBzMXzCg.js → chunk-DlHyKoeo.js} +1700 -1206
  2. package/bundle/custom.js +51 -47
  3. package/bundle/index.js +5495 -5428
  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 +41 -24
  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 +22 -19
  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 +10 -8
  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 +32 -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 +107 -110
  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 +7 -7
  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/index.d.ts +1 -1
  83. package/dist/likec4model/useLikeC4ElementsTree.js +1 -1
  84. package/dist/likec4model/useLikeC4Model.d.ts +23 -10
  85. package/dist/likec4model/useLikeC4Model.js +22 -7
  86. package/dist/overlays/Overlays.js +4 -27
  87. package/dist/overlays/element-details/ElementDetailsCard.d.ts +1 -1
  88. package/dist/overlays/element-details/ElementDetailsCard.js +19 -12
  89. package/dist/overlays/element-details/TabPanelDeployments.d.ts +1 -1
  90. package/dist/overlays/element-details/TabPanelDeployments.js +1 -1
  91. package/dist/overlays/element-details/TabPanelRelationships.d.ts +1 -1
  92. package/dist/overlays/element-details/TabPanelStructure.d.ts +1 -1
  93. package/dist/overlays/element-details/actor.d.ts +288 -286
  94. package/dist/overlays/overlay/Overlay.css.d.ts +57 -2
  95. package/dist/overlays/overlay/Overlay.css.js +76 -39
  96. package/dist/overlays/overlay/Overlay.d.ts +12 -0
  97. package/dist/overlays/overlay/Overlay.js +58 -27
  98. package/dist/overlays/overlaysActor.d.ts +1 -1
  99. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +3 -2
  100. package/dist/overlays/relationship-details/RelationshipDetails.js +3 -3
  101. package/dist/overlays/relationship-details/_types.d.ts +2 -2
  102. package/dist/overlays/relationship-details/actor.js +7 -7
  103. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +3 -2
  104. package/dist/overlays/relationship-details/custom/nodeTypes.js +4 -0
  105. package/dist/overlays/relationship-details/hooks.d.ts +10 -9
  106. package/dist/overlays/relationship-details/layout-to-xyflow.js +1 -0
  107. package/dist/overlays/relationship-details/layout.js +3 -1
  108. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +3 -2
  109. package/dist/overlays/relationships-browser/SelectElement.js +1 -1
  110. package/dist/overlays/relationships-browser/_types.d.ts +2 -2
  111. package/dist/overlays/relationships-browser/actor.d.ts +1 -1
  112. package/dist/overlays/relationships-browser/actor.js +7 -7
  113. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +3 -2
  114. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +8 -5
  115. package/dist/overlays/relationships-browser/custom/nodeTypes.js +4 -0
  116. package/dist/overlays/relationships-browser/layout.d.ts +2 -2
  117. package/dist/overlays/relationships-browser/layout.js +10 -6
  118. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +4 -3
  119. package/dist/search/Search.d.ts +4 -0
  120. package/dist/search/Search.js +173 -0
  121. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.js +0 -1
  122. package/dist/search/components/ElementsColumn.d.ts +2 -0
  123. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.js +26 -25
  124. package/dist/search/components/PickView.d.ts +4 -0
  125. package/dist/search/components/PickView.js +135 -0
  126. package/dist/search/components/SearchByTags.d.ts +1 -0
  127. package/dist/search/components/SearchByTags.js +119 -0
  128. package/dist/search/components/SearchInput.d.ts +2 -0
  129. package/dist/{likec4diagram/ui/search → search/components}/SearchInput.js +61 -40
  130. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.d.ts +3 -2
  131. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.js +25 -17
  132. package/dist/{likec4diagram/ui/search → search/components}/_shared.css.js +26 -35
  133. package/dist/{likec4diagram/ui/search/LikeC4Search.css.d.ts → search/components/styles.css.d.ts} +0 -2
  134. package/dist/search/components/styles.css.js +60 -0
  135. package/dist/search/components/utils.d.ts +5 -0
  136. package/dist/search/components/utils.js +58 -0
  137. package/dist/search/hooks.d.ts +10 -0
  138. package/dist/search/hooks.js +35 -0
  139. package/dist/search/searchActor.d.ts +90 -0
  140. package/dist/search/searchActor.js +75 -0
  141. package/dist/state/DiagramActorProvider.d.ts +9 -7
  142. package/dist/state/DiagramActorProvider.js +24 -18
  143. package/dist/state/assign.d.ts +0 -1
  144. package/dist/state/assign.js +9 -19
  145. package/dist/state/diagram-machine.d.ts +645 -183
  146. package/dist/state/diagram-machine.js +127 -60
  147. package/dist/state/syncManualLayoutActor.d.ts +2 -2
  148. package/dist/state/types.d.ts +2 -0
  149. package/dist/state/utils.d.ts +2 -0
  150. package/dist/state/utils.js +3 -0
  151. package/dist/styles-min.css +1 -1
  152. package/dist/styles-xyflow.css +1 -1
  153. package/dist/styles.css +1 -1
  154. package/dist/styles.css2.js +1 -1
  155. package/package.json +20 -19
  156. package/panda.buildinfo.json +171 -148
  157. package/src/LikeC4CustomColors.tsx +21 -6
  158. package/src/LikeC4Diagram.props.ts +48 -32
  159. package/src/LikeC4Diagram.tsx +19 -20
  160. package/src/LikeC4ModelProvider.tsx +6 -5
  161. package/src/StaticLikeC4Diagram.tsx +8 -6
  162. package/src/base/const.ts +1 -1
  163. package/src/base/index.ts +2 -1
  164. package/src/base/primitives/compound/CompoundActionButton.tsx +2 -1
  165. package/src/base/primitives/compound/CompoundDetailsButton.tsx +2 -1
  166. package/src/base/primitives/compound/CompoundTitle.tsx +3 -2
  167. package/src/base/primitives/edge/EdgeContainer.tsx +2 -1
  168. package/src/base/primitives/edge/EdgeLabel.css.ts +1 -0
  169. package/src/base/primitives/edge/EdgeLabel.tsx +20 -15
  170. package/src/base/primitives/edge/EdgeLabelContainer.tsx +1 -1
  171. package/src/base/primitives/edge/EdgeMarkers.tsx +2 -1
  172. package/src/base/primitives/edge/EdgePath.tsx +1 -1
  173. package/src/base/primitives/element/ElementActionButtons.tsx +11 -10
  174. package/src/base/primitives/element/ElementDetailsButton.tsx +2 -1
  175. package/src/base/primitives/element/ElementShape.tsx +2 -1
  176. package/src/base/primitives/element/ElementTags.tsx +182 -0
  177. package/src/base/primitives/element/ElementTitle.tsx +21 -15
  178. package/src/base/primitives/index.ts +1 -0
  179. package/src/base/types.Base.ts +104 -0
  180. package/src/base/types.ts +2 -99
  181. package/src/bundle/LikeC4View.props.ts +17 -4
  182. package/src/bundle/LikeC4View.tsx +27 -36
  183. package/src/bundle/ReactLikeC4.tsx +16 -36
  184. package/src/components/ErrorFallback.tsx +30 -0
  185. package/src/context/DiagramEventHandlers.tsx +5 -4
  186. package/src/context/DiagramFeatures.tsx +3 -22
  187. package/src/context/EnsureMantine.tsx +1 -1
  188. package/src/context/IconRenderer.tsx +1 -4
  189. package/src/context/RootContainer.tsx +9 -3
  190. package/src/context/TagStylesContext.tsx +96 -0
  191. package/src/custom/components.ts +2 -0
  192. package/src/custom/customNodes.tsx +29 -14
  193. package/src/custom/hooks.ts +2 -0
  194. package/src/hooks/index.ts +1 -1
  195. package/src/hooks/useCurrentViewId.ts +1 -4
  196. package/src/hooks/useDiagram.ts +104 -12
  197. package/src/hooks/useMantinePortalProps.ts +10 -1
  198. package/src/hooks/useSearchActor.ts +11 -0
  199. package/src/hooks/useUpdateEffect.ts +7 -4
  200. package/src/hooks/useXYFlow.ts +5 -0
  201. package/src/likec4diagram/DiagramUI.tsx +5 -0
  202. package/src/likec4diagram/DiagramXYFlow.tsx +118 -121
  203. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +9 -0
  204. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +10 -9
  205. package/src/likec4diagram/custom/nodes/nodes.tsx +45 -43
  206. package/src/likec4diagram/custom/nodes/toolbar/_shared.tsx +11 -3
  207. package/src/likec4diagram/types.ts +5 -3
  208. package/src/likec4diagram/ui/controls/Controls.tsx +11 -4
  209. package/src/likec4diagram/ui/notation/NotationPanel.tsx +2 -2
  210. package/src/likec4diagram/useViewToNodesEdges.ts +34 -36
  211. package/src/likec4model/LikeC4ModelContext.ts +2 -2
  212. package/src/likec4model/index.ts +2 -0
  213. package/src/likec4model/useLikeC4ElementsTree.ts +1 -1
  214. package/src/likec4model/useLikeC4Model.ts +32 -16
  215. package/src/overlays/Overlays.tsx +5 -32
  216. package/src/overlays/element-details/ElementDetailsCard.tsx +25 -18
  217. package/src/overlays/element-details/TabPanelDeployments.tsx +3 -2
  218. package/src/overlays/element-details/TabPanelRelationships.tsx +2 -1
  219. package/src/overlays/element-details/TabPanelStructure.tsx +1 -1
  220. package/src/overlays/element-details/actor.ts +2 -2
  221. package/src/overlays/overlay/Overlay.css.ts +75 -38
  222. package/src/overlays/overlay/Overlay.tsx +61 -29
  223. package/src/overlays/overlaysActor.ts +1 -1
  224. package/src/overlays/relationship-details/RelationshipDetails.tsx +4 -4
  225. package/src/overlays/relationship-details/_types.ts +2 -1
  226. package/src/overlays/relationship-details/custom/nodeTypes.tsx +4 -0
  227. package/src/overlays/relationship-details/layout-to-xyflow.ts +1 -0
  228. package/src/overlays/relationship-details/layout.ts +3 -1
  229. package/src/overlays/relationships-browser/SelectElement.tsx +1 -1
  230. package/src/overlays/relationships-browser/_types.ts +2 -1
  231. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +4 -0
  232. package/src/overlays/relationships-browser/layout.ts +12 -7
  233. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +4 -4
  234. package/src/search/Search.tsx +220 -0
  235. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.css.ts +0 -29
  236. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.tsx +28 -29
  237. package/src/search/components/PickView.tsx +134 -0
  238. package/src/search/components/SearchByTags.tsx +112 -0
  239. package/src/{likec4diagram/ui/search → search/components}/SearchInput.tsx +72 -42
  240. package/src/{likec4diagram/ui/search → search/components}/ViewsColum.tsx +29 -22
  241. package/src/{likec4diagram/ui/search → search/components}/_shared.css.ts +26 -37
  242. package/src/{likec4diagram/ui/search/LikeC4Search.css.ts → search/components/styles.css.ts} +9 -36
  243. package/src/search/components/utils.ts +64 -0
  244. package/src/search/hooks.ts +38 -0
  245. package/src/search/searchActor.ts +99 -0
  246. package/src/state/DiagramActorProvider.tsx +37 -25
  247. package/src/state/assign.ts +10 -10
  248. package/src/state/diagram-machine.ts +123 -58
  249. package/src/state/syncManualLayoutActor.ts +1 -1
  250. package/src/state/types.ts +2 -0
  251. package/src/state/utils.ts +4 -0
  252. package/dist/base/types.js +0 -54
  253. package/dist/likec4diagram/ui/search/ElementsColumn.d.ts +0 -1
  254. package/dist/likec4diagram/ui/search/LikeC4Search.css.js +0 -87
  255. package/dist/likec4diagram/ui/search/LikeC4Search.d.ts +0 -2
  256. package/dist/likec4diagram/ui/search/LikeC4Search.js +0 -267
  257. package/dist/likec4diagram/ui/search/SearchInput.d.ts +0 -1
  258. package/dist/likec4diagram/ui/search/state.d.ts +0 -19
  259. package/dist/likec4diagram/ui/search/state.js +0 -63
  260. package/dist/likec4diagram/ui/search/utils.d.ts +0 -3
  261. package/dist/likec4diagram/ui/search/utils.js +0 -20
  262. package/src/likec4diagram/ui/search/LikeC4Search.tsx +0 -301
  263. package/src/likec4diagram/ui/search/state.ts +0 -78
  264. package/src/likec4diagram/ui/search/utils.ts +0 -20
  265. /package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.d.ts +0 -0
  266. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.d.ts +0 -0
  267. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.js +0 -0
  268. /package/dist/{likec4diagram/ui/search → search/components}/_shared.css.d.ts +0 -0
  269. /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,34 +36,18 @@ 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
- const view = likec4model?.findView(viewId)
64
-
65
- if (!likec4model) {
66
- return (
67
- <ErrorMessage>
68
- LikeC4Model not found. Make sure you have LikeC4ModelProvider.
69
- </ErrorMessage>
70
- )
71
- }
50
+ const view = likec4model.findView(viewId)
72
51
 
73
52
  if (!view) {
74
53
  return <ViewNotFound viewId={viewId} />
@@ -77,7 +56,7 @@ export function ReactLikeC4<
77
56
  if (!view.isDiagram()) {
78
57
  return (
79
58
  <ErrorMessage>
80
- LikeC4Model is not layouted. Make sure you have LikeC4ModelProvider with layouted model.
59
+ LikeC4 View "${viewId}" is not layouted. Make sure you have LikeC4ModelProvider with layouted model.
81
60
  </ErrorMessage>
82
61
  )
83
62
  }
@@ -85,10 +64,10 @@ export function ReactLikeC4<
85
64
  return <ReactLikeC4Inner view={view.$view} {...props} />
86
65
  }
87
66
 
88
- type ReactLikeC4InnerProps = Omit<ReactLikeC4Props<any, any, any>, 'viewId'> & {
89
- view: DiagramView
67
+ type ReactLikeC4InnerProps<A extends Any> = Omit<ReactLikeC4Props<A>, 'viewId'> & {
68
+ view: DiagramView<A>
90
69
  }
91
- function ReactLikeC4Inner({
70
+ function ReactLikeC4Inner<A extends Any>({
92
71
  className,
93
72
  view,
94
73
  colorScheme: explicitColorScheme,
@@ -101,12 +80,12 @@ function ReactLikeC4Inner({
101
80
  mantineTheme,
102
81
  styleNonce,
103
82
  ...props
104
- }: ReactLikeC4InnerProps) {
83
+ }: ReactLikeC4InnerProps<A>) {
105
84
  const colorScheme = useColorScheme(explicitColorScheme)
106
85
 
107
86
  const [shadowRootProps, cssstyle] = useShadowRootStyle(keepAspectRatio, view)
108
87
 
109
- const notations = view.notation?.elements ?? []
88
+ const notations = view.notation?.nodes ?? []
110
89
  const hasNotations = notations.length > 0
111
90
 
112
91
  let nonce
@@ -139,6 +118,7 @@ function ReactLikeC4Inner({
139
118
  showNotations={showNotations && hasNotations}
140
119
  onNavigateTo={onNavigateTo as any}
141
120
  background={background}
121
+ enableElementTags={false}
142
122
  {...props}
143
123
  />
144
124
  </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 {
@@ -43,15 +45,20 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
43
45
  * ElementTitle,
44
46
  * ElementActions,
45
47
  * ElementDetailsButtonWithHandler,
48
+ * IfEnabled,
46
49
  * IfNotReadOnly,
47
50
  * ElementToolbar,
48
51
  * DefaultHandles,
52
+ * ElementTags
49
53
  * } from '@likec4/diagram/custom'
50
54
  *
51
55
  * const CustomElementNode = elementNode(({ nodeProps, nodeModel }) => (
52
56
  * <ElementNodeContainer nodeProps={nodeProps}>
53
57
  * <ElementShape {...nodeProps} />
54
58
  * <ElementTitle {...nodeProps} />
59
+ * <IfEnabled feature="ElementTags">
60
+ * <ElementTags {...nodeProps} />
61
+ * </IfEnabled>
55
62
  * <ElementActions
56
63
  * {...nodeProps}
57
64
  * extraButtons={[
@@ -74,9 +81,9 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
74
81
  */
75
82
  export const elementNode = customDiagramNode<CustomElementNodeProps>
76
83
 
77
- export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
84
+ export type CustomDeploymentNodeProps<M extends Any = Any> = {
78
85
  nodeProps: NodeProps<Types.DeploymentElementNodeData, 'deployment'>
79
- nodeModel: NodeModel.WithDeploymentElement<M, DiagramView>
86
+ nodeModel: NodeModel.WithDeploymentElement<M>
80
87
  }
81
88
  /**
82
89
  * Node that will be used to render the element from deployment model.
@@ -87,6 +94,8 @@ export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
87
94
  * - `nodeProps`: props from XYFlow
88
95
  * - `nodeModel`: {@link NodeModel.WithDeploymentElement}
89
96
  *
97
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
98
+ *
90
99
  * @example
91
100
  * ```tsx
92
101
  * import {
@@ -126,9 +135,9 @@ export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
126
135
  */
127
136
  export const deploymentNode = customDiagramNode<CustomDeploymentNodeProps>
128
137
 
129
- export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
138
+ export type CustomCompoundElementNodeProps<M extends Any = Any> = {
130
139
  nodeProps: NodeProps<Types.CompoundElementNodeData, 'compound-element'>
131
- nodeModel: NodeModel.WithElement<M, DiagramView>
140
+ nodeModel: NodeModel.WithElement<M>
132
141
  }
133
142
  /**
134
143
  * Node that will be used to render the compound element from the model.
@@ -138,6 +147,8 @@ export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
138
147
  * - `nodeProps`: props from XYFlow
139
148
  * - `nodeModel`: LikeC4 {@link NodeModel.WithElement}
140
149
  *
150
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
151
+ *
141
152
  * @example
142
153
  * ```tsx
143
154
  * import {
@@ -168,9 +179,9 @@ export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
168
179
  */
169
180
  export const compoundElementNode = customDiagramNode<CustomCompoundElementNodeProps>
170
181
 
171
- export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
182
+ export type CustomCompoundDeploymentNodeProps<M extends Any = Any> = {
172
183
  nodeProps: NodeProps<Types.CompoundDeploymentNodeData, 'compound-deployment'>
173
- nodeModel: NodeModel.WithDeploymentElement<M, DiagramView>
184
+ nodeModel: NodeModel.WithDeploymentElement<M>
174
185
  }
175
186
  /**
176
187
  * Node that will be used to render the compound from the deployment model.
@@ -180,6 +191,8 @@ export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
180
191
  * - `nodeProps`: props from XYFlow
181
192
  * - `nodeModel`: LikeC4 {@link NodeModel.WithDeploymentElement}
182
193
  *
194
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
195
+ *
183
196
  * @example
184
197
  * ```tsx
185
198
  * import {
@@ -204,9 +217,9 @@ export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
204
217
  */
205
218
  export const compoundDeploymentNode = customDiagramNode<CustomCompoundDeploymentNodeProps>
206
219
 
207
- export type CustomViewGroupNodeProps<M extends AnyAux = AnyAux> = {
220
+ export type CustomViewGroupNodeProps<M extends Any = Any> = {
208
221
  nodeProps: NodeProps<Types.ViewGroupNodeData, 'view-group'>
209
- nodeModel: NodeModel.IsGroup<M, DiagramView>
222
+ nodeModel: NodeModel.IsGroup<M>
210
223
  }
211
224
  /**
212
225
  * Node that will be used to render the view group from the model.
@@ -215,6 +228,8 @@ export type CustomViewGroupNodeProps<M extends AnyAux = AnyAux> = {
215
228
  * - `nodeProps`: props from XYFlow
216
229
  * - `nodeModel`: LikeC4 {@link NodeModel.IsGroup}
217
230
  *
231
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
232
+ *
218
233
  * @example
219
234
  * ```tsx
220
235
  * import {
@@ -28,6 +28,8 @@ export {
28
28
 
29
29
  export {
30
30
  useLikeC4Model,
31
+ useLikeC4Specification,
32
+ useLikeC4ViewModel,
31
33
  } from '../likec4model/useLikeC4Model'
32
34
 
33
35
  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