@likec4/diagram 1.32.2 → 1.33.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 (155) hide show
  1. package/bundle/{chunk-DlHyKoeo.js → chunk-DyFK-AJ5.js} +516 -488
  2. package/bundle/custom.js +53 -50
  3. package/bundle/index.js +317 -154
  4. package/dist/base/primitives/MarkdownBlock.d.ts +27 -0
  5. package/dist/base/primitives/MarkdownBlock.js +42 -0
  6. package/dist/base/primitives/compound/CompoundActionButton.js +1 -1
  7. package/dist/base/primitives/compound/CompoundDetailsButton.js +1 -1
  8. package/dist/base/primitives/edge/EdgeActionButton.js +1 -1
  9. package/dist/base/primitives/element/ElementDetailsButton.js +1 -1
  10. package/dist/base/primitives/element/ElementTags.d.ts +1 -1
  11. package/dist/base/primitives/element/ElementTags.js +116 -125
  12. package/dist/base/primitives/element/ElementTitle.css.js +6 -1
  13. package/dist/base/primitives/element/ElementTitle.d.ts +3 -2
  14. package/dist/base/primitives/element/ElementTitle.js +9 -6
  15. package/dist/base/primitives/index.d.ts +1 -0
  16. package/dist/bundle/LikeC4View.js +1 -1
  17. package/dist/bundle/custom.js +31 -0
  18. package/dist/bundle/index.js +1 -0
  19. package/dist/components/ErrorFallback.js +1 -1
  20. package/dist/components/Link.js +2 -1
  21. package/dist/components/SearchControl.js +1 -1
  22. package/dist/context/DiagramFeatures.d.ts +3 -2
  23. package/dist/context/DiagramFeatures.js +16 -1
  24. package/dist/context/IconRenderer.js +6 -1
  25. package/dist/context/TagStylesContext.js +1 -1
  26. package/dist/custom/components.d.ts +2 -2
  27. package/dist/custom/customNodes.js +18 -0
  28. package/dist/custom/hooks.d.ts +3 -3
  29. package/dist/custom/index.js +31 -0
  30. package/dist/hooks/safeContext.js +1 -1
  31. package/dist/hooks/useXYFlow.d.ts +2 -1
  32. package/dist/index.d.ts +4 -6
  33. package/dist/index.js +1 -0
  34. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +5 -2
  35. package/dist/likec4diagram/custom/nodes/ElementActions.js +2 -1
  36. package/dist/likec4diagram/custom/nodes/nodes.js +3 -3
  37. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +2 -1
  38. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +2 -1
  39. package/dist/likec4diagram/types.d.ts +3 -2
  40. package/dist/likec4diagram/ui/controls/ChangeAutoLayoutButton.js +1 -1
  41. package/dist/likec4diagram/ui/controls/Controls.js +3 -1
  42. package/dist/likec4diagram/ui/controls/LayoutDriftNotification.js +1 -1
  43. package/dist/likec4diagram/ui/controls/ManualLayoutToolsButton.js +9 -1
  44. package/dist/likec4diagram/ui/controls/NavigationButtons.js +2 -1
  45. package/dist/likec4diagram/ui/controls/ToggleReadonly.js +2 -1
  46. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.js +19 -15
  47. package/dist/likec4diagram/ui/notation/NotationPanel.js +3 -1
  48. package/dist/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.js +4 -1
  49. package/dist/likec4diagram/useViewToNodesEdges.js +2 -2
  50. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/createReactComponent.js +41 -0
  51. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.js +30 -0
  52. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertTriangle.js +13 -0
  53. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowDownRight.js +13 -0
  54. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js +13 -0
  55. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconBrowser.js +13 -0
  56. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js +13 -0
  57. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js +13 -0
  58. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js +13 -0
  59. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js +13 -0
  60. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconCylinder.js +13 -0
  61. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconDeviceMobile.js +13 -0
  62. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconExternalLink.js +13 -0
  63. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js +13 -0
  64. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconFocusCentered.js +13 -0
  65. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconHelpCircle.js +13 -0
  66. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconId.js +13 -0
  67. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js +13 -0
  68. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignBottom.js +13 -0
  69. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignCenter.js +13 -0
  70. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignLeft.js +13 -0
  71. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignMiddle.js +13 -0
  72. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignRight.js +13 -0
  73. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignTop.js +13 -0
  74. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutBoardSplit.js +13 -0
  75. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutCollage.js +13 -0
  76. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutDashboard.js +13 -0
  77. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLock.js +13 -0
  78. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconLockOpen2.js +13 -0
  79. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconMenu.js +13 -0
  80. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconMenu2.js +13 -0
  81. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerPlayFilled.js +13 -0
  82. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerSkipBackFilled.js +13 -0
  83. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerSkipForwardFilled.js +13 -0
  84. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerStopFilled.js +13 -0
  85. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconRectangularPrism.js +13 -0
  86. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconReorder.js +13 -0
  87. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconRouteOff.js +13 -0
  88. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js +13 -0
  89. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconSelector.js +13 -0
  90. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconStack2.js +13 -0
  91. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconTarget.js +13 -0
  92. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconTransform.js +13 -0
  93. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconUser.js +13 -0
  94. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconX.js +13 -0
  95. package/dist/node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js +13 -0
  96. package/dist/overlays/element-details/ElementDetailsCard.css.js +4 -2
  97. package/dist/overlays/element-details/ElementDetailsCard.js +127 -12
  98. package/dist/overlays/element-details/TabPanelDeployments.js +3 -1
  99. package/dist/overlays/element-details/TabPanelRelationships.js +3 -1
  100. package/dist/overlays/element-details/TabPanelStructure.js +1 -1
  101. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +2 -2
  102. package/dist/overlays/relationship-details/RelationshipDetails.js +3 -1
  103. package/dist/overlays/relationship-details/SelectEdge.js +2 -1
  104. package/dist/overlays/relationship-details/_types.d.ts +4 -3
  105. package/dist/overlays/relationship-details/actor.d.ts +2 -2
  106. package/dist/overlays/relationship-details/custom/ElementActions.js +3 -1
  107. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +2 -2
  108. package/dist/overlays/relationship-details/hooks.d.ts +10 -10
  109. package/dist/overlays/relationship-details/layout-to-xyflow.js +4 -4
  110. package/dist/overlays/relationship-details/layout.d.ts +5 -3
  111. package/dist/overlays/relationship-details/layout.js +2 -2
  112. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +3 -1
  113. package/dist/overlays/relationships-browser/SelectElement.js +2 -1
  114. package/dist/overlays/relationships-browser/_types.d.ts +3 -2
  115. package/dist/overlays/relationships-browser/custom/ElementActions.js +3 -1
  116. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +2 -2
  117. package/dist/overlays/relationships-browser/layout.d.ts +4 -3
  118. package/dist/overlays/relationships-browser/layout.js +3 -3
  119. package/dist/search/components/ElementsColumn.js +2 -2
  120. package/dist/search/components/PickView.js +1 -1
  121. package/dist/search/components/SearchByTags.js +1 -1
  122. package/dist/search/components/SearchInput.js +1 -1
  123. package/dist/search/components/ViewsColum.js +4 -3
  124. package/dist/state/DiagramActorProvider.js +9 -1
  125. package/dist/state/diagram-machine.js +1 -1
  126. package/dist/styles-min.css +1 -1
  127. package/dist/styles.css +1 -1
  128. package/dist/styles.css2.js +1 -1
  129. package/package.json +20 -14
  130. package/panda.buildinfo.json +25 -6
  131. package/src/base/primitives/MarkdownBlock.tsx +66 -0
  132. package/src/base/primitives/element/ElementTags.tsx +118 -116
  133. package/src/base/primitives/element/ElementTitle.css.ts +7 -1
  134. package/src/base/primitives/element/ElementTitle.tsx +14 -9
  135. package/src/base/primitives/index.ts +1 -0
  136. package/src/context/DiagramFeatures.tsx +7 -7
  137. package/src/custom/components.ts +2 -0
  138. package/src/custom/hooks.ts +5 -0
  139. package/src/hooks/useXYFlow.ts +9 -1
  140. package/src/index.ts +18 -6
  141. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +1 -1
  142. package/src/likec4diagram/types.ts +2 -2
  143. package/src/likec4diagram/ui/diagram-title/DiagramTitlePanel.tsx +21 -16
  144. package/src/likec4diagram/useViewToNodesEdges.ts +2 -1
  145. package/src/overlays/element-details/ElementDetailsCard.css.ts +3 -1
  146. package/src/overlays/element-details/ElementDetailsCard.tsx +101 -17
  147. package/src/overlays/relationship-details/_types.ts +12 -3
  148. package/src/overlays/relationship-details/layout-to-xyflow.ts +3 -2
  149. package/src/overlays/relationship-details/layout.ts +7 -4
  150. package/src/overlays/relationships-browser/_types.ts +2 -1
  151. package/src/overlays/relationships-browser/layout.ts +7 -4
  152. package/src/search/components/ElementsColumn.tsx +1 -1
  153. package/src/search/components/ViewsColum.tsx +2 -2
  154. package/src/state/DiagramActorProvider.tsx +10 -2
  155. package/src/state/diagram-machine.ts +1 -1
