@likec4/diagram 1.58.0 → 1.59.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 (229) hide show
  1. package/dist/LikeC4Diagram.js +1 -1
  2. package/dist/LikeC4Diagram.props.d.ts +1 -1
  3. package/dist/LikeC4Styles.js +1 -1
  4. package/dist/LikeC4View.js +2 -2
  5. package/dist/ReactLikeC4.d.ts +1 -1
  6. package/dist/base/Base.d.ts +3 -2
  7. package/dist/base/Base.js +14 -26
  8. package/dist/base/BaseXYFlow.d.ts +2 -1
  9. package/dist/base/BaseXYFlow.js +63 -4
  10. package/dist/base/keyboardZoom.d.ts +3 -0
  11. package/dist/base/keyboardZoom.js +20 -0
  12. package/dist/base/updateEdges.js +7 -16
  13. package/dist/base/updateNodes.js +3 -9
  14. package/dist/base-primitives/compound/CompoundActionButton.d.ts +2 -1
  15. package/dist/base-primitives/compound/CompoundActionButton.js +5 -2
  16. package/dist/base-primitives/compound/CompoundDetailsButton.d.ts +2 -1
  17. package/dist/base-primitives/compound/CompoundDetailsButton.js +5 -2
  18. package/dist/base-primitives/compound/CompoundTitle.d.ts +7 -1
  19. package/dist/base-primitives/compound/CompoundTitle.js +2 -1
  20. package/dist/base-primitives/compound/actionbtns.css.d.ts +1 -1
  21. package/dist/base-primitives/edge/EdgeActionButton.d.ts +2 -1
  22. package/dist/base-primitives/edge/EdgeActionButton.js +2 -1
  23. package/dist/base-primitives/edge/EdgeContainer.d.ts +1 -1
  24. package/dist/base-primitives/edge/EdgeContainer.js +4 -2
  25. package/dist/base-primitives/edge/EdgeLabel.d.ts +2 -0
  26. package/dist/base-primitives/edge/EdgeLabel.js +2 -5
  27. package/dist/base-primitives/element/ElementActionButtons.d.ts +1 -0
  28. package/dist/base-primitives/element/ElementActionButtons.js +4 -1
  29. package/dist/base-primitives/element/ElementData.d.ts +3 -1
  30. package/dist/base-primitives/element/ElementData.js +2 -1
  31. package/dist/base-primitives/element/ElementDetailsButton.d.ts +2 -1
  32. package/dist/base-primitives/element/ElementDetailsButton.js +5 -2
  33. package/dist/base-primitives/element/ElementNodeContainer.js +1 -1
  34. package/dist/base-primitives/element/ElementShape.js +3 -0
  35. package/dist/components/ErrorFallback.js +3 -5
  36. package/dist/components/Link.js +6 -6
  37. package/dist/components/NavigationPanel.js +1 -1
  38. package/dist/components/SearchControl.css.js +11 -11
  39. package/dist/context/TagStylesContext.d.ts +3 -3
  40. package/dist/context/TagStylesContext.js +16 -16
  41. package/dist/custom/index.d.ts +1 -0
  42. package/dist/custom/index.js +3 -2
  43. package/dist/editor/actor/actions.js +1 -1
  44. package/dist/editor/actor/machine.d.ts +4 -6
  45. package/dist/editor/actor/setup.d.ts +16 -2
  46. package/dist/editor/actor/setup.js +5 -4
  47. package/dist/hooks/index.d.ts +1 -1
  48. package/dist/hooks/safeContext.d.ts +156 -3
  49. package/dist/hooks/safeContext.js +60 -12
  50. package/dist/hooks/useCurrentViewModel.js +1 -1
  51. package/dist/hooks/useDiagram.d.ts +8 -0
  52. package/dist/hooks/useDiagram.js +9 -2
  53. package/dist/hooks/useEditorActor.js +1 -1
  54. package/dist/hooks/useLikeC4ElementsTree.js +1 -1
  55. package/dist/hooks/useLikeC4Model.js +1 -1
  56. package/dist/hooks/useXYFlow.d.ts +1 -0
  57. package/dist/hooks/useXYFlow.js +5 -3
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.js +2 -2
  60. package/dist/likec4diagram/DiagramUI.js +19 -6
  61. package/dist/likec4diagram/DiagramXYFlow.js +39 -14
  62. package/dist/likec4diagram/convert-to-xyflow.d.ts +3 -5
  63. package/dist/likec4diagram/convert-to-xyflow.js +29 -10
  64. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +13 -4
  65. package/dist/likec4diagram/custom/edges/SequenceStepEdge.js +11 -4
  66. package/dist/likec4diagram/custom/edges/edges.css.js +1 -1
  67. package/dist/likec4diagram/custom/index.d.ts +2 -1
  68. package/dist/likec4diagram/custom/index.js +5 -3
  69. package/dist/likec4diagram/custom/nodes/CompoundActions.js +1 -0
  70. package/dist/likec4diagram/custom/nodes/ElementActions.d.ts +2 -2
  71. package/dist/likec4diagram/custom/nodes/ElementActions.js +13 -3
  72. package/dist/likec4diagram/custom/nodes/NodeNotes.js +0 -4
  73. package/dist/likec4diagram/custom/nodes/SequenceActorNode.js +32 -19
  74. package/dist/likec4diagram/custom/nodes/SequenceSubFlow.d.ts +2 -0
  75. package/dist/likec4diagram/custom/nodes/SequenceSubFlow.js +234 -0
  76. package/dist/likec4diagram/custom/nodes/index.d.ts +1 -0
  77. package/dist/likec4diagram/custom/nodes/nodes.js +20 -5
  78. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +1 -1
  79. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +1 -1
  80. package/dist/likec4diagram/relationship-popover/RelationshipPopover.js +15 -14
  81. package/dist/likec4diagram/relationship-popover/components.d.ts +1 -1
  82. package/dist/likec4diagram/state/DiagramActorProvider.js +11 -20
  83. package/dist/likec4diagram/state/aligners.js +1 -1
  84. package/dist/likec4diagram/state/assign.d.ts +1 -1
  85. package/dist/likec4diagram/state/assign.js +1 -1
  86. package/dist/likec4diagram/state/createViewChange.js +1 -1
  87. package/dist/likec4diagram/state/diagram-api.d.ts +18 -10
  88. package/dist/likec4diagram/state/diagram-api.js +333 -229
  89. package/dist/likec4diagram/state/machine.actions.d.ts +1026 -332
  90. package/dist/likec4diagram/state/machine.actions.js +115 -44
  91. package/dist/likec4diagram/state/machine.actions.layout.d.ts +123 -51
  92. package/dist/likec4diagram/state/machine.actions.layout.js +40 -33
  93. package/dist/likec4diagram/state/machine.d.ts +154 -16
  94. package/dist/likec4diagram/state/machine.js +5 -41
  95. package/dist/likec4diagram/state/machine.setup.d.ts +84 -19
  96. package/dist/likec4diagram/state/machine.setup.js +65 -12
  97. package/dist/likec4diagram/state/machine.state.initializing.d.ts +59 -33
  98. package/dist/likec4diagram/state/machine.state.navigating.js +7 -3
  99. package/dist/likec4diagram/state/machine.state.ready.d.ts +1540 -476
  100. package/dist/likec4diagram/state/machine.state.ready.focused.d.ts +294 -53
  101. package/dist/likec4diagram/state/machine.state.ready.focused.js +3 -3
  102. package/dist/likec4diagram/state/machine.state.ready.idle.d.ts +264 -73
  103. package/dist/likec4diagram/state/machine.state.ready.idle.js +31 -6
  104. package/dist/likec4diagram/state/machine.state.ready.js +22 -16
  105. package/dist/likec4diagram/state/machine.state.ready.printing.d.ts +23 -9
  106. package/dist/likec4diagram/state/machine.state.ready.walkthrough.d.ts +288 -84
  107. package/dist/likec4diagram/state/machine.state.ready.walkthrough.js +135 -66
  108. package/dist/likec4diagram/state/types.d.ts +4 -2
  109. package/dist/likec4diagram/state/utils.d.ts +7 -0
  110. package/dist/likec4diagram/state/utils.js +36 -34
  111. package/dist/likec4diagram/types.d.ts +47 -3
  112. package/dist/likec4diagram/ui/FloatingSequenceActors.d.ts +6 -0
  113. package/dist/likec4diagram/ui/FloatingSequenceActors.js +155 -0
  114. package/dist/likec4diagram/ui/LayoutDriftFrame.js +2 -2
  115. package/dist/likec4diagram/ui/index.d.ts +2 -0
  116. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +5 -5
  117. package/dist/likec4diagram/ui/sequence-outline/SequenceOutlinePanel.d.ts +2 -0
  118. package/dist/likec4diagram/ui/sequence-outline/SequenceOutlinePanel.js +519 -0
  119. package/dist/likec4diagram/ui/sequence-outline/state.d.ts +36 -0
  120. package/dist/likec4diagram/ui/sequence-outline/state.js +55 -0
  121. package/dist/likec4diagram/xyflow-diagram/diagram-view.d.ts +1 -1
  122. package/dist/likec4diagram/xyflow-diagram/diagram-view.js +112 -60
  123. package/dist/likec4diagram/xyflow-sequence/_types.d.ts +55 -5
  124. package/dist/likec4diagram/xyflow-sequence/const.d.ts +5 -5
  125. package/dist/likec4diagram/xyflow-sequence/const.js +4 -4
  126. package/dist/likec4diagram/xyflow-sequence/layouter.d.ts +30 -6
  127. package/dist/likec4diagram/xyflow-sequence/layouter.js +561 -0
  128. package/dist/likec4diagram/xyflow-sequence/{sequence-layout.d.ts → sequence-view-to-xy.d.ts} +8 -2
  129. package/dist/likec4diagram/xyflow-sequence/{sequence-layout.js → sequence-view-to-xy.js} +111 -14
  130. package/dist/likec4diagram/xyflow-sequence/sequence-view.d.ts +2 -7
  131. package/dist/likec4diagram/xyflow-sequence/sequence-view.js +144 -0
  132. package/dist/likec4diagram/xyflow-sequence/utils.d.ts +9 -1
  133. package/dist/likec4diagram/xyflow-sequence/utils.js +96 -0
  134. package/dist/navigationpanel/NavigationPanel.d.ts +5 -2
  135. package/dist/navigationpanel/NavigationPanel.js +58 -59
  136. package/dist/navigationpanel/NavigationPanelDropdown.js +45 -38
  137. package/dist/navigationpanel/_common.js +2 -2
  138. package/dist/navigationpanel/actor.actions.d.ts +19 -0
  139. package/dist/navigationpanel/actor.actions.js +45 -0
  140. package/dist/navigationpanel/actor.d.ts +34 -96
  141. package/dist/navigationpanel/actor.js +21 -84
  142. package/dist/navigationpanel/actor.setup.d.ts +98 -0
  143. package/dist/navigationpanel/actor.setup.js +31 -0
  144. package/dist/navigationpanel/comparepanel/DriftsSummary.js +4 -5
  145. package/dist/navigationpanel/controls/DetailsControls.js +7 -8
  146. package/dist/navigationpanel/dropdown/ProjectsMenu.js +1 -1
  147. package/dist/navigationpanel/editorpanel/styles.js +8 -8
  148. package/dist/navigationpanel/hooks.d.ts +20 -5
  149. package/dist/navigationpanel/hooks.js +4 -18
  150. package/dist/navigationpanel/styles.css.d.ts +1 -1
  151. package/dist/navigationpanel/walkthrough/ActiveWalkthroughControls.js +2 -2
  152. package/dist/navigationpanel/walkthrough/DynamicViewControls.d.ts +4 -4
  153. package/dist/navigationpanel/walkthrough/DynamicViewControls.js +23 -25
  154. package/dist/navigationpanel/walkthrough/WalkthroughPanel.js +5 -5
  155. package/dist/overlays/Overlays.d.ts +4 -2
  156. package/dist/overlays/Overlays.js +10 -10
  157. package/dist/overlays/element-details/ElementDetailsCard.css.js +17 -17
  158. package/dist/overlays/element-details/MetadataValue.js +15 -15
  159. package/dist/overlays/element-details/TabPanelDeployments.css.js +5 -5
  160. package/dist/overlays/element-details/TabPanelRelationships.css.js +11 -11
  161. package/dist/overlays/element-details/TabPanelRelationships.js +1 -1
  162. package/dist/overlays/element-details/TabPanelStructure.css.js +2 -2
  163. package/dist/overlays/element-details/TabPanelStructure.js +1 -1
  164. package/dist/overlays/element-details/actor.d.ts +2 -3
  165. package/dist/overlays/hooks.d.ts +28 -0
  166. package/dist/overlays/hooks.js +5 -0
  167. package/dist/overlays/overlay/Overlay.js +34 -25
  168. package/dist/overlays/overlaysActor.js +0 -1
  169. package/dist/overlays/relationship-details/custom/nodeTypes.js +1 -1
  170. package/dist/overlays/relationship-details/layout.js +1 -1
  171. package/dist/overlays/relationships-browser/SelectElement.css.js +2 -2
  172. package/dist/overlays/relationships-browser/actor.js +79 -78
  173. package/dist/overlays/relationships-browser/custom/nodeTypes.js +1 -1
  174. package/dist/overlays/relationships-browser/hooks.js +1 -1
  175. package/dist/overlays/relationships-browser/layout.js +2 -2
  176. package/dist/projects-overview/actor.js +4 -4
  177. package/dist/search/Search.js +1 -1
  178. package/dist/search/components/ElementsColumn.css.js +2 -2
  179. package/dist/search/components/ViewsColum.js +1 -1
  180. package/dist/search/components/_shared.css.d.ts +1 -1
  181. package/dist/search/components/_shared.css.js +23 -23
  182. package/dist/search/components/styles.css.js +4 -4
  183. package/dist/shadowroot/ShadowRoot.d.ts +1 -1
  184. package/dist/shadowroot/ShadowRoot.js +76 -28
  185. package/dist/styles2.js +1 -1
  186. package/dist/utils/defineActors.d.ts +21 -0
  187. package/dist/utils/defineActors.js +13 -0
  188. package/dist/utils/index.d.ts +1 -0
  189. package/dist/utils/index.js +5 -4
  190. package/dist/utils/readableText.d.ts +11 -0
  191. package/dist/utils/readableText.js +18 -0
  192. package/package.json +18 -30
  193. package/panda.buildinfo.json +267 -288
  194. package/styles-min.css +1 -1
  195. package/styles.css +1 -1
  196. package/adhoc-editor/package.json +0 -4
  197. package/dist/adhoc-editor/EditorPanel.d.ts +0 -1
  198. package/dist/adhoc-editor/EditorPanel.js +0 -106
  199. package/dist/adhoc-editor/ElementsTree.d.ts +0 -2
  200. package/dist/adhoc-editor/ElementsTree.js +0 -112
  201. package/dist/adhoc-editor/LikeC4AdHocViewEditor.d.ts +0 -4
  202. package/dist/adhoc-editor/LikeC4AdHocViewEditor.js +0 -83
  203. package/dist/adhoc-editor/components/Tree.d.ts +0 -48
  204. package/dist/adhoc-editor/components/Tree.js +0 -213
  205. package/dist/adhoc-editor/hooks.d.ts +0 -14
  206. package/dist/adhoc-editor/hooks.js +0 -34
  207. package/dist/adhoc-editor/index.d.ts +0 -2
  208. package/dist/adhoc-editor/index.js +0 -2
  209. package/dist/adhoc-editor/state/ActorProvider.d.ts +0 -5
  210. package/dist/adhoc-editor/state/ActorProvider.js +0 -37
  211. package/dist/adhoc-editor/state/actor.d.ts +0 -13
  212. package/dist/adhoc-editor/state/actor.editor.d.ts +0 -56
  213. package/dist/adhoc-editor/state/actor.editor.js +0 -167
  214. package/dist/adhoc-editor/state/actor.js +0 -14
  215. package/dist/adhoc-editor/state/actor.layouter.d.ts +0 -51
  216. package/dist/adhoc-editor/state/actor.layouter.js +0 -54
  217. package/dist/adhoc-editor/state/actor.types.d.ts +0 -63
  218. package/dist/adhoc-editor/state/actor.types.js +0 -25
  219. package/dist/adhoc-editor/state/panel.d.ts +0 -95
  220. package/dist/adhoc-editor/state/panel.js +0 -124
  221. package/dist/adhoc-editor/state/utils.d.ts +0 -17
  222. package/dist/adhoc-editor/state/utils.js +0 -25
  223. package/dist/adhoc-editor/useElementsTree.d.ts +0 -18
  224. package/dist/adhoc-editor/useElementsTree.js +0 -98
  225. package/dist/adhoc-editor/viewrules/ViewRulesPanel.d.ts +0 -6
  226. package/dist/context/ShadowRootContext.d.ts +0 -3
  227. package/dist/context/ShadowRootContext.js +0 -5
  228. package/dist/shadowroot/styles.d.ts +0 -13
  229. package/dist/shadowroot/styles.js +0 -60
