@likec4/diagram 1.30.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 (403) hide show
  1. package/README.md +324 -5
  2. package/bundle/chunk-BvTQaUYl.js +21851 -0
  3. package/bundle/custom.js +65 -0
  4. package/bundle/index.js +19910 -40570
  5. package/dist/LikeC4CustomColors.d.ts +2 -7
  6. package/dist/LikeC4CustomColors.js +17 -6
  7. package/dist/LikeC4Diagram.d.ts +3 -2
  8. package/dist/LikeC4Diagram.js +14 -16
  9. package/dist/LikeC4Diagram.props.d.ts +34 -23
  10. package/dist/LikeC4ModelProvider.d.ts +5 -4
  11. package/dist/LikeC4ModelProvider.js +0 -1
  12. package/dist/StaticLikeC4Diagram.d.ts +3 -2
  13. package/dist/StaticLikeC4Diagram.js +2 -2
  14. package/dist/base/BaseXYFlow.js +8 -8
  15. package/dist/base/const.d.ts +1 -1
  16. package/dist/base/const.js +1 -1
  17. package/dist/base/index.d.ts +2 -1
  18. package/dist/base/primitives/compound/CompoundActionButton.d.ts +3 -2
  19. package/dist/base/primitives/compound/CompoundActionButton.js +2 -1
  20. package/dist/base/primitives/compound/CompoundDetailsButton.d.ts +3 -2
  21. package/dist/base/primitives/compound/CompoundDetailsButton.js +2 -1
  22. package/dist/base/primitives/compound/CompoundNodeContainer.d.ts +7 -3
  23. package/dist/base/primitives/compound/CompoundNodeContainer.js +3 -2
  24. package/dist/base/primitives/compound/CompoundTitle.d.ts +1 -1
  25. package/dist/base/primitives/compound/CompoundTitle.js +2 -1
  26. package/dist/base/primitives/customEdge.d.ts +2 -35
  27. package/dist/base/primitives/customEdge.js +2 -2
  28. package/dist/base/primitives/customNode.d.ts +2 -2
  29. package/dist/base/primitives/customNode.js +9 -2
  30. package/dist/base/primitives/edge/EdgeContainer.d.ts +1 -1
  31. package/dist/base/primitives/edge/EdgeContainer.js +0 -1
  32. package/dist/base/primitives/edge/EdgeLabel.css.js +1 -0
  33. package/dist/base/primitives/edge/EdgeLabel.d.ts +3 -3
  34. package/dist/base/primitives/edge/EdgeLabel.js +6 -5
  35. package/dist/base/primitives/edge/EdgeLabelContainer.d.ts +1 -1
  36. package/dist/base/primitives/edge/EdgeLabelContainer.js +0 -2
  37. package/dist/base/primitives/edge/EdgeMarkers.d.ts +1 -1
  38. package/dist/base/primitives/edge/EdgePath.d.ts +1 -1
  39. package/dist/base/primitives/edge/EdgePath.js +2 -2
  40. package/dist/base/primitives/element/ElementActionButtons.js +10 -9
  41. package/dist/base/primitives/element/ElementDetailsButton.js +2 -1
  42. package/dist/base/primitives/element/ElementNodeContainer.d.ts +24 -22
  43. package/dist/base/primitives/element/ElementNodeContainer.js +66 -68
  44. package/dist/base/primitives/element/ElementShape.d.ts +8 -4
  45. package/dist/base/primitives/element/ElementShape.js +4 -3
  46. package/dist/base/primitives/element/ElementTags.d.ts +14 -0
  47. package/dist/base/primitives/element/ElementTags.js +176 -0
  48. package/dist/base/primitives/element/ElementTitle.css.d.ts +1 -1
  49. package/dist/base/primitives/element/ElementTitle.d.ts +5 -4
  50. package/dist/base/primitives/element/ElementTitle.js +6 -7
  51. package/dist/base/primitives/index.d.ts +1 -0
  52. package/dist/base/types.Base.d.ts +54 -0
  53. package/dist/base/types.Base.js +48 -0
  54. package/dist/base/types.d.ts +3 -53
  55. package/dist/bundle/LikeC4View.d.ts +2 -1
  56. package/dist/bundle/LikeC4View.js +13 -8
  57. package/dist/bundle/LikeC4View.props.d.ts +20 -5
  58. package/dist/bundle/ReactLikeC4.d.ts +4 -7
  59. package/dist/bundle/ReactLikeC4.js +4 -4
  60. package/dist/bundle/ShadowRoot.js +3 -3
  61. package/dist/bundle/custom.d.ts +1 -0
  62. package/dist/bundle/index.d.ts +3 -1
  63. package/dist/bundle/index.js +9 -0
  64. package/dist/bundle/styles.css.js +5 -5
  65. package/dist/components/ErrorFallback.d.ts +2 -0
  66. package/dist/components/ErrorFallback.js +29 -0
  67. package/dist/components/SearchControl.js +2 -2
  68. package/dist/context/ControlsCustomLayout.js +0 -1
  69. package/dist/context/DiagramEventHandlers.d.ts +6 -5
  70. package/dist/context/DiagramEventHandlers.js +5 -5
  71. package/dist/context/DiagramFeatures.d.ts +3 -5
  72. package/dist/context/DiagramFeatures.js +11 -40
  73. package/dist/context/EnsureMantine.js +9 -4
  74. package/dist/context/FramerMotionConfig.js +0 -1
  75. package/dist/context/IconRenderer.js +8 -11
  76. package/dist/context/ReduceGraphics.js +6 -6
  77. package/dist/context/RootContainer.js +10 -6
  78. package/dist/context/TagStylesContext.d.ts +7 -0
  79. package/dist/context/TagStylesContext.js +85 -0
  80. package/dist/context/index.d.ts +1 -1
  81. package/dist/custom/components.d.ts +5 -0
  82. package/dist/custom/customNodes.d.ts +228 -0
  83. package/dist/custom/hooks.d.ts +10 -0
  84. package/dist/custom/index.d.ts +4 -0
  85. package/dist/hooks/index.d.ts +1 -1
  86. package/dist/hooks/safeContext.js +3 -3
  87. package/dist/hooks/useCurrentViewId.d.ts +5 -1
  88. package/dist/hooks/useCurrentViewId.js +1 -2
  89. package/dist/hooks/useDiagram.d.ts +77 -12572
  90. package/dist/hooks/useDiagram.js +9 -7
  91. package/dist/hooks/useMantinePortalProps.d.ts +2 -2
  92. package/dist/hooks/useMantinePortalProps.js +2 -2
  93. package/dist/hooks/useSearchActor.d.ts +2 -0
  94. package/dist/hooks/useSearchActor.js +10 -0
  95. package/dist/hooks/useSetState.js +3 -3
  96. package/dist/hooks/useUpdateEffect.js +3 -1
  97. package/dist/hooks/useXYFlow.d.ts +75 -73
  98. package/dist/hooks/useXYFlow.js +7 -3
  99. package/dist/index.d.ts +2 -4
  100. package/dist/index.js +8 -3
  101. package/dist/likec4diagram/DiagramUI.js +9 -4
  102. package/dist/likec4diagram/DiagramXYFlow.d.ts +4 -3
  103. package/dist/likec4diagram/DiagramXYFlow.js +124 -109
  104. package/dist/likec4diagram/custom/edges/NotePopover.js +2 -2
  105. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +12 -15
  106. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +16 -8
  107. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +19 -15
  108. package/dist/likec4diagram/custom/index.d.ts +18 -21
  109. package/dist/likec4diagram/custom/index.js +3 -3
  110. package/dist/likec4diagram/custom/nodes/CompoundActions.js +2 -2
  111. package/dist/likec4diagram/custom/nodes/ElementActions.d.ts +27 -4
  112. package/dist/likec4diagram/custom/nodes/ElementActions.js +67 -53
  113. package/dist/likec4diagram/custom/nodes/index.d.ts +8 -0
  114. package/dist/likec4diagram/custom/nodes/nodes.d.ts +10 -0
  115. package/dist/likec4diagram/custom/nodes/nodes.js +105 -0
  116. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +2 -2
  117. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +6 -7
  118. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +3 -3
  119. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.d.ts +3 -2
  120. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +2 -2
  121. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +5 -5
  122. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +2 -2
  123. package/dist/likec4diagram/types.d.ts +18 -10
  124. package/dist/likec4diagram/ui/controls/ChangeAutoLayoutButton.js +4 -4
  125. package/dist/likec4diagram/ui/controls/Controls.js +14 -6
  126. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.js +2 -2
  127. package/dist/likec4diagram/ui/notation/NotationPanel.js +7 -9
  128. package/dist/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.js +4 -4
  129. package/dist/likec4diagram/useLayoutConstraints.js +3 -4
  130. package/dist/likec4diagram/useViewToNodesEdges.d.ts +5 -3
  131. package/dist/likec4diagram/useViewToNodesEdges.js +22 -30
  132. package/dist/likec4model/LikeC4ModelContext.d.ts +2 -2
  133. package/dist/likec4model/LikeC4ModelContext.js +2 -2
  134. package/dist/likec4model/useLikeC4ElementsTree.d.ts +1 -1
  135. package/dist/likec4model/useLikeC4ElementsTree.js +4 -4
  136. package/dist/likec4model/useLikeC4Model.d.ts +22 -10
  137. package/dist/likec4model/useLikeC4Model.js +13 -9
  138. package/dist/overlays/Overlays.d.ts +2 -3
  139. package/dist/overlays/Overlays.js +9 -33
  140. package/dist/overlays/element-details/ElementDetailsCard.css.js +13 -9
  141. package/dist/overlays/element-details/ElementDetailsCard.d.ts +1 -1
  142. package/dist/overlays/element-details/ElementDetailsCard.js +110 -110
  143. package/dist/overlays/element-details/TabPanelDeployments.d.ts +1 -1
  144. package/dist/overlays/element-details/TabPanelDeployments.js +5 -5
  145. package/dist/overlays/element-details/TabPanelRelationships.d.ts +1 -1
  146. package/dist/overlays/element-details/TabPanelRelationships.js +2 -2
  147. package/dist/overlays/element-details/TabPanelStructure.d.ts +1 -1
  148. package/dist/overlays/element-details/TabPanelStructure.js +3 -3
  149. package/dist/overlays/element-details/actor.d.ts +5482 -18265
  150. package/dist/overlays/element-details/actor.js +0 -2
  151. package/dist/overlays/element-details/actorContext.js +3 -3
  152. package/dist/overlays/overlay/Overlay.css.d.ts +57 -2
  153. package/dist/overlays/overlay/Overlay.css.js +76 -39
  154. package/dist/overlays/overlay/Overlay.d.ts +23 -1
  155. package/dist/overlays/overlay/Overlay.js +40 -29
  156. package/dist/overlays/overlaysActor.d.ts +5 -3
  157. package/dist/overlays/overlaysActor.js +2 -1
  158. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +6 -9
  159. package/dist/overlays/relationship-details/RelationshipDetails.js +15 -15
  160. package/dist/overlays/relationship-details/SelectEdge.js +2 -3
  161. package/dist/overlays/relationship-details/_types.d.ts +7 -6
  162. package/dist/overlays/relationship-details/actor.d.ts +3 -3
  163. package/dist/overlays/relationship-details/actor.js +7 -7
  164. package/dist/overlays/relationship-details/compute.js +3 -3
  165. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +6 -9
  166. package/dist/overlays/relationship-details/custom/edgeTypes.js +2 -2
  167. package/dist/overlays/relationship-details/custom/nodeTypes.d.ts +3 -31
  168. package/dist/overlays/relationship-details/custom/nodeTypes.js +4 -0
  169. package/dist/overlays/relationship-details/hooks.d.ts +28 -27
  170. package/dist/overlays/relationship-details/hooks.js +4 -4
  171. package/dist/overlays/relationship-details/layout-to-xyflow.js +1 -0
  172. package/dist/overlays/relationship-details/layout.js +5 -4
  173. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +6 -9
  174. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +8 -8
  175. package/dist/overlays/relationships-browser/SelectElement.js +6 -6
  176. package/dist/overlays/relationships-browser/_types.d.ts +7 -6
  177. package/dist/overlays/relationships-browser/actor.d.ts +64 -429
  178. package/dist/overlays/relationships-browser/actor.js +7 -7
  179. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +6 -9
  180. package/dist/overlays/relationships-browser/custom/edgeTypes.js +2 -2
  181. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +17 -18
  182. package/dist/overlays/relationships-browser/custom/nodeTypes.js +5 -2
  183. package/dist/overlays/relationships-browser/hooks.d.ts +4 -61
  184. package/dist/overlays/relationships-browser/hooks.js +4 -4
  185. package/dist/overlays/relationships-browser/layout.d.ts +2 -2
  186. package/dist/overlays/relationships-browser/layout.js +13 -10
  187. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +4 -3
  188. package/dist/search/Search.d.ts +5 -0
  189. package/dist/search/Search.js +192 -0
  190. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.js +0 -1
  191. package/dist/search/components/ElementsColumn.d.ts +2 -0
  192. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.js +26 -25
  193. package/dist/search/components/PickView.d.ts +4 -0
  194. package/dist/search/components/PickView.js +135 -0
  195. package/dist/search/components/SearchByTags.d.ts +1 -0
  196. package/dist/search/components/SearchByTags.js +116 -0
  197. package/dist/search/components/SearchInput.d.ts +2 -0
  198. package/dist/{likec4diagram/ui/search → search/components}/SearchInput.js +53 -35
  199. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.d.ts +3 -2
  200. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.js +14 -13
  201. package/dist/search/components/_shared.css.d.ts +4 -0
  202. package/dist/{likec4diagram/ui/search → search/components}/_shared.css.js +26 -35
  203. package/dist/{likec4diagram/ui/search/LikeC4Search.css.d.ts → search/components/styles.css.d.ts} +0 -2
  204. package/dist/search/components/styles.css.js +60 -0
  205. package/dist/{likec4diagram/ui/search → search/components}/utils.d.ts +1 -0
  206. package/dist/{likec4diagram/ui/search → search/components}/utils.js +7 -1
  207. package/dist/search/hooks.d.ts +16 -0
  208. package/dist/search/hooks.js +35 -0
  209. package/dist/search/searchActor.d.ts +90 -0
  210. package/dist/search/searchActor.js +75 -0
  211. package/dist/state/DiagramActorProvider.d.ts +9 -7
  212. package/dist/state/DiagramActorProvider.js +24 -18
  213. package/dist/state/assign.d.ts +0 -1
  214. package/dist/state/assign.js +9 -19
  215. package/dist/state/diagram-machine.d.ts +749 -10678
  216. package/dist/state/diagram-machine.js +121 -55
  217. package/dist/state/hotkeyActor.d.ts +4 -2
  218. package/dist/state/syncManualLayoutActor.d.ts +15 -4
  219. package/dist/state/syncManualLayoutActor.js +2 -1
  220. package/dist/state/types.d.ts +7 -4
  221. package/dist/state/utils.d.ts +3 -1
  222. package/dist/state/utils.js +3 -0
  223. package/dist/styles-font.css +1 -0
  224. package/dist/styles-min.css +1 -0
  225. package/dist/styles-xyflow.css +1 -0
  226. package/dist/styles.css +1 -0
  227. package/dist/styles.css2.js +3 -0
  228. package/package.json +50 -25
  229. package/panda.buildinfo.json +1002 -0
  230. package/src/LikeC4CustomColors.tsx +21 -6
  231. package/src/LikeC4Diagram.props.ts +42 -31
  232. package/src/LikeC4Diagram.tsx +21 -20
  233. package/src/LikeC4ModelProvider.tsx +7 -6
  234. package/src/StaticLikeC4Diagram.tsx +9 -6
  235. package/src/base/Background.tsx +0 -4
  236. package/src/base/const.ts +1 -1
  237. package/src/base/index.ts +2 -1
  238. package/src/base/primitives/compound/CompoundActionButton.tsx +9 -5
  239. package/src/base/primitives/compound/CompoundDetailsButton.tsx +9 -5
  240. package/src/base/primitives/compound/CompoundNodeContainer.tsx +8 -7
  241. package/src/base/primitives/compound/CompoundTitle.tsx +3 -2
  242. package/src/base/primitives/customEdge.ts +1 -1
  243. package/src/base/primitives/{customNode.ts → customNode.tsx} +11 -3
  244. package/src/base/primitives/edge/EdgeContainer.tsx +2 -1
  245. package/src/base/primitives/edge/EdgeLabel.css.ts +1 -0
  246. package/src/base/primitives/edge/EdgeLabel.tsx +20 -15
  247. package/src/base/primitives/edge/EdgeLabelContainer.tsx +1 -1
  248. package/src/base/primitives/edge/EdgeMarkers.tsx +2 -1
  249. package/src/base/primitives/edge/EdgePath.tsx +1 -1
  250. package/src/base/primitives/element/ElementActionButtons.tsx +11 -10
  251. package/src/base/primitives/element/ElementDetailsButton.tsx +2 -1
  252. package/src/base/primitives/element/ElementNodeContainer.tsx +87 -80
  253. package/src/base/primitives/element/ElementShape.tsx +12 -10
  254. package/src/base/primitives/element/ElementTags.tsx +182 -0
  255. package/src/base/primitives/element/ElementTitle.tsx +21 -15
  256. package/src/base/primitives/index.ts +1 -0
  257. package/src/base/types.Base.ts +104 -0
  258. package/src/base/types.ts +4 -106
  259. package/src/bundle/LikeC4View.props.ts +23 -5
  260. package/src/bundle/LikeC4View.tsx +20 -19
  261. package/src/bundle/ReactLikeC4.tsx +15 -27
  262. package/src/bundle/custom.ts +1 -0
  263. package/src/bundle/index.ts +20 -1
  264. package/src/bundle/styles.css.ts +1 -1
  265. package/src/components/ErrorFallback.tsx +30 -0
  266. package/src/components/SearchControl.tsx +1 -1
  267. package/src/context/DiagramEventHandlers.tsx +5 -4
  268. package/src/context/DiagramFeatures.tsx +15 -30
  269. package/src/context/EnsureMantine.tsx +13 -3
  270. package/src/context/IconRenderer.tsx +2 -5
  271. package/src/context/ReduceGraphics.tsx +6 -6
  272. package/src/context/RootContainer.tsx +9 -3
  273. package/src/context/TagStylesContext.tsx +96 -0
  274. package/src/context/index.ts +0 -1
  275. package/src/custom/components.ts +49 -0
  276. package/src/custom/customNodes.tsx +254 -0
  277. package/src/custom/hooks.ts +36 -0
  278. package/src/custom/index.ts +5 -0
  279. package/src/hooks/index.ts +1 -1
  280. package/src/hooks/useCurrentViewId.ts +6 -1
  281. package/src/hooks/useDiagram.ts +131 -18
  282. package/src/hooks/useMantinePortalProps.ts +10 -1
  283. package/src/hooks/useSearchActor.ts +11 -0
  284. package/src/hooks/useUpdateEffect.ts +7 -4
  285. package/src/hooks/useXYFlow.ts +5 -0
  286. package/src/index.ts +4 -8
  287. package/src/likec4diagram/DiagramUI.tsx +5 -0
  288. package/src/likec4diagram/DiagramXYFlow.tsx +135 -115
  289. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +10 -1
  290. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +17 -14
  291. package/src/likec4diagram/custom/{index.tsx → index.ts} +2 -2
  292. package/src/likec4diagram/custom/nodes/CompoundActions.tsx +2 -2
  293. package/src/likec4diagram/custom/nodes/ElementActions.tsx +100 -57
  294. package/src/likec4diagram/custom/nodes/index.ts +17 -0
  295. package/src/likec4diagram/custom/nodes/nodes.tsx +127 -0
  296. package/src/likec4diagram/custom/nodes/toolbar/CompoundToolbar.tsx +3 -4
  297. package/src/likec4diagram/custom/nodes/toolbar/ElementToolbar.tsx +3 -3
  298. package/src/likec4diagram/custom/nodes/toolbar/Toolbar.tsx +5 -4
  299. package/src/likec4diagram/custom/nodes/toolbar/_shared.tsx +11 -3
  300. package/src/likec4diagram/types.ts +24 -12
  301. package/src/likec4diagram/ui/controls/Controls.tsx +11 -4
  302. package/src/likec4diagram/ui/diagram-title/DiagramTitlePanel.tsx +1 -1
  303. package/src/likec4diagram/ui/notation/NotationPanel.tsx +3 -4
  304. package/src/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.tsx +1 -1
  305. package/src/likec4diagram/useViewToNodesEdges.ts +36 -36
  306. package/src/likec4model/LikeC4ModelContext.ts +2 -2
  307. package/src/likec4model/useLikeC4ElementsTree.ts +4 -2
  308. package/src/likec4model/useLikeC4Model.ts +18 -16
  309. package/src/overlays/Overlays.tsx +7 -35
  310. package/src/overlays/element-details/ElementDetailsCard.css.ts +14 -22
  311. package/src/overlays/element-details/ElementDetailsCard.tsx +43 -34
  312. package/src/overlays/element-details/TabPanelDeployments.tsx +3 -2
  313. package/src/overlays/element-details/TabPanelRelationships.tsx +2 -1
  314. package/src/overlays/element-details/TabPanelStructure.tsx +1 -1
  315. package/src/overlays/element-details/actor.ts +2 -2
  316. package/src/overlays/overlay/Overlay.css.ts +75 -38
  317. package/src/overlays/overlay/Overlay.tsx +45 -29
  318. package/src/overlays/overlaysActor.ts +5 -4
  319. package/src/overlays/relationship-details/RelationshipDetails.tsx +5 -5
  320. package/src/overlays/relationship-details/SelectEdge.tsx +0 -2
  321. package/src/overlays/relationship-details/_types.ts +18 -14
  322. package/src/overlays/relationship-details/custom/edgeTypes.tsx +2 -2
  323. package/src/overlays/relationship-details/custom/nodeTypes.tsx +4 -0
  324. package/src/overlays/relationship-details/layout-to-xyflow.ts +1 -0
  325. package/src/overlays/relationship-details/layout.ts +3 -1
  326. package/src/overlays/relationships-browser/SelectElement.tsx +1 -1
  327. package/src/overlays/relationships-browser/_types.ts +20 -16
  328. package/src/overlays/relationships-browser/actor.ts +2 -2
  329. package/src/overlays/relationships-browser/custom/edgeTypes.tsx +2 -2
  330. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +5 -2
  331. package/src/overlays/relationships-browser/layout.ts +12 -7
  332. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +4 -4
  333. package/src/search/Search.tsx +237 -0
  334. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.css.ts +0 -29
  335. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.tsx +25 -25
  336. package/src/search/components/PickView.tsx +140 -0
  337. package/src/search/components/SearchByTags.tsx +109 -0
  338. package/src/{likec4diagram/ui/search → search/components}/SearchInput.tsx +63 -36
  339. package/src/{likec4diagram/ui/search → search/components}/ViewsColum.tsx +17 -18
  340. package/src/{likec4diagram/ui/search → search/components}/_shared.css.ts +26 -37
  341. package/src/{likec4diagram/ui/search/LikeC4Search.css.ts → search/components/styles.css.ts} +9 -36
  342. package/src/{likec4diagram/ui/search → search/components}/utils.ts +7 -0
  343. package/src/search/hooks.ts +41 -0
  344. package/src/search/searchActor.ts +99 -0
  345. package/src/state/DiagramActorProvider.tsx +36 -25
  346. package/src/state/assign.ts +10 -10
  347. package/src/state/diagram-machine.ts +128 -60
  348. package/src/state/hotkeyActor.ts +4 -2
  349. package/src/state/syncManualLayoutActor.ts +10 -4
  350. package/src/state/types.ts +11 -3
  351. package/src/state/utils.ts +7 -3
  352. package/src/styles-min.css +2 -0
  353. package/src/styles-xyflow.css +1 -0
  354. package/dist/_virtual/_commonjsHelpers.js +0 -5
  355. package/dist/_virtual/default-map.js +0 -7
  356. package/dist/_virtual/index.js +0 -5
  357. package/dist/_virtual/index2.js +0 -3
  358. package/dist/_virtual/react.production.js +0 -3
  359. package/dist/_virtual/set.js +0 -5
  360. package/dist/_virtual/set2.js +0 -3
  361. package/dist/base/types.js +0 -54
  362. package/dist/base/xyflowMachine.d.ts +0 -212
  363. package/dist/likec4diagram/custom/nodes/nodeTypes.d.ts +0 -8
  364. package/dist/likec4diagram/custom/nodes/nodeTypes.js +0 -92
  365. package/dist/likec4diagram/ui/search/ElementsColumn.d.ts +0 -1
  366. package/dist/likec4diagram/ui/search/LikeC4Search.css.js +0 -87
  367. package/dist/likec4diagram/ui/search/LikeC4Search.d.ts +0 -2
  368. package/dist/likec4diagram/ui/search/LikeC4Search.js +0 -267
  369. package/dist/likec4diagram/ui/search/SearchInput.d.ts +0 -1
  370. package/dist/likec4diagram/ui/search/_shared.css.d.ts +0 -4
  371. package/dist/likec4diagram/ui/search/state.d.ts +0 -19
  372. package/dist/likec4diagram/ui/search/state.js +0 -64
  373. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/default-map.js +0 -172
  374. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/set.js +0 -369
  375. package/dist/node_modules/.pnpm/react@19.1.0/node_modules/react/cjs/react.production.js +0 -556
  376. package/dist/node_modules/.pnpm/react@19.1.0/node_modules/react/index.js +0 -15
  377. package/dist/packages/core/src/compute-view/relationships-view/compute.js +0 -123
  378. package/dist/packages/core/src/compute-view/relationships-view/utils.js +0 -68
  379. package/dist/packages/core/src/errors/index.js +0 -15
  380. package/dist/packages/core/src/model/connection/model/ConnectionModel.js +0 -121
  381. package/dist/packages/core/src/model/connection/model/find.js +0 -39
  382. package/dist/packages/core/src/model/connection/ops.js +0 -7
  383. package/dist/packages/core/src/utils/const.js +0 -3
  384. package/dist/packages/core/src/utils/fqn.js +0 -51
  385. package/dist/packages/core/src/utils/guards.js +0 -7
  386. package/dist/packages/core/src/utils/iterable/filter.js +0 -21
  387. package/dist/packages/core/src/utils/iterable/find.js +0 -21
  388. package/dist/packages/core/src/utils/iterable/map.js +0 -18
  389. package/dist/packages/core/src/utils/iterable/some.js +0 -21
  390. package/dist/packages/core/src/utils/iterable/to.js +0 -14
  391. package/dist/packages/core/src/utils/set.js +0 -48
  392. package/dist/packages/core/src/utils/string-hash.js +0 -13
  393. package/dist/styles.css.js +0 -3
  394. package/src/base/xyflowMachine.ts +0 -75
  395. package/src/likec4diagram/custom/nodes/nodeTypes.tsx +0 -109
  396. package/src/likec4diagram/ui/search/LikeC4Search.tsx +0 -301
  397. package/src/likec4diagram/ui/search/state.ts +0 -78
  398. /package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.d.ts +0 -0
  399. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.d.ts +0 -0
  400. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.js +0 -0
  401. /package/dist/{bundle/font.css.js → styles-font.css2.js} +0 -0
  402. /package/src/{likec4diagram/ui/search → search/components}/ViewsColumn.css.ts +0 -0
  403. /package/src/{bundle/font.css → styles-font.css} +0 -0