@@ -1,12 +1,11 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { cx, css } from '@likec4/styles/css';
3
- import { RemoveScroll, Card, Group, Text, CloseButton, Badge, Flex, ActionIconGroup, ActionIcon, Tooltip as Tooltip$1, Tabs, TabsList, TabsTab, TabsPanel, ScrollArea, Box, Stack, Divider as Divider$1, Code, UnstyledButton, ThemeIcon } from '@mantine/core';
3
+ import { RemoveScroll, Card, Group, Text, CloseButton, Badge, Flex, ActionIconGroup, ActionIcon, Tooltip as Tooltip$1, Tabs, TabsList, TabsTab, TabsPanel, ScrollArea, Box, Stack, Divider as Divider$1, ScrollAreaAutosize, UnstyledButton, ThemeIcon } from '@mantine/core';
4
4
  import { useViewportSize, useSessionStorage } from '@mantine/hooks';
5
5
  import { useSyncedRef, useDebouncedCallback, useTimeoutEffect } from '@react-hookz/web';
6
- import { IconExternalLink, IconFileSymlink, IconZoomScan, IconStack2 } from '@tabler/icons-react';
7
6
  import { useDragControls, useMotionValue, m } from 'motion/react';
8
7
  import { useState, useCallback, useRef } from 'react';
9
- import { pipe, map, partition, only, clamp, isNullish } from 'remeda';
8
+ import { pipe, map, partition, only, clamp, isNullish, entries } from 'remeda';
10
9
  import { ElementTag } from '../../base/primitives/element/ElementTags.js';
11
10
  import { Link } from '../../components/Link.js';
12
11
  import { useDiagram } from '../../hooks/useDiagram.js';
