@likec4/diagram 1.35.0 → 1.36.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 (214) hide show
  1. package/bundle/{chunk-C0Eg81Gj.js → chunk-7MPUJFHj.js} +315 -311
  2. package/bundle/custom.js +52 -52
  3. package/bundle/index.js +1583 -739
  4. package/dist/LikeC4Diagram.js +6 -6
  5. package/dist/LikeC4Diagram.props.d.ts +2 -3
  6. package/dist/LikeC4ModelProvider.d.ts +3 -3
  7. package/dist/LikeC4ProjectsProvider.d.ts +17 -0
  8. package/dist/LikeC4ProjectsProvider.js +22 -0
  9. package/dist/LikeC4Styles.d.ts +1 -0
  10. package/dist/LikeC4Styles.js +94 -0
  11. package/dist/StaticLikeC4Diagram.d.ts +3 -3
  12. package/dist/base/BaseXYFlow.js +23 -26
  13. package/dist/base/primitives/MarkdownBlock.d.ts +7 -1
  14. package/dist/base/primitives/MarkdownBlock.js +1 -1
  15. package/dist/base/primitives/compound/CompoundActionButton.js +2 -2
  16. package/dist/base/primitives/compound/CompoundDetailsButton.js +2 -2
  17. package/dist/base/primitives/compound/CompoundNodeContainer.css.js +4 -4
  18. package/dist/base/primitives/compound/CompoundNodeContainer.js +1 -4
  19. package/dist/base/primitives/compound/CompoundTitle.js +9 -8
  20. package/dist/base/primitives/compound/actionbtns.css.js +6 -6
  21. package/dist/base/primitives/edge/EdgeActionButton.js +2 -2
  22. package/dist/base/primitives/edge/EdgeContainer.js +4 -7
  23. package/dist/base/primitives/edge/EdgeLabel.css.d.ts +0 -22
  24. package/dist/base/primitives/edge/EdgeLabel.css.js +6 -84
  25. package/dist/base/primitives/edge/EdgeLabel.js +16 -6
  26. package/dist/base/primitives/edge/EdgeLabelContainer.js +1 -6
  27. package/dist/base/primitives/edge/EdgeMarkers.js +3 -3
  28. package/dist/base/primitives/edge/edge.css.d.ts +0 -2
  29. package/dist/base/primitives/edge/edge.css.js +1 -55
  30. package/dist/base/primitives/element/ElementActionButtons.js +2 -2
  31. package/dist/base/primitives/element/ElementDetailsButton.js +8 -7
  32. package/dist/base/primitives/element/ElementNodeContainer.css.js +4 -4
  33. package/dist/base/primitives/element/ElementNodeContainer.js +1 -4
  34. package/dist/base/primitives/element/ElementShape.css.js +11 -11
  35. package/dist/base/primitives/element/ElementTags.d.ts +1 -0
  36. package/dist/base/primitives/element/ElementTags.js +17 -14
  37. package/dist/bundle/LikeC4View.d.ts +1 -1
  38. package/dist/bundle/LikeC4View.js +7 -1
  39. package/dist/bundle/LikeC4View.props.d.ts +1 -2
  40. package/dist/bundle/ReactLikeC4.d.ts +1 -1
  41. package/dist/bundle/ViewNotFound.js +1 -1
  42. package/dist/bundle/index.d.ts +2 -1
  43. package/dist/bundle/index.js +1 -0
  44. package/dist/bundle/styles.css.js +1 -1
  45. package/dist/components/ErrorFallback.js +1 -1
  46. package/dist/components/GithubIcon.d.ts +2 -0
  47. package/dist/components/GithubIcon.js +17 -0
  48. package/dist/components/Link.d.ts +4 -3
  49. package/dist/components/Link.js +84 -87
  50. package/dist/components/NavigationLink.d.ts +2 -2
  51. package/dist/components/SearchControl.css.js +6 -5
  52. package/dist/context/DiagramEventHandlers.d.ts +6 -6
  53. package/dist/context/DiagramEventHandlers.js +4 -7
  54. package/dist/globals.css.js +3 -0
  55. package/dist/hooks/useXYFlow.d.ts +10 -10
  56. package/dist/index.d.ts +1 -0
  57. package/dist/index.js +1 -0
  58. package/dist/likec4diagram/custom/edges/NotePopover.css.js +2 -2
  59. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +2 -2
  60. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +1 -1
  61. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.css.js +7 -7
  62. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +3 -3
  63. package/dist/likec4diagram/custom/edges/edges.css.js +4 -4
  64. package/dist/likec4diagram/custom/index.d.ts +2 -2
  65. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +2 -2
  66. package/dist/likec4diagram/ui/controls/styles.css.js +5 -5
  67. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +11 -11
  68. package/dist/likec4diagram/ui/notation/NotationPanel.js +2 -5
  69. package/dist/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.css.js +10 -10
  70. package/dist/likec4model/LikeC4ProjectsContext.d.ts +7 -0
  71. package/dist/likec4model/LikeC4ProjectsContext.js +5 -0
  72. package/dist/likec4model/index.d.ts +1 -0
  73. package/dist/likec4model/useLikeC4Project.d.ts +22 -0
  74. package/dist/likec4model/useLikeC4Project.js +23 -0
  75. package/dist/navigationpanel/NavigationPanel.js +15 -17
  76. package/dist/navigationpanel/NavigationPanelControls.js +34 -21
  77. package/dist/navigationpanel/NavigationPanelDropdown.js +33 -17
  78. package/dist/navigationpanel/_common.js +4 -1
  79. package/dist/navigationpanel/actor.d.ts +11 -15
  80. package/dist/navigationpanel/actor.js +14 -15
  81. package/dist/navigationpanel/controls/BurgerButton.js +5 -7
  82. package/dist/navigationpanel/controls/NavigationButtons.js +37 -24
  83. package/dist/navigationpanel/controls/OpenSource.js +1 -1
  84. package/dist/navigationpanel/controls/SearchControl.js +6 -4
  85. package/dist/navigationpanel/controls/ToggleReadonly.js +3 -3
  86. package/dist/navigationpanel/controls/ViewDetailsCard.d.ts +2 -0
  87. package/dist/navigationpanel/controls/ViewDetailsCard.js +232 -0
  88. package/dist/navigationpanel/controls/index.d.ts +1 -0
  89. package/dist/navigationpanel/dropdown/ProjectsMenu.d.ts +2 -0
  90. package/dist/navigationpanel/dropdown/ProjectsMenu.js +75 -0
  91. package/dist/navigationpanel/editorpanel/EditorPanel.js +3 -3
  92. package/dist/navigationpanel/editorpanel/ManualLayoutToolsButton.js +19 -20
  93. package/dist/navigationpanel/editorpanel/styles.js +5 -5
  94. package/dist/navigationpanel/hooks.d.ts +2 -2
  95. package/dist/navigationpanel/styles.css.js +0 -2
  96. package/dist/navigationpanel/walkthrough/ActiveWalkthroughControls.js +12 -7
  97. package/dist/node_modules/.pnpm/@tabler_icons-react@3.34.1_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.js +14 -0
  98. package/dist/node_modules/.pnpm/@tabler_icons-react@3.34.1_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconLink.js +14 -0
  99. package/dist/overlays/element-details/ElementDetailsCard.css.js +18 -17
  100. package/dist/overlays/element-details/ElementDetailsCard.js +8 -13
  101. package/dist/overlays/element-details/TabPanelDeployments.css.js +5 -4
  102. package/dist/overlays/element-details/TabPanelRelationships.css.js +7 -7
  103. package/dist/overlays/overlay/Overlay.css.d.ts +3 -3
  104. package/dist/overlays/overlay/Overlay.css.js +8 -7
  105. package/dist/overlays/relationship-details/SelectEdge.css.js +8 -8
  106. package/dist/overlays/relationships-browser/SelectElement.css.js +1 -1
  107. package/dist/search/Search.js +6 -6
  108. package/dist/search/components/ElementsColumn.css.js +5 -5
  109. package/dist/search/components/SearchByTags.js +3 -2
  110. package/dist/search/components/ViewsColum.js +1 -1
  111. package/dist/search/components/ViewsColumn.css.js +1 -1
  112. package/dist/search/components/_shared.css.js +3 -3
  113. package/dist/search/components/styles.css.js +5 -5
  114. package/dist/state/DiagramActorProvider.js +34 -15
  115. package/dist/state/diagram-machine.d.ts +29 -247
  116. package/dist/state/diagram-machine.js +16 -16
  117. package/dist/styles-min.css +1 -1
  118. package/dist/styles.css +1 -1
  119. package/dist/styles.css2.js +1 -1
  120. package/package.json +10 -8
  121. package/panda.buildinfo.json +254 -326
  122. package/src/LikeC4Diagram.props.ts +2 -2
  123. package/src/LikeC4Diagram.tsx +2 -2
  124. package/src/LikeC4ModelProvider.tsx +4 -4
  125. package/src/LikeC4ProjectsProvider.tsx +41 -0
  126. package/src/LikeC4Styles.tsx +107 -0
  127. package/src/StaticLikeC4Diagram.tsx +3 -3
  128. package/src/base/BaseXYFlow.tsx +24 -29
  129. package/src/base/primitives/MarkdownBlock.tsx +11 -3
  130. package/src/base/primitives/compound/CompoundActionButton.tsx +2 -2
  131. package/src/base/primitives/compound/CompoundDetailsButton.tsx +2 -2
  132. package/src/base/primitives/compound/CompoundNodeContainer.css.ts +4 -13
  133. package/src/base/primitives/compound/CompoundNodeContainer.tsx +0 -3
  134. package/src/base/primitives/compound/CompoundTitle.tsx +8 -8
  135. package/src/base/primitives/compound/actionbtns.css.ts +6 -6
  136. package/src/base/primitives/edge/EdgeActionButton.tsx +2 -2
  137. package/src/base/primitives/edge/EdgeContainer.tsx +3 -6
  138. package/src/base/primitives/edge/EdgeLabel.css.ts +4 -83
  139. package/src/base/primitives/edge/EdgeLabel.tsx +16 -10
  140. package/src/base/primitives/edge/EdgeLabelContainer.tsx +1 -6
  141. package/src/base/primitives/edge/EdgeMarkers.tsx +3 -3
  142. package/src/base/primitives/edge/edge.css.ts +0 -60
  143. package/src/base/primitives/element/ElementActionButtons.tsx +2 -2
  144. package/src/base/primitives/element/ElementDetailsButton.tsx +7 -7
  145. package/src/base/primitives/element/ElementNodeContainer.css.ts +4 -4
  146. package/src/base/primitives/element/ElementNodeContainer.tsx +0 -3
  147. package/src/base/primitives/element/ElementShape.css.ts +11 -11
  148. package/src/base/primitives/element/ElementTags.tsx +17 -14
  149. package/src/bundle/LikeC4View.props.ts +1 -2
  150. package/src/bundle/LikeC4View.tsx +10 -3
  151. package/src/bundle/ReactLikeC4.tsx +1 -2
  152. package/src/bundle/ViewNotFound.tsx +1 -1
  153. package/src/bundle/index.ts +2 -1
  154. package/src/bundle/styles.css.ts +1 -1
  155. package/src/components/ErrorFallback.tsx +1 -1
  156. package/src/components/GithubIcon.tsx +16 -0
  157. package/src/components/Link.tsx +102 -113
  158. package/src/components/NavigationLink.tsx +2 -1
  159. package/src/components/SearchControl.css.ts +5 -5
  160. package/src/context/DiagramEventHandlers.tsx +12 -12
  161. package/src/globals.css +71 -0
  162. package/src/index.ts +5 -0
  163. package/src/likec4diagram/custom/edges/NotePopover.css.ts +2 -2
  164. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +1 -1
  165. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.css.ts +7 -7
  166. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +3 -3
  167. package/src/likec4diagram/custom/edges/edges.css.ts +4 -4
  168. package/src/likec4diagram/custom/nodes/toolbar/CompoundToolbar.tsx +2 -2
  169. package/src/likec4diagram/ui/controls/styles.css.ts +5 -5
  170. package/src/likec4diagram/ui/notation/NotationPanel.css.ts +11 -11
  171. package/src/likec4diagram/ui/notation/NotationPanel.tsx +1 -4
  172. package/src/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.css.ts +10 -10
  173. package/src/likec4model/LikeC4ProjectsContext.ts +9 -0
  174. package/src/likec4model/index.ts +8 -0
  175. package/src/likec4model/useLikeC4Project.ts +61 -0
  176. package/src/navigationpanel/NavigationPanel.tsx +16 -17
  177. package/src/navigationpanel/NavigationPanelControls.tsx +24 -46
  178. package/src/navigationpanel/NavigationPanelDropdown.tsx +32 -16
  179. package/src/navigationpanel/_common.tsx +4 -1
  180. package/src/navigationpanel/actor.ts +14 -15
  181. package/src/navigationpanel/controls/BurgerButton.tsx +5 -7
  182. package/src/navigationpanel/controls/NavigationButtons.tsx +9 -1
  183. package/src/navigationpanel/controls/OpenSource.tsx +1 -1
  184. package/src/navigationpanel/controls/SearchControl.tsx +6 -4
  185. package/src/navigationpanel/controls/ToggleReadonly.tsx +3 -3
  186. package/src/navigationpanel/controls/ViewDetailsCard.tsx +244 -0
  187. package/src/navigationpanel/controls/index.ts +1 -0
  188. package/src/navigationpanel/dropdown/ProjectsMenu.tsx +74 -0
  189. package/src/navigationpanel/editorpanel/EditorPanel.tsx +3 -3
  190. package/src/navigationpanel/editorpanel/ManualLayoutToolsButton.tsx +19 -22
  191. package/src/navigationpanel/editorpanel/styles.ts +5 -5
  192. package/src/navigationpanel/hooks.tsx +2 -2
  193. package/src/navigationpanel/styles.css.ts +0 -2
  194. package/src/navigationpanel/walkthrough/ActiveWalkthroughControls.tsx +9 -4
  195. package/src/overlays/element-details/ElementDetailsCard.css.ts +17 -17
  196. package/src/overlays/element-details/ElementDetailsCard.tsx +8 -13
  197. package/src/overlays/element-details/TabPanelDeployments.css.ts +4 -4
  198. package/src/overlays/element-details/TabPanelRelationships.css.ts +7 -7
  199. package/src/overlays/overlay/Overlay.css.ts +7 -7
  200. package/src/overlays/relationship-details/SelectEdge.css.ts +8 -8
  201. package/src/overlays/relationships-browser/SelectElement.css.ts +1 -1
  202. package/src/search/Search.tsx +6 -6
  203. package/src/search/components/ElementsColumn.css.ts +5 -5
  204. package/src/search/components/SearchByTags.tsx +2 -2
  205. package/src/search/components/ViewsColum.tsx +1 -1
  206. package/src/search/components/ViewsColumn.css.ts +1 -1
  207. package/src/search/components/_shared.css.ts +3 -3
  208. package/src/search/components/styles.css.ts +5 -5
  209. package/src/state/DiagramActorProvider.tsx +45 -20
  210. package/src/state/diagram-machine.ts +22 -16
  211. package/dist/LikeC4CustomColors.d.ts +0 -2
  212. package/dist/LikeC4CustomColors.js +0 -45
  213. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +0 -45
  214. package/src/LikeC4CustomColors.tsx +0 -85
