@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,205 @@
1
+ /**
2
+ * useStateView Hook
3
+ *
4
+ * Manages state accumulation from events and provides replay controls.
5
+ */
6
+
7
+ import { useState, useEffect, useRef, useCallback } from 'react';
8
+ import type {
9
+ StateEvent,
10
+ EventSource,
11
+ StateReducer,
12
+ StateDiff,
13
+ ReplayControls,
14
+ ActiveAnimation,
15
+ TransitionDefinition,
16
+ } from './types';
17
+
18
+ export interface UseStateViewOptions<TState, TEvent extends StateEvent> {
19
+ /** Initial state */
20
+ initialState: TState;
21
+ /** Reducer to apply events */
22
+ reducer: StateReducer<TState, TEvent>;
23
+ /** Event source (live or replay) */
24
+ eventSource: EventSource<TEvent>;
25
+ /** Transition definitions for animations */
26
+ transitions?: TransitionDefinition[];
27
+ /** Callback when state changes */
28
+ onStateChange?: (diff: StateDiff<TState>) => void;
29
+ }
30
+
31
+ export interface UseStateViewResult<TState> {
32
+ /** Current state */
33
+ state: TState;
34
+ /** Active animations */
35
+ animations: ActiveAnimation[];
36
+ /** Whether we're in replay mode */
37
+ isReplay: boolean;
38
+ /** Replay controls (if in replay mode) */
39
+ replayControls?: ReplayControls;
40
+ /** Reset state to initial */
41
+ reset: () => void;
42
+ }
43
+
44
+ /**
45
+ * Get changed paths between two objects (shallow comparison)
46
+ */
47
+ function getChangedPaths(prev: unknown, next: unknown, prefix = ''): string[] {
48
+ const paths: string[] = [];
49
+
50
+ if (prev === next) return paths;
51
+
52
+ if (
53
+ typeof prev !== 'object' ||
54
+ typeof next !== 'object' ||
55
+ prev === null ||
56
+ next === null
57
+ ) {
58
+ return prefix ? [prefix] : [];
59
+ }
60
+
61
+ const prevObj = prev as Record<string, unknown>;
62
+ const nextObj = next as Record<string, unknown>;
63
+
64
+ const allKeys = new Set([...Object.keys(prevObj), ...Object.keys(nextObj)]);
65
+
66
+ for (const key of allKeys) {
67
+ const path = prefix ? `${prefix}.${key}` : key;
68
+ if (prevObj[key] !== nextObj[key]) {
69
+ paths.push(path);
70
+ }
71
+ }
72
+
73
+ return paths;
74
+ }
75
+
76
+ /**
77
+ * Check if a transition should fire based on state change
78
+ */
79
+ function shouldTriggerTransition(
80
+ transition: TransitionDefinition,
81
+ prev: unknown,
82
+ next: unknown,
83
+ changedPaths: string[]
84
+ ): boolean {
85
+ // Check if the watched path changed
86
+ if (!changedPaths.some((p) => p.startsWith(transition.watch))) {
87
+ return false;
88
+ }
89
+
90
+ const prevValue = getValueAtPath(prev, transition.watch);
91
+ const nextValue = getValueAtPath(next, transition.watch);
92
+
93
+ switch (transition.condition) {
94
+ case 'changed':
95
+ return prevValue !== nextValue;
96
+ case 'increased':
97
+ return typeof nextValue === 'number' && typeof prevValue === 'number' && nextValue > prevValue;
98
+ case 'decreased':
99
+ return typeof nextValue === 'number' && typeof prevValue === 'number' && nextValue < prevValue;
100
+ case 'added':
101
+ return prevValue === undefined && nextValue !== undefined;
102
+ case 'removed':
103
+ return prevValue !== undefined && nextValue === undefined;
104
+ default:
105
+ return false;
106
+ }
107
+ }
108
+
109
+ function getValueAtPath(obj: unknown, path: string): unknown {
110
+ const parts = path.split('.');
111
+ let current = obj;
112
+ for (const part of parts) {
113
+ if (current === null || current === undefined) return undefined;
114
+ current = (current as Record<string, unknown>)[part];
115
+ }
116
+ return current;
117
+ }
118
+
119
+ export function useStateView<TState, TEvent extends StateEvent>({
120
+ initialState,
121
+ reducer,
122
+ eventSource,
123
+ transitions = [],
124
+ onStateChange,
125
+ }: UseStateViewOptions<TState, TEvent>): UseStateViewResult<TState> {
126
+ const [state, setState] = useState<TState>(initialState);
127
+ const [animations, setAnimations] = useState<ActiveAnimation[]>([]);
128
+ const prevStateRef = useRef<TState>(initialState);
129
+ const animationIdRef = useRef(0);
130
+
131
+ const triggerAnimation = useCallback(
132
+ (transition: TransitionDefinition, _event: StateEvent) => {
133
+ const id = `anim-${++animationIdRef.current}`;
134
+ const duration = transition.duration ?? 500;
135
+
136
+ const animation: ActiveAnimation = {
137
+ id,
138
+ type: transition.animate,
139
+ target: transition.target ?? transition.watch,
140
+ startTime: Date.now(),
141
+ duration,
142
+ params: transition.params,
143
+ };
144
+
145
+ setAnimations((prev) => [...prev, animation]);
146
+
147
+ // Auto-remove after duration
148
+ setTimeout(() => {
149
+ setAnimations((prev) => prev.filter((a) => a.id !== id));
150
+ }, duration);
151
+ },
152
+ []
153
+ );
154
+
155
+ const handleEvent = useCallback(
156
+ (event: TEvent) => {
157
+ setState((prevState) => {
158
+ const nextState = reducer(prevState, event);
159
+ const changedPaths = getChangedPaths(prevState, nextState);
160
+
161
+ // Trigger animations based on transitions
162
+ for (const transition of transitions) {
163
+ if (shouldTriggerTransition(transition, prevState, nextState, changedPaths)) {
164
+ triggerAnimation(transition, event);
165
+ }
166
+ }
167
+
168
+ // Notify listener
169
+ if (onStateChange && changedPaths.length > 0) {
170
+ onStateChange({
171
+ prev: prevState,
172
+ next: nextState,
173
+ changedPaths,
174
+ event,
175
+ });
176
+ }
177
+
178
+ prevStateRef.current = nextState;
179
+ return nextState;
180
+ });
181
+ },
182
+ [reducer, transitions, onStateChange, triggerAnimation]
183
+ );
184
+
185
+ // Subscribe to event source
186
+ useEffect(() => {
187
+ const unsubscribe = eventSource.subscribe(handleEvent);
188
+ return unsubscribe;
189
+ }, [eventSource, handleEvent]);
190
+
191
+ const reset = useCallback(() => {
192
+ setState(initialState);
193
+ setAnimations([]);
194
+ prevStateRef.current = initialState;
195
+ }, [initialState]);
196
+
197
+ const isReplay = eventSource.mode === 'replay';
198
+
199
+ return {
200
+ state,
201
+ animations,
202
+ isReplay,
203
+ reset,
204
+ };
205
+ }
@@ -0,0 +1,27 @@
1
+ import React, { createContext, useContext } from 'react';
2
+
3
+ export interface GraphEditContextValue {
4
+ /** Called when a node resize operation completes */
5
+ onNodeResizeEnd?: (nodeId: string, dimensions: { width: number; height: number }) => void;
6
+ /** Called when node text is edited (for text and group nodes) */
7
+ onNodeTextChange?: (nodeId: string, text: string) => void;
8
+ /** Called to toggle node hidden state (Cmd/Ctrl+click) */
9
+ onToggleNodeHidden?: (nodeId: string) => void;
10
+ /** Called to hide all nodes not directly connected to the given node (Cmd/Ctrl+Shift+click) */
11
+ onHideUnconnectedNodes?: (nodeId: string) => void;
12
+ }
13
+
14
+ const GraphEditContext = createContext<GraphEditContextValue>({});
15
+
16
+ export const GraphEditProvider: React.FC<{
17
+ children: React.ReactNode;
18
+ value: GraphEditContextValue;
19
+ }> = ({ children, value }) => {
20
+ return (
21
+ <GraphEditContext.Provider value={value}>
22
+ {children}
23
+ </GraphEditContext.Provider>
24
+ );
25
+ };
26
+
27
+ export const useGraphEdit = () => useContext(GraphEditContext);
@@ -0,0 +1,8 @@
1
+ import { createContext } from 'react';
2
+
3
+ /**
4
+ * Context for providing a portal target for tooltips.
5
+ * This allows tooltips to be rendered within the graph container
6
+ * instead of document.body, so they hide properly when tabs switch.
7
+ */
8
+ export const TooltipPortalContext = createContext<HTMLElement | null>(null);
@@ -0,0 +1,402 @@
1
+ import React, { useState, useEffect, useRef } from 'react';
2
+ import { BaseEdge, EdgeLabelRenderer, getSmoothStepPath } from '@xyflow/react';
3
+ import type { EdgeProps, Edge } from '@xyflow/react';
4
+ import type { EdgeTypeDefinition } from '@principal-ai/subsystems-core';
5
+ import { useTheme } from '@principal-ade/industry-theme';
6
+
7
+ export interface CustomEdgeData extends Record<string, unknown> {
8
+ typeDefinition: EdgeTypeDefinition;
9
+ hasViolations?: boolean;
10
+ data?: Record<string, unknown>;
11
+ edgeType?: string;
12
+ // Animation control
13
+ animationType?: 'flow' | 'particle' | 'pulse' | 'glow' | null;
14
+ animationDuration?: number;
15
+ animationDirection?: 'forward' | 'backward' | 'bidirectional';
16
+ // Whether tooltips are enabled (defaults to true)
17
+ tooltipsEnabled?: boolean;
18
+ // Whether shift key is currently pressed (for tooltip control)
19
+ shiftKeyPressed?: boolean;
20
+ // ELK-computed path (circuit-board style routing)
21
+ elkPath?: string;
22
+ // ELK-computed label position
23
+ elkLabelPosition?: { x: number; y: number };
24
+ }
25
+
26
+ /**
27
+ * Custom edge component for xyflow that renders based on EdgeTypeDefinition
28
+ */
29
+ export const CustomEdge: React.FC<EdgeProps<Edge<CustomEdgeData>>> = ({
30
+ id,
31
+ sourceX,
32
+ sourceY,
33
+ targetX,
34
+ targetY,
35
+ sourcePosition,
36
+ targetPosition,
37
+ data,
38
+ markerEnd,
39
+ selected,
40
+ }) => {
41
+ const { theme } = useTheme();
42
+ const edgeProps = data;
43
+ const {
44
+ typeDefinition,
45
+ hasViolations,
46
+ data: edgeData,
47
+ edgeType,
48
+ animationType,
49
+ animationDuration = 1000,
50
+ animationDirection = 'forward',
51
+ tooltipsEnabled = true,
52
+ shiftKeyPressed = false,
53
+ elkPath,
54
+ elkLabelPosition,
55
+ } = edgeProps || ({} as CustomEdgeData);
56
+
57
+ const [particlePosition, setParticlePosition] = useState(0);
58
+ const [isHovered, setIsHovered] = useState(false);
59
+ const pathRef = useRef<SVGPathElement>(null);
60
+
61
+ // Particle animation effect
62
+ useEffect(() => {
63
+ if (animationType !== 'particle') return;
64
+
65
+ const animate = () => {
66
+ setParticlePosition((prev) => {
67
+ const next = prev + (100 / animationDuration) * 16; // ~60fps
68
+ return next >= 100 ? 0 : next;
69
+ });
70
+ };
71
+
72
+ const intervalId = setInterval(animate, 16);
73
+ return () => clearInterval(intervalId);
74
+ }, [animationType, animationDuration]);
75
+
76
+ // Early return after hooks
77
+ if (!typeDefinition) {
78
+ return null;
79
+ }
80
+
81
+ // Color priority: violations > edge data color > type definition color > default
82
+ const edgeColor = edgeData?.color as string | undefined;
83
+ const color = hasViolations ? '#D0021B' : edgeColor || typeDefinition.color || '#888';
84
+ const width = typeDefinition.width || 2;
85
+
86
+ // Get edge path - use ELK path if available, otherwise fall back to SmoothStep
87
+ const [defaultPath, defaultLabelX, defaultLabelY] = getSmoothStepPath({
88
+ sourceX,
89
+ sourceY,
90
+ sourcePosition,
91
+ targetX,
92
+ targetY,
93
+ targetPosition,
94
+ borderRadius: 0,
95
+ offset: 20,
96
+ });
97
+
98
+ // Use ELK-computed path for circuit-board style routing when available
99
+ const edgePath = elkPath || defaultPath;
100
+ const labelX = elkLabelPosition?.x ?? defaultLabelX;
101
+ const labelY = elkLabelPosition?.y ?? defaultLabelY;
102
+
103
+ // Style based on edge type
104
+ const getStrokeStyle = () => {
105
+ switch (typeDefinition.style) {
106
+ case 'dashed':
107
+ return '5 5';
108
+ case 'dotted':
109
+ return '2 2';
110
+ default:
111
+ return 'none';
112
+ }
113
+ };
114
+
115
+ // Label configuration
116
+ const labelConfig = typeDefinition.label;
117
+ const labelField = labelConfig?.field;
118
+ const labelText = labelField && edgeData?.[labelField] ? String(edgeData[labelField]) : '';
119
+
120
+ // Animation-specific rendering helpers
121
+ const getAnimationClass = () => {
122
+ if (!animationType) {
123
+ return typeDefinition.style === 'animated' ? 'edge-flow-forward' : '';
124
+ }
125
+
126
+ switch (animationType) {
127
+ case 'flow':
128
+ return animationDirection === 'backward'
129
+ ? 'edge-flow-backward'
130
+ : animationDirection === 'bidirectional'
131
+ ? 'edge-flow-bidirectional'
132
+ : 'edge-flow-forward';
133
+ case 'pulse':
134
+ return 'edge-pulse';
135
+ case 'glow':
136
+ return 'edge-glow';
137
+ default:
138
+ return '';
139
+ }
140
+ };
141
+
142
+ const getAnimationDurationStyle = () => {
143
+ if (!animationType) return {};
144
+ return {
145
+ animationDuration: `${animationDuration}ms`,
146
+ };
147
+ };
148
+
149
+ // Calculate particle position along path using SVG path methods
150
+ const getParticleTransform = () => {
151
+ if (!pathRef.current) {
152
+ // Fallback to linear interpolation if path ref not available yet
153
+ const progress =
154
+ animationDirection === 'backward' ? 1 - particlePosition / 100 : particlePosition / 100;
155
+ const x = sourceX + (targetX - sourceX) * progress;
156
+ const y = sourceY + (targetY - sourceY) * progress;
157
+ return { x, y };
158
+ }
159
+
160
+ // Use actual path to get point along the curve
161
+ const pathLength = pathRef.current.getTotalLength();
162
+ const progress =
163
+ animationDirection === 'backward' ? 1 - particlePosition / 100 : particlePosition / 100;
164
+ const distance = pathLength * progress;
165
+ const point = pathRef.current.getPointAtLength(distance);
166
+
167
+ return { x: point.x, y: point.y };
168
+ };
169
+
170
+ const particlePos = animationType === 'particle' ? getParticleTransform() : null;
171
+
172
+ return (
173
+ <g
174
+ onMouseEnter={() => setIsHovered(true)}
175
+ onMouseLeave={() => setIsHovered(false)}
176
+ style={{ cursor: 'pointer' }}
177
+ >
178
+ {/* Hidden path for particle position calculation */}
179
+ <path
180
+ ref={pathRef}
181
+ d={edgePath}
182
+ fill="none"
183
+ stroke="transparent"
184
+ strokeWidth={0}
185
+ style={{ pointerEvents: 'none' }}
186
+ />
187
+
188
+ {/* Invisible wide path for easier clicking */}
189
+ <path
190
+ d={edgePath}
191
+ fill="none"
192
+ stroke="transparent"
193
+ strokeWidth={Math.max(width + 10, 20)}
194
+ style={{ pointerEvents: 'stroke' }}
195
+ />
196
+
197
+ <BaseEdge
198
+ id={id}
199
+ path={edgePath}
200
+ markerEnd={markerEnd as string}
201
+ style={{
202
+ stroke: color,
203
+ strokeWidth: selected ? width + 2 : width,
204
+ strokeDasharray: getStrokeStyle(),
205
+ opacity: animationType ? 0.7 : 1,
206
+ cursor: 'pointer',
207
+ }}
208
+ />
209
+
210
+ {/* Flow Animation - Animated dashed overlay */}
211
+ {animationType === 'flow' && (
212
+ <path
213
+ d={edgePath}
214
+ fill="none"
215
+ stroke={typeDefinition.animation?.color || color}
216
+ strokeWidth={width}
217
+ strokeDasharray="10 5"
218
+ className={getAnimationClass()}
219
+ style={{
220
+ ...getAnimationDurationStyle(),
221
+ opacity: 0.8,
222
+ }}
223
+ />
224
+ )}
225
+
226
+ {/* Pulse Animation - Wave effect */}
227
+ {animationType === 'pulse' && (
228
+ <path
229
+ d={edgePath}
230
+ fill="none"
231
+ stroke={typeDefinition.animation?.color || color}
232
+ strokeWidth={width + 2}
233
+ className={getAnimationClass()}
234
+ style={{
235
+ ...getAnimationDurationStyle(),
236
+ }}
237
+ />
238
+ )}
239
+
240
+ {/* Glow Animation - Brief highlight */}
241
+ {animationType === 'glow' && (
242
+ <path
243
+ d={edgePath}
244
+ fill="none"
245
+ stroke={typeDefinition.animation?.color || color}
246
+ strokeWidth={width + 4}
247
+ className={getAnimationClass()}
248
+ style={{
249
+ ...getAnimationDurationStyle(),
250
+ filter: 'blur(3px)',
251
+ }}
252
+ />
253
+ )}
254
+
255
+ {/* Particle Animation - Traveling dot */}
256
+ {animationType === 'particle' && particlePos && (
257
+ <circle
258
+ cx={particlePos.x}
259
+ cy={particlePos.y}
260
+ r={width * 1.5}
261
+ fill={typeDefinition.animation?.color || color}
262
+ style={{
263
+ filter: 'drop-shadow(0 0 3px rgba(0,0,0,0.3))',
264
+ }}
265
+ />
266
+ )}
267
+
268
+ {/* Fallback: Legacy animated style support */}
269
+ {!animationType && typeDefinition.style === 'animated' && (
270
+ <path
271
+ d={edgePath}
272
+ fill="none"
273
+ stroke={typeDefinition.animation?.color || color}
274
+ strokeWidth={width}
275
+ strokeDasharray="5 5"
276
+ className="edge-flow-forward"
277
+ style={{
278
+ animationDuration: '500ms',
279
+ }}
280
+ />
281
+ )}
282
+
283
+ {/* Label */}
284
+ {labelText && (
285
+ <EdgeLabelRenderer>
286
+ <div
287
+ style={{
288
+ position: 'absolute',
289
+ transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,
290
+ backgroundColor: 'white',
291
+ padding: '2px 6px',
292
+ borderRadius: '4px',
293
+ fontSize: theme.fontSizes[0],
294
+ fontWeight: theme.fontWeights.medium,
295
+ fontFamily: theme.fonts.body,
296
+ border: `1px solid ${color}`,
297
+ pointerEvents: 'all',
298
+ zIndex: 1000,
299
+ }}
300
+ className="nodrag nopan"
301
+ >
302
+ {labelText}
303
+ </div>
304
+ </EdgeLabelRenderer>
305
+ )}
306
+
307
+ {/* Hover tooltip showing edge type - only shown when shift key is pressed */}
308
+ {tooltipsEnabled && isHovered && shiftKeyPressed && (
309
+ <EdgeLabelRenderer>
310
+ <div
311
+ style={{
312
+ position: 'absolute',
313
+ transform: `translate(-50%, -100%) translate(${labelX}px,${labelY - 12}px)`,
314
+ backgroundColor: 'rgba(0, 0, 0, 0.85)',
315
+ color: 'white',
316
+ padding: '4px 8px',
317
+ borderRadius: '4px',
318
+ fontSize: theme.fontSizes[0],
319
+ fontWeight: theme.fontWeights.medium,
320
+ fontFamily: theme.fonts.body,
321
+ whiteSpace: 'nowrap',
322
+ pointerEvents: 'none',
323
+ zIndex: 1000,
324
+ boxShadow: '0 2px 8px rgba(0,0,0,0.2)',
325
+ }}
326
+ >
327
+ {edgeType || 'edge'}
328
+ </div>
329
+ </EdgeLabelRenderer>
330
+ )}
331
+
332
+ {/* CSS animations for all edge animation types */}
333
+ <style>{`
334
+ /* Flow animation - forward direction */
335
+ .edge-flow-forward {
336
+ animation: flow-forward linear infinite;
337
+ }
338
+
339
+ @keyframes flow-forward {
340
+ to {
341
+ stroke-dashoffset: -15;
342
+ }
343
+ }
344
+
345
+ /* Flow animation - backward direction */
346
+ .edge-flow-backward {
347
+ animation: flow-backward linear infinite;
348
+ }
349
+
350
+ @keyframes flow-backward {
351
+ to {
352
+ stroke-dashoffset: 15;
353
+ }
354
+ }
355
+
356
+ /* Flow animation - bidirectional (alternating) */
357
+ .edge-flow-bidirectional {
358
+ animation: flow-bidirectional linear infinite alternate;
359
+ }
360
+
361
+ @keyframes flow-bidirectional {
362
+ 0% {
363
+ stroke-dashoffset: -15;
364
+ }
365
+ 100% {
366
+ stroke-dashoffset: 15;
367
+ }
368
+ }
369
+
370
+ /* Pulse animation - wave effect */
371
+ .edge-pulse {
372
+ animation: pulse ease-in-out infinite;
373
+ }
374
+
375
+ @keyframes pulse {
376
+ 0%, 100% {
377
+ opacity: 0.3;
378
+ stroke-width: inherit;
379
+ }
380
+ 50% {
381
+ opacity: 1;
382
+ stroke-width: calc(inherit + 2);
383
+ }
384
+ }
385
+
386
+ /* Glow animation - brief highlight */
387
+ .edge-glow {
388
+ animation: glow ease-out forwards;
389
+ }
390
+
391
+ @keyframes glow {
392
+ 0% {
393
+ opacity: 1;
394
+ }
395
+ 100% {
396
+ opacity: 0;
397
+ }
398
+ }
399
+ `}</style>
400
+ </g>
401
+ );
402
+ };
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import type { EdgeTypeDefinition } from '@principal-ai/subsystems-core';
3
+
4
+ export interface GenericEdgeProps {
5
+ /** Edge ID */
6
+ id: string;
7
+
8
+ /** Edge type definition from configuration */
9
+ typeDefinition: EdgeTypeDefinition;
10
+
11
+ /** Edge data */
12
+ data?: Record<string, unknown>;
13
+
14
+ /** Whether this edge has violations */
15
+ hasViolations?: boolean;
16
+ }
17
+
18
+ /**
19
+ * Generic edge renderer that adapts based on EdgeTypeDefinition
20
+ * TODO: Implement different styles, animations, and labels
21
+ */
22
+ export const GenericEdge: React.FC<GenericEdgeProps> = ({ id, typeDefinition, hasViolations }) => {
23
+ const color = hasViolations ? 'red' : typeDefinition.color || '#888';
24
+
25
+ return (
26
+ <div>
27
+ {/* This is a placeholder - actual edge rendering happens in xyflow */}
28
+ <div style={{ fontSize: '10px', color }}>
29
+ Edge: {id} ({typeDefinition.style})
30
+ </div>
31
+ <div style={{ fontSize: '8px' }}>
32
+ <strong>TODO:</strong> Render in xyflow with proper styling
33
+ </div>
34
+ </div>
35
+ );
36
+ };