@@ -18,7 +17,12 @@ import { useLikeC4Model } from '../../likec4model/useLikeC4Model.js';
18
17
  import { useUpdateEffect } from '../../hooks/useUpdateEffect.js';
19
18
  import { IconRenderer } from '../../context/IconRenderer.js';
20
19
  import { stopPropagation } from '../../utils/xyflow.js';
20
+ import IconExternalLink from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconExternalLink.js';
21
21
  import { IfEnabled, DiagramFeatures } from '../../context/DiagramFeatures.js';
22
+ import IconFileSymlink from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js';
23
+ import IconZoomScan from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js';
24
+ import { MarkdownBlock } from '../../base/primitives/MarkdownBlock.js';
25
+ import IconStack2 from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconStack2.js';
22
26
 
23
27
  const Divider = Divider$1.withProps({
24
28
  mb: 8,
@@ -255,7 +259,23 @@ function ElementDetailsCard({
255
259
  /* @__PURE__ */ jsxs(Group, { align: "baseline", gap: "sm", wrap: "nowrap", children: [
256
260
  /* @__PURE__ */ jsxs("div", { children: [
257
261
  /* @__PURE__ */ jsx(SmallLabel, { children: "kind" }),
258
- /* @__PURE__ */ jsx(Badge, { radius: "sm", size: "sm", fw: 600, color: "gray", children: elementModel.kind })
262
+ /* @__PURE__ */ jsx(
263
+ Badge,
264
+ {
265
+ radius: "sm",
266
+ size: "sm",
267
+ fw: 600,
268
+ color: "gray",
269
+ style: {
270
+ cursor: "pointer"
271
+ },
272
+ onClick: (e) => {
273
+ e.stopPropagation();
274
+ diagram.openSearch(`kind:${elementModel.kind}`);
275
+ },
276
+ children: elementModel.kind
277
+ }
278
+ )
259
279
  ] }),
260
280
  /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
261
281
  /* @__PURE__ */ jsx(SmallLabel, { children: "tags" }),
@@ -304,6 +324,9 @@ function ElementDetailsCard({
304
324
  radius: "sm",
305
325
  onClick: (e) => {
306
326
  e.stopPropagation();
327
+ diagram.openSource({
328
+ element: elementModel.id
329
+ });
307
330
  },
308
331
  children: /* @__PURE__ */ jsx(IconFileSymlink, { stroke: 1.8, style: { width: "62%" } })
309
332
  }
@@ -340,8 +363,17 @@ function ElementDetailsCard({
340
363
  },
341
364
  children: [
342
365
  /* @__PURE__ */ jsx(TabsList, { children: TABS.map((tab) => /* @__PURE__ */ jsx(TabsTab, { value: tab, children: tab }, tab)) }),
343
- /* @__PURE__ */ jsx(TabsPanel, { value: "Properties", children: /* @__PURE__ */ jsx(ScrollArea, { scrollbars: "y", type: "auto", children: /* @__PURE__ */ jsxs(Box, { className: propertiesGrid, pt: "xs", children: [
344
- /* @__PURE__ */ jsx(ElementProperty, { title: "description", emptyValue: "no description", children: elementModel.description }),
366
+ /* @__PURE__ */ jsx(TabsPanel, { value: "Properties", children: /* @__PURE__ */ jsx(ScrollArea, { scrollbars: "y", type: "scroll", offsetScrollbars: true, children: /* @__PURE__ */ jsxs(Box, { className: propertiesGrid, pt: "xs", children: [
367
+ /* @__PURE__ */ jsxs(Fragment, { children: [
368
+ /* @__PURE__ */ jsx(PropertyLabel, { children: "description" }),
369
+ /* @__PURE__ */ jsx(
370
+ MarkdownBlock,
371
+ {
372
+ value: elementModel.description,
373
+ emptyText: "no description"
374
+ }
375
+ )
376
+ ] }),
345
377
  elementModel.technology && /* @__PURE__ */ jsx(ElementProperty, { title: "technology", children: elementModel.technology }),
346
378
  elementModel.links.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
347
379
  /* @__PURE__ */ jsx(PropertyLabel, { children: "links" }),
@@ -417,10 +449,7 @@ const ViewButton = ({
417
449
  }) => {
418
450
  return /* @__PURE__ */ jsx(UnstyledButton, { className: viewButton, onClick: (e) => onNavigateTo(view.id, e), children: /* @__PURE__ */ jsxs(Group, { gap: 6, align: "start", wrap: "nowrap", children: [
419
451
  /* @__PURE__ */ jsx(ThemeIcon, { size: "sm", variant: "transparent", children: view._type === "deployment" ? /* @__PURE__ */ jsx(IconStack2, { stroke: 1.8 }) : /* @__PURE__ */ jsx(IconZoomScan, { stroke: 1.8 }) }),
420
- /* @__PURE__ */ jsxs(Box, { children: [
421
- /* @__PURE__ */ jsx(Text, { component: "div", className: viewButtonTitle, lineClamp: 1, children: view.title || "untitled" }),
422
- view.description && /* @__PURE__ */ jsx(Text, { component: "div", mt: 2, fz: "xs", c: "dimmed", lh: 1.4, lineClamp: 1, children: view.description })
423
- ] })
452
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { component: "div", className: viewButtonTitle, lineClamp: 1, children: view.title || "untitled" }) })
424
453
  ] }) });
425
454
  };
426
455
  function ElementProperty({
@@ -440,6 +469,7 @@ function ElementProperty({
440
469
  fz: "md",
441
470
  style: {
442
471
  whiteSpace: "preserve-breaks",
472
+ userSelect: "all",
443
473
  ...style
444
474
  },
445
475
  ...props,
@@ -449,11 +479,96 @@ function ElementProperty({
449
479
  ] });
450
480
  }
451
481
  function ElementMetata({
452
- value
482
+ value: metadata
453
483
  }) {
454
484
  return /* @__PURE__ */ jsxs(Fragment, { children: [
455
485
  /* @__PURE__ */ jsx(PropertyLabel, { children: "metadata" }),
456
- /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Code, { block: true, children: JSON.stringify(value, null, 2) }) })
486
+ /* @__PURE__ */ jsx(
487
+ Box,
488
+ {
489
+ className: css({
490
+ flex: 1,
491
+ display: "grid",
492
+ gridTemplateColumns: "min-content 1fr",
493
+ gridAutoRows: "min-content max-content",
494
+ gap: `[4px 4px]`,
495
+ alignItems: "baseline",
496
+ justifyItems: "stretch",
497
+ paddingRight: "2xs"
498
+ }),
499
+ children: entries(metadata).map(([key, value]) => /* @__PURE__ */ jsxs(
500
+ "div",
501
+ {
502
+ className: cx(
503
+ "group",
504
+ css({
505
+ display: "contents"
506
+ })
507
+ ),
508
+ children: [
509
+ /* @__PURE__ */ jsxs(
510
+ "div",
511
+ {
512
+ className: css({
513
+ fontSize: "sm",
514
+ fontWeight: 500,
515
+ justifySelf: "end",
516
+ whiteSpace: "nowrap"
517
+ }),
518
+ children: [
519
+ key,
520
+ ":"
521
+ ]
522
+ }
523
+ ),
524
+ /* @__PURE__ */ jsx(
525
+ "div",
526
+ {
527
+ className: css({}),
528
+ children: /* @__PURE__ */ jsx(
529
+ ScrollAreaAutosize,
530
+ {
531
+ type: "auto",
532
+ mah: 200,
533
+ overscrollBehavior: "none",
534
+ className: css({
535
+ transitionProperty: "all",
536
+ transitionDuration: "fast",
537
+ transitionTimingFunction: "inOut",
538
+ rounded: "sm",
539
+ color: "mantine.colors.gray[8]",
540
+ _dark: {
541
+ color: "mantine.colors.dark[1]"
542
+ },
543
+ _groupHover: {
544
+ transitionTimingFunction: "out",
545
+ color: "mantine.colors.defaultColor",
546
+ background: "mantine.colors.defaultHover"
547
+ }
548
+ }),
549
+ children: /* @__PURE__ */ jsx(
550
+ "div",
551
+ {
552
+ className: css({
553
+ fontSize: "sm",
554
+ padding: "2xs",
555
+ whiteSpace: "pre",
556
+ fontFamily: "[var(--mantine-font-family-monospace)]",
557
+ userSelect: "all"
558
+ }),
559
+ children: value
560
+ }
561
+ )
562
+ }
563
+ )
564
+ }
565
+ )
566
+ ]
567
+ },
568
+ key
569
+ ))
570
+ }
571
+ )
457
572
  ] });
458
573
  }
459
574
 
@@ -1,11 +1,13 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useTree, Alert, Tree, Box, rem, Button, Group, Text, ThemeIcon, Menu } from '@mantine/core';
3
- import { IconInfoCircle, IconTarget, IconZoomScan } from '@tabler/icons-react';
4
3
  import { memo, useMemo, useEffect } from 'react';
5
4
  import { useDiagram } from '../../hooks/useDiagram.js';
6
5
  import { useLikeC4Model } from '../../likec4model/useLikeC4Model.js';
7
6
  import { treeNodeLabel, treeNode, nodeLabel, instanceLabel } from './TabPanelDeployments.css.js';
7
+ import IconInfoCircle from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js';
8
+ import IconTarget from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconTarget.js';
8
9
  import { stopPropagation } from '../../utils/xyflow.js';
10
+ import IconZoomScan from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js';
9
11
 
10
12
  const DeploymentNodeRenderer = ({
11
13
  node
@@ -1,7 +1,6 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { nameFromFqn } from '@likec4/core';
3
3
  import { Stack, Group, Box, ThemeIcon, Text, Tooltip as Tooltip$1, ActionIcon, Paper } from '@mantine/core';
4
- import { IconArrowRight, IconInfoCircle, IconExternalLink } from '@tabler/icons-react';
5
4
  import { useSelector } from '@xstate/react';
6
5
  import { useState } from 'react';
7
6
  import { unique } from 'remeda';
@@ -9,6 +8,9 @@ import { useOverlaysActorRef } from '../../hooks/useOverlaysActor.js';
9
8
  import { RelationshipsBrowser } from '../relationships-browser/RelationshipsBrowser.js';
10
9
  import { useElementDetailsActorRef } from './actorContext.js';
11
10
  import { fqn, xyflow, relationshipStat } from './TabPanelRelationships.css.js';
11
+ import IconArrowRight from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js';
12
+ import IconInfoCircle from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js';
13
+ import IconExternalLink from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconExternalLink.js';
12
14
 
13
15
  const Tooltip = Tooltip$1.withProps({
14
16
  color: "dark",
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useTree, Alert, Anchor, Tree, Box, Text, Pill } from '@mantine/core';
3
- import { IconInfoCircle } from '@tabler/icons-react';
4
3
  import { useMemo, useEffect } from 'react';
5
4
  import { treeNodeLabel, elementLabel } from './TabPanelStructure.css.js';
5
+ import IconInfoCircle from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js';
6
6
 
7
7
  const ElementLabel = ({
8
8
  element
@@ -2,7 +2,7 @@ import { RelationshipDetailsActorRef } from './actor';
2
2
  import { FunctionComponent, CSSProperties, ReactNode } from 'react';
3
3
  import { Position } from '@xyflow/system';
4
4
  import { EdgeData, Dimmed } from '../../base/types.Base';
5
- import { RelationId, Color, ViewId, RelationshipLineType } from '@likec4/core';
5
+ import { RelationId, Color, ViewId, RelationshipLineType, RichTextOrEmpty } from '@likec4/core';
6
6
  export declare const edgeTypes: {
7
7
  relationship: FunctionComponent<{
8
8
  id: string;
@@ -39,9 +39,9 @@ export declare const edgeTypes: {
39
39
  color: Color | undefined;
40
40
  label: string | null;
41
41
  technology?: string | undefined | undefined;
42
- description?: string | undefined | undefined;
43
42
  navigateTo: ViewId | null;
44
43
  line: RelationshipLineType;
44
+ description: RichTextOrEmpty;
45
45
  };
46
46
  }>;
47
47
  };
@@ -3,7 +3,6 @@ import { invariant, nonNullable, isAncestor } from '@likec4/core';
3
3
  import { cx } from '@likec4/styles/css';
4
4
  import { ActionIcon, Group } from '@mantine/core';
5
5
  import { useCallbackRef, useStateHistory } from '@mantine/hooks';
6
- import { IconX, IconChevronLeft, IconChevronRight } from '@tabler/icons-react';
7
6
  import { useSelector } from '@xstate/react';
8
7
  import { ReactFlowProvider, Panel, useStoreApi, useReactFlow } from '@xyflow/react';
9
8
  import { deepEqual } from 'fast-equals';
@@ -18,6 +17,9 @@ import { layoutRelationshipDetails } from './layout.js';
18
17
  import { SelectEdge } from './SelectEdge.js';
19
18
  import { RelationshipEdge } from './custom/edgeTypes.js';
20
19
  import { CompoundNode, ElementNode } from './custom/nodeTypes.js';
20
+ import IconX from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconX.js';
21
+ import IconChevronLeft from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js';
22
+ import IconChevronRight from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js';
21
23
 
22
24
  const nodeTypes = {
23
25
  element: ElementNode,
@@ -1,9 +1,10 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { Popover, PopoverTarget, Button, Box, Text, ThemeIcon, PopoverDropdown, ScrollAreaAutosize } from '@mantine/core';
3
- import { IconArrowRight, IconSelector } from '@tabler/icons-react';
4
3
  import { useRef } from 'react';
5
4
  import { useRelationshipDetails } from './hooks.js';
6
5
  import { edgeSource, edgeTarget, scrollArea, edgeGrid, edgeRow, edgeArrow, edgeLabel } from './SelectEdge.css.js';
6
+ import IconArrowRight from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js';
7
+ import IconSelector from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconSelector.js';
7
8
 
8
9
  const SelectEdge = ({
9
10
  edge,
@@ -1,4 +1,4 @@
1
- import { Color, DiagramNode, Fqn, IconUrl, RelationId, RelationshipLineType, ViewId } from '@likec4/core/types';
1
+ import { Color, DiagramNode, Fqn, IconUrl, RelationId, RelationshipLineType, RichTextOrEmpty, ViewId } from '@likec4/core/types';
2
2
  import { Simplify } from 'type-fest';
3
3
  import { Base, NonOptional, ReactFlowEdge, ReactFlowNode } from '../../base/types';
4
4
  export declare namespace RelationshipDetailsTypes {
@@ -10,11 +10,12 @@ export declare namespace RelationshipDetailsTypes {
10
10
  in: string[];
11
11
  out: string[];
12
12
  };
13
- type ElementNodeData = Base.NodeData & NonOptional<Pick<DiagramNode, 'title' | 'technology' | 'description' | 'color' | 'shape' | 'width' | 'height' | 'navigateTo' | 'style' | 'tags'>> & {
13
+ type ElementNodeData = Base.NodeData & NonOptional<Pick<DiagramNode, 'title' | 'technology' | 'color' | 'shape' | 'width' | 'height' | 'navigateTo' | 'style' | 'tags'>> & {
14
14
  column: Column;
15
15
  fqn: Fqn;
16
16
  icon: IconUrl;
17
17
  ports: Ports;
18
+ description: RichTextOrEmpty;
18
19
  };
19
20
  type CompoundNodeData = Base.NodeData & NonOptional<Pick<DiagramNode, 'title' | 'color' | 'style'>> & {
20
21
  column: Column;
@@ -32,9 +33,9 @@ export declare namespace RelationshipDetailsTypes {
32
33
  color: Color | undefined;
33
34
  label: string | null;
34
35
  technology?: string | undefined;
35
- description?: string | undefined;
36
36
  navigateTo: ViewId | null;
37
37
  line: RelationshipLineType;
38
+ description: RichTextOrEmpty;
38
39
  }>;
39
40
  type Edge = ReactFlowEdge<EdgeData, 'relationship'>;
40
41
  }
@@ -1,4 +1,4 @@
1
- import { BBox, EdgeId, ExclusiveUnion, Fqn, ViewId, RelationId, Color, RelationshipLineType } from '@likec4/core';
1
+ import { BBox, EdgeId, ExclusiveUnion, Fqn, ViewId, RelationId, Color, RelationshipLineType, RichTextOrEmpty } from '@likec4/core';
2
2
  import { EdgeChange, NodeChange, ReactFlowInstance, useStoreApi } from '@xyflow/react';
3
3
  import { ActorLogicFrom, ActorRefFromLogic, SnapshotFrom, StateMachine, Values, NonReducibleUnknown, EventObject, MetaObject, AnyActorLogic, ConditionalRequired, InputFrom, RequiredLogicInput, IsNotNever, ActorRef, MachineSnapshot, AnyActorRef, StateValue, AnyEventObject, ActionFunction, CancelAction } from 'xstate';
4
4
  import { Base } from '../../base';
@@ -628,9 +628,9 @@ export declare const relationshipDetailsLogic: StateMachine<Readonly<{
628
628
  color: Color | undefined;
629
629
  label: string | null;
630
630
  technology?: string | undefined | undefined;
631
- description?: string | undefined | undefined;
632
631
  navigateTo: ViewId | null;
633
632
  line: RelationshipLineType;
633
+ description: RichTextOrEmpty;
634
634
  };
635
635
  }[];
636
636
  bounds: BBox;
@@ -1,9 +1,11 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { IconZoomScan, IconTransform, IconFileSymlink } from '@tabler/icons-react';
3
2
  import { useEnabledFeatures } from '../../../context/DiagramFeatures.js';
4
3
  import { useCurrentViewId } from '../../../hooks/useCurrentViewId.js';
5
4
  import { useDiagram } from '../../../hooks/useDiagram.js';
6
5
  import { ElementActionButtons } from '../../../base/primitives/element/ElementActionButtons.js';
6
+ import IconZoomScan from '../../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js';
7
+ import IconTransform from '../../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconTransform.js';
8
+ import IconFileSymlink from '../../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js';
7
9
 
8
10
  const ElementActions = (props) => {
9
11
  const { enableNavigateTo, enableVscode } = useEnabledFeatures();
@@ -1,7 +1,7 @@
1
1
  import { FunctionComponent, CSSProperties, ReactNode } from 'react';
2
2
  import { Position } from '@xyflow/system';
3
3
  import { EdgeData, Dimmed } from '../../../base/types.Base';
4
- import { RelationId, Color, ViewId, RelationshipLineType } from '@likec4/core';
4
+ import { RelationId, Color, ViewId, RelationshipLineType, RichTextOrEmpty } from '@likec4/core';
5
5
  export declare const RelationshipEdge: FunctionComponent<{
6
6
  id: string;
7
7
  selected?: boolean;
@@ -37,8 +37,8 @@ export declare const RelationshipEdge: FunctionComponent<{
37
37
  color: Color | undefined;
38
38
  label: string | null;
39
39
  technology?: string | undefined | undefined;
40
- description?: string | undefined | undefined;
41
40
  navigateTo: ViewId | null;
42
41
  line: RelationshipLineType;
42
+ description: RichTextOrEmpty;
43
43
  };
44
44
  }>;
@@ -1,4 +1,4 @@
1
- import { EdgeId, Fqn, ViewId, RelationId, Color, RelationshipLineType, BBox } from '@likec4/core';
1
+ import { EdgeId, Fqn, ViewId, RelationId, Color, RelationshipLineType, RichTextOrEmpty, BBox } from '@likec4/core';
2
2
  import { RelationshipDetailsActorRef, RelationshipDetailsSnapshot, Events } from './actor';
3
3
  import { Context, ReactNode, CSSProperties } from 'react';
4
4
  import { GeneralHelpers, ViewportHelperFunctions, ReactFlowState } from '@xyflow/react';
@@ -56,9 +56,9 @@ export declare function useRelationshipDetails(): {
56
56
  color: Color | undefined;
57
57
  label: string | null;
58
58
  technology?: string | undefined | undefined;
59
- description?: string | undefined | undefined;
60
59
  navigateTo: ViewId | null;
61
60
  line: RelationshipLineType;
61
+ description: RichTextOrEmpty;
62
62
  };
63
63
  }> & ViewportHelperFunctions & {
64
64
  viewportInitialized: boolean;
@@ -99,9 +99,9 @@ export declare function useRelationshipDetails(): {
99
99
  color: Color | undefined;
100
100
  label: string | null;
101
101
  technology?: string | undefined | undefined;
102
- description?: string | undefined | undefined;
103
102
  navigateTo: ViewId | null;
104
103
  line: RelationshipLineType;
104
+ description: RichTextOrEmpty;
105
105
  };
106
106
  }>;
107
107
  setState: (partial: ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
@@ -139,9 +139,9 @@ export declare function useRelationshipDetails(): {
139
139
  color: Color | undefined;
140
140
  label: string | null;
141
141
  technology?: string | undefined | undefined;
142
- description?: string | undefined | undefined;
143
142
  navigateTo: ViewId | null;
144
143
  line: RelationshipLineType;
144
+ description: RichTextOrEmpty;
145
145
  };
146
146
  }> | Partial< ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
147
147
  id: string;
@@ -178,9 +178,9 @@ export declare function useRelationshipDetails(): {
178
178
  color: Color | undefined;
179
179
  label: string | null;
180
180
  technology?: string | undefined | undefined;
181
- description?: string | undefined | undefined;
182
181
  navigateTo: ViewId | null;
183
182
  line: RelationshipLineType;
183
+ description: RichTextOrEmpty;
184
184
  };
185
185
  }>> | ((state: ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
186
186
  id: string;
@@ -217,9 +217,9 @@ export declare function useRelationshipDetails(): {
217
217
  color: Color | undefined;
218
218
  label: string | null;
219
219
  technology?: string | undefined | undefined;
220
- description?: string | undefined | undefined;
221
220
  navigateTo: ViewId | null;
222
221
  line: RelationshipLineType;
222
+ description: RichTextOrEmpty;
223
223
  };
224
224
  }>) => ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
225
225
  id: string;
@@ -256,9 +256,9 @@ export declare function useRelationshipDetails(): {
256
256
  color: Color | undefined;
257
257
  label: string | null;
258
258
  technology?: string | undefined | undefined;
259
- description?: string | undefined | undefined;
260
259
  navigateTo: ViewId | null;
261
260
  line: RelationshipLineType;
261
+ description: RichTextOrEmpty;
262
262
  };
263
263
  }> | Partial< ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
264
264
  id: string;
@@ -295,9 +295,9 @@ export declare function useRelationshipDetails(): {
295
295
  color: Color | undefined;
296
296
  label: string | null;
297
297
  technology?: string | undefined | undefined;
298
- description?: string | undefined | undefined;
299
298
  navigateTo: ViewId | null;
300
299
  line: RelationshipLineType;
300
+ description: RichTextOrEmpty;
301
301
  };
302
302
  }>>), replace?: boolean | undefined) => void;
303
303
  subscribe: (listener: (state: ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
@@ -335,9 +335,9 @@ export declare function useRelationshipDetails(): {
335
335
  color: Color | undefined;
336
336
  label: string | null;
337
337
  technology?: string | undefined | undefined;
338
- description?: string | undefined | undefined;
339
338
  navigateTo: ViewId | null;
340
339
  line: RelationshipLineType;
340
+ description: RichTextOrEmpty;
341
341
  };
342
342
  }>, prevState: ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
343
343
  id: string;
@@ -374,9 +374,9 @@ export declare function useRelationshipDetails(): {
374
374
  color: Color | undefined;
375
375
  label: string | null;
376
376
  technology?: string | undefined | undefined;
377
- description?: string | undefined | undefined;
378
377
  navigateTo: ViewId | null;
379
378
  line: RelationshipLineType;
379
+ description: RichTextOrEmpty;
380
380
  };
381
381
  }>) => void) => () => void;
382
382
  } | null;
@@ -1,4 +1,4 @@
1
- import { Queue, nonNullable } from '@likec4/core';
1
+ import { Queue, nonNullable, RichText } from '@likec4/core';
2
2
  import { hasAtLeast } from 'remeda';
3
3
  import { ZIndexes } from '../../base/const.js';
4
4
 
@@ -85,7 +85,7 @@ function layoutResultToXYFlow(layout) {
85
85
  fqn,
86
86
  title: node.title,
87
87
  technology: node.technology,
88
- description: node.description,
88
+ description: RichText.from(node.description),
89
89
  height: node.height,
90
90
  width: node.width,
91
91
  color: node.color,
@@ -131,8 +131,8 @@ function layoutResultToXYFlow(layout) {
131
131
  color,
132
132
  navigateTo,
133
133
  line,
134
- ...technology && { technology },
135
- ...description && { description }
134
+ description: RichText.from(description),
135
+ ...technology && { technology }
136
136
  }
137
137
  });
138
138
  }
@@ -1,4 +1,4 @@
1
- import { DiagramEdge, DiagramNode, DiagramView, Fqn, RelationId } from '@likec4/core/types';
1
+ import { DiagramEdge, DiagramNode, DiagramView, Fqn, RelationId, RichTextOrEmpty } from '@likec4/core/types';
2
2
  import { AnyAux, LikeC4ViewModel } from '@likec4/core/model';
3
3
  import { RelationshipDetailsTypes } from './_types';
4
4
  import { RelationshipDetailsViewData } from './compute';
@@ -8,15 +8,17 @@ export type LayoutResult = {
8
8
  bounds: DiagramView['bounds'];
9
9
  };
10
10
  export declare namespace LayoutResult {
11
- type Node = Omit<DiagramNode, 'modelRef' | 'deploymentRef' | 'inEdges' | 'outEdges'> & {
11
+ type Node = Omit<DiagramNode, 'modelRef' | 'description' | 'deploymentRef' | 'inEdges' | 'outEdges'> & {
12
+ description: RichTextOrEmpty;
12
13
  modelRef: Fqn;
13
14
  column: RelationshipDetailsTypes.Column;
14
15
  ports: RelationshipDetailsTypes.Ports;
15
16
  };
16
- type Edge = Omit<DiagramEdge, 'relations'> & {
17
+ type Edge = Omit<DiagramEdge, 'relations' | 'description'> & {
17
18
  relationId: RelationId;
18
19
  sourceHandle: string;
19
20
  targetHandle: string;
21
+ description: RichTextOrEmpty;
20
22
  };
21
23
  }
22
24
  export declare function layoutRelationshipDetails(data: RelationshipDetailsViewData, scope: LikeC4ViewModel<AnyAux> | null): LayoutResult;
@@ -1,6 +1,6 @@
1
1
  import { treeFromElements } from '@likec4/core/compute-view/relationships';
2
2
  import dagre from '@dagrejs/dagre';
3
- import { invariant } from '@likec4/core';
3
+ import { RichText, invariant } from '@likec4/core';
4
4
  import { ifind, DefaultMap } from '@likec4/core/utils';
5
5
  import { pipe, filter, mapToObj, find, map, tap, reduce, sortBy, prop } from 'remeda';
6
6
 
@@ -240,7 +240,7 @@ function layoutRelationshipDetails(data, scope) {
240
240
  y: position.y,
241
241
  position: [position.x, position.y],
242
242
  title: element.title,
243
- description: element.description,
243
+ description: RichText.from(element.description),
244
244
  technology: element.technology,
245
245
  tags: [...element.tags],
246
246
  links: null,
@@ -2,7 +2,6 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { cx } from '@likec4/styles/css';
3
3
  import { ActionIcon, Group } from '@mantine/core';
4
4
  import { useCallbackRef, useStateHistory } from '@mantine/hooks';
5
- import { IconX, IconChevronLeft, IconChevronRight } from '@tabler/icons-react';
6
5
  import { ReactFlowProvider, useStoreApi, useReactFlow, Panel } from '@xyflow/react';
7
6
  import { shallowEqual } from 'fast-equals';
8
7
  import { LayoutGroup, AnimatePresence, m } from 'motion/react';
@@ -13,6 +12,9 @@ import { useRelationshipsView } from './layout.js';
13
12
  import { SelectElement } from './SelectElement.js';
14
13
  import { RelationshipEdge } from './custom/edgeTypes.js';
15
14
  import { EmptyNode, CompoundNode, ElementNode } from './custom/nodeTypes.js';
15
+ import IconX from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconX.js';
16
+ import IconChevronLeft from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js';
17
+ import IconChevronRight from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js';
16
18
 
17
19
  const nodeTypes = {
18
20
  element: ElementNode,
@@ -1,13 +1,14 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { ancestorsFqn } from '@likec4/core';
3
3
  import { useTree, Group, Box, Popover, PopoverTarget, Button, Text, PopoverDropdown, ScrollAreaAutosize, Tree, ActionIcon, Tooltip, SegmentedControl } from '@mantine/core';
4
- import { IconSelector, IconChevronRight } from '@tabler/icons-react';
5
4
  import { memo, useRef, useEffect } from 'react';
6
5
  import { useRelationshipsBrowser, useRelationshipsBrowserState } from './hooks.js';
7
6
  import * as SelectElement_css from './SelectElement.css.js';
8
7
  import { scrollArea } from './SelectElement.css.js';
9
8
  import { useLikeC4Model } from '../../likec4model/useLikeC4Model.js';
10
9
  import { useLikeC4ElementsTree } from '../../likec4model/useLikeC4ElementsTree.js';
10
+ import IconSelector from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconSelector.js';
11
+ import IconChevronRight from '../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js';
11
12
 
12
13
  const selector2 = (state) => {
13
14
  const subjectExistsInScope = state.context.layouted?.subjectExistsInScope ?? false;
@@ -1,4 +1,4 @@
1
- import { Color, DiagramNode, Fqn, IconUrl, NonEmptyArray, RelationId, RelationshipLineType, ViewId } from '@likec4/core/types';
1
+ import { Color, DiagramNode, Fqn, IconUrl, NonEmptyArray, RelationId, RelationshipLineType, RichTextOrEmpty, ViewId } from '@likec4/core/types';
2
2
  import { Simplify } from 'type-fest';
3
3
  import { Base, NonOptional, ReactFlowEdge, ReactFlowNode } from '../../base/types';
4
4
  export declare namespace RelationshipsBrowserTypes {
@@ -10,12 +10,13 @@ export declare namespace RelationshipsBrowserTypes {
10
10
  in: string[];
11
11
  out: string[];
12
12
  };
13
- type ElementNodeData = Simplify<Base.NodeData & NonOptional<Pick<DiagramNode, 'title' | 'technology' | 'description' | 'color' | 'shape' | 'style' | 'width' | 'height' | 'tags' | 'navigateTo'>> & {
13
+ type ElementNodeData = Simplify<Base.NodeData & NonOptional<Pick<DiagramNode, 'title' | 'technology' | 'color' | 'shape' | 'style' | 'width' | 'height' | 'tags' | 'navigateTo'>> & {
14
14
  column: Column;
15
15
  fqn: Fqn;
16
16
  icon: string | null;
17
17
  ports: Ports;
18
18
  existsInCurrentView: boolean;
19
+ description: RichTextOrEmpty;
19
20
  }>;
20
21
  type CompoundNodeData = Simplify<Base.NodeData & NonOptional<Pick<DiagramNode, 'title' | 'color' | 'shape' | 'style'>> & {
21
22
  column: Column;
@@ -1,10 +1,12 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { IconZoomScan, IconTransform, IconFileSymlink } from '@tabler/icons-react';
3
2
  import { useEnabledFeatures } from '../../../context/DiagramFeatures.js';
4
3
  import { useCurrentViewId } from '../../../hooks/useCurrentViewId.js';
5
4
  import { useDiagram } from '../../../hooks/useDiagram.js';
6
5
  import { useRelationshipsBrowser, useRelationshipsBrowserState } from '../hooks.js';
7
6
  import { ElementActionButtons } from '../../../base/primitives/element/ElementActionButtons.js';
7
+ import IconZoomScan from '../../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js';
8
+ import IconTransform from '../../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconTransform.js';
9
+ import IconFileSymlink from '../../../node_modules/.pnpm/@tabler_icons-react@3.31.0_react@19.1.0/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js';
8
10
 
9
11
  const ElementActions = (props) => {
10
12
  const { enableNavigateTo, enableVscode } = useEnabledFeatures();