@@ -15,30 +15,43 @@ const NavigationButtons = () => {
15
15
  hasStepBack: s.navigationHistory.currentIndex > 0,
16
16
  hasStepForward: s.navigationHistory.currentIndex < s.navigationHistory.history.length - 1
17
17
  }));
18
- return /* @__PURE__ */ jsxs(m.div, { layout: "position", className: hstack({ gap: 1, mdDown: { display: "none" } }), children: [
19
- /* @__PURE__ */ jsx(
20
- PanelActionIcon,
21
- {
22
- disabled: !hasStepBack,
23
- onClick: (e) => {
24
- e.stopPropagation();
25
- diagram.navigate("back");
26
- },
27
- children: /* @__PURE__ */ jsx(IconArrowLeft, { size: 14 })
28
- }
29
- ),
30
- /* @__PURE__ */ jsx(
31
- PanelActionIcon,
32
- {
33
- disabled: !hasStepForward,
34
- onClick: (e) => {
35
- e.stopPropagation();
36
- diagram.navigate("forward");
37
- },
38
- children: /* @__PURE__ */ jsx(IconArrowRight, { size: 14 })
39
- }
40
- )
41
- ] });
18
+ return /* @__PURE__ */ jsxs(
19
+ m.div,
20
+ {
21
+ layout: "position",
22
+ className: hstack({
23
+ gap: "[1px]",
24
+ display: {
25
+ base: "none",
26
+ "@likec4-root/sm": "flex"
27
+ }
28
+ }),
29
+ children: [
30
+ /* @__PURE__ */ jsx(
31
+ PanelActionIcon,
32
+ {
33
+ disabled: !hasStepBack,
34
+ onClick: (e) => {
35
+ e.stopPropagation();
36
+ diagram.navigate("back");
37
+ },
38
+ children: /* @__PURE__ */ jsx(IconArrowLeft, { size: 14 })
39
+ }
40
+ ),
41
+ /* @__PURE__ */ jsx(
42
+ PanelActionIcon,
43
+ {
44
+ disabled: !hasStepForward,
45
+ onClick: (e) => {
46
+ e.stopPropagation();
47
+ diagram.navigate("forward");
48
+ },
49
+ children: /* @__PURE__ */ jsx(IconArrowRight, { size: 14 })
50
+ }
51
+ )
52
+ ]
53
+ }
54
+ );
42
55
  };
