@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,643 @@
1
+ /**
2
+ * ComponentDeclaration — the selected subsystem component rendered as it would
3
+ * appear in code: a file-path comment + doc comment, then the construct's
4
+ * declaration (`class X extends Y { ... }`, `function f(): T`, ...) with its
5
+ * members as signatures. Graphify relationship drill-downs appear as trailing
6
+ * comments. File content lives in the bottom FileDrawer, not here.
7
+ */
8
+
9
+ import { useEffect, useRef, useState, type ReactNode } from 'react';
10
+ import { AlignLeft, FileText, ShieldCheck } from 'lucide-react';
11
+ import { useTheme } from '@principal-ade/industry-theme';
12
+ import { resolvePierreSyntaxThemeName } from '../pierre/pierreSyntaxTheme';
13
+ import {
14
+ formatPurl,
15
+ type SubsystemComponent,
16
+ type SubsystemDeclTokenKind,
17
+ } from './model';
18
+ import type { SubsystemOpenFileOptions } from './declarationRef';
19
+ import { parseSourceLocation } from './declarationRef';
20
+ import { tokenizeComponent } from './tokenizeComponent';
21
+ import { constructColorsFromPierreTheme } from '../pierre/constructColors';
22
+
23
+ /** Live / result state for the declaration-panel Verify control. */
24
+ export type ComponentVerificationPhase =
25
+ | 'idle'
26
+ | 'checking'
27
+ | 'done'
28
+ | 'error';
29
+
30
+ export interface ComponentVerificationState {
31
+ phase: ComponentVerificationPhase;
32
+ message?: string;
33
+ /** Mirrors host `ok` when a structured verify result is available. */
34
+ ok?: boolean;
35
+ code?: string;
36
+ file?: {
37
+ exists: boolean;
38
+ symbolDeclared?: boolean | null;
39
+ };
40
+ cache?: {
41
+ status: 'ready' | 'missing' | 'unavailable';
42
+ purl: string;
43
+ };
44
+ anchor?: {
45
+ resolution: 'exact' | 'file-only' | 'ambiguous' | 'missing';
46
+ nodeId?: string;
47
+ label?: string;
48
+ source_file?: string;
49
+ source_location?: string;
50
+ candidates?: Array<{ nodeId: string; label: string; source_file?: string }>;
51
+ };
52
+ construct?: {
53
+ claimed: string;
54
+ inferred: string;
55
+ match: boolean;
56
+ evidence?: string[];
57
+ };
58
+ signature?: {
59
+ match: boolean;
60
+ skipped: boolean;
61
+ skipCode?: string;
62
+ reason?: string;
63
+ claimed: { parameterTypes: string[]; returnTypes: string[] };
64
+ inferred: { parameterTypes: string[]; returnTypes: string[] };
65
+ /** Graphify `inline_parameter` marker count (anonymous eager args). */
66
+ inlineParameters?: number;
67
+ };
68
+ declaration?: {
69
+ freshness: 'valid' | 'stale' | 'missing' | 'unanchored' | 'unchecked';
70
+ ref?: {
71
+ startLine: number;
72
+ lineHash: string;
73
+ };
74
+ };
75
+ }
76
+
77
+ /** Shared affordance for clickable text pieces. */
78
+ const clickableStyle = {
79
+ cursor: 'pointer',
80
+ textDecorationLine: 'underline',
81
+ textDecorationStyle: 'dotted',
82
+ textUnderlineOffset: 2,
83
+ } as const;
84
+
85
+ /** Clickable detail-panel piece — dotted underline signals interactivity. */
86
+ function DetailLink({ children, onClick }: { children: ReactNode; onClick?: () => void }) {
87
+ if (!onClick) return <>{children}</>;
88
+ return (
89
+ <span
90
+ onClick={(e) => {
91
+ e.stopPropagation();
92
+ onClick();
93
+ }}
94
+ style={{
95
+ cursor: 'pointer',
96
+ textDecorationLine: 'underline',
97
+ textDecorationStyle: 'dotted',
98
+ textUnderlineOffset: 2,
99
+ }}
100
+ >
101
+ {children}
102
+ </span>
103
+ );
104
+ }
105
+
106
+ /** Panel props. Callbacks are wired by the graph; standalone usage without
107
+ * them renders the same panel with nothing clickable. */
108
+ export interface ComponentDeclarationProps {
109
+ component: SubsystemComponent;
110
+ /** File-path click → open that file in the bottom drawer (optional start line). */
111
+ onOpenFile?: (file: string, opts?: SubsystemOpenFileOptions) => void;
112
+ /** Related-name click (types, callers/callees, implementors, …) → select
113
+ * that component if one matches; unmatched refs no-op. */
114
+ onRelatedSelect?: (ref: string) => void;
115
+ /** Max width of the declaration panel (CSS value). Defaults to none. */
116
+ maxWidth?: string | number;
117
+ /** When set, shows a Verify control that calls back with the component id. */
118
+ onVerify?: (componentId: string) => void;
119
+ /** Live verification status for the selected component. */
120
+ verification?: ComponentVerificationState | null;
121
+ }
122
+
123
+ function verificationSummary(
124
+ v: ComponentVerificationState,
125
+ muted: string,
126
+ ok: string,
127
+ warn: string,
128
+ ): { text: string; color: string } {
129
+ if (v.phase === 'checking') {
130
+ return { text: v.message ?? 'Verifying…', color: muted };
131
+ }
132
+ if (v.phase === 'error') {
133
+ return { text: v.message ?? 'Verification failed', color: '#e5534b' };
134
+ }
135
+ if (v.phase !== 'done') {
136
+ return { text: '', color: muted };
137
+ }
138
+ const bits: string[] = [];
139
+ if (v.file) {
140
+ if (!v.file.exists) bits.push('file missing');
141
+ else if (v.file.symbolDeclared === false) bits.push('symbol not declared in file');
142
+ else if (v.file.symbolDeclared === true) bits.push('file+symbol ok');
143
+ else bits.push('file exists');
144
+ }
145
+ if (v.cache?.status === 'missing') {
146
+ return {
147
+ text: [...bits, 'graphify cache not ready — run graphify from Subsystems list'].join(' · '),
148
+ color: warn,
149
+ };
150
+ }
151
+ if (v.cache?.status === 'unavailable') {
152
+ return {
153
+ text: [...bits, 'no local checkout for this purl'].join(' · '),
154
+ color: muted,
155
+ };
156
+ }
157
+ const res = v.anchor?.resolution;
158
+ if (res === 'exact') {
159
+ const loc = v.anchor?.source_location ? ` @ ${v.anchor.source_location}` : '';
160
+ const declFresh = v.declaration?.freshness;
161
+ const declBit =
162
+ declFresh && declFresh !== 'unanchored'
163
+ ? ` · declaration ${declFresh}${v.declaration?.ref ? ` L${v.declaration.ref.startLine}` : ''}`
164
+ : '';
165
+ const anchorBit = `exact → ${v.anchor?.label ?? v.anchor?.nodeId ?? 'node'}${loc}${declBit}`;
166
+ if (v.construct && !v.construct.match) {
167
+ const why =
168
+ v.construct.inferred === 'unknown'
169
+ ? `construct unknown (claimed ${v.construct.claimed})`
170
+ : `construct mismatch: claimed ${v.construct.claimed}, inferred ${v.construct.inferred}`;
171
+ return {
172
+ text: [...bits, anchorBit, why].join(' · '),
173
+ color: '#e5534b',
174
+ };
175
+ }
176
+ if (v.signature && !v.signature.skipped && !v.signature.match) {
177
+ const cParams = v.signature.claimed.parameterTypes.join(', ') || '∅';
178
+ const iParams = v.signature.inferred.parameterTypes.join(', ') || '∅';
179
+ const cRet = v.signature.claimed.returnTypes.join(', ') || '∅';
180
+ const iRet = v.signature.inferred.returnTypes.join(', ') || '∅';
181
+ return {
182
+ text: [
183
+ ...bits,
184
+ anchorBit,
185
+ v.construct?.match ? `construct ${v.construct.inferred}` : undefined,
186
+ `signature mismatch: params [${cParams}]≠[${iParams}] return [${cRet}]≠[${iRet}]`,
187
+ ]
188
+ .filter(Boolean)
189
+ .join(' · '),
190
+ color: '#e5534b',
191
+ };
192
+ }
193
+ const constructBit =
194
+ v.construct?.match ? `construct ${v.construct.inferred}` : undefined;
195
+ const inlineBit =
196
+ v.signature?.inlineParameters
197
+ ? `${v.signature.inlineParameters} inline param${v.signature.inlineParameters === 1 ? '' : 's'} verified`
198
+ : undefined;
199
+ if (v.signature?.skipped) {
200
+ const skipPhrase: Record<string, string> = {
201
+ no_claimed_types: 'no claimable named types (primitives/inline only)',
202
+ generic_arg_only:
203
+ 'return only as generic_arg — wrapper types (Promise/Omit/Map/Array) not read as return edges',
204
+ partially_generic_arg:
205
+ 'claimed types resolve only via generic_arg; rest unresolved',
206
+ unresolved_claimed_types:
207
+ 'claimed return type has no graphify edge (npm/global/DOM type)',
208
+ };
209
+ return {
210
+ text: [
211
+ ...bits,
212
+ anchorBit,
213
+ ...(constructBit ? [constructBit] : []),
214
+ ...(inlineBit ? [inlineBit] : []),
215
+ v.signature.skipCode
216
+ ? `params/return not fully checked — ${skipPhrase[v.signature.skipCode] ?? v.signature.skipCode}`
217
+ : 'params/return not checked',
218
+ ].join(' · '),
219
+ color: warn,
220
+ };
221
+ }
222
+ const sigBit =
223
+ v.signature && v.signature.match ? 'params/return ok' : undefined;
224
+ return {
225
+ text: [...bits, anchorBit, ...(constructBit ? [constructBit] : []), ...(sigBit ? [sigBit] : [])].join(' · '),
226
+ color: ok,
227
+ };
228
+ }
229
+ if (res === 'file-only') {
230
+ return {
231
+ text: [...bits, 'file in graph, symbol not uniquely matched'].join(' · '),
232
+ color: warn,
233
+ };
234
+ }
235
+ if (res === 'ambiguous') {
236
+ const n = v.anchor?.candidates?.length ?? 0;
237
+ return {
238
+ text: [...bits, `ambiguous (${n} candidates)`].join(' · '),
239
+ color: warn,
240
+ };
241
+ }
242
+ if (res === 'missing') {
243
+ return {
244
+ text: [...bits, 'no matching graphify node'].join(' · '),
245
+ color: '#e5534b',
246
+ };
247
+ }
248
+ return { text: bits.join(' · ') || 'done', color: muted };
249
+ }
250
+
251
+ /** Declaration panel for the selected component — its definition, code-style. */
252
+ export function ComponentDeclaration({
253
+ component,
254
+ onOpenFile,
255
+ onRelatedSelect: _onRelatedSelect,
256
+ maxWidth,
257
+ onVerify,
258
+ verification,
259
+ }: ComponentDeclarationProps) {
260
+ const { theme, mode } = useTheme();
261
+ const pierreSyntaxTheme = resolvePierreSyntaxThemeName(mode);
262
+ const [fileHovered, setFileHovered] = useState(false);
263
+ const [showFile, setShowFile] = useState(false);
264
+ const [showPurpose, setShowPurpose] = useState(false);
265
+ const muted = theme.colors.textMuted ?? theme.colors.textSecondary;
266
+ const color = constructColorsFromPierreTheme(pierreSyntaxTheme)[component.construct];
267
+ const okColor = '#3d9a5f';
268
+ const warnColor = theme.colors.textSecondary;
269
+
270
+ const tokenColor: Record<SubsystemDeclTokenKind, string> = {
271
+ keyword: theme.colors.secondary,
272
+ name: color,
273
+ member: theme.colors.info,
274
+ type: theme.colors.accent,
275
+ punctuation: muted,
276
+ string: theme.colors.success,
277
+ newline: '',
278
+ };
279
+ /** Fallback when wire tokens omit Shiki colors. */
280
+ const declarationTextColor = muted;
281
+
282
+ const declarationStartLine =
283
+ component.declarationRef?.startLine ??
284
+ verification?.declaration?.ref?.startLine ??
285
+ parseSourceLocation(verification?.anchor?.source_location) ??
286
+ undefined;
287
+
288
+ const openDeclarationFile = () => {
289
+ if (!onOpenFile || !component.file) return;
290
+ onOpenFile(
291
+ component.file,
292
+ declarationStartLine != null ? { startLine: declarationStartLine } : undefined,
293
+ );
294
+ };
295
+
296
+ const lineLocationLabel =
297
+ declarationStartLine != null ? (
298
+ <DetailLink onClick={onOpenFile ? openDeclarationFile : undefined}>
299
+ <span
300
+ style={{
301
+ color: theme.colors.accent ?? color,
302
+ fontFamily: theme.fonts.monospace,
303
+ fontSize: theme.fontSizes[0],
304
+ ...(onOpenFile ? clickableStyle : undefined),
305
+ }}
306
+ >
307
+ L{declarationStartLine}
308
+ </span>
309
+ </DetailLink>
310
+ ) : null;
311
+
312
+ const line = (
313
+ children: ReactNode,
314
+ key?: string,
315
+ indent?: boolean | number,
316
+ wrap: 'pre' | 'pre-wrap' | 'normal' = 'pre-wrap',
317
+ ) => {
318
+ const paddingLeft = typeof indent === 'number' ? indent : indent ? 16 : 0;
319
+ return (
320
+ <div
321
+ key={key}
322
+ style={{
323
+ display: 'flex',
324
+ alignItems: wrap === 'normal' ? 'flex-start' : 'center',
325
+ whiteSpace: wrap,
326
+ overflowWrap: 'anywhere',
327
+ minWidth: 0,
328
+ minHeight: 18,
329
+ ...(paddingLeft ? { paddingLeft } : {}),
330
+ }}
331
+ >
332
+ {children}
333
+ </div>
334
+ );
335
+ };
336
+ const commentStyle = { color: muted, fontStyle: 'italic' } as const;
337
+ const commentLine = (text: string, key?: string, indent?: boolean, onClick?: () => void) =>
338
+ line(
339
+ <DetailLink onClick={onClick}>
340
+ <span style={{ ...commentStyle, ...(onClick ? clickableStyle : undefined) }}>{text}</span>
341
+ </DetailLink>,
342
+ key,
343
+ indent,
344
+ );
345
+ const purposeStyle = {
346
+ color: theme.colors.text,
347
+ fontFamily: theme.fonts.body,
348
+ fontSize: theme.fontSizes[1],
349
+ lineHeight: 1.5,
350
+ minWidth: 0,
351
+ flex: 1,
352
+ } as const;
353
+
354
+ const lines: ReactNode[] = [];
355
+ const ghMatch = /^pkg:github\/([^/]+)\/([^/#?]+)/.exec(component.purl ?? '');
356
+ const toggleBtn = (on: boolean, onClick: () => void, title: string, Icon: typeof FileText) => (
357
+ <button
358
+ type="button"
359
+ title={title}
360
+ aria-label={title}
361
+ onClick={onClick}
362
+ style={{
363
+ display: 'flex',
364
+ alignItems: 'center',
365
+ justifyContent: 'center',
366
+ width: 20,
367
+ height: 20,
368
+ padding: 0,
369
+ border: 'none',
370
+ borderRadius: 4,
371
+ background: 'transparent',
372
+ color: on ? theme.colors.accent : muted,
373
+ cursor: 'pointer',
374
+ }}
375
+ >
376
+ <Icon size={13} />
377
+ </button>
378
+ );
379
+ const verifyBusy = verification?.phase === 'checking';
380
+ const headerActions = (
381
+ <span style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 2 }}>
382
+ {onVerify && (
383
+ <button
384
+ type="button"
385
+ title="Verify against graphify"
386
+ aria-label="Verify against graphify"
387
+ disabled={verifyBusy}
388
+ onClick={(e) => {
389
+ e.stopPropagation();
390
+ onVerify(component.id);
391
+ }}
392
+ style={{
393
+ display: 'flex',
394
+ alignItems: 'center',
395
+ gap: 4,
396
+ height: 20,
397
+ padding: '0 6px',
398
+ border: `1px solid ${theme.colors.border}`,
399
+ borderRadius: 4,
400
+ background: 'transparent',
401
+ color: verifyBusy ? muted : theme.colors.textSecondary,
402
+ cursor: verifyBusy ? 'wait' : 'pointer',
403
+ fontSize: theme.fontSizes[0],
404
+ fontFamily: theme.fonts.body,
405
+ opacity: verifyBusy ? 0.7 : 1,
406
+ }}
407
+ >
408
+ <ShieldCheck size={12} />
409
+ {verifyBusy ? '…' : 'Verify'}
410
+ </button>
411
+ )}
412
+ {toggleBtn(showFile, () => setShowFile((v) => !v), 'Toggle file path', FileText)}
413
+ {lineLocationLabel}
414
+ {component.purpose?.trim() &&
415
+ toggleBtn(showPurpose, () => setShowPurpose((v) => !v), 'Toggle description', AlignLeft)}
416
+ </span>
417
+ );
418
+
419
+ if (ghMatch) {
420
+ const [, ghOwner, ghRepo] = ghMatch;
421
+ lines.push(
422
+ line(
423
+ <span style={{ display: 'flex', alignItems: 'center', gap: 6, width: '100%' }}>
424
+ <img
425
+ src={`https://github.com/${ghOwner}.png?size=40`}
426
+ alt=""
427
+ width={18}
428
+ height={18}
429
+ style={{ borderRadius: 4, flexShrink: 0 }}
430
+ onError={(e) => {
431
+ e.currentTarget.style.display = 'none';
432
+ }}
433
+ />
434
+ <span
435
+ style={{
436
+ color: theme.colors.textSecondary ?? muted,
437
+ fontFamily: theme.fonts.body,
438
+ fontSize: theme.fontSizes[1],
439
+ }}
440
+ >
441
+ {ghRepo}
442
+ </span>
443
+ {headerActions}
444
+ </span>,
445
+ 'repo',
446
+ ),
447
+ );
448
+ } else if (component.purl) {
449
+ lines.push(
450
+ line(
451
+ <span style={{ display: 'flex', alignItems: 'center', gap: 6, width: '100%' }}>
452
+ <span style={commentStyle}>{`// ${formatPurl(component.purl)}`}</span>
453
+ {headerActions}
454
+ </span>,
455
+ 'purl',
456
+ ),
457
+ );
458
+ } else if (onVerify) {
459
+ lines.push(line(headerActions, 'actions'));
460
+ }
461
+
462
+ if (verification && verification.phase !== 'idle') {
463
+ const summary = verificationSummary(verification, muted, okColor, warnColor);
464
+ if (summary.text) {
465
+ lines.push(
466
+ line(
467
+ <span
468
+ style={{
469
+ color: summary.color,
470
+ fontFamily: theme.fonts.body,
471
+ fontSize: theme.fontSizes[0],
472
+ whiteSpace: 'normal',
473
+ }}
474
+ >
475
+ {summary.text}
476
+ </span>,
477
+ 'verify-status',
478
+ ),
479
+ );
480
+ }
481
+ if (
482
+ verification.anchor?.resolution === 'ambiguous' &&
483
+ verification.anchor.candidates &&
484
+ verification.anchor.candidates.length > 0
485
+ ) {
486
+ for (const c of verification.anchor.candidates.slice(0, 5)) {
487
+ lines.push(
488
+ commentLine(
489
+ `// ${c.label}${c.source_file ? ` — ${c.source_file}` : ''}`,
490
+ `cand-${c.nodeId}`,
491
+ ),
492
+ );
493
+ }
494
+ }
495
+ if (verification.signature?.skipped && verification.signature.reason) {
496
+ lines.push(
497
+ commentLine(
498
+ `// why: ${verification.signature.reason}`,
499
+ 'verify-skip-reason',
500
+ ),
501
+ );
502
+ }
503
+ }
504
+
505
+ if (showFile && component.file) {
506
+ lines.push(
507
+ line(
508
+ <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>
509
+ <DetailLink onClick={onOpenFile ? openDeclarationFile : undefined}>
510
+ <span
511
+ onMouseEnter={() => setFileHovered(true)}
512
+ onMouseLeave={() => setFileHovered(false)}
513
+ style={{
514
+ color: theme.colors.textSecondary ?? muted,
515
+ fontFamily: theme.fonts.body,
516
+ fontSize: theme.fontSizes[1],
517
+ textDecoration: fileHovered && onOpenFile ? 'underline' : undefined,
518
+ textUnderlineOffset: 2,
519
+ }}
520
+ >
521
+ {component.file}
522
+ </span>
523
+ </DetailLink>
524
+ {lineLocationLabel}
525
+ </span>,
526
+ 'file',
527
+ ),
528
+ );
529
+ }
530
+
531
+ const containerRef = useRef<HTMLDivElement>(null);
532
+ const [printWidth, setPrintWidth] = useState(80);
533
+
534
+ useEffect(() => {
535
+ const el = containerRef.current;
536
+ if (!el) return;
537
+
538
+ function measureWidth() {
539
+ const probe = document.createElement('div');
540
+ probe.style.cssText =
541
+ 'position:absolute;visibility:hidden;white-space:pre;' +
542
+ `font-family:${getComputedStyle(el!).fontFamily};` +
543
+ `font-size:${getComputedStyle(el!).fontSize};` +
544
+ 'line-height:1;width:auto';
545
+ probe.textContent = 'x';
546
+ document.body.appendChild(probe);
547
+ const ch = probe.getBoundingClientRect().width || 8.4;
548
+ document.body.removeChild(probe);
549
+ setPrintWidth(Math.max(40, Math.floor(el!.clientWidth / ch)));
550
+ }
551
+
552
+ measureWidth();
553
+ const ro = new ResizeObserver(measureWidth);
554
+ ro.observe(el);
555
+ return () => ro.disconnect();
556
+ }, []);
557
+
558
+ const [tokens, setTokens] = useState(component.tokens ?? []);
559
+ useEffect(() => {
560
+ if (component.tokens) {
561
+ setTokens(component.tokens);
562
+ return;
563
+ }
564
+ let cancelled = false;
565
+ tokenizeComponent(component, printWidth, pierreSyntaxTheme).then((t) => {
566
+ if (!cancelled) setTokens(t);
567
+ });
568
+ return () => {
569
+ cancelled = true;
570
+ };
571
+ }, [component, printWidth, pierreSyntaxTheme]);
572
+ const declLines: ReactNode[][] = [[]];
573
+ let di = 0;
574
+ for (const tok of tokens) {
575
+ if (tok.kind === 'newline') {
576
+ declLines.push([]);
577
+ di++;
578
+ continue;
579
+ }
580
+ declLines[di].push(
581
+ <span
582
+ key={`${di}-${declLines[di].length}`}
583
+ style={{ color: tok.color ?? tokenColor[tok.kind] ?? declarationTextColor }}
584
+ >
585
+ {tok.text}
586
+ </span>,
587
+ );
588
+ }
589
+ for (let li = 0; li < declLines.length; li++) {
590
+ if (declLines[li].length === 0) continue;
591
+ lines.push(
592
+ <div
593
+ key={`decl-${li}`}
594
+ style={{
595
+ display: 'flex',
596
+ alignItems: 'center',
597
+ whiteSpace: 'pre-wrap',
598
+ overflowWrap: 'anywhere',
599
+ minWidth: 0,
600
+ minHeight: 18,
601
+ }}
602
+ >
603
+ {declLines[li]}
604
+ </div>,
605
+ );
606
+ }
607
+
608
+ if (showPurpose && component.purpose) {
609
+ lines.push(line(<div style={{ height: 6 }} />, 'purpose-gap', false, 'normal'));
610
+ component.purpose.split('\n').forEach((purposeLine, i) =>
611
+ lines.push(
612
+ line(
613
+ <span style={purposeStyle} key={`purpose${i}`}>
614
+ {purposeLine.trim()}
615
+ </span>,
616
+ `purpose${i}`,
617
+ false,
618
+ 'normal',
619
+ ),
620
+ ),
621
+ );
622
+ }
623
+
624
+ return (
625
+ <div
626
+ ref={containerRef}
627
+ style={{
628
+ width: '100%',
629
+ minWidth: 0,
630
+ boxSizing: 'border-box',
631
+ background: theme.colors.backgroundSecondary,
632
+ padding: '10px 12px',
633
+ fontFamily: theme.fonts.monospace,
634
+ fontSize: theme.fontSizes[1],
635
+ lineHeight: 1.7,
636
+ overflowWrap: 'anywhere',
637
+ ...(maxWidth != null ? { maxWidth } : {}),
638
+ }}
639
+ >
640
+ {lines}
641
+ </div>
642
+ );
643
+ }