@@ -1,8 +1,7 @@
1
- import type { DiagramEdge, DiagramNode, Fqn, IconUrl, ViewId } from '@likec4/core'
1
+ import type { DeploymentFqn, DiagramEdge, DiagramNode, Fqn, IconUrl, ViewId } from '@likec4/core/types'
2
2
  import type { XYPosition } from '@xyflow/system'
3
3
  import type { OptionalKeysOf, Simplify } from 'type-fest'
4
- import type { Base } from '../base'
5
- import type { ReactFlowEdge, ReactFlowNode } from '../base/types'
4
+ import type { Base, ReactFlowEdge, ReactFlowNode } from '../base/types'
6
5
 
7
6
  type NonOptional<T extends object> = Simplify<
8
7
  & {
@@ -14,7 +13,8 @@ type NonOptional<T extends object> = Simplify<
14
13
  >
15
14
 
16
15
  export namespace Types {
17
- export type LeafNodeData = Base.NodeData<
16
+ export type LeafNodeData =
17
+ & Base.NodeData
18
18
  & NonOptional<
19
19
  Pick<
20
20
  DiagramNode,
@@ -28,14 +28,18 @@ export namespace Types {
28
28
  | 'level'
29
29
  | 'height'
30
30
  | 'style'
31
+ | 'tags'
31
32
  | 'position'
32
33
  >
33
34
  >
34
35
  & {
36
+ /**
37
+ * View this node belongs to
38
+ */
39
+ viewId: ViewId
35
40
  isMultiple?: boolean | undefined
36
41
  icon: string | null
37
42
  }
38
- >
39
43
 
40
44
  /**
41
45
  * Represents element from logical model
@@ -56,12 +60,13 @@ export namespace Types {
56
60
  & LeafNodeData
57
61
  & {
58
62
  navigateTo: ViewId | null
59
- deploymentFqn: Fqn
63
+ deploymentFqn: DeploymentFqn
60
64
  // If set - this node refers to a model element
61
65
  modelFqn: Fqn | null
62
66
  }
63
67
 
64
- export type CompoundNodeData = Base.NodeData<
68
+ export type CompoundNodeData =
69
+ & Base.NodeData
65
70
  & NonOptional<
66
71
  Pick<
67
72
  DiagramNode,
@@ -70,14 +75,18 @@ export namespace Types {
70
75
  | 'color'
71
76
  | 'shape'
72
77
  | 'style'
78
+ | 'tags'
73
79
  | 'position'
74
80
  >
75
81
  >
76
82
  & {
83
+ /**
84
+ * View this node belongs to
85
+ */
86
+ viewId: ViewId
77
87
  depth: number
78
88
  icon?: IconUrl
79
89
  }
80
- >
81
90
 
82
91
  export type CompoundElementNodeData = CompoundNodeData & {
83
92
  modelFqn: Fqn
@@ -89,7 +98,7 @@ export namespace Types {
89
98
  }
90
99
 
91
100
  export type CompoundDeploymentNodeData = CompoundNodeData & {
92
- deploymentFqn: Fqn
101
+ deploymentFqn: DeploymentFqn
93
102
  /**
94
103
  * If set - this node refers to a model element
95
104
  */
@@ -116,8 +125,9 @@ export namespace Types {
116
125
 
117
126
  export type NodeData = Node['data']
118
127
 
119
- export type RelationshipEdgeData = Base.EdgeData<
120
- NonOptional<
128
+ export type RelationshipEdgeData = Simplify<
129
+ & Base.EdgeData
130
+ & NonOptional<
121
131
  Pick<
122
132
  DiagramEdge,
123
133
  | 'id'
@@ -133,7 +143,8 @@ export namespace Types {
133
143
  | 'navigateTo'
134
144
  | 'notes'
135
145
  >
136
- > & {
146
+ >
147
+ & {
137
148
  labelXY: XYPosition | null
138
149
  controlPoints: XYPosition[] | undefined | null
139
150
  }
@@ -142,4 +153,5 @@ export namespace Types {
142
153
  export type RelationshipEdge = ReactFlowEdge<RelationshipEdgeData, 'relationship'>
143
154
 
144
155
  export type Edge = RelationshipEdge
156
+ export type EdgeData = RelationshipEdgeData
145
157
  }
@@ -3,12 +3,12 @@ import { ActionIconGroup, Badge, Box, Group, Loader, Stack } from '@mantine/core
3
3
  import { IconFileSymlink, IconFocusCentered, IconMenu2 } from '@tabler/icons-react'
4
4
  import { LayoutGroup, m } from 'motion/react'
5
5
  import { memo } from 'react'
6
+ import { SearchControl } from '../../../components/SearchControl'
6
7
  import { useDiagramEventHandlers, useEnabledFeatures } from '../../../context'
7
8
  import { type ControlsCustomLayout, useControlsCustomLayout } from '../../../context/ControlsCustomLayout'
8
9
  import { useMantinePortalProps } from '../../../hooks'
9
10
  import { useDiagram, useDiagramContext, useDiagramSyncLayoutState } from '../../../hooks/useDiagram'
10
11
  import { stopPropagation } from '../../../utils'
11
- import { LikeC4Search } from '../search/LikeC4Search'
12
12
  import { ActionIcon, Tooltip } from './_shared'
13
13
  import { ChangeAutoLayoutButton } from './ChangeAutoLayoutButton'
14
14
  import { LayoutDriftNotification } from './LayoutDriftNotification'
@@ -68,8 +68,7 @@ const ControlsDefaultLayout: ControlsCustomLayout = ({
68
68
  )
69
69
 
70
70
  export const Controls = memo(() => {
71
- const { viewId, hasLayoutDrift, viewportChanged, isNotActiveWalkthrough } = useDiagramContext(c => ({
72
- viewId: c.view.id,
71
+ const { hasLayoutDrift, viewportChanged, isNotActiveWalkthrough } = useDiagramContext(c => ({
73
72
  hasLayoutDrift: c.view.hasLayoutDrift ?? false,
74
73
  viewportChanged: c.viewportChangedManually,
75
74
  isNotActiveWalkthrough: c.activeWalkthrough === null,
@@ -103,7 +102,14 @@ export const Controls = memo(() => {
103
102
  </ActionIcon>
104
103
  )}
105
104
  navigationButtons={enableNavigationButtons && <NavigationButtons />}
106
- search={enableSearch && <LikeC4Search />}
105
+ search={enableSearch && (
106
+ <SearchControl
107
+ onClick={e => {
108
+ e.stopPropagation()
109
+ diagram.openSearch()
110
+ }}
111
+ />
112
+ )}
107
113
  syncInProgressBadge={<SyncLayoutBadge />}
108
114
  actionsGroup={
109
115
  <ActionIconGroup className={css.actionIconGroup} orientation="vertical">
@@ -112,6 +118,7 @@ export const Controls = memo(() => {
112
118
  <ActionIcon
113
119
  onClick={e => {
114
120
  e.stopPropagation()
121
+ const viewId = diagram.currentView.id
115
122
  onOpenSource?.({ view: viewId })
116
123
  }}>
117
124
  <IconFileSymlink stroke={1.5} />
@@ -1,7 +1,7 @@
1
+ import { cx as clsx } from '@likec4/styles/css'
1
2
  import { Button, Card, CardSection, Group, Spoiler, Stack, Text } from '@mantine/core'
2
3
  import { useLocalStorage } from '@mantine/hooks'
3
4
  import { IconMenu } from '@tabler/icons-react'
4
- import clsx from 'clsx'
5
5
  import { AnimatePresence, m } from 'motion/react'
6
6
  import { Link } from '../../../components/Link'
7
7
  import { useDiagramContext } from '../../../hooks/useDiagram'
@@ -1,5 +1,5 @@
1
- import { type ComputedNode, type ElementNotation as ElementNotationData } from '@likec4/core'
2
- import { css, cx } from '@likec4/styles/css'
1
+ import { type ComputedNode, type NodeNotation as ElementNotationData } from '@likec4/core'
2
+ import { css, cx, cx as clsx } from '@likec4/styles/css'
3
3
  import {
4
4
  ActionIcon,
5
5
  Badge,
@@ -19,7 +19,6 @@ import {
19
19
  } from '@mantine/core'
20
20
  import { useLocalStorage } from '@mantine/hooks'
21
21
  import { IconAlertTriangle, IconArrowDownRight, IconHelpCircle } from '@tabler/icons-react'
22
- import clsx from 'clsx'
23
22
  import { AnimatePresence, m } from 'motion/react'
24
23
  import { memo, useState } from 'react'
25
24
  import { ceil, isNonNullish } from 'remeda'
@@ -123,7 +122,7 @@ const ElementNotation = ({ value }: { value: ElementNotationData }) => {
123
122
 
124
123
  const selector = (s: DiagramContext) => ({
125
124
  id: s.view.id,
126
- notations: s.view.notation?.elements ?? [],
125
+ notations: s.view.notation?.nodes ?? [],
127
126
  isVisible: true,
128
127
  // isVisible: isNullish(s.focusedNodeId ?? s.activeWalkthrough),
129
128
  })
@@ -1,3 +1,4 @@
1
+ import { cx as clsx } from '@likec4/styles/css'
1
2
  import { Badge, Box, Button, ButtonGroup } from '@mantine/core'
2
3
  import {
3
4
  IconPlayerPlayFilled,
@@ -5,7 +6,6 @@ import {
5
6
  IconPlayerSkipForwardFilled,
6
7
  IconPlayerStopFilled,
7
8
  } from '@tabler/icons-react'
8
- import clsx from 'clsx'
9
9
  import { AnimatePresence, m } from 'motion/react'
10
10
  import { isNonNull, isTruthy } from 'remeda'
11
11
  import { useXYStore } from '../../../hooks'
@@ -1,26 +1,27 @@
1
1
  import {
2
2
  type DiagramEdge,
3
+ type DiagramNode,
3
4
  type DiagramView,
4
5
  type EdgeId,
5
6
  type Fqn,
6
7
  type NodeId,
7
8
  type WhereOperator,
8
- DiagramNode,
9
- ElementKind,
9
+ GroupElementKind,
10
10
  invariant,
11
11
  nonNullable,
12
12
  Queue,
13
13
  whereOperatorAsPredicate,
14
14
  } from '@likec4/core'
15
- import { useDeepCompareMemo } from '@react-hookz/web'
15
+ import { useCustomCompareMemo } from '@react-hookz/web'
16
+ import { deepEqual, shallowEqual } from 'fast-equals'
16
17
  import { hasAtLeast, pick } from 'remeda'
17
18
  import { ZIndexes } from '../base/const'
18
19
  import type { Types } from './types'
19
20
 
20
21
  // const nodeZIndex = (node: DiagramNode) => node.level - (node.children.length > 0 ? 1 : 0)
21
22
  function viewToNodesEdge(opts: {
22
- view: Pick<DiagramView, 'id' | 'nodes' | 'edges' | '__'>
23
- where: WhereOperator<string, string> | undefined
23
+ view: Pick<DiagramView, 'id' | 'nodes' | 'edges' | '_type'>
24
+ where: WhereOperator | null
24
25
  nodesSelectable: boolean
25
26
  }): {
26
27
  xynodes: Types.Node[]
@@ -30,7 +31,7 @@ function viewToNodesEdge(opts: {
30
31
  view,
31
32
  nodesSelectable: selectable,
32
33
  } = opts
33
- const isDynamicView = view.__ === 'dynamic',
34
+ const isDynamicView = view._type === 'dynamic',
34
35
  xynodes = [] as Types.Node[],
35
36
  xyedges = [] as Types.Edge[],
36
37
  nodeLookup = new Map<Fqn, DiagramNode>()
@@ -73,7 +74,7 @@ function viewToNodesEdge(opts: {
73
74
  let next: TraverseItem | undefined
74
75
  while ((next = queue.dequeue())) {
75
76
  const { node, parent } = next
76
- const isCompound = hasAtLeast(node.children, 1) || node.kind == ElementKind.Group
77
+ const isCompound = hasAtLeast(node.children, 1) || node.kind == GroupElementKind
77
78
  if (isCompound) {
78
79
  for (const child of node.children) {
79
80
  queue.enqueue({ node: nodeById(child), parent: node })
@@ -93,8 +94,8 @@ function viewToNodesEdge(opts: {
93
94
 
94
95
  const base = {
95
96
  id,
96
- selectable: selectable && node.kind !== ElementKind.Group,
97
- focusable: selectable && node.kind !== ElementKind.Group,
97
+ selectable: selectable && node.kind !== GroupElementKind,
98
+ focusable: selectable && node.kind !== GroupElementKind,
98
99
  deletable: false,
99
100
  position,
100
101
  zIndex: isCompound ? ZIndexes.Compound : ZIndexes.Element,
@@ -104,13 +105,14 @@ function viewToNodesEdge(opts: {
104
105
  },
105
106
  initialWidth: node.width,
106
107
  initialHeight: node.height,
107
- hidden: node.kind !== ElementKind.Group && !visiblePredicate(node),
108
+ hidden: node.kind !== GroupElementKind && !visiblePredicate(node),
108
109
  ...(parent && {
109
110
  parentId: ns + parent.id,
110
111
  }),
111
112
  } satisfies Omit<Types.Node, 'data' | 'type'>
112
113
 
113
114
  const compoundData = {
115
+ viewId: view.id,
114
116
  id: node.id,
115
117
  title: node.title,
116
118
  color: node.color,
@@ -118,10 +120,12 @@ function viewToNodesEdge(opts: {
118
120
  style: node.style,
119
121
  depth: node.depth ?? 0,
120
122
  icon: node.icon ?? 'none',
123
+ tags: node.tags ?? null,
121
124
  position: node.position,
122
125
  } satisfies Types.CompoundNodeData
123
126
 
124
127
  const leafNodeData = {
128
+ viewId: view.id,
125
129
  id: node.id,
126
130
  title: node.title,
127
131
  technology: node.technology,
@@ -133,11 +137,12 @@ function viewToNodesEdge(opts: {
133
137
  shape: node.shape,
134
138
  style: node.style,
135
139
  icon: node.icon ?? null,
140
+ tags: node.tags,
136
141
  position: node.position,
137
142
  isMultiple: node.style?.multiple ?? false,
138
143
  } satisfies Types.LeafNodeData
139
144
 
140
- if (node.kind === ElementKind.Group) {
145
+ if (node.kind === GroupElementKind) {
141
146
  xynodes.push({
142
147
  ...base,
143
148
  type: 'view-group',
@@ -150,8 +155,8 @@ function viewToNodesEdge(opts: {
150
155
  continue
151
156
  }
152
157
 
153
- const modelFqn = DiagramNode.modelRef(node)
154
- const deploymentFqn = DiagramNode.deploymentRef(node)
158
+ const modelFqn = node.modelRef ?? null
159
+ const deploymentFqn = node.deploymentRef ?? null
155
160
  if (!modelFqn && !deploymentFqn) {
156
161
  console.error('Invalid node', node)
157
162
  throw new Error('Element should have either modelRef or deploymentRef')
@@ -267,29 +272,24 @@ function viewToNodesEdge(opts: {
267
272
  xyedges,
268
273
  }
269
274
  }
270
-
271
- export function useViewToNodesEdges({
272
- view: {
273
- id,
274
- nodes,
275
- edges,
276
- __ = 'element',
277
- },
278
- ...opts
279
- }: {
275
+ type ViewToNodesEdgeInput = {
280
276
  view: DiagramView
281
- where: WhereOperator<string, string> | undefined
277
+ where: WhereOperator | null
282
278
  nodesSelectable: boolean
283
- }) {
284
- return useDeepCompareMemo(() => {
285
- return viewToNodesEdge({
286
- view: {
287
- id,
288
- nodes,
289
- edges,
290
- __,
291
- },
292
- ...opts,
293
- })
294
- }, [id, __, nodes, edges, opts])
279
+ }
280
+ const viewToNodesEdgeEqual = (a: ViewToNodesEdgeInput, b: ViewToNodesEdgeInput) => (
281
+ a.view.id === b.view.id
282
+ && a.view._type === b.view._type
283
+ && a.nodesSelectable === b.nodesSelectable
284
+ && shallowEqual(a.view.nodes, b.view.nodes)
285
+ && shallowEqual(a.view.edges, b.view.edges)
286
+ && deepEqual(a.where, b.where)
287
+ )
288
+
289
+ export function useViewToNodesEdges(params: ViewToNodesEdgeInput) {
290
+ return useCustomCompareMemo(
291
+ () => viewToNodesEdge(params),
292
+ [params],
293
+ ([a], [b]) => !!a && !!b && viewToNodesEdgeEqual(a, b),
294
+ )
295
295
  }
@@ -1,4 +1,4 @@
1
- import type { LikeC4Model } from '@likec4/core'
1
+ import type { LikeC4Model } from '@likec4/core/model'
2
2
  import { createContext } from 'react'
3
3
 
4
- export const LikeC4ModelContext = createContext<LikeC4Model | null>(null)
4
+ export const LikeC4ModelContext = createContext<LikeC4Model<any> | null>(null)
@@ -1,4 +1,6 @@
1
- import { type Fqn, type LikeC4Model, type ViewId, compareNatural } from '@likec4/core'
1
+ import { type LikeC4Model } from '@likec4/core/model'
2
+ import { type Fqn, type ViewId } from '@likec4/core/types'
3
+ import { compareNatural } from '@likec4/core/utils'
2
4
  import { useMemo } from 'react'
3
5
  import { useLikeC4Model } from './useLikeC4Model'
4
6
 
@@ -25,7 +27,7 @@ function buildNode(
25
27
  * If `viewId` is provided, returns the tree of elements in the view.
26
28
  */
27
29
  export function useLikeC4ElementsTree(viewId?: ViewId): LikeC4ModelTreeNodeData[] {
28
- const model = useLikeC4Model(true)
30
+ const model = useLikeC4Model()
29
31
  return useMemo(() => {
30
32
  if (viewId) {
31
33
  const view = model.view(viewId)
@@ -1,26 +1,28 @@
1
- import type { LikeC4Model } from '@likec4/core'
1
+ import type { aux, LikeC4Model } from '@likec4/core/model'
2
2
  import { useContext } from 'react'
3
- import { isDefined, isNonNullish, isString } from 'remeda'
3
+ import { isString } from 'remeda'
4
4
  import { LikeC4ModelContext } from './LikeC4ModelContext'
5
5
 
6
- export function useLikeC4Model(): LikeC4Model | null
7
- export function useLikeC4Model(strict: true): LikeC4Model
8
- export function useLikeC4Model(strict: boolean): LikeC4Model | null
9
- export function useLikeC4Model(strict: true, type: 'layouted'): LikeC4Model.Layouted
10
- export function useLikeC4Model(strict: true, type: 'computed'): LikeC4Model.Computed
11
- export function useLikeC4Model(strict: true, type: 'layouted' | 'computed' | undefined): LikeC4Model
12
- export function useLikeC4Model(strict: boolean, type: 'layouted'): LikeC4Model.Layouted | null
13
- export function useLikeC4Model(strict: boolean, type: 'computed'): LikeC4Model.Computed | null
14
- export function useLikeC4Model(strict: boolean, type: 'layouted' | 'computed' | undefined): LikeC4Model | null
15
- export function useLikeC4Model(strict?: boolean, type?: 'layouted' | 'computed') {
6
+ export function useLikeC4Model<A extends aux.Any = aux.Unknown>(): LikeC4Model<A>
7
+ export function useLikeC4Model<A extends aux.Any = aux.Unknown>(type: 'layouted'): LikeC4Model.Layouted<A>
8
+ export function useLikeC4Model<A extends aux.Any = aux.Unknown>(type: 'computed'): LikeC4Model.Computed<A>
9
+ // dprint-ignore
10
+ export function useLikeC4Model<A extends aux.Any = aux.Unknown>(type: 'layouted' | 'computed' | undefined): LikeC4Model<A>
11
+ export function useLikeC4Model(type?: 'layouted' | 'computed') {
16
12
  const model = useContext(LikeC4ModelContext)
17
13
 
18
- if (isString(type) && isNonNullish(model) && model.type !== type) {
19
- throw new Error(`Invalid LikeC4ModelContext, expected "${type}" but got "${model.type}" in context`)
14
+ if (!model) {
15
+ throw new Error('No LikeC4Model found in context')
20
16
  }
21
17
 
22
- if (isDefined(strict) && strict === true && !model) {
23
- throw new Error('No LikeC4Model found in context')
18
+ if (isString(type) && model.stage !== type) {
19
+ throw new Error(`Invalid LikeC4ModelContext, expected "${type}" but got "${model.stage}" in context`)
24
20
  }
21
+
25
22
  return model
26
23
  }
24
+
25
+ export function useLikeC4Specification() {
26
+ const model = useLikeC4Model()
27
+ return model.$data.specification
28
+ }
@@ -1,13 +1,12 @@
1
1
  import { nonexhaustive } from '@likec4/core'
2
- import { Box, Button, Code, Group, Notification, ScrollAreaAutosize } from '@mantine/core'
3
- import { IconX } from '@tabler/icons-react'
4
2
  import { useSelector } from '@xstate/react'
5
3
  import { animate } from 'motion'
6
4
  import { AnimatePresence, LayoutGroup, useReducedMotionConfig } from 'motion/react'
7
- import { memo, useEffect, useMemo } from 'react'
8
- import { type FallbackProps, ErrorBoundary } from 'react-error-boundary'
5
+ import { useEffect, useMemo } from 'react'
6
+ import { ErrorBoundary } from 'react-error-boundary'
9
7
  import { isNonNullish } from 'remeda'
10
8
  import type { AnyActorRef } from 'xstate'
9
+ import { ErrorFallback } from '../components/ErrorFallback'
11
10
  import { DiagramFeatures } from '../context'
12
11
  import { useXYStore } from '../hooks'
13
12
  import { ElementDetails } from './element-details/ElementDetails'
@@ -16,32 +15,6 @@ import { type OverlaysActorRef, type OverlaysActorSnapshot } from './overlaysAct
16
15
  import { RelationshipDetails } from './relationship-details/RelationshipDetails'
17
16
  import { RelationshipsBrowser } from './relationships-browser/RelationshipsBrowser'
18
17
 
19
- function Fallback({ error, resetErrorBoundary }: FallbackProps) {
20
- const errorString = error instanceof Error ? error.message : 'Unknown error'
21
- return (
22
- <Box pos={'fixed'} top={0} left={0} w={'100%'} p={0} style={{ zIndex: 1000 }}>
23
- <Notification
24
- icon={<IconX style={{ width: 16, height: 16 }} />}
25
- styles={{
26
- icon: {
27
- alignSelf: 'flex-start',
28
- },
29
- }}
30
- color={'red'}
31
- title={'Oops, something went wrong'}
32
- p={'xl'}
33
- withCloseButton={false}>
34
- <ScrollAreaAutosize maw={'100%'} mah={400}>
35
- <Code block>{errorString}</Code>
36
- </ScrollAreaAutosize>
37
- <Group gap={'xs'} mt="xl">
38
- <Button color="gray" size="xs" variant="light" onClick={() => resetErrorBoundary()}>Reset</Button>
39
- </Group>
40
- </Notification>
41
- </Box>
42
- )
43
- }
44
-
45
18
  const selectOverlays = (s: OverlaysActorSnapshot) => {
46
19
  return s.context.overlays.map((overlay) => {
47
20
  switch (overlay.type) {
@@ -77,7 +50,7 @@ const compareSelectOverlays = <T extends ReturnType<typeof selectOverlays>>(a: T
77
50
  })
78
51
  }
79
52
 
80
- export const Overlays = memo(({ overlaysActorRef }: { overlaysActorRef: OverlaysActorRef }) => {
53
+ export function Overlays({ overlaysActorRef }: { overlaysActorRef: OverlaysActorRef }) {
81
54
  const xyflowDomNode = useXYStore(s => s.domNode)
82
55
  const xyflowRendererDom = useMemo(() => xyflowDomNode?.querySelector('.react-flow__renderer') ?? null, [
83
56
  xyflowDomNode,
@@ -85,7 +58,7 @@ export const Overlays = memo(({ overlaysActorRef }: { overlaysActorRef: Overlays
85
58
  const overlays = useSelector(overlaysActorRef, selectOverlays, compareSelectOverlays)
86
59
  const isMotionReduced = useReducedMotionConfig() ?? false
87
60
 
88
- const isActiveOverlay = overlays.length > 0
61
+ const isActiveOverlay = overlays.some((overlay) => overlay.type === 'elementDetails')
89
62
 
90
63
  useEffect(() => {
91
64
  if (!xyflowRendererDom || isMotionReduced) return
@@ -136,7 +109,7 @@ export const Overlays = memo(({ overlaysActorRef }: { overlaysActorRef: Overlays
136
109
 
137
110
  return (
138
111
  <DiagramFeatures.Overlays>
139
- <ErrorBoundary FallbackComponent={Fallback} onReset={() => overlaysActorRef.send({ type: 'close.all' })}>
112
+ <ErrorBoundary FallbackComponent={ErrorFallback} onReset={() => overlaysActorRef.send({ type: 'close.all' })}>
140
113
  <LayoutGroup>
141
114
  <AnimatePresence>
142
115
  {overlaysReact}
@@ -145,5 +118,4 @@ export const Overlays = memo(({ overlaysActorRef }: { overlaysActorRef: Overlays
145
118
  </ErrorBoundary>
146
119
  </DiagramFeatures.Overlays>
147
120
  )
148
- })
149
- Overlays.displayName = 'Overlays'
121
+ }
@@ -27,17 +27,20 @@ export const card = css({
27
27
  pointerEvents: 'all',
28
28
  gap: 'lg',
29
29
  justifyContent: 'stretch',
30
- backgroundColor: 'mantine.colors.body',
31
- backgroundImage:
32
- `linear-gradient(180deg, {colors.likec4.palette.fill}, {colors.likec4.palette.fill} 4px, transparent 4px)`,
33
- borderTopColor: 'likec4.palette.fill',
34
- _dark: {
35
- backgroundColor: `mantine.colors.dark[6]`,
36
- backgroundImage: `
37
- linear-gradient(180deg, color-mix(in srgb, {colors.likec4.palette.fill} 15%, transparent), transparent 80px),
38
- linear-gradient(180deg, {colors.likec4.palette.fill}, {colors.likec4.palette.fill} 4px, transparent 4px)
39
- `,
40
- },
30
+ backgroundColor: {
31
+ base: 'mantine.colors.body',
32
+ _dark: 'mantine.colors.dark[6]',
33
+ },
34
+ border: `none`,
35
+ backgroundImage: `
36
+ linear-gradient(180deg,
37
+ color-mix(in srgb, {colors.likec4.palette.fill} 60%, transparent),
38
+ color-mix(in srgb, {colors.likec4.palette.fill} 20%, transparent) 8px,
39
+ color-mix(in srgb, {colors.likec4.palette.fill} 14%, transparent) 20px,
40
+ transparent 80px
41
+ ),
42
+ linear-gradient(180deg, {colors.likec4.palette.fill}, {colors.likec4.palette.fill} 4px, transparent 4px)
43
+ `,
41
44
  '& .react-flow__attribution': {
42
45
  display: 'none',
43
46
  },
@@ -145,17 +148,6 @@ export const viewButtonTitle = css({
145
148
  fontWeight: 500,
146
149
  lineHeight: '1.4',
147
150
  })
148
- // globalStyle(`${viewButton} .tabler-icon`, {
149
- // width: '85%',
150
- // })
151
- // globalStyle(`${viewButton} .tabler-icon`, {
152
- // width: '85%',
153
- // opacity: 0.75
154
- // })
155
-
156
- // globalStyle(`${whereLight} ${viewButton} .mantine-Button-label`, {
157
- // color: mantine.colors.dark[3]
158
- // })
159
151
 
160
152
  export const tabsRoot = css({
161
153
  flex: 1,