@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,1045 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import { GraphRenderer } from '../../components/GraphRenderer';
4
+ import type { ExtendedCanvas } from '@principal-ai/subsystems-core';
5
+ import { ThemeProvider, defaultEditorTheme } from '@principal-ade/industry-theme';
6
+ import type { Theme } from '@principal-ade/industry-theme';
7
+
8
+ const meta = {
9
+ title: 'Audit/WideNodesTesting',
10
+ component: GraphRenderer,
11
+ parameters: {
12
+ layout: 'fullscreen',
13
+ },
14
+ tags: ['autodocs'],
15
+ } satisfies Meta<typeof GraphRenderer>;
16
+
17
+ export default meta;
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ /**
21
+ * Create theme with 16px base font
22
+ */
23
+ const theme16px: Theme = {
24
+ ...defaultEditorTheme,
25
+ fontSizes: [16, 18, 20, 22, 24, 28, 36, 52, 68, 100],
26
+ };
27
+
28
+ /**
29
+ * Large workflow event names for testing
30
+ */
31
+ const WORKFLOW_EVENTS = [
32
+ 'Analysis Started',
33
+ 'FileTree Built',
34
+ 'Packages Discovered',
35
+ 'Canvases Discovered',
36
+ 'Executions Discovered',
37
+ 'Library Loaded',
38
+ 'Discovery Complete',
39
+ 'Validation Started',
40
+ 'File Parsed',
41
+ 'Type Detected',
42
+ 'Canvas Validated',
43
+ 'Workflow Validated',
44
+ 'Execution Validated',
45
+ 'Library Validated',
46
+ 'Rules Executed',
47
+ 'Results Aggregated',
48
+ 'Validation Complete',
49
+ 'Validation Error',
50
+ 'Config Saved',
51
+ 'Report Generated',
52
+ ];
53
+
54
+ /**
55
+ * Generate colors based on category
56
+ */
57
+ const getEventColor = (name: string): string => {
58
+ if (name.includes('Started')) return '#22c55e';
59
+ if (name.includes('Complete')) return '#22c55e';
60
+ if (name.includes('Error')) return '#ef4444';
61
+ if (name.includes('Validated')) return '#8b5cf6';
62
+ if (name.includes('Discovered')) return '#f59e0b';
63
+ return '#3b82f6';
64
+ };
65
+
66
+ /**
67
+ * Main story: 200×75 with 16px font - Large workflow
68
+ */
69
+ export const WideNodes_200x75_ManyNodes: Story = {
70
+ render: () => {
71
+ const theme = defaultEditorTheme;
72
+
73
+ const canvas: ExtendedCanvas = {
74
+ nodes: WORKFLOW_EVENTS.map((event, idx) => ({
75
+ id: `event-${idx}`,
76
+ type: 'text',
77
+ x: 100,
78
+ y: 80 + idx * 120,
79
+ width: 200,
80
+ height: 75,
81
+ text: event,
82
+ color: getEventColor(event),
83
+ pv: {
84
+ name: event,
85
+ shape: 'roundedRect',
86
+ otel: {
87
+ kind: 'event',
88
+ category: event.includes('Started') || event.includes('Complete') ? 'lifecycle' : 'operation',
89
+ },
90
+ },
91
+ })),
92
+ edges: WORKFLOW_EVENTS.slice(0, -1).map((_, idx) => ({
93
+ id: `edge-${idx}`,
94
+ fromNode: `event-${idx}`,
95
+ toNode: `event-${idx + 1}`,
96
+ fromSide: 'bottom' as const,
97
+ toSide: 'top' as const,
98
+ })),
99
+ };
100
+
101
+ return (
102
+ <div style={{ padding: '32px' }}>
103
+ <h1 style={{
104
+ marginBottom: '16px',
105
+ fontSize: theme.fontSizes[7],
106
+ color: theme.colors.text,
107
+ }}>
108
+ Wide Nodes: 200×75 with 16px Font
109
+ </h1>
110
+ <p style={{
111
+ marginBottom: '24px',
112
+ fontSize: theme.fontSizes[2],
113
+ color: theme.colors.textSecondary,
114
+ maxWidth: '1000px',
115
+ }}>
116
+ Testing wider aspect ratio (200×75) with 16px font size. This shows {WORKFLOW_EVENTS.length} nodes
117
+ in a complete validation workflow to see how the design scales.
118
+ </p>
119
+
120
+ <div style={{
121
+ display: 'flex',
122
+ gap: '16px',
123
+ marginBottom: '24px',
124
+ padding: '16px',
125
+ backgroundColor: theme.colors.surface,
126
+ borderRadius: '8px',
127
+ }}>
128
+ <div style={{
129
+ flex: 1,
130
+ padding: '12px',
131
+ backgroundColor: theme.colors.backgroundSecondary,
132
+ borderRadius: '6px',
133
+ }}>
134
+ <div style={{ fontSize: theme.fontSizes[0], color: theme.colors.textMuted, marginBottom: '4px' }}>
135
+ Dimensions
136
+ </div>
137
+ <div style={{ fontSize: theme.fontSizes[3], fontFamily: theme.fonts.monospace, color: theme.colors.text }}>
138
+ 200 × 75
139
+ </div>
140
+ </div>
141
+ <div style={{
142
+ flex: 1,
143
+ padding: '12px',
144
+ backgroundColor: theme.colors.backgroundSecondary,
145
+ borderRadius: '6px',
146
+ }}>
147
+ <div style={{ fontSize: theme.fontSizes[0], color: theme.colors.textMuted, marginBottom: '4px' }}>
148
+ Font Size
149
+ </div>
150
+ <div style={{ fontSize: theme.fontSizes[3], fontFamily: theme.fonts.monospace, color: theme.colors.text }}>
151
+ 16px
152
+ </div>
153
+ </div>
154
+ <div style={{
155
+ flex: 1,
156
+ padding: '12px',
157
+ backgroundColor: theme.colors.backgroundSecondary,
158
+ borderRadius: '6px',
159
+ }}>
160
+ <div style={{ fontSize: theme.fontSizes[0], color: theme.colors.textMuted, marginBottom: '4px' }}>
161
+ Aspect Ratio
162
+ </div>
163
+ <div style={{ fontSize: theme.fontSizes[3], fontFamily: theme.fonts.monospace, color: theme.colors.text }}>
164
+ 2.67:1
165
+ </div>
166
+ </div>
167
+ <div style={{
168
+ flex: 1,
169
+ padding: '12px',
170
+ backgroundColor: theme.colors.backgroundSecondary,
171
+ borderRadius: '6px',
172
+ }}>
173
+ <div style={{ fontSize: theme.fontSizes[0], color: theme.colors.textMuted, marginBottom: '4px' }}>
174
+ Nodes
175
+ </div>
176
+ <div style={{ fontSize: theme.fontSizes[3], fontFamily: theme.fonts.monospace, color: theme.colors.text }}>
177
+ {WORKFLOW_EVENTS.length}
178
+ </div>
179
+ </div>
180
+ </div>
181
+
182
+ <div style={{
183
+ backgroundColor: theme.colors.background,
184
+ border: `2px solid ${theme.colors.border}`,
185
+ borderRadius: '8px',
186
+ overflow: 'hidden',
187
+ }}>
188
+ <ThemeProvider theme={theme16px}>
189
+ <GraphRenderer
190
+ canvas={canvas}
191
+ height={2600}
192
+ width="100%"
193
+ />
194
+ </ThemeProvider>
195
+ </div>
196
+ </div>
197
+ );
198
+ },
199
+ };
200
+
201
+ /**
202
+ * Compare different heights with 200px width and 16px font
203
+ */
204
+ export const HeightComparison_200Width_16pxFont: Story = {
205
+ render: () => {
206
+ const theme = defaultEditorTheme;
207
+
208
+ const heights = [
209
+ { label: '200×70 (2.86:1)', height: 70, description: 'Very wide, minimal vertical padding' },
210
+ { label: '200×75 (2.67:1)', height: 75, description: 'Wide, compact vertical spacing' },
211
+ { label: '200×80 (2.5:1)', height: 80, description: 'Wide, balanced spacing' },
212
+ { label: '200×85 (2.35:1)', height: 85, description: 'Wide, more vertical breathing room' },
213
+ { label: '200×90 (2.22:1)', height: 90, description: 'Wide, generous vertical spacing' },
214
+ ];
215
+
216
+ const sampleEvents = [
217
+ 'Analysis Started',
218
+ 'File Parsed',
219
+ 'Canvas Validated',
220
+ 'Results Aggregated',
221
+ 'Validation Complete',
222
+ ];
223
+
224
+ return (
225
+ <div style={{ padding: '32px' }}>
226
+ <h1 style={{
227
+ marginBottom: '16px',
228
+ fontSize: theme.fontSizes[7],
229
+ color: theme.colors.text,
230
+ }}>
231
+ Height Comparison: 200px Width, 16px Font
232
+ </h1>
233
+ <p style={{
234
+ marginBottom: '32px',
235
+ fontSize: theme.fontSizes[2],
236
+ color: theme.colors.textSecondary,
237
+ }}>
238
+ Testing different heights with fixed 200px width and 16px font to find the optimal aspect ratio.
239
+ </p>
240
+
241
+ {heights.map((config, idx) => {
242
+ const canvas: ExtendedCanvas = {
243
+ nodes: sampleEvents.map((event, eventIdx) => ({
244
+ id: `${idx}-${eventIdx}`,
245
+ type: 'text',
246
+ x: 100,
247
+ y: 80 + eventIdx * (config.height + 30),
248
+ width: 200,
249
+ height: config.height,
250
+ text: event,
251
+ color: getEventColor(event),
252
+ pv: {
253
+ name: event,
254
+ shape: 'roundedRect',
255
+ },
256
+ })),
257
+ edges: sampleEvents.slice(0, -1).map((_, eventIdx) => ({
258
+ id: `edge-${idx}-${eventIdx}`,
259
+ fromNode: `${idx}-${eventIdx}`,
260
+ toNode: `${idx}-${eventIdx + 1}`,
261
+ fromSide: 'bottom' as const,
262
+ toSide: 'top' as const,
263
+ })),
264
+ };
265
+
266
+ return (
267
+ <div
268
+ key={idx}
269
+ style={{
270
+ marginBottom: '40px',
271
+ padding: '24px',
272
+ backgroundColor: theme.colors.surface,
273
+ border: `1px solid ${theme.colors.border}`,
274
+ borderRadius: '8px',
275
+ }}
276
+ >
277
+ <div style={{
278
+ display: 'flex',
279
+ justifyContent: 'space-between',
280
+ alignItems: 'center',
281
+ marginBottom: '16px',
282
+ }}>
283
+ <div>
284
+ <h3 style={{
285
+ fontSize: theme.fontSizes[3],
286
+ fontWeight: theme.fontWeights.semibold,
287
+ color: theme.colors.text,
288
+ marginBottom: '4px',
289
+ }}>
290
+ {config.label}
291
+ </h3>
292
+ <p style={{
293
+ fontSize: theme.fontSizes[1],
294
+ color: theme.colors.textSecondary,
295
+ }}>
296
+ {config.description}
297
+ </p>
298
+ </div>
299
+ {config.height === 75 && (
300
+ <div style={{
301
+ padding: '6px 12px',
302
+ backgroundColor: theme.colors.primary,
303
+ color: theme.colors.background,
304
+ borderRadius: '4px',
305
+ fontSize: theme.fontSizes[0],
306
+ fontWeight: theme.fontWeights.bold,
307
+ }}>
308
+ ⭐ Recommended
309
+ </div>
310
+ )}
311
+ </div>
312
+
313
+ <div style={{
314
+ backgroundColor: theme.colors.background,
315
+ border: `2px solid ${config.height === 75 ? theme.colors.primary : theme.colors.border}`,
316
+ borderRadius: '6px',
317
+ overflow: 'hidden',
318
+ }}>
319
+ <ThemeProvider theme={theme16px}>
320
+ <GraphRenderer
321
+ canvas={canvas}
322
+ height={700}
323
+ width="100%"
324
+ />
325
+ </ThemeProvider>
326
+ </div>
327
+ </div>
328
+ );
329
+ })}
330
+ </div>
331
+ );
332
+ },
333
+ };
334
+
335
+ /**
336
+ * Side-by-side comparison of current vs proposed
337
+ */
338
+ export const CurrentVsProposed: Story = {
339
+ render: () => {
340
+ const theme = defaultEditorTheme;
341
+ const theme12px = defaultEditorTheme;
342
+
343
+ const testEvents = WORKFLOW_EVENTS.slice(0, 12); // First 12 events
344
+
345
+ const configs = [
346
+ {
347
+ title: 'Current Standard',
348
+ description: '200×100 with 12px font',
349
+ width: 200,
350
+ height: 100,
351
+ theme: theme12px,
352
+ color: theme.colors.textSecondary,
353
+ },
354
+ {
355
+ title: 'Proposed Wide',
356
+ description: '200×75 with 16px font',
357
+ width: 200,
358
+ height: 75,
359
+ theme: theme16px,
360
+ color: theme.colors.primary,
361
+ },
362
+ ];
363
+
364
+ return (
365
+ <div style={{ padding: '32px' }}>
366
+ <h1 style={{
367
+ marginBottom: '16px',
368
+ fontSize: theme.fontSizes[7],
369
+ color: theme.colors.text,
370
+ }}>
371
+ Current vs Proposed Wide Design
372
+ </h1>
373
+ <p style={{
374
+ marginBottom: '32px',
375
+ fontSize: theme.fontSizes[2],
376
+ color: theme.colors.textSecondary,
377
+ maxWidth: '1000px',
378
+ }}>
379
+ Direct comparison between current standard (200×100, 12px) and proposed wide design (200×75, 16px).
380
+ Notice the improved readability with larger font while maintaining compact vertical space.
381
+ </p>
382
+
383
+ <div style={{
384
+ display: 'grid',
385
+ gridTemplateColumns: '1fr 1fr',
386
+ gap: '32px',
387
+ }}>
388
+ {configs.map((config, idx) => {
389
+ const canvas: ExtendedCanvas = {
390
+ nodes: testEvents.map((event, eventIdx) => ({
391
+ id: `${idx}-${eventIdx}`,
392
+ type: 'text',
393
+ x: 100,
394
+ y: 80 + eventIdx * (config.height + 30),
395
+ width: config.width,
396
+ height: config.height,
397
+ text: event,
398
+ color: getEventColor(event),
399
+ pv: {
400
+ name: event,
401
+ shape: 'roundedRect',
402
+ otel: {
403
+ kind: 'event',
404
+ category: event.includes('Started') || event.includes('Complete') ? 'lifecycle' : 'operation',
405
+ },
406
+ },
407
+ })),
408
+ edges: testEvents.slice(0, -1).map((_, eventIdx) => ({
409
+ id: `edge-${idx}-${eventIdx}`,
410
+ fromNode: `${idx}-${eventIdx}`,
411
+ toNode: `${idx}-${eventIdx + 1}`,
412
+ fromSide: 'bottom' as const,
413
+ toSide: 'top' as const,
414
+ })),
415
+ };
416
+
417
+ return (
418
+ <div key={idx}>
419
+ <div style={{
420
+ marginBottom: '16px',
421
+ padding: '16px',
422
+ backgroundColor: theme.colors.surface,
423
+ borderRadius: '8px',
424
+ border: `2px solid ${config.color}`,
425
+ }}>
426
+ <h3 style={{
427
+ fontSize: theme.fontSizes[3],
428
+ fontWeight: theme.fontWeights.semibold,
429
+ color: config.color,
430
+ marginBottom: '4px',
431
+ }}>
432
+ {config.title}
433
+ </h3>
434
+ <p style={{
435
+ fontSize: theme.fontSizes[1],
436
+ color: theme.colors.textSecondary,
437
+ marginBottom: '12px',
438
+ }}>
439
+ {config.description}
440
+ </p>
441
+ <div style={{
442
+ display: 'flex',
443
+ gap: '16px',
444
+ fontSize: theme.fontSizes[1],
445
+ fontFamily: theme.fonts.monospace,
446
+ }}>
447
+ <div>
448
+ <span style={{ color: theme.colors.textMuted }}>Size:</span>{' '}
449
+ <span style={{ color: theme.colors.text }}>{config.width}×{config.height}</span>
450
+ </div>
451
+ <div>
452
+ <span style={{ color: theme.colors.textMuted }}>Font:</span>{' '}
453
+ <span style={{ color: theme.colors.text }}>{config.theme.fontSizes[0]}px</span>
454
+ </div>
455
+ <div>
456
+ <span style={{ color: theme.colors.textMuted }}>Ratio:</span>{' '}
457
+ <span style={{ color: theme.colors.text }}>{(config.width / config.height).toFixed(2)}:1</span>
458
+ </div>
459
+ </div>
460
+ </div>
461
+
462
+ <div style={{
463
+ backgroundColor: theme.colors.background,
464
+ border: `2px solid ${config.color}`,
465
+ borderRadius: '8px',
466
+ overflow: 'hidden',
467
+ }}>
468
+ <ThemeProvider theme={config.theme}>
469
+ <GraphRenderer
470
+ canvas={canvas}
471
+ height={1700}
472
+ width="100%"
473
+ />
474
+ </ThemeProvider>
475
+ </div>
476
+ </div>
477
+ );
478
+ })}
479
+ </div>
480
+
481
+ <div style={{
482
+ marginTop: '40px',
483
+ padding: '24px',
484
+ backgroundColor: theme.colors.backgroundSecondary,
485
+ border: `2px solid ${theme.colors.primary}`,
486
+ borderRadius: '8px',
487
+ }}>
488
+ <h3 style={{
489
+ marginBottom: '16px',
490
+ fontSize: theme.fontSizes[4],
491
+ color: theme.colors.text,
492
+ }}>
493
+ Key Differences
494
+ </h3>
495
+ <div style={{
496
+ display: 'grid',
497
+ gridTemplateColumns: '1fr 1fr',
498
+ gap: '24px',
499
+ fontSize: theme.fontSizes[1],
500
+ color: theme.colors.text,
501
+ lineHeight: 1.8,
502
+ }}>
503
+ <div>
504
+ <strong style={{ color: theme.colors.textSecondary }}>Current (200×100, 12px)</strong>
505
+ <ul style={{ paddingLeft: '20px', marginTop: '8px', color: theme.colors.textSecondary }}>
506
+ <li>More vertical space per node</li>
507
+ <li>Smaller font requires good vision</li>
508
+ <li>Square-ish aspect ratio (2:1)</li>
509
+ <li>More vertical scrolling needed</li>
510
+ </ul>
511
+ </div>
512
+ <div>
513
+ <strong style={{ color: theme.colors.primary }}>Proposed (200×75, 16px)</strong>
514
+ <ul style={{ paddingLeft: '20px', marginTop: '8px', color: theme.colors.text }}>
515
+ <li>✨ 33% larger font for better readability</li>
516
+ <li>✨ 25% less vertical space (more compact)</li>
517
+ <li>✨ Wider aspect ratio (2.67:1)</li>
518
+ <li>✨ Fits more nodes on screen</li>
519
+ </ul>
520
+ </div>
521
+ </div>
522
+ </div>
523
+ </div>
524
+ );
525
+ },
526
+ };
527
+
528
+ /**
529
+ * Ultra-wide aspect ratios
530
+ */
531
+ export const UltraWideRatios: Story = {
532
+ render: () => {
533
+ const theme = defaultEditorTheme;
534
+
535
+ const configs = [
536
+ { label: '220×70 (3.14:1)', width: 220, height: 70 },
537
+ { label: '240×75 (3.2:1)', width: 240, height: 75 },
538
+ { label: '200×65 (3.08:1)', width: 200, height: 65 },
539
+ { label: '200×75 (2.67:1) ⭐', width: 200, height: 75 },
540
+ ];
541
+
542
+ const sampleEvents = [
543
+ 'Analysis Started',
544
+ 'Packages Discovered',
545
+ 'Canvas Validated',
546
+ 'Validation Complete',
547
+ ];
548
+
549
+ return (
550
+ <div style={{ padding: '32px' }}>
551
+ <h1 style={{
552
+ marginBottom: '16px',
553
+ fontSize: theme.fontSizes[7],
554
+ color: theme.colors.text,
555
+ }}>
556
+ Ultra-Wide Aspect Ratios (16px Font)
557
+ </h1>
558
+ <p style={{
559
+ marginBottom: '32px',
560
+ fontSize: theme.fontSizes[2],
561
+ color: theme.colors.textSecondary,
562
+ }}>
563
+ Exploring very wide aspect ratios (2.67:1 to 3.2:1) with 16px font. These create a more horizontal,
564
+ streamlined appearance.
565
+ </p>
566
+
567
+ <div style={{
568
+ display: 'grid',
569
+ gridTemplateColumns: 'repeat(2, 1fr)',
570
+ gap: '32px',
571
+ }}>
572
+ {configs.map((config, idx) => {
573
+ const canvas: ExtendedCanvas = {
574
+ nodes: sampleEvents.map((event, eventIdx) => ({
575
+ id: `${idx}-${eventIdx}`,
576
+ type: 'text',
577
+ x: 100,
578
+ y: 80 + eventIdx * (config.height + 30),
579
+ width: config.width,
580
+ height: config.height,
581
+ text: event,
582
+ color: getEventColor(event),
583
+ pv: {
584
+ name: event,
585
+ shape: 'roundedRect',
586
+ },
587
+ })),
588
+ edges: [],
589
+ };
590
+
591
+ return (
592
+ <div
593
+ key={idx}
594
+ style={{
595
+ padding: '20px',
596
+ backgroundColor: theme.colors.surface,
597
+ border: `1px solid ${theme.colors.border}`,
598
+ borderRadius: '8px',
599
+ }}
600
+ >
601
+ <h3 style={{
602
+ fontSize: theme.fontSizes[2],
603
+ fontWeight: theme.fontWeights.semibold,
604
+ color: theme.colors.text,
605
+ marginBottom: '12px',
606
+ }}>
607
+ {config.label}
608
+ </h3>
609
+
610
+ <div style={{
611
+ backgroundColor: theme.colors.background,
612
+ border: `2px solid ${theme.colors.border}`,
613
+ borderRadius: '6px',
614
+ overflow: 'hidden',
615
+ }}>
616
+ <ThemeProvider theme={theme16px}>
617
+ <GraphRenderer
618
+ canvas={canvas}
619
+ height={500}
620
+ width="100%"
621
+ />
622
+ </ThemeProvider>
623
+ </div>
624
+ </div>
625
+ );
626
+ })}
627
+ </div>
628
+ </div>
629
+ );
630
+ },
631
+ };
632
+
633
+ /**
634
+ * Compare 200×90 specifically against other options
635
+ */
636
+ export const Compare_200x90: Story = {
637
+ render: () => {
638
+ const theme = defaultEditorTheme;
639
+
640
+ const configs = [
641
+ {
642
+ title: 'Current Standard',
643
+ description: '200×100 with 12px font',
644
+ width: 200,
645
+ height: 100,
646
+ theme: defaultEditorTheme,
647
+ ratio: '2:1',
648
+ },
649
+ {
650
+ title: 'Proposed 200×90',
651
+ description: '200×90 with 16px font',
652
+ width: 200,
653
+ height: 90,
654
+ theme: theme16px,
655
+ ratio: '2.22:1',
656
+ highlight: true,
657
+ },
658
+ {
659
+ title: 'Ultra-Wide Option',
660
+ description: '200×75 with 16px font',
661
+ width: 200,
662
+ height: 75,
663
+ theme: theme16px,
664
+ ratio: '2.67:1',
665
+ },
666
+ ];
667
+
668
+ const sampleEvents = WORKFLOW_EVENTS.slice(0, 10);
669
+
670
+ return (
671
+ <div style={{ padding: '32px' }}>
672
+ <h1 style={{
673
+ marginBottom: '16px',
674
+ fontSize: theme.fontSizes[7],
675
+ color: theme.colors.text,
676
+ }}>
677
+ 200×90 Comparison
678
+ </h1>
679
+ <p style={{
680
+ marginBottom: '32px',
681
+ fontSize: theme.fontSizes[2],
682
+ color: theme.colors.textSecondary,
683
+ maxWidth: '1000px',
684
+ }}>
685
+ Direct comparison of 200×90 (2.22:1 aspect ratio) against current standard and ultra-wide option.
686
+ The 200×90 option balances improved readability (16px font) with generous vertical spacing.
687
+ </p>
688
+
689
+ <div style={{
690
+ display: 'grid',
691
+ gridTemplateColumns: 'repeat(3, 1fr)',
692
+ gap: '24px',
693
+ }}>
694
+ {configs.map((config, idx) => {
695
+ const canvas: ExtendedCanvas = {
696
+ nodes: sampleEvents.map((event, eventIdx) => ({
697
+ id: `${idx}-${eventIdx}`,
698
+ type: 'text',
699
+ x: 100,
700
+ y: 80 + eventIdx * (config.height + 30),
701
+ width: config.width,
702
+ height: config.height,
703
+ text: event,
704
+ color: getEventColor(event),
705
+ pv: {
706
+ name: event,
707
+ shape: 'roundedRect',
708
+ otel: {
709
+ kind: 'event',
710
+ category: event.includes('Started') || event.includes('Complete') ? 'lifecycle' : 'operation',
711
+ },
712
+ },
713
+ })),
714
+ edges: sampleEvents.slice(0, -1).map((_, eventIdx) => ({
715
+ id: `edge-${idx}-${eventIdx}`,
716
+ fromNode: `${idx}-${eventIdx}`,
717
+ toNode: `${idx}-${eventIdx + 1}`,
718
+ fromSide: 'bottom' as const,
719
+ toSide: 'top' as const,
720
+ })),
721
+ };
722
+
723
+ return (
724
+ <div key={idx}>
725
+ <div style={{
726
+ marginBottom: '16px',
727
+ padding: '16px',
728
+ backgroundColor: config.highlight ? theme.colors.primary : theme.colors.surface,
729
+ borderRadius: '8px',
730
+ border: `2px solid ${config.highlight ? theme.colors.primary : theme.colors.border}`,
731
+ }}>
732
+ <div style={{
733
+ display: 'flex',
734
+ justifyContent: 'space-between',
735
+ alignItems: 'flex-start',
736
+ marginBottom: '8px',
737
+ }}>
738
+ <h3 style={{
739
+ fontSize: theme.fontSizes[2],
740
+ fontWeight: theme.fontWeights.semibold,
741
+ color: config.highlight ? theme.colors.background : theme.colors.text,
742
+ }}>
743
+ {config.title}
744
+ </h3>
745
+ {config.highlight && (
746
+ <div style={{
747
+ padding: '2px 6px',
748
+ backgroundColor: theme.colors.background,
749
+ color: theme.colors.primary,
750
+ borderRadius: '4px',
751
+ fontSize: theme.fontSizes[0],
752
+ fontWeight: theme.fontWeights.bold,
753
+ }}>
754
+ ⭐ Testing
755
+ </div>
756
+ )}
757
+ </div>
758
+ <p style={{
759
+ fontSize: theme.fontSizes[1],
760
+ color: config.highlight ? theme.colors.background : theme.colors.textSecondary,
761
+ marginBottom: '12px',
762
+ }}>
763
+ {config.description}
764
+ </p>
765
+ <div style={{
766
+ display: 'flex',
767
+ gap: '12px',
768
+ fontSize: theme.fontSizes[0],
769
+ fontFamily: theme.fonts.monospace,
770
+ color: config.highlight ? theme.colors.background : theme.colors.text,
771
+ }}>
772
+ <div>Ratio: {config.ratio}</div>
773
+ <div>•</div>
774
+ <div>Font: {config.theme.fontSizes[0]}px</div>
775
+ </div>
776
+ </div>
777
+
778
+ <div style={{
779
+ backgroundColor: theme.colors.background,
780
+ border: `3px solid ${config.highlight ? theme.colors.primary : theme.colors.border}`,
781
+ borderRadius: '8px',
782
+ overflow: 'hidden',
783
+ }}>
784
+ <ThemeProvider theme={config.theme}>
785
+ <GraphRenderer
786
+ canvas={canvas}
787
+ height={1400}
788
+ width="100%"
789
+ />
790
+ </ThemeProvider>
791
+ </div>
792
+ </div>
793
+ );
794
+ })}
795
+ </div>
796
+
797
+ <div style={{
798
+ marginTop: '40px',
799
+ padding: '24px',
800
+ backgroundColor: theme.colors.surface,
801
+ border: `2px solid ${theme.colors.primary}`,
802
+ borderRadius: '8px',
803
+ }}>
804
+ <h3 style={{
805
+ marginBottom: '16px',
806
+ fontSize: theme.fontSizes[4],
807
+ color: theme.colors.text,
808
+ }}>
809
+ Why 200×90 Works Well
810
+ </h3>
811
+ <div style={{
812
+ display: 'grid',
813
+ gridTemplateColumns: '1fr 1fr',
814
+ gap: '24px',
815
+ fontSize: theme.fontSizes[1],
816
+ lineHeight: 1.8,
817
+ }}>
818
+ <div>
819
+ <strong style={{ color: theme.colors.primary }}>vs. Current (200×100, 12px)</strong>
820
+ <ul style={{ paddingLeft: '20px', marginTop: '8px', color: theme.colors.text }}>
821
+ <li>✨ 33% larger font (12px → 16px)</li>
822
+ <li>✨ 10% less vertical space per node</li>
823
+ <li>✨ Better readability for longer event names</li>
824
+ <li>✨ More modern, accessible design</li>
825
+ </ul>
826
+ </div>
827
+ <div>
828
+ <strong style={{ color: theme.colors.primary }}>vs. Ultra-Wide (200×75, 16px)</strong>
829
+ <ul style={{ paddingLeft: '20px', marginTop: '8px', color: theme.colors.text }}>
830
+ <li>✨ 20% more vertical breathing room</li>
831
+ <li>✨ Less cramped appearance</li>
832
+ <li>✨ Accommodates badges/states better</li>
833
+ <li>✨ More balanced aspect ratio (2.22:1 vs 2.67:1)</li>
834
+ </ul>
835
+ </div>
836
+ </div>
837
+ </div>
838
+ </div>
839
+ );
840
+ },
841
+ };
842
+
843
+ /**
844
+ * Dense workflow - many nodes on one screen
845
+ */
846
+ export const DenseWorkflowView: Story = {
847
+ render: () => {
848
+ const theme = defaultEditorTheme;
849
+
850
+ // Create a branching workflow with many nodes
851
+ const canvas: ExtendedCanvas = {
852
+ nodes: [
853
+ // Main flow
854
+ ...WORKFLOW_EVENTS.slice(0, 10).map((event, idx) => ({
855
+ id: `main-${idx}`,
856
+ type: 'text',
857
+ x: 100,
858
+ y: 80 + idx * 140,
859
+ width: 200,
860
+ height: 90,
861
+ text: event,
862
+ color: getEventColor(event),
863
+ pv: {
864
+ name: event,
865
+ shape: 'roundedRect',
866
+ otel: { kind: 'event' as const, category: 'operation' as const },
867
+ },
868
+ })),
869
+ // Branch 1
870
+ ...['Config Loaded', 'Settings Validated', 'Plugins Initialized'].map((event, idx) => ({
871
+ id: `branch1-${idx}`,
872
+ type: 'text',
873
+ x: 400,
874
+ y: 220 + idx * 140,
875
+ width: 200,
876
+ height: 90,
877
+ text: event,
878
+ color: '#8b5cf6',
879
+ pv: {
880
+ name: event,
881
+ shape: 'roundedRect',
882
+ },
883
+ })),
884
+ // Branch 2
885
+ ...['Cache Checked', 'Cache Hit', 'Data Loaded'].map((event, idx) => ({
886
+ id: `branch2-${idx}`,
887
+ type: 'text',
888
+ x: 700,
889
+ y: 220 + idx * 140,
890
+ width: 200,
891
+ height: 90,
892
+ text: event,
893
+ color: '#f59e0b',
894
+ pv: {
895
+ name: event,
896
+ shape: 'roundedRect',
897
+ },
898
+ })),
899
+ // Final nodes
900
+ ...['Merge Results', 'Final Validation', 'Complete'].map((event, idx) => ({
901
+ id: `final-${idx}`,
902
+ type: 'text',
903
+ x: 400,
904
+ y: 780 + idx * 140,
905
+ width: 200,
906
+ height: 90,
907
+ text: event,
908
+ color: getEventColor(event),
909
+ pv: {
910
+ name: event,
911
+ shape: 'roundedRect',
912
+ },
913
+ })),
914
+ ],
915
+ edges: [
916
+ // Main flow edges
917
+ ...Array.from({ length: 9 }, (_, i) => ({
918
+ id: `main-edge-${i}`,
919
+ fromNode: `main-${i}`,
920
+ toNode: `main-${i + 1}`,
921
+ fromSide: 'bottom' as const,
922
+ toSide: 'top' as const,
923
+ })),
924
+ // Branch edges
925
+ { id: 'to-branch1', fromNode: 'main-2', toNode: 'branch1-0', fromSide: 'right' as const, toSide: 'left' as const },
926
+ { id: 'branch1-1', fromNode: 'branch1-0', toNode: 'branch1-1', fromSide: 'bottom' as const, toSide: 'top' as const },
927
+ { id: 'branch1-2', fromNode: 'branch1-1', toNode: 'branch1-2', fromSide: 'bottom' as const, toSide: 'top' as const },
928
+ { id: 'to-branch2', fromNode: 'main-2', toNode: 'branch2-0', fromSide: 'right' as const, toSide: 'left' as const },
929
+ { id: 'branch2-1', fromNode: 'branch2-0', toNode: 'branch2-1', fromSide: 'bottom' as const, toSide: 'top' as const },
930
+ { id: 'branch2-2', fromNode: 'branch2-1', toNode: 'branch2-2', fromSide: 'bottom' as const, toSide: 'top' as const },
931
+ // Merge edges
932
+ { id: 'to-merge', fromNode: 'main-5', toNode: 'final-0', fromSide: 'right' as const, toSide: 'left' as const },
933
+ { id: 'branch1-merge', fromNode: 'branch1-2', toNode: 'final-0', fromSide: 'bottom' as const, toSide: 'left' as const },
934
+ { id: 'branch2-merge', fromNode: 'branch2-2', toNode: 'final-0', fromSide: 'bottom' as const, toSide: 'right' as const },
935
+ { id: 'final-1', fromNode: 'final-0', toNode: 'final-1', fromSide: 'bottom' as const, toSide: 'top' as const },
936
+ { id: 'final-2', fromNode: 'final-1', toNode: 'final-2', fromSide: 'bottom' as const, toSide: 'top' as const },
937
+ ],
938
+ };
939
+
940
+ const totalNodes = canvas.nodes.length;
941
+
942
+ return (
943
+ <div style={{ padding: '32px' }}>
944
+ <h1 style={{
945
+ marginBottom: '16px',
946
+ fontSize: theme.fontSizes[7],
947
+ color: theme.colors.text,
948
+ }}>
949
+ Dense Workflow: {totalNodes} Nodes
950
+ </h1>
951
+ <p style={{
952
+ marginBottom: '24px',
953
+ fontSize: theme.fontSizes[2],
954
+ color: theme.colors.textSecondary,
955
+ maxWidth: '1000px',
956
+ }}>
957
+ Complex branching workflow with {totalNodes} nodes using 200×90 dimensions and 16px font.
958
+ This tests how the balanced aspect ratio handles a realistic, dense workflow with multiple branches.
959
+ </p>
960
+
961
+ <div style={{
962
+ marginBottom: '24px',
963
+ padding: '20px',
964
+ backgroundColor: theme.colors.surface,
965
+ borderRadius: '8px',
966
+ border: `2px solid ${theme.colors.primary}`,
967
+ }}>
968
+ <div style={{
969
+ display: 'grid',
970
+ gridTemplateColumns: 'repeat(4, 1fr)',
971
+ gap: '16px',
972
+ }}>
973
+ <div>
974
+ <div style={{ fontSize: theme.fontSizes[0], color: theme.colors.textMuted }}>Total Nodes</div>
975
+ <div style={{ fontSize: theme.fontSizes[4], fontFamily: theme.fonts.monospace, color: theme.colors.text }}>
976
+ {totalNodes}
977
+ </div>
978
+ </div>
979
+ <div>
980
+ <div style={{ fontSize: theme.fontSizes[0], color: theme.colors.textMuted }}>Node Size</div>
981
+ <div style={{ fontSize: theme.fontSizes[4], fontFamily: theme.fonts.monospace, color: theme.colors.text }}>
982
+ 200×90
983
+ </div>
984
+ </div>
985
+ <div>
986
+ <div style={{ fontSize: theme.fontSizes[0], color: theme.colors.textMuted }}>Font Size</div>
987
+ <div style={{ fontSize: theme.fontSizes[4], fontFamily: theme.fonts.monospace, color: theme.colors.text }}>
988
+ 16px
989
+ </div>
990
+ </div>
991
+ <div>
992
+ <div style={{ fontSize: theme.fontSizes[0], color: theme.colors.textMuted }}>Branches</div>
993
+ <div style={{ fontSize: theme.fontSizes[4], fontFamily: theme.fonts.monospace, color: theme.colors.text }}>
994
+ 3
995
+ </div>
996
+ </div>
997
+ </div>
998
+ </div>
999
+
1000
+ <div style={{
1001
+ backgroundColor: theme.colors.background,
1002
+ border: `2px solid ${theme.colors.border}`,
1003
+ borderRadius: '8px',
1004
+ overflow: 'hidden',
1005
+ }}>
1006
+ <ThemeProvider theme={theme16px}>
1007
+ <GraphRenderer
1008
+ canvas={canvas}
1009
+ height={1600}
1010
+ width="100%"
1011
+ />
1012
+ </ThemeProvider>
1013
+ </div>
1014
+
1015
+ <div style={{
1016
+ marginTop: '32px',
1017
+ padding: '20px',
1018
+ backgroundColor: theme.colors.surface,
1019
+ borderRadius: '8px',
1020
+ }}>
1021
+ <h3 style={{
1022
+ marginBottom: '12px',
1023
+ fontSize: theme.fontSizes[3],
1024
+ color: theme.colors.text,
1025
+ }}>
1026
+ Benefits of 200×90 with 16px Font
1027
+ </h3>
1028
+ <ul style={{
1029
+ fontSize: theme.fontSizes[1],
1030
+ color: theme.colors.textSecondary,
1031
+ lineHeight: 1.8,
1032
+ paddingLeft: '20px',
1033
+ }}>
1034
+ <li>Balanced aspect ratio (2.22:1) - wider than traditional but not extreme</li>
1035
+ <li>Generous vertical spacing accommodates 16px font comfortably</li>
1036
+ <li>10% less vertical space than current 200×100 while improving readability</li>
1037
+ <li>16px font remains highly readable even with many nodes</li>
1038
+ <li>Streamlined appearance reduces visual clutter</li>
1039
+ <li>Better use of modern widescreen displays</li>
1040
+ </ul>
1041
+ </div>
1042
+ </div>
1043
+ );
1044
+ },
1045
+ };