@principal-ai/subsystems-react 0.17.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 (496) hide show
  1. package/README.md +93 -0
  2. package/dist/components/ConfigurationSelector.d.ts +35 -0
  3. package/dist/components/ConfigurationSelector.d.ts.map +1 -0
  4. package/dist/components/ConfigurationSelector.js +63 -0
  5. package/dist/components/ConfigurationSelector.js.map +1 -0
  6. package/dist/components/GraphRenderer.d.ts +295 -0
  7. package/dist/components/GraphRenderer.d.ts.map +1 -0
  8. package/dist/components/GraphRenderer.js +2008 -0
  9. package/dist/components/GraphRenderer.js.map +1 -0
  10. package/dist/components/MultiCanvasRenderer.d.ts +75 -0
  11. package/dist/components/MultiCanvasRenderer.d.ts.map +1 -0
  12. package/dist/components/MultiCanvasRenderer.js +203 -0
  13. package/dist/components/MultiCanvasRenderer.js.map +1 -0
  14. package/dist/components/NodeTooltip.d.ts +24 -0
  15. package/dist/components/NodeTooltip.d.ts.map +1 -0
  16. package/dist/components/NodeTooltip.js +160 -0
  17. package/dist/components/NodeTooltip.js.map +1 -0
  18. package/dist/components/SelectionSidebar.d.ts +18 -0
  19. package/dist/components/SelectionSidebar.d.ts.map +1 -0
  20. package/dist/components/SelectionSidebar.js +190 -0
  21. package/dist/components/SelectionSidebar.js.map +1 -0
  22. package/dist/components/SequenceDiagramRenderer.d.ts +77 -0
  23. package/dist/components/SequenceDiagramRenderer.d.ts.map +1 -0
  24. package/dist/components/SequenceDiagramRenderer.js +604 -0
  25. package/dist/components/SequenceDiagramRenderer.js.map +1 -0
  26. package/dist/components/WorkflowSequenceDiagram.d.ts +63 -0
  27. package/dist/components/WorkflowSequenceDiagram.d.ts.map +1 -0
  28. package/dist/components/WorkflowSequenceDiagram.js +147 -0
  29. package/dist/components/WorkflowSequenceDiagram.js.map +1 -0
  30. package/dist/components/dashboard/DashboardRenderer.d.ts +10 -0
  31. package/dist/components/dashboard/DashboardRenderer.d.ts.map +1 -0
  32. package/dist/components/dashboard/DashboardRenderer.js +179 -0
  33. package/dist/components/dashboard/DashboardRenderer.js.map +1 -0
  34. package/dist/components/dashboard/MetricPanel.d.ts +10 -0
  35. package/dist/components/dashboard/MetricPanel.d.ts.map +1 -0
  36. package/dist/components/dashboard/MetricPanel.js +103 -0
  37. package/dist/components/dashboard/MetricPanel.js.map +1 -0
  38. package/dist/components/dashboard/MockDataProvider.d.ts +30 -0
  39. package/dist/components/dashboard/MockDataProvider.d.ts.map +1 -0
  40. package/dist/components/dashboard/MockDataProvider.js +270 -0
  41. package/dist/components/dashboard/MockDataProvider.js.map +1 -0
  42. package/dist/components/dashboard/components/BarChart.d.ts +10 -0
  43. package/dist/components/dashboard/components/BarChart.d.ts.map +1 -0
  44. package/dist/components/dashboard/components/BarChart.js +167 -0
  45. package/dist/components/dashboard/components/BarChart.js.map +1 -0
  46. package/dist/components/dashboard/components/LineChart.d.ts +10 -0
  47. package/dist/components/dashboard/components/LineChart.d.ts.map +1 -0
  48. package/dist/components/dashboard/components/LineChart.js +141 -0
  49. package/dist/components/dashboard/components/LineChart.js.map +1 -0
  50. package/dist/components/dashboard/components/MetricCard.d.ts +9 -0
  51. package/dist/components/dashboard/components/MetricCard.d.ts.map +1 -0
  52. package/dist/components/dashboard/components/MetricCard.js +163 -0
  53. package/dist/components/dashboard/components/MetricCard.js.map +1 -0
  54. package/dist/components/dashboard/components/SourceLink.d.ts +9 -0
  55. package/dist/components/dashboard/components/SourceLink.d.ts.map +1 -0
  56. package/dist/components/dashboard/components/SourceLink.js +39 -0
  57. package/dist/components/dashboard/components/SourceLink.js.map +1 -0
  58. package/dist/components/dashboard/components/TimeRangeSelector.d.ts +9 -0
  59. package/dist/components/dashboard/components/TimeRangeSelector.d.ts.map +1 -0
  60. package/dist/components/dashboard/components/TimeRangeSelector.js +167 -0
  61. package/dist/components/dashboard/components/TimeRangeSelector.js.map +1 -0
  62. package/dist/components/dashboard/components/index.d.ts +6 -0
  63. package/dist/components/dashboard/components/index.d.ts.map +1 -0
  64. package/dist/components/dashboard/components/index.js +6 -0
  65. package/dist/components/dashboard/components/index.js.map +1 -0
  66. package/dist/components/dashboard/index.d.ts +6 -0
  67. package/dist/components/dashboard/index.d.ts.map +1 -0
  68. package/dist/components/dashboard/index.js +8 -0
  69. package/dist/components/dashboard/index.js.map +1 -0
  70. package/dist/components/dashboard/types.d.ts +74 -0
  71. package/dist/components/dashboard/types.d.ts.map +1 -0
  72. package/dist/components/dashboard/types.js +8 -0
  73. package/dist/components/dashboard/types.js.map +1 -0
  74. package/dist/components/session-events/SessionEventFeed.d.ts +34 -0
  75. package/dist/components/session-events/SessionEventFeed.d.ts.map +1 -0
  76. package/dist/components/session-events/SessionEventFeed.js +1196 -0
  77. package/dist/components/session-events/SessionEventFeed.js.map +1 -0
  78. package/dist/components/session-events/index.d.ts +7 -0
  79. package/dist/components/session-events/index.d.ts.map +1 -0
  80. package/dist/components/session-events/index.js +6 -0
  81. package/dist/components/session-events/index.js.map +1 -0
  82. package/dist/components/state-view/PipelineView.d.ts +14 -0
  83. package/dist/components/state-view/PipelineView.d.ts.map +1 -0
  84. package/dist/components/state-view/PipelineView.js +195 -0
  85. package/dist/components/state-view/PipelineView.js.map +1 -0
  86. package/dist/components/state-view/index.d.ts +14 -0
  87. package/dist/components/state-view/index.d.ts.map +1 -0
  88. package/dist/components/state-view/index.js +12 -0
  89. package/dist/components/state-view/index.js.map +1 -0
  90. package/dist/components/state-view/types.d.ts +188 -0
  91. package/dist/components/state-view/types.d.ts.map +1 -0
  92. package/dist/components/state-view/types.js +10 -0
  93. package/dist/components/state-view/types.js.map +1 -0
  94. package/dist/components/state-view/useStateView.d.ts +32 -0
  95. package/dist/components/state-view/useStateView.d.ts.map +1 -0
  96. package/dist/components/state-view/useStateView.js +129 -0
  97. package/dist/components/state-view/useStateView.js.map +1 -0
  98. package/dist/contexts/GraphEditContext.d.ts +20 -0
  99. package/dist/contexts/GraphEditContext.d.ts.map +1 -0
  100. package/dist/contexts/GraphEditContext.js +8 -0
  101. package/dist/contexts/GraphEditContext.js.map +1 -0
  102. package/dist/contexts/TooltipPortalContext.d.ts +8 -0
  103. package/dist/contexts/TooltipPortalContext.d.ts.map +1 -0
  104. package/dist/contexts/TooltipPortalContext.js +8 -0
  105. package/dist/contexts/TooltipPortalContext.js.map +1 -0
  106. package/dist/edges/CustomEdge.d.ts +24 -0
  107. package/dist/edges/CustomEdge.d.ts.map +1 -0
  108. package/dist/edges/CustomEdge.js +222 -0
  109. package/dist/edges/CustomEdge.js.map +1 -0
  110. package/dist/edges/GenericEdge.d.ts +18 -0
  111. package/dist/edges/GenericEdge.d.ts.map +1 -0
  112. package/dist/edges/GenericEdge.js +10 -0
  113. package/dist/edges/GenericEdge.js.map +1 -0
  114. package/dist/graphify/anchor.d.ts +28 -0
  115. package/dist/graphify/anchor.d.ts.map +1 -0
  116. package/dist/graphify/anchor.js +132 -0
  117. package/dist/graphify/anchor.js.map +1 -0
  118. package/dist/graphify/consolidated.d.ts +210 -0
  119. package/dist/graphify/consolidated.d.ts.map +1 -0
  120. package/dist/graphify/consolidated.js +11 -0
  121. package/dist/graphify/consolidated.js.map +1 -0
  122. package/dist/graphify/ids.d.ts +19 -0
  123. package/dist/graphify/ids.d.ts.map +1 -0
  124. package/dist/graphify/ids.js +46 -0
  125. package/dist/graphify/ids.js.map +1 -0
  126. package/dist/graphify/index.d.ts +18 -0
  127. package/dist/graphify/index.d.ts.map +1 -0
  128. package/dist/graphify/index.js +12 -0
  129. package/dist/graphify/index.js.map +1 -0
  130. package/dist/graphify/kind.d.ts +23 -0
  131. package/dist/graphify/kind.d.ts.map +1 -0
  132. package/dist/graphify/kind.js +77 -0
  133. package/dist/graphify/kind.js.map +1 -0
  134. package/dist/graphify/resolve.d.ts +48 -0
  135. package/dist/graphify/resolve.d.ts.map +1 -0
  136. package/dist/graphify/resolve.js +83 -0
  137. package/dist/graphify/resolve.js.map +1 -0
  138. package/dist/graphify/signature.d.ts +87 -0
  139. package/dist/graphify/signature.d.ts.map +1 -0
  140. package/dist/graphify/signature.js +276 -0
  141. package/dist/graphify/signature.js.map +1 -0
  142. package/dist/graphify/types.d.ts +141 -0
  143. package/dist/graphify/types.d.ts.map +1 -0
  144. package/dist/graphify/types.js +8 -0
  145. package/dist/graphify/types.js.map +1 -0
  146. package/dist/hooks/useElkLayout.d.ts +66 -0
  147. package/dist/hooks/useElkLayout.d.ts.map +1 -0
  148. package/dist/hooks/useElkLayout.js +136 -0
  149. package/dist/hooks/useElkLayout.js.map +1 -0
  150. package/dist/hooks/usePathBasedEvents.d.ts +42 -0
  151. package/dist/hooks/usePathBasedEvents.d.ts.map +1 -0
  152. package/dist/hooks/usePathBasedEvents.js +119 -0
  153. package/dist/hooks/usePathBasedEvents.js.map +1 -0
  154. package/dist/hooks/useSequenceLayout.d.ts +186 -0
  155. package/dist/hooks/useSequenceLayout.d.ts.map +1 -0
  156. package/dist/hooks/useSequenceLayout.js +327 -0
  157. package/dist/hooks/useSequenceLayout.js.map +1 -0
  158. package/dist/hooks/useUndoRedo.d.ts +80 -0
  159. package/dist/hooks/useUndoRedo.d.ts.map +1 -0
  160. package/dist/hooks/useUndoRedo.js +70 -0
  161. package/dist/hooks/useUndoRedo.js.map +1 -0
  162. package/dist/index.d.ts +73 -0
  163. package/dist/index.d.ts.map +1 -0
  164. package/dist/index.js +51 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/nodes/CustomNode.d.ts +28 -0
  167. package/dist/nodes/CustomNode.d.ts.map +1 -0
  168. package/dist/nodes/CustomNode.js +820 -0
  169. package/dist/nodes/CustomNode.js.map +1 -0
  170. package/dist/nodes/GenericNode.d.ts +20 -0
  171. package/dist/nodes/GenericNode.d.ts.map +1 -0
  172. package/dist/nodes/GenericNode.js +20 -0
  173. package/dist/nodes/GenericNode.js.map +1 -0
  174. package/dist/nodes/otel/OtelBoundaryNode.d.ts +55 -0
  175. package/dist/nodes/otel/OtelBoundaryNode.d.ts.map +1 -0
  176. package/dist/nodes/otel/OtelBoundaryNode.js +81 -0
  177. package/dist/nodes/otel/OtelBoundaryNode.js.map +1 -0
  178. package/dist/nodes/otel/OtelEventNode.d.ts +59 -0
  179. package/dist/nodes/otel/OtelEventNode.d.ts.map +1 -0
  180. package/dist/nodes/otel/OtelEventNode.js +82 -0
  181. package/dist/nodes/otel/OtelEventNode.js.map +1 -0
  182. package/dist/nodes/otel/OtelResourceNode.d.ts +53 -0
  183. package/dist/nodes/otel/OtelResourceNode.d.ts.map +1 -0
  184. package/dist/nodes/otel/OtelResourceNode.js +105 -0
  185. package/dist/nodes/otel/OtelResourceNode.js.map +1 -0
  186. package/dist/nodes/otel/OtelScopeNode.d.ts +53 -0
  187. package/dist/nodes/otel/OtelScopeNode.d.ts.map +1 -0
  188. package/dist/nodes/otel/OtelScopeNode.js +81 -0
  189. package/dist/nodes/otel/OtelScopeNode.js.map +1 -0
  190. package/dist/nodes/otel/OtelSpanConventionNode.d.ts +61 -0
  191. package/dist/nodes/otel/OtelSpanConventionNode.d.ts.map +1 -0
  192. package/dist/nodes/otel/OtelSpanConventionNode.js +131 -0
  193. package/dist/nodes/otel/OtelSpanConventionNode.js.map +1 -0
  194. package/dist/nodes/otel/index.d.ts +17 -0
  195. package/dist/nodes/otel/index.d.ts.map +1 -0
  196. package/dist/nodes/otel/index.js +13 -0
  197. package/dist/nodes/otel/index.js.map +1 -0
  198. package/dist/nodes/otel/shared/NodeBadges.d.ts +10 -0
  199. package/dist/nodes/otel/shared/NodeBadges.d.ts.map +1 -0
  200. package/dist/nodes/otel/shared/NodeBadges.js +178 -0
  201. package/dist/nodes/otel/shared/NodeBadges.js.map +1 -0
  202. package/dist/nodes/otel/shared/NodeContent.d.ts +10 -0
  203. package/dist/nodes/otel/shared/NodeContent.d.ts.map +1 -0
  204. package/dist/nodes/otel/shared/NodeContent.js +96 -0
  205. package/dist/nodes/otel/shared/NodeContent.js.map +1 -0
  206. package/dist/nodes/otel/shared/index.d.ts +8 -0
  207. package/dist/nodes/otel/shared/index.d.ts.map +1 -0
  208. package/dist/nodes/otel/shared/index.js +8 -0
  209. package/dist/nodes/otel/shared/index.js.map +1 -0
  210. package/dist/nodes/otel/shared/types.d.ts +129 -0
  211. package/dist/nodes/otel/shared/types.d.ts.map +1 -0
  212. package/dist/nodes/otel/shared/types.js +5 -0
  213. package/dist/nodes/otel/shared/types.js.map +1 -0
  214. package/dist/nodes/otel/shared/useNodeBehavior.d.ts +42 -0
  215. package/dist/nodes/otel/shared/useNodeBehavior.d.ts.map +1 -0
  216. package/dist/nodes/otel/shared/useNodeBehavior.js +61 -0
  217. package/dist/nodes/otel/shared/useNodeBehavior.js.map +1 -0
  218. package/dist/pierre/PierreFileView.d.ts +17 -0
  219. package/dist/pierre/PierreFileView.d.ts.map +1 -0
  220. package/dist/pierre/PierreFileView.js +46 -0
  221. package/dist/pierre/PierreFileView.js.map +1 -0
  222. package/dist/pierre/PierreSnippetView.d.ts +28 -0
  223. package/dist/pierre/PierreSnippetView.d.ts.map +1 -0
  224. package/dist/pierre/PierreSnippetView.js +105 -0
  225. package/dist/pierre/PierreSnippetView.js.map +1 -0
  226. package/dist/pierre/PierreThroughlineCodeView.d.ts +22 -0
  227. package/dist/pierre/PierreThroughlineCodeView.d.ts.map +1 -0
  228. package/dist/pierre/PierreThroughlineCodeView.js +206 -0
  229. package/dist/pierre/PierreThroughlineCodeView.js.map +1 -0
  230. package/dist/pierre/constructColors.d.ts +24 -0
  231. package/dist/pierre/constructColors.d.ts.map +1 -0
  232. package/dist/pierre/constructColors.js +91 -0
  233. package/dist/pierre/constructColors.js.map +1 -0
  234. package/dist/pierre/index.d.ts +12 -0
  235. package/dist/pierre/index.d.ts.map +1 -0
  236. package/dist/pierre/index.js +7 -0
  237. package/dist/pierre/index.js.map +1 -0
  238. package/dist/pierre/pierreBackground.d.ts +15 -0
  239. package/dist/pierre/pierreBackground.d.ts.map +1 -0
  240. package/dist/pierre/pierreBackground.js +31 -0
  241. package/dist/pierre/pierreBackground.js.map +1 -0
  242. package/dist/pierre/pierreFileLang.d.ts +27 -0
  243. package/dist/pierre/pierreFileLang.d.ts.map +1 -0
  244. package/dist/pierre/pierreFileLang.js +52 -0
  245. package/dist/pierre/pierreFileLang.js.map +1 -0
  246. package/dist/pierre/pierreSyntaxTheme.d.ts +11 -0
  247. package/dist/pierre/pierreSyntaxTheme.d.ts.map +1 -0
  248. package/dist/pierre/pierreSyntaxTheme.js +20 -0
  249. package/dist/pierre/pierreSyntaxTheme.js.map +1 -0
  250. package/dist/pierre/scrollAnchor.d.ts +5 -0
  251. package/dist/pierre/scrollAnchor.d.ts.map +1 -0
  252. package/dist/pierre/scrollAnchor.js +9 -0
  253. package/dist/pierre/scrollAnchor.js.map +1 -0
  254. package/dist/pierre/sliceSnippet.d.ts +10 -0
  255. package/dist/pierre/sliceSnippet.d.ts.map +1 -0
  256. package/dist/pierre/sliceSnippet.js +16 -0
  257. package/dist/pierre/sliceSnippet.js.map +1 -0
  258. package/dist/pierre/syntaxTokens.d.ts +11 -0
  259. package/dist/pierre/syntaxTokens.d.ts.map +1 -0
  260. package/dist/pierre/syntaxTokens.js +51 -0
  261. package/dist/pierre/syntaxTokens.js.map +1 -0
  262. package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts +8 -0
  263. package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts.map +1 -0
  264. package/dist/stories/Subsystem/ComponentGraph/fixtures.js +116 -0
  265. package/dist/stories/Subsystem/ComponentGraph/fixtures.js.map +1 -0
  266. package/dist/subsystem/ComponentDeclaration.d.ts +87 -0
  267. package/dist/subsystem/ComponentDeclaration.d.ts.map +1 -0
  268. package/dist/subsystem/ComponentDeclaration.js +374 -0
  269. package/dist/subsystem/ComponentDeclaration.js.map +1 -0
  270. package/dist/subsystem/FileDrawer.d.ts +17 -0
  271. package/dist/subsystem/FileDrawer.d.ts.map +1 -0
  272. package/dist/subsystem/FileDrawer.js +72 -0
  273. package/dist/subsystem/FileDrawer.js.map +1 -0
  274. package/dist/subsystem/GraphLayoutCover.d.ts +20 -0
  275. package/dist/subsystem/GraphLayoutCover.d.ts.map +1 -0
  276. package/dist/subsystem/GraphLayoutCover.js +42 -0
  277. package/dist/subsystem/GraphLayoutCover.js.map +1 -0
  278. package/dist/subsystem/SubsystemComponentGraph.d.ts +96 -0
  279. package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -0
  280. package/dist/subsystem/SubsystemComponentGraph.js +1059 -0
  281. package/dist/subsystem/SubsystemComponentGraph.js.map +1 -0
  282. package/dist/subsystem/SubsystemFileTree.d.ts +24 -0
  283. package/dist/subsystem/SubsystemFileTree.d.ts.map +1 -0
  284. package/dist/subsystem/SubsystemFileTree.js +150 -0
  285. package/dist/subsystem/SubsystemFileTree.js.map +1 -0
  286. package/dist/subsystem/declarationRef.d.ts +39 -0
  287. package/dist/subsystem/declarationRef.d.ts.map +1 -0
  288. package/dist/subsystem/declarationRef.js +32 -0
  289. package/dist/subsystem/declarationRef.js.map +1 -0
  290. package/dist/subsystem/formatDeclaration.d.ts +11 -0
  291. package/dist/subsystem/formatDeclaration.d.ts.map +1 -0
  292. package/dist/subsystem/formatDeclaration.js +146 -0
  293. package/dist/subsystem/formatDeclaration.js.map +1 -0
  294. package/dist/subsystem/model.d.ts +353 -0
  295. package/dist/subsystem/model.d.ts.map +1 -0
  296. package/dist/subsystem/model.js +503 -0
  297. package/dist/subsystem/model.js.map +1 -0
  298. package/dist/subsystem/nodes.d.ts +69 -0
  299. package/dist/subsystem/nodes.d.ts.map +1 -0
  300. package/dist/subsystem/nodes.js +289 -0
  301. package/dist/subsystem/nodes.js.map +1 -0
  302. package/dist/subsystem/paths.d.ts +63 -0
  303. package/dist/subsystem/paths.d.ts.map +1 -0
  304. package/dist/subsystem/paths.js +86 -0
  305. package/dist/subsystem/paths.js.map +1 -0
  306. package/dist/subsystem/tokenizeComponent.d.ts +20 -0
  307. package/dist/subsystem/tokenizeComponent.d.ts.map +1 -0
  308. package/dist/subsystem/tokenizeComponent.js +56 -0
  309. package/dist/subsystem/tokenizeComponent.js.map +1 -0
  310. package/dist/subsystem/tokenizeFormatted.d.ts +12 -0
  311. package/dist/subsystem/tokenizeFormatted.d.ts.map +1 -0
  312. package/dist/subsystem/tokenizeFormatted.js +13 -0
  313. package/dist/subsystem/tokenizeFormatted.js.map +1 -0
  314. package/dist/utils/animationMapping.d.ts +53 -0
  315. package/dist/utils/animationMapping.d.ts.map +1 -0
  316. package/dist/utils/animationMapping.js +126 -0
  317. package/dist/utils/animationMapping.js.map +1 -0
  318. package/dist/utils/canvasBounds.d.ts +50 -0
  319. package/dist/utils/canvasBounds.d.ts.map +1 -0
  320. package/dist/utils/canvasBounds.js +88 -0
  321. package/dist/utils/canvasBounds.js.map +1 -0
  322. package/dist/utils/elkLayout.d.ts +137 -0
  323. package/dist/utils/elkLayout.d.ts.map +1 -0
  324. package/dist/utils/elkLayout.js +596 -0
  325. package/dist/utils/elkLayout.js.map +1 -0
  326. package/dist/utils/graphConverter.d.ts +18 -0
  327. package/dist/utils/graphConverter.d.ts.map +1 -0
  328. package/dist/utils/graphConverter.js +114 -0
  329. package/dist/utils/graphConverter.js.map +1 -0
  330. package/dist/utils/iconResolver.d.ts +29 -0
  331. package/dist/utils/iconResolver.d.ts.map +1 -0
  332. package/dist/utils/iconResolver.js +30 -0
  333. package/dist/utils/iconResolver.js.map +1 -0
  334. package/dist/utils/orientationUtils.d.ts +19 -0
  335. package/dist/utils/orientationUtils.d.ts.map +1 -0
  336. package/dist/utils/orientationUtils.js +62 -0
  337. package/dist/utils/orientationUtils.js.map +1 -0
  338. package/package.json +80 -0
  339. package/src/components/ConfigurationSelector.tsx +133 -0
  340. package/src/components/GraphRenderer.tsx +3195 -0
  341. package/src/components/MultiCanvasRenderer.tsx +295 -0
  342. package/src/components/NodeTooltip.tsx +279 -0
  343. package/src/components/PendingChanges.test.tsx +375 -0
  344. package/src/components/SelectionSidebar.tsx +352 -0
  345. package/src/components/SequenceDiagramRenderer.tsx +1156 -0
  346. package/src/components/WorkflowSequenceDiagram.tsx +270 -0
  347. package/src/components/dashboard/DashboardRenderer.tsx +317 -0
  348. package/src/components/dashboard/MetricPanel.tsx +254 -0
  349. package/src/components/dashboard/MockDataProvider.ts +330 -0
  350. package/src/components/dashboard/components/BarChart.tsx +299 -0
  351. package/src/components/dashboard/components/LineChart.tsx +279 -0
  352. package/src/components/dashboard/components/MetricCard.tsx +270 -0
  353. package/src/components/dashboard/components/SourceLink.tsx +63 -0
  354. package/src/components/dashboard/components/TimeRangeSelector.tsx +280 -0
  355. package/src/components/dashboard/components/index.ts +5 -0
  356. package/src/components/dashboard/index.ts +47 -0
  357. package/src/components/dashboard/types.ts +126 -0
  358. package/src/components/session-events/SessionEventFeed.tsx +1797 -0
  359. package/src/components/session-events/index.ts +13 -0
  360. package/src/components/state-view/PipelineView.tsx +347 -0
  361. package/src/components/state-view/index.ts +14 -0
  362. package/src/components/state-view/types.ts +261 -0
  363. package/src/components/state-view/useStateView.ts +205 -0
  364. package/src/contexts/GraphEditContext.tsx +27 -0
  365. package/src/contexts/TooltipPortalContext.ts +8 -0
  366. package/src/edges/CustomEdge.tsx +402 -0
  367. package/src/edges/GenericEdge.tsx +36 -0
  368. package/src/graphify/anchor.test.ts +124 -0
  369. package/src/graphify/anchor.ts +160 -0
  370. package/src/graphify/consolidated.ts +246 -0
  371. package/src/graphify/ids.ts +48 -0
  372. package/src/graphify/index.ts +72 -0
  373. package/src/graphify/kind.test.ts +108 -0
  374. package/src/graphify/kind.ts +120 -0
  375. package/src/graphify/resolve.test.ts +89 -0
  376. package/src/graphify/resolve.ts +115 -0
  377. package/src/graphify/signature.test.ts +278 -0
  378. package/src/graphify/signature.ts +354 -0
  379. package/src/graphify/types.ts +164 -0
  380. package/src/hooks/useElkLayout.test.ts +134 -0
  381. package/src/hooks/useElkLayout.ts +191 -0
  382. package/src/hooks/usePathBasedEvents.ts +192 -0
  383. package/src/hooks/useSequenceLayout.ts +543 -0
  384. package/src/hooks/useUndoRedo.ts +144 -0
  385. package/src/index.ts +341 -0
  386. package/src/nodes/CustomNode.tsx +1231 -0
  387. package/src/nodes/GenericNode.tsx +55 -0
  388. package/src/nodes/otel/OtelBoundaryNode.tsx +224 -0
  389. package/src/nodes/otel/OtelEventNode.tsx +225 -0
  390. package/src/nodes/otel/OtelResourceNode.tsx +251 -0
  391. package/src/nodes/otel/OtelScopeNode.tsx +221 -0
  392. package/src/nodes/otel/OtelSpanConventionNode.tsx +295 -0
  393. package/src/nodes/otel/index.ts +23 -0
  394. package/src/nodes/otel/shared/NodeBadges.tsx +295 -0
  395. package/src/nodes/otel/shared/NodeContent.tsx +204 -0
  396. package/src/nodes/otel/shared/index.ts +8 -0
  397. package/src/nodes/otel/shared/types.ts +138 -0
  398. package/src/nodes/otel/shared/useNodeBehavior.ts +114 -0
  399. package/src/pierre/PierreFileView.tsx +81 -0
  400. package/src/pierre/PierreSnippetView.tsx +184 -0
  401. package/src/pierre/PierreThroughlineCodeView.tsx +304 -0
  402. package/src/pierre/constructColors.test.ts +52 -0
  403. package/src/pierre/constructColors.ts +112 -0
  404. package/src/pierre/index.ts +18 -0
  405. package/src/pierre/pierreBackground.ts +33 -0
  406. package/src/pierre/pierreFileLang.test.ts +26 -0
  407. package/src/pierre/pierreFileLang.ts +55 -0
  408. package/src/pierre/pierreSyntaxTheme.ts +23 -0
  409. package/src/pierre/scrollAnchor.test.ts +13 -0
  410. package/src/pierre/scrollAnchor.ts +11 -0
  411. package/src/pierre/sliceSnippet.test.ts +21 -0
  412. package/src/pierre/sliceSnippet.ts +31 -0
  413. package/src/pierre/syntaxTokens.test.ts +35 -0
  414. package/src/pierre/syntaxTokens.ts +60 -0
  415. package/src/stories/Audit/BoundaryNodes.stories.tsx +385 -0
  416. package/src/stories/Audit/CanvasEdgeTypes.stories.tsx +1448 -0
  417. package/src/stories/Audit/CanvasNodeTypes.stories.tsx +1049 -0
  418. package/src/stories/Audit/ColorPriority.stories.tsx +895 -0
  419. package/src/stories/Audit/DiamondBadges.stories.tsx +629 -0
  420. package/src/stories/Audit/NodeDimensionsTesting.stories.tsx +724 -0
  421. package/src/stories/Audit/NodeFieldsAudit.stories.tsx +996 -0
  422. package/src/stories/Audit/NodeFontSizeTesting.stories.tsx +715 -0
  423. package/src/stories/Audit/NodeShapes.stories.tsx +1208 -0
  424. package/src/stories/Audit/WideNodesTesting.stories.tsx +1045 -0
  425. package/src/stories/Components/DashboardRenderer.stories.tsx +263 -0
  426. package/src/stories/Components/GraphRenderer.stories.tsx +3236 -0
  427. package/src/stories/Components/MultiCanvasRenderer.stories.tsx +370 -0
  428. package/src/stories/Components/SequenceDiagram.stories.tsx +255 -0
  429. package/src/stories/Components/StateView.stories.tsx +417 -0
  430. package/src/stories/Components/TraceViewer.stories.tsx +442 -0
  431. package/src/stories/Components/WorkflowSequenceDiagram.stories.tsx +802 -0
  432. package/src/stories/Features/AnimationWorkshop.stories.tsx +727 -0
  433. package/src/stories/Features/ChangeTypeVisual.stories.tsx +67 -0
  434. package/src/stories/Features/EventDrivenAnimations.stories.tsx +513 -0
  435. package/src/stories/Features/MultiConfig.stories.tsx +539 -0
  436. package/src/stories/Introduction.mdx +34 -0
  437. package/src/stories/Layout/ElkEdgeRouting.stories.tsx +539 -0
  438. package/src/stories/Layout/GraphOrientation.stories.tsx +500 -0
  439. package/src/stories/Layout/MultiDirectionalConnections.stories.tsx +352 -0
  440. package/src/stories/Nodes/NodeDefinitionComparison.stories.tsx +560 -0
  441. package/src/stories/Nodes/NodeNameFallbacks.stories.tsx +491 -0
  442. package/src/stories/Nodes/NumericColors.stories.tsx +440 -0
  443. package/src/stories/OTEL/EventNameDisplay.stories.tsx +694 -0
  444. package/src/stories/OTEL/EventNameFallback.stories.tsx +578 -0
  445. package/src/stories/OTEL/OtelComponents.stories.tsx +422 -0
  446. package/src/stories/OTEL/OtelNodeTypesPrototype.stories.tsx +806 -0
  447. package/src/stories/OTEL/RawEventCards.stories.tsx +57 -0
  448. package/src/stories/OTEL/SpanBadges.stories.tsx +840 -0
  449. package/src/stories/OTEL/ValidationEventsCanvas.stories.tsx +209 -0
  450. package/src/stories/Pierre/CodeView.stories.tsx +219 -0
  451. package/src/stories/RealWorld/BacklogMdCanvases.stories.tsx +721 -0
  452. package/src/stories/RealWorld/FileCitySequence.stories.tsx +516 -0
  453. package/src/stories/RealWorld/RealCanvasFiles.stories.tsx +336 -0
  454. package/src/stories/Subsystem/ComponentDeclarationAudit.stories.tsx +321 -0
  455. package/src/stories/Subsystem/ComponentGraph/Appearance.stories.tsx +365 -0
  456. package/src/stories/Subsystem/ComponentGraph/Basics.stories.tsx +137 -0
  457. package/src/stories/Subsystem/ComponentGraph/Captures.stories.tsx +238 -0
  458. package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +315 -0
  459. package/src/stories/Subsystem/ComponentGraph/Flows.stories.tsx +239 -0
  460. package/src/stories/Subsystem/ComponentGraph/FrameworkStereotype.stories.tsx +216 -0
  461. package/src/stories/Subsystem/ComponentGraph/GraphTitle.stories.tsx +70 -0
  462. package/src/stories/Subsystem/ComponentGraph/Processes.stories.tsx +68 -0
  463. package/src/stories/Subsystem/ComponentGraph/Scenarios.stories.tsx +959 -0
  464. package/src/stories/Subsystem/ComponentGraph/Spotlights.stories.tsx +681 -0
  465. package/src/stories/Subsystem/ComponentGraph/fixtures.ts +129 -0
  466. package/src/stories/__traces__/test-run.canvas.json +241 -0
  467. package/src/stories/data/activity-feed-analytics.dashboard.json +300 -0
  468. package/src/stories/data/file-city-images-transformed.otel.canvas.json +295 -0
  469. package/src/stories/data/file-city-workflows.json +269 -0
  470. package/src/stories/data/graph-converter-test-execution.json +443 -0
  471. package/src/stories/data/graph-converter-test.workflow.json +105 -0
  472. package/src/stories/data/graph-converter-validated-execution.json +58 -0
  473. package/src/stories/data/opencode-session-raw-events.json +273396 -0
  474. package/src/subsystem/ComponentDeclaration.tsx +643 -0
  475. package/src/subsystem/FileDrawer.tsx +106 -0
  476. package/src/subsystem/GraphLayoutCover.tsx +69 -0
  477. package/src/subsystem/SubsystemComponentGraph.tsx +1644 -0
  478. package/src/subsystem/SubsystemFileTree.tsx +190 -0
  479. package/src/subsystem/declarationRef.test.ts +33 -0
  480. package/src/subsystem/declarationRef.ts +63 -0
  481. package/src/subsystem/formatDeclaration.ts +174 -0
  482. package/src/subsystem/model.test.ts +244 -0
  483. package/src/subsystem/model.ts +850 -0
  484. package/src/subsystem/nodes.test.ts +56 -0
  485. package/src/subsystem/nodes.tsx +443 -0
  486. package/src/subsystem/paths.test.ts +123 -0
  487. package/src/subsystem/paths.ts +127 -0
  488. package/src/subsystem/tokenizeComponent.ts +70 -0
  489. package/src/subsystem/tokenizeFormatted.ts +19 -0
  490. package/src/utils/animationMapping.ts +166 -0
  491. package/src/utils/canvasBounds.ts +146 -0
  492. package/src/utils/elkLayout.test.ts +240 -0
  493. package/src/utils/elkLayout.ts +779 -0
  494. package/src/utils/graphConverter.ts +148 -0
  495. package/src/utils/iconResolver.tsx +53 -0
  496. package/src/utils/orientationUtils.ts +73 -0