@@ -0,0 +1,519 @@
1
+ import "../../../_virtual/_rolldown/runtime.js";
2
+ import { selectDiagramContext, useDiagram, useDiagramSelector } from "../../../hooks/safeContext.js";
3
+ import { useOnDiagramEvent } from "../../../hooks/useDiagram.js";
4
+ import { Markdown } from "../../../base-primitives/Markdown.js";
5
+ import { PortalToContainer } from "../../../components/PortalToContainer.js";
6
+ import { useTreeData } from "./state.js";
7
+ import { css, cx } from "@likec4/styles/css";
8
+ import { IconAlertTriangle, IconArrowFork, IconArrowGuide, IconArrowRight, IconChevronRight, IconCornerDownRight, IconDirectionSignFilled, IconListTree, IconPlayerSkipBackFilled, IconPlayerSkipForwardFilled, IconPlayerStop, IconRepeat } from "@tabler/icons-react";
9
+ import { memo, useMemo } from "react";
10
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
+ import { mapToObj, only } from "remeda";
12
+ import { RichText, dynamicViewFlow, flowAncestors, hasProp, isDynamicView } from "@likec4/core";
13
+ import { ActionIcon, Button, CloseButton, ScrollArea, Spoiler, Tooltip, Tree, useTree } from "@mantine/core";
14
+ import { AnimatePresence, m } from "motion/react";
15
+ import { Box as Box$1, HStack, Txt, VStack, styled } from "@likec4/styles/jsx";
16
+ import { vstack } from "@likec4/styles/patterns";
17
+ import { extractViewTitleFromPath } from "@likec4/core/model";
18
+ //#region src/likec4diagram/ui/sequence-outline/SequenceOutlinePanel.tsx
19
+ /**
20
+ * PandaCSS `colorPalette` classes for each sub-flow palette.
21
+ * Declared as literals so the static analyzer can extract them.
22
+ */
23
+ var palette = {
24
+ loop: css({ colorPalette: "subflow.loop" }),
25
+ opt: css({ colorPalette: "subflow.opt" }),
26
+ par: css({ colorPalette: "subflow.par" }),
27
+ break: css({ colorPalette: "subflow.break" }),
28
+ alt: css({ colorPalette: "subflow.alt" }),
29
+ try: css({ colorPalette: "subflow.try" })
30
+ };
31
+ var flowPresentation = {
32
+ loop: {
33
+ paletteClass: palette.loop,
34
+ tag: "loop",
35
+ Icon: IconRepeat
36
+ },
37
+ opt: {
38
+ paletteClass: palette.opt,
39
+ tag: "opt",
40
+ Icon: IconArrowGuide
41
+ },
42
+ par: {
43
+ paletteClass: palette.par,
44
+ tag: "par",
45
+ Icon: IconArrowFork
46
+ },
47
+ break: {
48
+ paletteClass: palette.break,
49
+ tag: "break",
50
+ Icon: IconPlayerStop
51
+ },
52
+ alt: {
53
+ paletteClass: palette.alt,
54
+ tag: "alt",
55
+ Icon: IconArrowFork
56
+ },
57
+ "alt-when": {
58
+ paletteClass: palette.alt,
59
+ tag: "when",
60
+ Icon: IconCornerDownRight
61
+ },
62
+ "alt-else": {
63
+ paletteClass: palette.alt,
64
+ tag: "else",
65
+ Icon: IconCornerDownRight
66
+ },
67
+ "alt-if": {
68
+ paletteClass: palette.alt,
69
+ tag: "if",
70
+ Icon: IconCornerDownRight
71
+ },
72
+ try: {
73
+ paletteClass: palette.try,
74
+ tag: "try",
75
+ Icon: IconAlertTriangle
76
+ },
77
+ "try-block": {
78
+ paletteClass: palette.try,
79
+ tag: "block",
80
+ Icon: IconCornerDownRight
81
+ },
82
+ "try-catch": {
83
+ paletteClass: palette.break,
84
+ tag: "catch",
85
+ Icon: IconCornerDownRight
86
+ },
87
+ "try-finally": {
88
+ paletteClass: palette.break,
89
+ tag: "finally",
90
+ Icon: IconCornerDownRight
91
+ }
92
+ };
93
+ var SectionLabel = styled("div", { base: {
94
+ textStyle: "dimmed.xs",
95
+ fontWeight: "semibold",
96
+ letterSpacing: "wider",
97
+ textTransform: "uppercase",
98
+ userSelect: "none"
99
+ } });
100
+ /** Numeric step badge (e.g. `12`). */
101
+ var StepNum = styled("div", { base: {
102
+ flex: "none",
103
+ display: "flex",
104
+ alignItems: "center",
105
+ justifyContent: "center",
106
+ minWidth: "22px",
107
+ height: "18px",
108
+ paddingInline: "1",
109
+ rounded: "sm",
110
+ bg: "surface.sunken",
111
+ color: "text.dimmed",
112
+ fontSize: "[10px]",
113
+ fontWeight: "bold",
114
+ fontVariantNumeric: "tabular-nums",
115
+ userSelect: "none"
116
+ } });
117
+ /** Small pill tag for the sub-flow operator (`loop`, `par`, `try`, …). */
118
+ var FlowTag = styled("div", { base: {
119
+ flex: "none",
120
+ paddingInline: "1.5",
121
+ paddingBlock: "0.5",
122
+ rounded: "sm",
123
+ bg: "colorPalette.label",
124
+ color: "colorPalette.text",
125
+ fontSize: "[9px]",
126
+ fontWeight: "bold",
127
+ lineHeight: "xs",
128
+ letterSpacing: "tight",
129
+ textTransform: "uppercase",
130
+ userSelect: "none"
131
+ } });
132
+ var rowBase = css.raw({
133
+ display: "flex",
134
+ alignItems: "center",
135
+ gap: "2",
136
+ width: "100%",
137
+ paddingInline: "1.5",
138
+ paddingBlock: "1",
139
+ rounded: "md",
140
+ cursor: "pointer",
141
+ color: "text",
142
+ userSelect: "none",
143
+ transition: "background-color 120ms ease",
144
+ _hover: { bg: "surface.sunken/60" },
145
+ "&[data-selected=\"true\"]": {
146
+ bg: "mantine.primary.light",
147
+ color: "mantine.primary.lightColor"
148
+ }
149
+ });
150
+ var labelText = css.raw({
151
+ flex: "1",
152
+ minWidth: "0",
153
+ fontSize: "xs",
154
+ whiteSpace: "nowrap",
155
+ overflow: "hidden",
156
+ textOverflow: "ellipsis"
157
+ });
158
+ var LabelSpan = styled("span", { base: labelText });
159
+ var selectFlow = selectDiagramContext((s) => {
160
+ const title = extractViewTitleFromPath(s.view.title ?? "Untitled");
161
+ const description = s.view.description;
162
+ const activeStep = s.activeWalkthrough?.stepId ?? null;
163
+ if (activeStep) return {
164
+ flow: isDynamicView(s.view) && hasProp(s.view, "flow") ? dynamicViewFlow(s.view) : null,
165
+ activeStep,
166
+ title,
167
+ description,
168
+ outlinePanelWidth: s.activeWalkthrough?.outlinePanelWidth ?? 0,
169
+ collapsed: s.collapsedSequenceFlows
170
+ };
171
+ return {
172
+ flow: null,
173
+ activeStep: null,
174
+ title,
175
+ description
176
+ };
177
+ });
178
+ var SequenceOutlinePanel = memo(() => {
179
+ const props = useDiagramSelector(selectFlow);
180
+ return /* @__PURE__ */ jsx(PortalToContainer, { children: /* @__PURE__ */ jsx(AnimatePresence, {
181
+ propagate: true,
182
+ children: props.activeStep && props.flow && /* @__PURE__ */ jsx(m.div, {
183
+ layout: "position",
184
+ className: vstack({
185
+ position: "absolute",
186
+ top: "0",
187
+ left: "0",
188
+ layerStyle: "likec4.panel",
189
+ rounded: "0",
190
+ gap: "0",
191
+ padding: "0",
192
+ pointerEvents: "all",
193
+ maxWidth: "85cqw",
194
+ height: "100cqh",
195
+ maxHeight: "100cqh",
196
+ cursor: "default",
197
+ overflow: "hidden"
198
+ }),
199
+ style: { width: props.outlinePanelWidth },
200
+ initial: {
201
+ opacity: .5,
202
+ translateX: -40
203
+ },
204
+ animate: {
205
+ opacity: 1,
206
+ translateX: 0
207
+ },
208
+ exit: {
209
+ opacity: 0,
210
+ translateX: -props.outlinePanelWidth
211
+ },
212
+ children: /* @__PURE__ */ jsx(SequenceOutlinePanelBody, {
213
+ title: props.title,
214
+ description: props.description,
215
+ activeStep: props.activeStep,
216
+ flow: props.flow,
217
+ collapsed: props.collapsed
218
+ })
219
+ })
220
+ }) });
221
+ });
222
+ SequenceOutlinePanel.displayName = "SequenceOutlinePanel";
223
+ function SequenceOutlinePanelBody(props) {
224
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(OutlineHeader, {
225
+ title: props.title,
226
+ flow: props.flow,
227
+ description: props.description
228
+ }), /* @__PURE__ */ jsx(OutlineBody, {
229
+ activeStep: props.activeStep,
230
+ flow: props.flow,
231
+ collapsed: props.collapsed
232
+ })] });
233
+ }
234
+ var OutlineHeader = ({ title, flow, description }) => {
235
+ const diagram = useDiagram();
236
+ const stepCount = flow.stepsCount;
237
+ return /* @__PURE__ */ jsxs(VStack, {
238
+ css: {
239
+ gap: "2.5",
240
+ width: "100%",
241
+ paddingInline: "2.5",
242
+ paddingBlock: "2",
243
+ borderBottom: "1px solid {colors.likec4.panel.border}"
244
+ },
245
+ children: [/* @__PURE__ */ jsxs(HStack, {
246
+ css: {
247
+ gap: "2.5",
248
+ alignItems: "center",
249
+ width: "100%",
250
+ padding: "0"
251
+ },
252
+ children: [
253
+ /* @__PURE__ */ jsx(Box$1, {
254
+ css: {
255
+ flex: "none",
256
+ display: "flex",
257
+ alignItems: "center",
258
+ justifyContent: "center",
259
+ boxSize: "20px",
260
+ rounded: "sm",
261
+ colorPalette: "subflow.loop",
262
+ bg: "colorPalette.label",
263
+ color: "colorPalette.text"
264
+ },
265
+ children: /* @__PURE__ */ jsx(IconDirectionSignFilled, { size: 14 })
266
+ }),
267
+ /* @__PURE__ */ jsxs(VStack, {
268
+ css: {
269
+ gap: "0",
270
+ alignItems: "stretch",
271
+ flex: "1",
272
+ minWidth: "0"
273
+ },
274
+ children: [/* @__PURE__ */ jsx(styled.div, {
275
+ css: {
276
+ fontSize: "sm",
277
+ fontWeight: "semibold",
278
+ color: "text",
279
+ whiteSpace: "nowrap",
280
+ overflow: "hidden",
281
+ textOverflow: "ellipsis"
282
+ },
283
+ children: title ?? "Sequence"
284
+ }), /* @__PURE__ */ jsxs(Txt, {
285
+ size: "xxs",
286
+ dimmed: true,
287
+ noUserSelect: true,
288
+ children: [
289
+ stepCount,
290
+ " ",
291
+ stepCount === 1 ? "step" : "steps"
292
+ ]
293
+ })]
294
+ }),
295
+ /* @__PURE__ */ jsx(Box$1, {
296
+ css: {
297
+ flex: "none",
298
+ alignItems: "center",
299
+ justifyContent: "center"
300
+ },
301
+ children: /* @__PURE__ */ jsx(CloseButton, {
302
+ size: "sm",
303
+ onClick: () => diagram.stopWalkthrough()
304
+ })
305
+ })
306
+ ]
307
+ }), description && /* @__PURE__ */ jsx(Spoiler, {
308
+ showLabel: /* @__PURE__ */ jsx(Txt, {
309
+ size: "xxs",
310
+ children: "show description"
311
+ }),
312
+ hideLabel: /* @__PURE__ */ jsx(Txt, {
313
+ size: "xxs",
314
+ children: "hide"
315
+ }),
316
+ maxHeight: 16,
317
+ children: /* @__PURE__ */ jsx(Markdown, {
318
+ value: RichText.from(description),
319
+ className: css({ color: "text.dimmed" }),
320
+ fontSize: "xxs"
321
+ })
322
+ })]
323
+ });
324
+ };
325
+ var OutlineBody = ({ activeStep, flow, collapsed }) => {
326
+ const diagram = useDiagram();
327
+ const treeData = useTreeData(flow, collapsed);
328
+ const initialExpandedState = useMemo(() => mapToObj(flowAncestors(activeStep), (id) => [id, true]), []);
329
+ const tree = useTree({
330
+ initialSelectedState: [activeStep],
331
+ initialExpandedState,
332
+ multiple: false,
333
+ onSelectedStateChange(selected) {
334
+ const step = only(selected);
335
+ if (step && flow.isStep(step)) diagram.walkthroughStep({ step });
336
+ }
337
+ });
338
+ useOnDiagramEvent("walkthroughStep", ({ stepId }) => {
339
+ if (!tree.selectedState.includes(stepId)) {
340
+ const ancestors = flowAncestors(stepId);
341
+ if (ancestors.length > 0) {
342
+ const expanded = { ...tree.expandedState };
343
+ for (const parent of ancestors) expanded[parent] = true;
344
+ tree.setExpandedState(expanded);
345
+ }
346
+ tree.setSelectedState([stepId]);
347
+ }
348
+ });
349
+ const allCollapsed = useMemo(() => Object.values(tree.expandedState).every((v) => !v), [tree.expandedState]);
350
+ const { prev, next } = flow.prevAndNext(activeStep, (flowId) => collapsed[flowId] ?? false);
351
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(HStack, {
352
+ css: {
353
+ justifyContent: "space-between",
354
+ alignItems: "center",
355
+ width: "100%",
356
+ paddingInline: "2.5",
357
+ paddingTop: "2",
358
+ paddingBottom: "1"
359
+ },
360
+ children: [
361
+ /* @__PURE__ */ jsx(SectionLabel, {
362
+ flex: "1",
363
+ children: "Outline"
364
+ }),
365
+ /* @__PURE__ */ jsx(Tooltip, {
366
+ label: allCollapsed ? "Expand all" : "Collapse all",
367
+ fz: "xs",
368
+ openDelay: 500,
369
+ withinPortal: false,
370
+ children: /* @__PURE__ */ jsx(ActionIcon, {
371
+ tabIndex: -1,
372
+ variant: "subtle",
373
+ size: "sm",
374
+ onClick: () => allCollapsed ? tree.expandAllNodes() : tree.collapseAllNodes(),
375
+ children: /* @__PURE__ */ jsx(IconListTree, { size: 14 })
376
+ })
377
+ }),
378
+ /* @__PURE__ */ jsx(Button, {
379
+ tabIndex: -1,
380
+ size: "compact-xs",
381
+ variant: "light",
382
+ className: css({ fontSize: "xxs" }),
383
+ leftSection: /* @__PURE__ */ jsx(IconPlayerSkipBackFilled, { size: 10 }),
384
+ onClick: () => prev && diagram.walkthroughStep({ step: prev }),
385
+ disabled: !prev,
386
+ children: "Back"
387
+ }),
388
+ /* @__PURE__ */ jsx(Button, {
389
+ tabIndex: -1,
390
+ size: "compact-xs",
391
+ variant: "light",
392
+ className: css({ fontSize: "xxs" }),
393
+ rightSection: /* @__PURE__ */ jsx(IconPlayerSkipForwardFilled, { size: 10 }),
394
+ onClick: () => next && diagram.walkthroughStep({ step: next }),
395
+ disabled: !next,
396
+ children: "Next"
397
+ })
398
+ ]
399
+ }), /* @__PURE__ */ jsx(ScrollArea, {
400
+ type: "auto",
401
+ overscrollBehavior: "contain",
402
+ className: css({
403
+ flex: "1",
404
+ width: "100%",
405
+ minHeight: "0"
406
+ }),
407
+ children: /* @__PURE__ */ jsx(Tree, {
408
+ levelOffset: "var(--spacing-2\\.5)",
409
+ data: treeData,
410
+ tree,
411
+ selectOnClick: true,
412
+ classNames: { root: css({
413
+ paddingInline: "2",
414
+ paddingBottom: "3"
415
+ }) },
416
+ styles: { node: { paddingInlineStart: "var(--label-offset)" } },
417
+ renderNode: renderTreeNode
418
+ })
419
+ })] });
420
+ };
421
+ var renderTreeNode = ((payload) => {
422
+ return payload.node.nodeProps.type === "step" ? /* @__PURE__ */ jsx(StepRow, { ...payload }) : /* @__PURE__ */ jsx(FlowRow, { ...payload });
423
+ });
424
+ var StepRow = ({ node, elementProps, selected }) => {
425
+ const { stepnum, source, target, label, notes } = node.nodeProps;
426
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Box$1, {
427
+ ...elementProps,
428
+ className: cx(elementProps.className, css(rowBase)),
429
+ children: [
430
+ /* @__PURE__ */ jsx(StepNum, { children: stepnum }),
431
+ /* @__PURE__ */ jsx(IconArrowRight, {
432
+ size: 13,
433
+ className: css({
434
+ flex: "none",
435
+ color: "text.dimmed"
436
+ })
437
+ }),
438
+ label ? /* @__PURE__ */ jsx(LabelSpan, { children: label }) : /* @__PURE__ */ jsxs(HStack, {
439
+ css: {
440
+ gap: "1",
441
+ minWidth: "0",
442
+ flex: "1"
443
+ },
444
+ children: [
445
+ /* @__PURE__ */ jsx(LabelSpan, {
446
+ css: {
447
+ flex: "none",
448
+ color: "text.dimmed"
449
+ },
450
+ children: source
451
+ }),
452
+ /* @__PURE__ */ jsx(IconArrowRight, {
453
+ size: 11,
454
+ className: css({
455
+ flex: "none",
456
+ color: "text.dimmed"
457
+ })
458
+ }),
459
+ /* @__PURE__ */ jsx(LabelSpan, { children: target })
460
+ ]
461
+ })
462
+ ]
463
+ }), notes && /* @__PURE__ */ jsx(Markdown, {
464
+ value: RichText.from(notes),
465
+ fontSize: "sm",
466
+ textScale: .9,
467
+ className: css({
468
+ background: "surface.sunken",
469
+ border: "1px solid {colors.surface.sunken.border}",
470
+ rounded: "md",
471
+ cursor: "default",
472
+ marginBlockStart: "1",
473
+ marginBlockEnd: "2",
474
+ paddingInline: "4",
475
+ paddingBlock: "2"
476
+ }),
477
+ style: {
478
+ marginInlineStart: "calc(-1 * var(--label-offset))",
479
+ display: selected ? "block" : "none"
480
+ }
481
+ })] });
482
+ };
483
+ var FlowRow = ({ node, expanded, elementProps }) => {
484
+ const { type, title } = node.nodeProps;
485
+ const { paletteClass, tag, Icon } = flowPresentation[type];
486
+ return /* @__PURE__ */ jsxs(Box$1, {
487
+ ...elementProps,
488
+ className: cx(elementProps.className, paletteClass, css(rowBase)),
489
+ children: [
490
+ /* @__PURE__ */ jsx(IconChevronRight, {
491
+ size: 14,
492
+ className: css({
493
+ flex: "none",
494
+ color: "text.dimmed",
495
+ transition: "transform 150ms ease",
496
+ "&[data-expanded=\"true\"]": { transform: "rotate(90deg)" }
497
+ }),
498
+ "data-expanded": expanded
499
+ }),
500
+ /* @__PURE__ */ jsx(Icon, {
501
+ size: 14,
502
+ className: css({
503
+ flex: "none",
504
+ color: "colorPalette.text"
505
+ })
506
+ }),
507
+ /* @__PURE__ */ jsx(styled.span, {
508
+ css: {
509
+ ...labelText,
510
+ fontWeight: "medium"
511
+ },
512
+ children: title ?? tag
513
+ }),
514
+ /* @__PURE__ */ jsx(FlowTag, { children: tag })
515
+ ]
516
+ });
517
+ };
518
+ //#endregion
519
+ export { SequenceOutlinePanel };
@@ -0,0 +1,36 @@
1
+ import { DynamicViewFlow, scalar, StepPath } from '@likec4/core';
2
+ import { TreeNodeData } from '@mantine/core';
3
+ import { DiagramContext } from '../../state/types';
4
+ export interface OutlineTreeNodeStep extends TreeNodeData {
5
+ readonly value: StepPath;
6
+ readonly nodeProps: Readonly<{
7
+ readonly type: 'step';
8
+ /** Global step number (1-based) across all flows */
9
+ readonly stepnum: number;
10
+ /** Title of the source actor */
11
+ readonly source: string;
12
+ /** Title of the target actor */
13
+ readonly target: string;
14
+ /** Relationship label, if any */
15
+ readonly label: string | null;
16
+ readonly notes: scalar.MarkdownOrString | null;
17
+ }>;
18
+ }
19
+ export interface OutlineTreeNodeFlow extends TreeNodeData {
20
+ readonly value: StepPath;
21
+ readonly nodeProps: Readonly<{
22
+ readonly type: DynamicViewFlow.SubFlowType;
23
+ /** Friendly title of the sub-flow, if defined */
24
+ readonly title: string | undefined;
25
+ }>;
26
+ children: OutlineTreeNodeData[];
27
+ }
28
+ export type OutlineTreeNodeData = OutlineTreeNodeStep | OutlineTreeNodeFlow;
29
+ export type OutlineTreeNodes = OutlineTreeNodeData[];
30
+ /**
31
+ * Type guard narrowing a tree node to a sub-flow node.
32
+ * (The discriminant lives on the nested `nodeProps.type`, so an explicit guard
33
+ * is needed for reliable narrowing.)
34
+ */
35
+ export declare function isOutlineFlowNode(node: OutlineTreeNodeData): node is OutlineTreeNodeFlow;
36
+ export declare function useTreeData(flow: DynamicViewFlow, collapsed: DiagramContext['collapsedSequenceFlows']): OutlineTreeNodes;
@@ -0,0 +1,55 @@
1
+ import "../../../_virtual/_rolldown/runtime.js";
2
+ import { useMemo } from "react";
3
+ import "@likec4/core";
4
+ //#region src/likec4diagram/ui/sequence-outline/state.ts
5
+ function buildTree(flow, collapsedFlows) {
6
+ const tree = [];
7
+ let currentFlow = tree;
8
+ let isCollapsed = false;
9
+ flow.walk({
10
+ step: ({ step, stepnum, source, target, edge }) => {
11
+ if (isCollapsed) return;
12
+ currentFlow.push({
13
+ label: edge.label ?? `${source.title} → ${target.title}`,
14
+ value: step,
15
+ nodeProps: {
16
+ type: "step",
17
+ stepnum: stepnum.global,
18
+ source: source.title,
19
+ target: target.title,
20
+ label: edge.label,
21
+ notes: edge.notes ?? null
22
+ }
23
+ });
24
+ },
25
+ subflow: ({ subflow }) => {
26
+ if (collapsedFlows[subflow.id]) {
27
+ isCollapsed = true;
28
+ return () => {
29
+ isCollapsed = false;
30
+ };
31
+ }
32
+ const node = {
33
+ label: subflow.title ?? subflow._type,
34
+ value: subflow.id,
35
+ nodeProps: {
36
+ type: subflow._type,
37
+ title: subflow.title
38
+ },
39
+ children: []
40
+ };
41
+ const parent = currentFlow;
42
+ parent.push(node);
43
+ currentFlow = node.children;
44
+ return () => {
45
+ currentFlow = parent;
46
+ };
47
+ }
48
+ });
49
+ return tree;
50
+ }
51
+ function useTreeData(flow, collapsed) {
52
+ return useMemo(() => buildTree(flow, collapsed), [flow, collapsed]);
53
+ }
54
+ //#endregion
55
+ export { useTreeData };
@@ -9,7 +9,7 @@ import { Types } from '../types';
9
9
  * @returns An object containing an array of XY flow nodes and an array of XY flow edges.
10
10
  */
11
11
  export declare function diagramToXY(opts: {
12
- view: Pick<DiagramView, 'id' | 'nodes' | 'edges' | '_type' | 'autoLayout'>;
12
+ view: Pick<DiagramView, 'id' | 'nodes' | 'bounds' | 'edges' | '_type' | 'autoLayout'>;
13
13
  currentViewId: ViewId | undefined;
14
14
  where: WhereOperator | null;
15
15
  }): {