43
56
 
44
57
  export { NavigationButtons };
@@ -19,7 +19,7 @@ const OpenSource = () => {
19
19
  e.stopPropagation();
20
20
  onOpenSource?.({ view: viewId });
21
21
  },
22
- children: /* @__PURE__ */ jsx(IconFileSymlink, { size: 12, stroke: 1.5, style: { width: "65%" } })
22
+ children: /* @__PURE__ */ jsx(IconFileSymlink, { stroke: 1.5, style: { width: "65%" } })
23
23
  }
24
24
  ) });
25
25
  };
@@ -21,14 +21,15 @@ function SearchControl() {
21
21
  diagram.openSearch();
22
22
  },
23
23
  whileTap: {
24
+ scale: 0.95,
24
25
  translateY: 1
25
26
  },
26
27
  className: cx(
27
28
  "group",
28
29
  hstack({
29
- gap: "2xs",
30
+ gap: "xxs",
30
31
  paddingInline: "sm",
31
- paddingBlock: "2xs",
32
+ paddingBlock: "xxs",
32
33
  rounded: "sm",
33
34
  userSelect: "none",
34
35
  cursor: "pointer",
@@ -40,8 +41,9 @@ function SearchControl() {
40
41
  base: "likec4.panel.action-icon.bg",
41
42
  _hover: "likec4.panel.action-icon.bg.hover"
42
43
  },
43
- smDown: {
44
- display: "none"
44
+ display: {
45
+ base: "none",
46
+ "@/md": "flex"
45
47
  }
46
48
  })
47
49
  ),
@@ -32,9 +32,9 @@ const ToggleReadonly = () => {
32
32
  className: cx(
33
33
  "group",
34
34
  hstack({
35
- gap: "2",
36
- paddingInline: "2xs",
37
- paddingBlock: "2xs",
35
+ gap: "0.5",
36
+ paddingInline: "xxs",
37
+ paddingBlock: "xxs",
38
38
  rounded: "sm",
39
39
  userSelect: "none",
40
40
  cursor: "pointer",
@@ -0,0 +1,2 @@
1
+ import { PopoverProps } from '@mantine/core';
2
+ export declare const ViewDetailsCard: (props: PopoverProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,232 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { cx, css } from '@likec4/styles/css';
3
+ import { HStack, Box, styled } from '@likec4/styles/jsx';
4
+ import { hstack, vstack } from '@likec4/styles/patterns';
5
+ import { Popover, UnstyledButton, Text, Badge } from '@mantine/core';
6
+ import * as m from 'motion/react-m';
7
+ import { Link } from '../../components/Link.js';
8
+ import { useDiagram } from '../../hooks/useDiagram.js';
9
+ import { useMantinePortalProps } from '../../hooks/useMantinePortalProps.js';
10
+ import { useNavigationActorSnapshot } from '../hooks.js';
11
+ import IconId from '../../node_modules/.pnpm/@tabler_icons-react@3.34.1_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconId.js';
12
+ import IconLink from '../../node_modules/.pnpm/@tabler_icons-react@3.34.1_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconLink.js';
13
+ import { ElementTag } from '../../base/primitives/element/ElementTags.js';
14
+ import { MarkdownBlock } from '../../base/primitives/MarkdownBlock.js';
15
+
16
+ const selector = ({ context }) => {
17
+ const view = context.viewModel;
18
+ return {
19
+ id: view.id,
20
+ title: view.titleOrUntitled,
21
+ description: view.description,
22
+ tags: view.tags,
23
+ links: view.links,
24
+ relativePath: view.$view.relativePath
25
+ };
26
+ };
27
+ const ViewDetailsCard = (props) => {
28
+ const data = useNavigationActorSnapshot(selector);
29
+ const portalProps = useMantinePortalProps();
30
+ return /* @__PURE__ */ jsxs(
31
+ Popover,
32
+ {
33
+ position: "bottom-end",
34
+ shadow: "xl",
35
+ clickOutsideEvents: ["pointerdown", "mousedown", "click"],
36
+ trapFocus: true,
37
+ ...portalProps,
38
+ ...props,
39
+ children: [
40
+ /* @__PURE__ */ jsx(ViewDetailsCardTrigger, { linksCount: data.links.length }),
41
+ /* @__PURE__ */ jsx(ViewDetailsCardDropdown, { data })
42
+ ]
43
+ }
44
+ );
45
+ };
46
+ const ViewDetailsCardTrigger = ({ linksCount }) => /* @__PURE__ */ jsx(Popover.Target, { children: /* @__PURE__ */ jsxs(
47
+ UnstyledButton,
48
+ {
49
+ component: m.button,
50
+ layout: "position",
51
+ whileTap: {
52
+ scale: 0.95,
53
+ translateY: 1
54
+ },
55
+ className: cx(
56
+ "group",
57
+ hstack({
58
+ gap: "2",
59
+ paddingInline: "xxs",
60
+ paddingBlock: "xxs",
61
+ rounded: "sm",
62
+ userSelect: "none",
63
+ cursor: "pointer",
64
+ color: {
65
+ base: "likec4.panel.action-icon.text",
66
+ _hover: "likec4.panel.action-icon.text.hover"
67
+ },
68
+ backgroundColor: {
69
+ _hover: "likec4.panel.action-icon.bg.hover"
70
+ },
71
+ display: {
72
+ base: "none",
73
+ "@/xs": "flex"
74
+ }
75
+ }),
76
+ ``
77
+ ),
78
+ children: [
79
+ /* @__PURE__ */ jsx(IconId, { size: 16, stroke: 1.8 }),
80
+ linksCount > 0 && /* @__PURE__ */ jsxs(HStack, { gap: "[1px]", children: [
81
+ /* @__PURE__ */ jsx(IconLink, { size: 14, stroke: 2 }),
82
+ /* @__PURE__ */ jsx(
83
+ Box,
84
+ {
85
+ css: {
86
+ fontSize: "11px",
87
+ fontWeight: 600,
88
+ lineHeight: 1,
89
+ opacity: 0.8
90
+ },
91
+ children: linksCount
92
+ }
93
+ )
94
+ ] })
95
+ ]
96
+ }
97
+ ) });
98
+ const SectionHeader = styled("div", {
99
+ base: {
100
+ fontSize: "xs",
101
+ color: "mantine.colors.dimmed",
102
+ fontWeight: 500,
103
+ userSelect: "none",
104
+ mb: "xxs"
105
+ }
106
+ });
107
+ const ViewDetailsCardDropdown = ({
108
+ data: {
109
+ id,
110
+ title,
111
+ description,
112
+ tags,
113
+ links,
114
+ relativePath
115
+ }
116
+ }) => {
117
+ const diagram = useDiagram();
118
+ return /* @__PURE__ */ jsxs(
119
+ Popover.Dropdown,
120
+ {
121
+ className: cx(
122
+ "nowheel nopan nodrag",
123
+ vstack({
124
+ margin: "xs",
125
+ layerStyle: "likec4.dropdown",
126
+ gap: "md",
127
+ padding: "md",
128
+ pointerEvents: "all",
129
+ maxWidth: "calc(100cqw - 32px)",
130
+ minWidth: "calc(100cqw - 50px)",
131
+ maxHeight: "calc(100cqh - 100px)",
132
+ width: "max-content",
133
+ cursor: "default",
134
+ "@/sm": {
135
+ minWidth: 400,
136
+ maxWidth: 550
137
+ },
138
+ "@/lg": {
139
+ maxWidth: 700
140
+ }
141
+ })
142
+ ),
143
+ children: [
144
+ /* @__PURE__ */ jsxs("section", { children: [
145
+ /* @__PURE__ */ jsx(Text, { component: "div", fw: 500, size: "xl", children: title }),
146
+ /* @__PURE__ */ jsxs(HStack, { alignItems: "flex-start", mt: "1", children: [
147
+ /* @__PURE__ */ jsx(ViewBadge, { label: "id", value: id }),
148
+ /* @__PURE__ */ jsx(HStack, { gap: "xs", flexWrap: "wrap", children: tags.map((tag, i) => /* @__PURE__ */ jsx(
149
+ ElementTag,
150
+ {
151
+ tag,
152
+ cursor: "pointer",
153
+ onClick: (e) => {
154
+ e.stopPropagation();
155
+ diagram.openSearch(`#${tag}`);
156
+ }
157
+ },
158
+ tag
159
+ )) })
160
+ ] })
161
+ ] }),
162
+ links.length > 0 && /* @__PURE__ */ jsxs("section", { className: hstack({ alignItems: "baseline" }), children: [
163
+ /* @__PURE__ */ jsx(SectionHeader, { children: "Links" }),
164
+ /* @__PURE__ */ jsx(HStack, { gap: "xs", flexWrap: "wrap", children: links.map((link, i) => /* @__PURE__ */ jsx(Link, { value: link }, `${i}-${link.url}`)) })
165
+ ] }),
166
+ description.isEmpty && /* @__PURE__ */ jsx(Text, { component: "div", fw: 500, size: "xs", c: "dimmed", my: "md", style: { userSelect: "none" }, children: "No description" }),
167
+ description.nonEmpty && /* @__PURE__ */ jsxs("section", { children: [
168
+ /* @__PURE__ */ jsx(SectionHeader, { children: "Description" }),
169
+ /* @__PURE__ */ jsx(
170
+ MarkdownBlock,
171
+ {
172
+ value: description,
173
+ fontSize: "sm",
174
+ emptyText: "No description",
175
+ className: css({
176
+ userSelect: "all"
177
+ })
178
+ }
179
+ )
180
+ ] })
181
+ ]
182
+ }
183
+ );
184
+ };
185
+ const ViewBadge = ({
186
+ label,
187
+ value
188
+ }) => {
189
+ return /* @__PURE__ */ jsxs(HStack, { gap: "0.5", children: [
190
+ /* @__PURE__ */ jsx(ViewBadgeLabel, { children: label }),
191
+ /* @__PURE__ */ jsx(
192
+ Badge,
193
+ {
194
+ size: "sm",
195
+ radius: "sm",
196
+ variant: "light",
197
+ color: "gray",
198
+ tt: "none",
199
+ fw: 500,
200
+ classNames: {
201
+ root: css({
202
+ width: "max-content",
203
+ overflow: "visible",
204
+ px: "1",
205
+ color: {
206
+ _light: "mantine.colors.gray[8]"
207
+ }
208
+ }),
209
+ label: css({
210
+ overflow: "visible"
211
+ }),
212
+ section: css({
213
+ opacity: 0.5,
214
+ userSelect: "none",
215
+ marginInlineEnd: "0.5"
216
+ })
217
+ },
218
+ children: value
219
+ }
220
+ )
221
+ ] });
222
+ };
223
+ const ViewBadgeLabel = styled("div", {
224
+ base: {
225
+ color: "mantine.colors.dimmed",
226
+ fontWeight: 500,
227
+ fontSize: "xxs",
228
+ userSelect: "none"
229
+ }
230
+ });
231
+
232
+ export { ViewDetailsCard };
@@ -3,3 +3,4 @@ export { NavigationButtons } from './NavigationButtons';
3
3
  export { OpenSource } from './OpenSource';
4
4
  export { SearchControl } from './SearchControl';
5
5
  export { ToggleReadonly } from './ToggleReadonly';
6
+ export { ViewDetailsCard } from './ViewDetailsCard';
@@ -0,0 +1,2 @@
1
+ import { ButtonProps } from '@mantine/core';
2
+ export declare function ProjectsMenu(props: ButtonProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,75 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { css } from '@likec4/styles/css';
3
+ import { HStack, Box } from '@likec4/styles/jsx';
4
+ import { Menu, MenuTarget, Button, MenuDropdown, MenuItem } from '@mantine/core';
5
+ import { useLikeC4ProjectsContext, useLikeC4ProjectId } from '../../likec4model/useLikeC4Project.js';
6
+ import IconChevronDown from '../../node_modules/.pnpm/@tabler_icons-react@3.34.1_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.js';
7
+
8
+ function ProjectsMenu(props) {
9
+ const { projects, onProjectChange } = useLikeC4ProjectsContext();
10
+ const projectId = useLikeC4ProjectId();
11
+ if (projects.length <= 1) {
12
+ return null;
13
+ }
14
+ return /* @__PURE__ */ jsxs(HStack, { gap: "0.5", alignItems: "baseline", children: [
15
+ /* @__PURE__ */ jsx(
16
+ Box,
17
+ {
18
+ css: {
19
+ fontWeight: "400",
20
+ fontSize: "xxs",
21
+ color: "mantine.colors.dimmed",
22
+ userSelect: "none"
23
+ },
24
+ children: "Project"
25
+ }
26
+ ),
27
+ /* @__PURE__ */ jsxs(Menu, { shadow: "md", position: "bottom-start", offset: { mainAxis: 2 }, closeOnItemClick: true, children: [
28
+ /* @__PURE__ */ jsx(MenuTarget, { children: /* @__PURE__ */ jsx(
29
+ Button,
30
+ {
31
+ tabIndex: -1,
32
+ autoFocus: false,
33
+ variant: "subtle",
34
+ size: "compact-xs",
35
+ color: "gray",
36
+ classNames: {
37
+ root: css({
38
+ fontWeight: "400",
39
+ fontSize: "xxs",
40
+ height: "auto",
41
+ lineHeight: 1.1,
42
+ color: {
43
+ _light: "mantine.colors.gray[9]"
44
+ }
45
+ }),
46
+ section: css({
47
+ '&:is([data-position="right"])': {
48
+ marginInlineStart: "1"
49
+ }
50
+ })
51
+ },
52
+ rightSection: /* @__PURE__ */ jsx(IconChevronDown, { opacity: 0.5, size: 12, stroke: 1.5 }),
53
+ ...props,
54
+ children: projectId
55
+ }
56
+ ) }),
57
+ /* @__PURE__ */ jsx(MenuDropdown, { children: projects.map(({ id, title }) => /* @__PURE__ */ jsx(
58
+ MenuItem,
59
+ {
60
+ onClick: (e) => {
61
+ if (projectId === id) {
62
+ e.stopPropagation();
63
+ return;
64
+ }
65
+ onProjectChange(id);
66
+ },
67
+ children: title ?? id
68
+ },
69
+ id
70
+ )) })
71
+ ] })
72
+ ] });
73
+ }
74
+
75
+ export { ProjectsMenu };
@@ -16,11 +16,11 @@ function EditorPanel() {
16
16
  {
17
17
  layout: "position",
18
18
  className: vstack({
19
- gap: "sm",
19
+ gap: "xs",
20
20
  layerStyle: "likec4.panel",
21
21
  position: "relative",
22
22
  cursor: "pointer",
23
- padding: "4",
23
+ padding: "xxs",
24
24
  pointerEvents: "all"
25
25
  }),
26
26
  initial: {
@@ -35,7 +35,7 @@ function EditorPanel() {
35
35
  opacity: 0,
36
36
  translateX: -20
37
37
  },
38
- children: /* @__PURE__ */ jsxs(TooltipGroup, { children: [
38
+ children: /* @__PURE__ */ jsxs(TooltipGroup, { openDelay: 600, closeDelay: 120, children: [
39
39
  /* @__PURE__ */ jsx(ChangeAutoLayoutButton, {}),
40
40
  /* @__PURE__ */ jsx(ManualLayoutToolsButton, {}),
41
41
  /* @__PURE__ */ jsx(LayoutDriftNotification, {}),
@@ -1,8 +1,9 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { css } from '@likec4/styles/css';
3
3
  import { hstack } from '@likec4/styles/patterns';
4
- import { Popover, PopoverTarget, PopoverDropdown, TooltipGroup, ActionIcon } from '@mantine/core';
4
+ import { Popover, PopoverTarget, PopoverDropdown, TooltipGroup } from '@mantine/core';
5
5
  import { useDiagram } from '../../hooks/useDiagram.js';
6
+ import { useMantinePortalProps } from '../../hooks/useMantinePortalProps.js';
6
7
  import { PanelActionIcon } from '../_common.js';
7
8
  import { Tooltip } from './_common.js';
8
9
  import IconLayoutCollage from '../../node_modules/.pnpm/@tabler_icons-react@3.34.1_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutCollage.js';
@@ -20,7 +21,7 @@ const Action = ({
20
21
  icon,
21
22
  onClick
22
23
  }) => /* @__PURE__ */ jsx(Tooltip, { label, withinPortal: false, position: "top", children: /* @__PURE__ */ jsx(
23
- ActionIcon,
24
+ PanelActionIcon,
24
25
  {
25
26
  classNames: {
26
27
  root: "action-icon",
@@ -31,27 +32,24 @@ const Action = ({
31
32
  }
32
33
  })
33
34
  },
34
- variant: "subtle",
35
- color: "gray",
36
35
  onClick,
37
36
  children: icon
38
37
  }
39
38
  ) });
40
39
  const ManualLayoutToolsButton = (props) => {
41
40
  const diagram = useDiagram();
41
+ const portalProps = useMantinePortalProps();
42
42
  return /* @__PURE__ */ jsxs(
43
43
  Popover,
44
44
  {
45
- position: "right-start",
45
+ position: "right",
46
46
  offset: {
47
- mainAxis: 10,
48
- crossAxis: -2
47
+ mainAxis: 12
49
48
  },
50
49
  clickOutsideEvents: [
51
50
  "pointerdown"
52
51
  ],
53
- radius: "sm",
54
- shadow: "lg",
52
+ ...portalProps,
55
53
  ...props,
56
54
  children: [
57
55
  /* @__PURE__ */ jsx(PopoverTarget, { children: /* @__PURE__ */ jsx(Tooltip, { label: "Manual layouting tools", children: /* @__PURE__ */ jsx(PanelActionIcon, { children: /* @__PURE__ */ jsx(IconLayoutCollage, {}) }) }) }),
@@ -59,16 +57,17 @@ const ManualLayoutToolsButton = (props) => {
59
57
  PopoverDropdown,
60
58
  {
61
59
  className: hstack({
62
- gap: 1,
60
+ gap: "0.5",
63
61
  layerStyle: "likec4.panel",
64
- p: "2"
62
+ padding: "1",
63
+ pointerEvents: "all"
65
64
  }),
66
65
  children: /* @__PURE__ */ jsxs(TooltipGroup, { children: [
67
66
  /* @__PURE__ */ jsx(
68
67
  Action,
69
68
  {
70
69
  label: "Align in columns",
71
- icon: /* @__PURE__ */ jsx(IconLayoutBoardSplit, { stroke: 1.2 }),
70
+ icon: /* @__PURE__ */ jsx(IconLayoutBoardSplit, {}),
72
71
  onClick: (e) => {
73
72
  e.stopPropagation();
74
73
  diagram.align("Column");
@@ -79,7 +78,7 @@ const ManualLayoutToolsButton = (props) => {
79
78
  Action,
80
79
  {
81
80
  label: "Align left",
82
- icon: /* @__PURE__ */ jsx(IconLayoutAlignLeft, { stroke: 1.5 }),
81
+ icon: /* @__PURE__ */ jsx(IconLayoutAlignLeft, {}),
83
82
  onClick: (e) => {
84
83
  e.stopPropagation();
85
84
  diagram.align("Left");
@@ -90,7 +89,7 @@ const ManualLayoutToolsButton = (props) => {
90
89
  Action,
91
90
  {
92
91
  label: "Align center",
93
- icon: /* @__PURE__ */ jsx(IconLayoutAlignCenter, { stroke: 1.5 }),
92
+ icon: /* @__PURE__ */ jsx(IconLayoutAlignCenter, {}),
94
93
  onClick: (e) => {
95
94
  e.stopPropagation();
96
95
  diagram.align("Center");
@@ -101,7 +100,7 @@ const ManualLayoutToolsButton = (props) => {
101
100
  Action,
102
101
  {
103
102
  label: "Align right",
104
- icon: /* @__PURE__ */ jsx(IconLayoutAlignRight, { stroke: 1.5 }),
103
+ icon: /* @__PURE__ */ jsx(IconLayoutAlignRight, {}),
105
104
  onClick: (e) => {
106
105
  e.stopPropagation();
107
106
  diagram.align("Right");
@@ -112,7 +111,7 @@ const ManualLayoutToolsButton = (props) => {
112
111
  Action,
113
112
  {
114
113
  label: "Align in rows",
115
- icon: /* @__PURE__ */ jsx(IconLayoutBoardSplit, { stroke: 1.5, style: { transform: "rotate(90deg)" } }),
114
+ icon: /* @__PURE__ */ jsx(IconLayoutBoardSplit, { style: { transform: "rotate(90deg)" } }),
116
115
  onClick: (e) => {
117
116
  e.stopPropagation();
118
117
  diagram.align("Row");
@@ -123,7 +122,7 @@ const ManualLayoutToolsButton = (props) => {
123
122
  Action,
124
123
  {
125
124
  label: "Align top",
126
- icon: /* @__PURE__ */ jsx(IconLayoutAlignTop, { stroke: 1.5 }),
125
+ icon: /* @__PURE__ */ jsx(IconLayoutAlignTop, {}),
127
126
  onClick: (e) => {
128
127
  e.stopPropagation();
129
128
  diagram.align("Top");
@@ -134,7 +133,7 @@ const ManualLayoutToolsButton = (props) => {
134
133
  Action,
135
134
  {
136
135
  label: "Align middle",
137
- icon: /* @__PURE__ */ jsx(IconLayoutAlignMiddle, { stroke: 1.5 }),
136
+ icon: /* @__PURE__ */ jsx(IconLayoutAlignMiddle, {}),
138
137
  onClick: (e) => {
139
138
  e.stopPropagation();
140
139
  diagram.align("Middle");
@@ -145,7 +144,7 @@ const ManualLayoutToolsButton = (props) => {
145
144
  Action,
146
145
  {
147
146
  label: "Align bottom",
148
- icon: /* @__PURE__ */ jsx(IconLayoutAlignBottom, { stroke: 1.5 }),
147
+ icon: /* @__PURE__ */ jsx(IconLayoutAlignBottom, {}),
149
148
  onClick: (e) => {
150
149
  e.stopPropagation();
151
150
  diagram.align("Bottom");
@@ -156,7 +155,7 @@ const ManualLayoutToolsButton = (props) => {
156
155
  Action,
157
156
  {
158
157
  label: "Reset all control points",
159
- icon: /* @__PURE__ */ jsx(IconRouteOff, { stroke: 1.5 }),
158
+ icon: /* @__PURE__ */ jsx(IconRouteOff, {}),
160
159
  onClick: (e) => {
161
160
  e.stopPropagation();
162
161
  diagram.resetEdgeControlPoints();
@@ -1,15 +1,15 @@
1
1
  import { css } from '@likec4/styles/css';
2
2
 
3
3
  css({
4
- gap: "micro",
4
+ gap: "xxs",
5
5
  _empty: {
6
6
  display: "none"
7
7
  }
8
8
  });
9
9
  css({
10
- top: "1rem",
11
- left: "1rem",
12
- margin: 0,
10
+ top: "md",
11
+ left: "md",
12
+ margin: "0",
13
13
  pointerEvents: "none",
14
14
  "& :where(button, .action-icon, [role='dialog'])": {
15
15
  pointerEvents: "all"
@@ -43,7 +43,7 @@ const autolayoutButton = css({
43
43
  flex: "1 1 40%",
44
44
  textAlign: "center",
45
45
  fontWeight: 500,
46
- padding: "4px 6px",
46
+ padding: "[4px 6px]",
47
47
  fontSize: "11px",
48
48
  zIndex: 1
49
49
  });
@@ -5,7 +5,7 @@ export declare const NavigationPanelActorContextProvider: Provider<NavigationPan
5
5
  export declare const useNavigationActorRef: () => NavigationPanelActorRef;
6
6
  export declare function useNavigationActorSnapshot<T = unknown>(selector: (context: NavigationPanelActorSnapshot) => T, compare?: (a: NoInfer<T>, b: NoInfer<T>) => boolean, deps?: DependencyList): T;
7
7
  export declare function useNavigationActorContext<T = unknown>(selector: (context: NavigationPanelActorContext) => T, compare?: (a: NoInfer<T>, b: NoInfer<T>) => boolean, deps?: DependencyList): T;
8
- export type NavigationActor = {
8
+ export interface NavigationActor {
9
9
  readonly actorRef: NavigationPanelActorRef;
10
10
  send: (event: NavigationPanelActorEvent) => void;
11
11
  selectFolder: (folderPath: string) => void;
@@ -16,5 +16,5 @@ export type NavigationActor = {
16
16
  isOpened: () => boolean;
17
17
  clearSearch: () => void;
18
18
  closeDropdown: () => void;
19
- };
19
+ }
20
20
  export declare function useNavigationActor(): NavigationActor;
@@ -5,8 +5,6 @@ const breadcrumbTitle = cva({
5
5
  fontSize: "sm",
6
6
  fontWeight: "500",
7
7
  transition: "fast",
8
- // width: 'max-content',
9
- alignSelf: "stretch",
10
8
  color: {
11
9
  base: "mantine.colors.text/90",
12
10
  _hover: "mantine.colors.text"