@@ -0,0 +1,802 @@
1
+ import React, { useState } from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import { WorkflowSequenceDiagram } from '../../components/WorkflowSequenceDiagram';
4
+ import type { WorkflowScenario, Canvas } from '@principal-ai/subsystems-core';
5
+ import { ThemeProvider, defaultEditorTheme } from '@principal-ade/industry-theme';
6
+
7
+ const meta = {
8
+ title: 'Components/WorkflowSequenceDiagram',
9
+ component: WorkflowSequenceDiagram,
10
+ parameters: {
11
+ layout: 'fullscreen',
12
+ docs: {
13
+ description: {
14
+ component: `
15
+ # WorkflowSequenceDiagram Component
16
+
17
+ A wrapper around \`SequenceDiagramRenderer\` that simplifies working with workflow scenarios.
18
+ Automatically converts workflow scenarios to sequence diagram format and optionally extracts
19
+ participant metadata from a canvas.
20
+
21
+ ## Key Features
22
+
23
+ - **Simplified API**: Just pass a workflow scenario instead of manually creating events/edges
24
+ - **Canvas Integration**: Optionally provide a canvas to extract scope and participant metadata
25
+ - **Move vs Transform Events**: Automatically distinguishes between cross-participant (move) and internal (transform) events
26
+ - **Clickable Labels**: Edge labels are fully clickable and highlight when selected (no dots needed!)
27
+ - **Event Selection**: Click any label to select it - the label changes color to show selection
28
+ - **Empty State Handling**: Gracefully handles scenarios with no events
29
+
30
+ ## Usage
31
+
32
+ \`\`\`tsx
33
+ <WorkflowSequenceDiagram
34
+ scenario={workflowScenario}
35
+ canvas={otelCanvas}
36
+ height={600}
37
+ onEventIndexChange={(index) => console.log('Selected event:', index)}
38
+ />
39
+ \`\`\`
40
+ `,
41
+ },
42
+ },
43
+ },
44
+ tags: ['autodocs'],
45
+ decorators: [
46
+ (Story) => (
47
+ <ThemeProvider theme={defaultEditorTheme}>
48
+ <div style={{ height: '100vh' }}>
49
+ <Story />
50
+ </div>
51
+ </ThemeProvider>
52
+ ),
53
+ ],
54
+ } satisfies Meta<typeof WorkflowSequenceDiagram>;
55
+
56
+ export default meta;
57
+ type Story = StoryObj<typeof meta>;
58
+
59
+ // ============================================================================
60
+ // Sample Scenarios
61
+ // ============================================================================
62
+
63
+ /**
64
+ * Simple authentication workflow
65
+ */
66
+ const simpleAuthScenario: WorkflowScenario = {
67
+ id: 'simple-auth',
68
+ name: 'Simple Authentication',
69
+ description: 'Basic authentication flow with validation',
70
+ template: {
71
+ events: {
72
+ 'auth.request.received': {},
73
+ 'auth.validation.started': {},
74
+ 'database.user.lookup': {},
75
+ 'auth.validation.completed': {},
76
+ 'auth.token.generated': {},
77
+ },
78
+ },
79
+ };
80
+
81
+ /**
82
+ * E-commerce order processing workflow
83
+ */
84
+ const orderProcessingScenario: WorkflowScenario = {
85
+ id: 'order-processing',
86
+ name: 'Order Processing',
87
+ description: 'Complete order processing with payment and inventory',
88
+ template: {
89
+ events: {
90
+ 'api.order.received': {},
91
+ 'auth.session.validate': {},
92
+ 'order.validation.started': {},
93
+ 'inventory.check.availability': {},
94
+ 'inventory.reserve.items': {},
95
+ 'order.validation.completed': {},
96
+ 'payment.charge.initiated': {},
97
+ 'payment.processor.authorize': {},
98
+ 'payment.charge.completed': {},
99
+ 'order.fulfillment.started': {},
100
+ 'notification.email.sent': {},
101
+ 'api.response.sent': {},
102
+ },
103
+ },
104
+ };
105
+
106
+ /**
107
+ * Microservices workflow with multiple participants
108
+ */
109
+ const microservicesScenario: WorkflowScenario = {
110
+ id: 'microservices-flow',
111
+ name: 'Microservices Communication',
112
+ description: 'Inter-service communication pattern',
113
+ template: {
114
+ events: {
115
+ 'gateway.request.received': {},
116
+ 'gateway.route.determined': {},
117
+ 'userservice.user.fetch': {},
118
+ 'userservice.database.query': {},
119
+ 'userservice.response.prepared': {},
120
+ 'gateway.response.aggregated': {},
121
+ 'cache.data.stored': {},
122
+ 'gateway.response.sent': {},
123
+ },
124
+ },
125
+ };
126
+
127
+ /**
128
+ * Error handling workflow
129
+ */
130
+ const errorHandlingScenario: WorkflowScenario = {
131
+ id: 'error-handling',
132
+ name: 'Error Handling Flow',
133
+ description: 'Workflow demonstrating error handling and recovery',
134
+ template: {
135
+ events: {
136
+ 'api.request.received': {},
137
+ 'service.processing.started': {},
138
+ 'service.validation.failed': {},
139
+ 'service.error.logged': {},
140
+ 'notification.alert.sent': {},
141
+ 'api.error.response.sent': {},
142
+ },
143
+ },
144
+ };
145
+
146
+ /**
147
+ * Scenario with long namespace titles for stress-testing swimlane header rendering
148
+ */
149
+ const longTitlesScenario: WorkflowScenario = {
150
+ id: 'long-titles',
151
+ name: 'Long Swimlane Titles',
152
+ description: 'Scenario designed to stress-test header rendering with long participant names',
153
+ template: {
154
+ events: {
155
+ 'authenticationAndAuthorizationService.request.received': {},
156
+ 'authenticationAndAuthorizationService.token.validated': {},
157
+ 'distributedTransactionCoordinator.transaction.started': {},
158
+ 'inventoryReservationAndAllocationManager.items.reserved': {},
159
+ 'paymentProcessingAndFraudDetectionGateway.charge.authorized': {},
160
+ 'paymentProcessingAndFraudDetectionGateway.charge.captured': {},
161
+ 'distributedTransactionCoordinator.transaction.committed': {},
162
+ 'notificationDispatchAndDeliveryService.confirmation.sent': {},
163
+ },
164
+ },
165
+ };
166
+
167
+ /**
168
+ * Empty scenario for testing empty state
169
+ */
170
+ const emptyScenario: WorkflowScenario = {
171
+ id: 'empty',
172
+ name: 'Empty Workflow',
173
+ description: 'Scenario with no events',
174
+ template: {
175
+ events: {},
176
+ },
177
+ };
178
+
179
+ /**
180
+ * Sample canvas with OTEL event nodes for metadata extraction
181
+ */
182
+ const sampleCanvas: Canvas = {
183
+ nodes: [
184
+ {
185
+ id: 'auth-validation-started',
186
+ type: 'otel-event',
187
+ x: 0,
188
+ y: 0,
189
+ width: 200,
190
+ height: 60,
191
+ event: { name: 'auth.validation.started' },
192
+ otel: { scope: 'auth' },
193
+ label: 'Start Validation',
194
+ },
195
+ {
196
+ id: 'database-lookup',
197
+ type: 'otel-event',
198
+ x: 0,
199
+ y: 100,
200
+ width: 200,
201
+ height: 60,
202
+ event: { name: 'database.user.lookup' },
203
+ otel: { scope: 'database' },
204
+ label: 'Lookup User',
205
+ },
206
+ {
207
+ id: 'auth-validation-completed',
208
+ type: 'otel-event',
209
+ x: 0,
210
+ y: 200,
211
+ width: 200,
212
+ height: 60,
213
+ event: { name: 'auth.validation.completed' },
214
+ otel: { scope: 'auth' },
215
+ label: 'Validation Complete',
216
+ },
217
+ ],
218
+ edges: [],
219
+ };
220
+
221
+ // ============================================================================
222
+ // Stories
223
+ // ============================================================================
224
+
225
+ /**
226
+ * Diagnostic story to test click functionality
227
+ * Shows click feedback with colored labels (no dots!)
228
+ * Verifies the label text matches the selected event (no off-by-one errors)
229
+ */
230
+ export const ClickDiagnostic: Story = {
231
+ render: () => {
232
+ const [selectedIndex, setSelectedIndex] = useState<number | undefined>(undefined);
233
+ const [clickCount, setClickCount] = useState(0);
234
+ const [lastClickTime, setLastClickTime] = useState<string>('Never');
235
+
236
+ const handleClick = (index: number) => {
237
+ console.log('Click detected! Event index:', index);
238
+ setSelectedIndex(index);
239
+ setClickCount(prev => prev + 1);
240
+ setLastClickTime(new Date().toLocaleTimeString());
241
+ };
242
+
243
+ const eventNames = Object.keys(simpleAuthScenario.template.events);
244
+
245
+ return (
246
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
247
+ <div
248
+ style={{
249
+ padding: '16px',
250
+ background: '#1a1a1a',
251
+ color: '#00ff00',
252
+ fontFamily: 'monospace',
253
+ borderBottom: '2px solid #00ff00',
254
+ marginBottom: 16,
255
+ }}
256
+ >
257
+ <h3 style={{ margin: '0 0 12px 0', color: '#00ff00' }}>🔍 CLICK DIAGNOSTIC MODE</h3>
258
+ <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8, fontSize: 13 }}>
259
+ <div>Total Clicks: <strong>{clickCount}</strong></div>
260
+ <div>Last Click: <strong>{lastClickTime}</strong></div>
261
+ <div>Selected Index: <strong>{selectedIndex !== undefined ? selectedIndex : 'None'}</strong></div>
262
+ <div>Selected Event: <strong>{selectedIndex !== undefined ? eventNames[selectedIndex] : 'None'}</strong></div>
263
+ </div>
264
+ <div style={{ marginTop: 12, padding: '8px', background: '#2a2a2a', borderRadius: 4 }}>
265
+ 💡 <strong>Click any label</strong> - it will highlight with colored background!
266
+ Watch the label change color and verify it matches the event shown above.
267
+ </div>
268
+ {selectedIndex !== undefined && (
269
+ <div style={{ marginTop: 8, padding: '8px', background: '#1e5a1e', borderRadius: 4, fontSize: 14 }}>
270
+ ✅ <strong>Selected:</strong> "{eventNames[selectedIndex]?.split('.').pop()}" (the highlighted label should match!)
271
+ </div>
272
+ )}
273
+ </div>
274
+ <div style={{ flex: 1 }}>
275
+ <WorkflowSequenceDiagram
276
+ scenario={simpleAuthScenario}
277
+ height="100%"
278
+ selectedEventIndex={selectedIndex}
279
+ onEventIndexChange={handleClick}
280
+ layoutOptions={{
281
+ eventSpacing: 100,
282
+ }}
283
+ />
284
+ </div>
285
+ </div>
286
+ );
287
+ },
288
+ };
289
+
290
+ /**
291
+ * Basic workflow scenario without canvas
292
+ */
293
+ export const BasicScenario: Story = {
294
+ args: {
295
+ scenario: simpleAuthScenario,
296
+ height: '100%',
297
+ layoutOptions: {
298
+ eventSpacing: 80,
299
+ },
300
+ },
301
+ };
302
+
303
+ /**
304
+ * Workflow with canvas metadata for enhanced labels
305
+ */
306
+ export const WithCanvasMetadata: Story = {
307
+ args: {
308
+ scenario: simpleAuthScenario,
309
+ canvas: sampleCanvas,
310
+ height: '100%',
311
+ layoutOptions: {
312
+ eventSpacing: 80,
313
+ },
314
+ },
315
+ };
316
+
317
+ /**
318
+ * Complex workflow with many events and participants
319
+ */
320
+ export const ComplexWorkflow: Story = {
321
+ args: {
322
+ scenario: orderProcessingScenario,
323
+ height: '100%',
324
+ layoutOptions: {
325
+ laneWidth: 200,
326
+ eventSpacing: 70,
327
+ },
328
+ },
329
+ };
330
+
331
+ /**
332
+ * Microservices communication pattern
333
+ */
334
+ export const MicroservicesPattern: Story = {
335
+ args: {
336
+ scenario: microservicesScenario,
337
+ height: '100%',
338
+ layoutOptions: {
339
+ laneWidth: 220,
340
+ eventSpacing: 75,
341
+ },
342
+ },
343
+ };
344
+
345
+ /**
346
+ * Error handling workflow
347
+ */
348
+ export const ErrorHandling: Story = {
349
+ args: {
350
+ scenario: errorHandlingScenario,
351
+ height: '100%',
352
+ layoutOptions: {
353
+ eventSpacing: 80,
354
+ },
355
+ },
356
+ };
357
+
358
+ /**
359
+ * Empty scenario showing graceful handling of no events
360
+ */
361
+ export const EmptyState: Story = {
362
+ args: {
363
+ scenario: emptyScenario,
364
+ height: '100%',
365
+ },
366
+ };
367
+
368
+ /**
369
+ * Long swimlane titles - stress-tests header rendering with very long participant names.
370
+ * Use this to verify text wrapping, truncation, and overflow behavior in lane headers.
371
+ */
372
+ export const LongSwimlaneTitles: Story = {
373
+ args: {
374
+ scenario: longTitlesScenario,
375
+ height: '100%',
376
+ layoutOptions: {
377
+ eventSpacing: 80,
378
+ headerHeight: 100,
379
+ },
380
+ },
381
+ };
382
+
383
+ /**
384
+ * Interactive example with event selection
385
+ * Click on any event in the sequence diagram to select it
386
+ * NOTE: Event click areas are small (14x14px by default) - use larger nodes for better UX
387
+ */
388
+ export const WithEventSelection: Story = {
389
+ render: () => {
390
+ const [selectedIndex, setSelectedIndex] = useState<number | undefined>(undefined);
391
+
392
+ // Get event names from the scenario
393
+ const eventNames = Object.keys(simpleAuthScenario.template.events);
394
+ const selectedEventName = selectedIndex !== undefined ? eventNames[selectedIndex] : null;
395
+
396
+ return (
397
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
398
+ <div
399
+ style={{
400
+ padding: '16px',
401
+ background: '#2c3e50',
402
+ color: '#ecf0f1',
403
+ borderBottom: '3px solid #3498db',
404
+ marginBottom: 16,
405
+ }}
406
+ >
407
+ <div style={{ fontSize: 16, marginBottom: 8 }}>
408
+ <strong>💡 Click on any event dot in the diagram below</strong>
409
+ </div>
410
+ <div style={{ fontSize: 14, opacity: 0.9 }}>
411
+ <strong>Selected Event:</strong>{' '}
412
+ {selectedIndex !== undefined ? (
413
+ <span style={{ color: '#3498db', fontFamily: 'monospace' }}>
414
+ [{selectedIndex}] {selectedEventName}
415
+ </span>
416
+ ) : (
417
+ <span style={{ opacity: 0.6 }}>None - Click an event to select</span>
418
+ )}
419
+ </div>
420
+ {selectedIndex !== undefined && (
421
+ <button
422
+ onClick={() => setSelectedIndex(undefined)}
423
+ style={{
424
+ marginTop: 8,
425
+ padding: '6px 16px',
426
+ cursor: 'pointer',
427
+ background: '#e74c3c',
428
+ color: 'white',
429
+ border: 'none',
430
+ borderRadius: 4,
431
+ fontSize: 13,
432
+ }}
433
+ >
434
+ Clear Selection
435
+ </button>
436
+ )}
437
+ </div>
438
+ <div style={{ flex: 1 }}>
439
+ <WorkflowSequenceDiagram
440
+ scenario={simpleAuthScenario}
441
+ height="100%"
442
+ selectedEventIndex={selectedIndex}
443
+ onEventIndexChange={setSelectedIndex}
444
+ layoutOptions={{
445
+ eventSpacing: 80,
446
+ nodeWidth: 14,
447
+ nodeHeight: 14,
448
+ }}
449
+ />
450
+ </div>
451
+ </div>
452
+ );
453
+ },
454
+ };
455
+
456
+ /**
457
+ * Interactive selection example
458
+ * Click labels to see them highlight with colored background
459
+ */
460
+ export const InteractiveSelection: Story = {
461
+ render: () => {
462
+ const [selectedIndex, setSelectedIndex] = useState<number | undefined>(0);
463
+
464
+ // Get event names from the scenario
465
+ const eventNames = Object.keys(orderProcessingScenario.template.events);
466
+ const selectedEventName = selectedIndex !== undefined ? eventNames[selectedIndex] : null;
467
+
468
+ return (
469
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
470
+ <div
471
+ style={{
472
+ padding: '16px',
473
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
474
+ color: 'white',
475
+ borderBottom: '4px solid #5a67d8',
476
+ marginBottom: 16,
477
+ }}
478
+ >
479
+ <div style={{ fontSize: 16, marginBottom: 8 }}>
480
+ <strong>✨ Clickable Labels Demo</strong>
481
+ </div>
482
+ <div style={{ fontSize: 14, marginBottom: 8 }}>
483
+ Labels highlight with colored background when selected - clean and intuitive!
484
+ </div>
485
+ <div style={{ fontSize: 14, opacity: 0.9 }}>
486
+ <strong>Selected:</strong>{' '}
487
+ {selectedIndex !== undefined ? (
488
+ <span style={{ color: '#ffd700', fontFamily: 'monospace', fontWeight: 'bold' }}>
489
+ Event {selectedIndex + 1} - {selectedEventName}
490
+ </span>
491
+ ) : (
492
+ <span style={{ opacity: 0.7 }}>Click any label</span>
493
+ )}
494
+ </div>
495
+ </div>
496
+ <div style={{ flex: 1 }}>
497
+ <WorkflowSequenceDiagram
498
+ scenario={orderProcessingScenario}
499
+ height="100%"
500
+ selectedEventIndex={selectedIndex}
501
+ onEventIndexChange={setSelectedIndex}
502
+ layoutOptions={{
503
+ eventSpacing: 80,
504
+ }}
505
+ />
506
+ </div>
507
+ </div>
508
+ );
509
+ },
510
+ };
511
+
512
+ /**
513
+ * Comparison: Edge Labels (Default) vs Node Labels (Optional)
514
+ * Both are clickable! This shows different visualization styles.
515
+ */
516
+ export const EdgeLabelsVsNodeLabels: Story = {
517
+ render: () => {
518
+ const [selectedLeft, setSelectedLeft] = useState<number | undefined>(undefined);
519
+ const [selectedRight, setSelectedRight] = useState<number | undefined>(undefined);
520
+
521
+ return (
522
+ <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', height: '100%', gap: 16 }}>
523
+ <div style={{ display: 'flex', flexDirection: 'column' }}>
524
+ <div style={{
525
+ padding: '12px',
526
+ background: '#3498db',
527
+ color: 'white',
528
+ borderBottom: '3px solid #2980b9',
529
+ marginBottom: 12,
530
+ }}>
531
+ <h3 style={{ margin: '0 0 8px 0', fontSize: 15 }}>📊 Edge Labels (Default)</h3>
532
+ <div style={{ fontSize: 13 }}>
533
+ Selected: {selectedLeft !== undefined ? `Event ${selectedLeft + 1}` : 'None'}
534
+ </div>
535
+ <div style={{ fontSize: 12, marginTop: 4, opacity: 0.9 }}>
536
+ Traditional UML style - labels on arrows
537
+ </div>
538
+ </div>
539
+ <div style={{ flex: 1, border: '1px solid #ddd', borderRadius: 4 }}>
540
+ <WorkflowSequenceDiagram
541
+ scenario={simpleAuthScenario}
542
+ height="100%"
543
+ selectedEventIndex={selectedLeft}
544
+ onEventIndexChange={setSelectedLeft}
545
+ showEventLabels={false}
546
+ layoutOptions={{
547
+ eventSpacing: 100,
548
+ }}
549
+ />
550
+ </div>
551
+ </div>
552
+ <div style={{ display: 'flex', flexDirection: 'column' }}>
553
+ <div style={{
554
+ padding: '12px',
555
+ background: '#9b59b6',
556
+ color: 'white',
557
+ borderBottom: '3px solid #8e44ad',
558
+ marginBottom: 12,
559
+ }}>
560
+ <h3 style={{ margin: '0 0 8px 0', fontSize: 15 }}>🏷️ Node Labels (Alternative)</h3>
561
+ <div style={{ fontSize: 13 }}>
562
+ Selected: {selectedRight !== undefined ? `Event ${selectedRight + 1}` : 'None'}
563
+ </div>
564
+ <div style={{ fontSize: 12, marginTop: 4, opacity: 0.9 }}>
565
+ Labels directly on events - alternative style
566
+ </div>
567
+ </div>
568
+ <div style={{ flex: 1, border: '1px solid #ddd', borderRadius: 4 }}>
569
+ <WorkflowSequenceDiagram
570
+ scenario={simpleAuthScenario}
571
+ height="100%"
572
+ selectedEventIndex={selectedRight}
573
+ onEventIndexChange={setSelectedRight}
574
+ showEventLabels={true}
575
+ layoutOptions={{
576
+ eventSpacing: 100,
577
+ nodeWidth: 80,
578
+ nodeHeight: 50,
579
+ }}
580
+ />
581
+ </div>
582
+ </div>
583
+ </div>
584
+ );
585
+ },
586
+ };
587
+
588
+ /**
589
+ * Comparison of default lanes vs fully-drilled lanes
590
+ */
591
+ export const DefaultVsDrilled: Story = {
592
+ render: () => {
593
+ const allTopSegments = Array.from(
594
+ new Set(
595
+ Object.keys(orderProcessingScenario.template.events ?? {})
596
+ .map((name) => name.split('.')[0])
597
+ .filter(Boolean)
598
+ )
599
+ );
600
+
601
+ return (
602
+ <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', height: '100%', gap: 16 }}>
603
+ <div style={{ display: 'flex', flexDirection: 'column' }}>
604
+ <h3 style={{ margin: '0 0 12px 0' }}>Default (top-level lanes)</h3>
605
+ <div style={{ flex: 1, border: '1px solid #ddd', borderRadius: 4 }}>
606
+ <WorkflowSequenceDiagram
607
+ scenario={orderProcessingScenario}
608
+ height="100%"
609
+ layoutOptions={{ laneWidth: 180, eventSpacing: 60 }}
610
+ />
611
+ </div>
612
+ </div>
613
+ <div style={{ display: 'flex', flexDirection: 'column' }}>
614
+ <h3 style={{ margin: '0 0 12px 0' }}>All top-level lanes drilled</h3>
615
+ <div style={{ flex: 1, border: '1px solid #ddd', borderRadius: 4 }}>
616
+ <WorkflowSequenceDiagram
617
+ scenario={orderProcessingScenario}
618
+ height="100%"
619
+ layoutOptions={{
620
+ openedNamespaces: allTopSegments,
621
+ laneWidth: 180,
622
+ eventSpacing: 60,
623
+ }}
624
+ />
625
+ </div>
626
+ </div>
627
+ </div>
628
+ );
629
+ },
630
+ };
631
+
632
+ /**
633
+ * Custom layout options - compact view
634
+ */
635
+ export const CompactLayout: Story = {
636
+ args: {
637
+ scenario: simpleAuthScenario,
638
+ height: '100%',
639
+ layoutOptions: {
640
+ laneWidth: 150,
641
+ laneGap: 30,
642
+ eventSpacing: 50,
643
+ },
644
+ },
645
+ };
646
+
647
+ /**
648
+ * Custom layout options - spacious view
649
+ */
650
+ export const SpaciousLayout: Story = {
651
+ args: {
652
+ scenario: simpleAuthScenario,
653
+ height: '100%',
654
+ layoutOptions: {
655
+ laneWidth: 250,
656
+ laneGap: 100,
657
+ eventSpacing: 120,
658
+ },
659
+ },
660
+ };
661
+
662
+ /**
663
+ * Without controls for embedded use
664
+ */
665
+ export const WithoutControls: Story = {
666
+ args: {
667
+ scenario: simpleAuthScenario,
668
+ height: '100%',
669
+ showControls: false,
670
+ layoutOptions: {
671
+ eventSpacing: 80,
672
+ },
673
+ },
674
+ };
675
+
676
+ /**
677
+ * With background grid
678
+ */
679
+ export const WithBackground: Story = {
680
+ args: {
681
+ scenario: simpleAuthScenario,
682
+ height: '100%',
683
+ showBackground: true,
684
+ layoutOptions: {
685
+ eventSpacing: 80,
686
+ },
687
+ },
688
+ };
689
+
690
+ /**
691
+ * Full-featured example with all options
692
+ * Demonstrates event navigation, selection, and visual customization
693
+ */
694
+ export const FullFeatured: Story = {
695
+ render: () => {
696
+ const [selectedIndex, setSelectedIndex] = useState<number>(0);
697
+ const [showControls, setShowControls] = useState(true);
698
+ const [showBackground, setShowBackground] = useState(false);
699
+
700
+ const eventNames = Object.keys(orderProcessingScenario.template.events);
701
+ const totalEvents = eventNames.length;
702
+
703
+ return (
704
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
705
+ <div
706
+ style={{
707
+ padding: '16px',
708
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
709
+ color: 'white',
710
+ borderBottom: '4px solid #5a67d8',
711
+ marginBottom: 16,
712
+ }}
713
+ >
714
+ <div style={{ marginBottom: 12, fontSize: 15 }}>
715
+ <strong>📍 Current Event:</strong>{' '}
716
+ <span style={{ fontFamily: 'monospace', background: 'rgba(255,255,255,0.2)', padding: '4px 8px', borderRadius: 3 }}>
717
+ {selectedIndex + 1} / {totalEvents}
718
+ </span>
719
+ {' - '}
720
+ <span style={{ fontFamily: 'monospace' }}>{eventNames[selectedIndex]}</span>
721
+ </div>
722
+
723
+ <div style={{ display: 'flex', gap: 16, alignItems: 'center', flexWrap: 'wrap' }}>
724
+ <div style={{ display: 'flex', gap: 8 }}>
725
+ <button
726
+ onClick={() => setSelectedIndex(Math.max(0, selectedIndex - 1))}
727
+ disabled={selectedIndex === 0}
728
+ style={{
729
+ padding: '8px 16px',
730
+ cursor: selectedIndex === 0 ? 'not-allowed' : 'pointer',
731
+ background: selectedIndex === 0 ? '#ccc' : '#3498db',
732
+ color: 'white',
733
+ border: 'none',
734
+ borderRadius: 4,
735
+ fontSize: 13,
736
+ fontWeight: 'bold',
737
+ }}
738
+ >
739
+ ← Previous
740
+ </button>
741
+ <button
742
+ onClick={() => setSelectedIndex(Math.min(totalEvents - 1, selectedIndex + 1))}
743
+ disabled={selectedIndex === totalEvents - 1}
744
+ style={{
745
+ padding: '8px 16px',
746
+ cursor: selectedIndex === totalEvents - 1 ? 'not-allowed' : 'pointer',
747
+ background: selectedIndex === totalEvents - 1 ? '#ccc' : '#3498db',
748
+ color: 'white',
749
+ border: 'none',
750
+ borderRadius: 4,
751
+ fontSize: 13,
752
+ fontWeight: 'bold',
753
+ }}
754
+ >
755
+ Next →
756
+ </button>
757
+ </div>
758
+
759
+ <div style={{ borderLeft: '2px solid rgba(255,255,255,0.3)', paddingLeft: 16, display: 'flex', gap: 12 }}>
760
+ <label style={{ cursor: 'pointer', fontSize: 13 }}>
761
+ <input
762
+ type="checkbox"
763
+ checked={showControls}
764
+ onChange={(e) => setShowControls(e.target.checked)}
765
+ style={{ marginRight: 6 }}
766
+ />
767
+ Show Controls
768
+ </label>
769
+ <label style={{ cursor: 'pointer', fontSize: 13 }}>
770
+ <input
771
+ type="checkbox"
772
+ checked={showBackground}
773
+ onChange={(e) => setShowBackground(e.target.checked)}
774
+ style={{ marginRight: 6 }}
775
+ />
776
+ Show Background
777
+ </label>
778
+ </div>
779
+ </div>
780
+
781
+ <div style={{ marginTop: 12, fontSize: 12, opacity: 0.9, background: 'rgba(0,0,0,0.2)', padding: '8px', borderRadius: 4 }}>
782
+ 💡 <strong>Tip:</strong> Click directly on any event dot in the diagram to jump to it!
783
+ </div>
784
+ </div>
785
+ <div style={{ flex: 1 }}>
786
+ <WorkflowSequenceDiagram
787
+ scenario={orderProcessingScenario}
788
+ height="100%"
789
+ selectedEventIndex={selectedIndex}
790
+ onEventIndexChange={setSelectedIndex}
791
+ showControls={showControls}
792
+ showBackground={showBackground}
793
+ layoutOptions={{
794
+ laneWidth: 200,
795
+ eventSpacing: 70,
796
+ }}
797
+ />
798
+ </div>
799
+ </div>
800
+ );
801
+ },
802
+ };