@principal-ai/subsystems-react 0.21.0 → 0.22.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 (267) hide show
  1. package/dist/graphify/consolidated.d.ts +5 -24
  2. package/dist/graphify/consolidated.d.ts.map +1 -1
  3. package/dist/graphify/index.d.ts +1 -1
  4. package/dist/graphify/index.d.ts.map +1 -1
  5. package/dist/graphify/index.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/pierre/PierreSnippetView.d.ts.map +1 -1
  10. package/dist/pierre/PierreSnippetView.js +4 -19
  11. package/dist/pierre/PierreSnippetView.js.map +1 -1
  12. package/dist/pierre/PierreWalkthroughCodeView.d.ts.map +1 -1
  13. package/dist/pierre/PierreWalkthroughCodeView.js +20 -3
  14. package/dist/pierre/PierreWalkthroughCodeView.js.map +1 -1
  15. package/dist/pierre/constructColors.d.ts.map +1 -1
  16. package/dist/pierre/constructColors.js +0 -5
  17. package/dist/pierre/constructColors.js.map +1 -1
  18. package/dist/pierre/index.d.ts +1 -1
  19. package/dist/pierre/index.d.ts.map +1 -1
  20. package/dist/pierre/index.js +1 -1
  21. package/dist/pierre/index.js.map +1 -1
  22. package/dist/pierre/sliceSnippet.d.ts +6 -0
  23. package/dist/pierre/sliceSnippet.d.ts.map +1 -1
  24. package/dist/pierre/sliceSnippet.js +25 -0
  25. package/dist/pierre/sliceSnippet.js.map +1 -1
  26. package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts.map +1 -1
  27. package/dist/stories/Subsystem/ComponentGraph/fixtures.js +0 -3
  28. package/dist/stories/Subsystem/ComponentGraph/fixtures.js.map +1 -1
  29. package/dist/subsystem/formatDeclaration.d.ts.map +1 -1
  30. package/dist/subsystem/formatDeclaration.js +0 -15
  31. package/dist/subsystem/formatDeclaration.js.map +1 -1
  32. package/dist/subsystem/model.d.ts +61 -22
  33. package/dist/subsystem/model.d.ts.map +1 -1
  34. package/dist/subsystem/model.js +186 -63
  35. package/dist/subsystem/model.js.map +1 -1
  36. package/dist/subsystem/nodes.d.ts +3 -4
  37. package/dist/subsystem/nodes.d.ts.map +1 -1
  38. package/dist/subsystem/nodes.js +5 -6
  39. package/dist/subsystem/nodes.js.map +1 -1
  40. package/dist/utils/elkLayout.d.ts +6 -4
  41. package/dist/utils/elkLayout.d.ts.map +1 -1
  42. package/dist/utils/elkLayout.js +144 -54
  43. package/dist/utils/elkLayout.js.map +1 -1
  44. package/package.json +3 -3
  45. package/src/graphify/consolidated.ts +4 -26
  46. package/src/graphify/index.ts +0 -2
  47. package/src/index.ts +0 -2
  48. package/src/pierre/PierreSnippetView.tsx +4 -18
  49. package/src/pierre/PierreWalkthroughCodeView.tsx +39 -3
  50. package/src/pierre/constructColors.test.ts +1 -2
  51. package/src/pierre/constructColors.ts +0 -5
  52. package/src/pierre/index.ts +1 -1
  53. package/src/pierre/sliceSnippet.test.ts +44 -1
  54. package/src/pierre/sliceSnippet.ts +28 -0
  55. package/src/stories/Subsystem/ComponentDeclarationAudit.stories.tsx +0 -31
  56. package/src/stories/Subsystem/ComponentGraph/Appearance.stories.tsx +2 -46
  57. package/src/stories/Subsystem/ComponentGraph/Captures.stories.tsx +9 -24
  58. package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +2 -2
  59. package/src/stories/Subsystem/ComponentGraph/Modules.stories.tsx +287 -0
  60. package/src/stories/Subsystem/ComponentGraph/Processes.stories.tsx +1 -1
  61. package/src/stories/Subsystem/ComponentGraph/Scenarios.stories.tsx +6 -6
  62. package/src/stories/Subsystem/ComponentGraph/fixtures.ts +0 -3
  63. package/src/subsystem/formatDeclaration.ts +0 -19
  64. package/src/subsystem/model.test.ts +190 -9
  65. package/src/subsystem/model.ts +219 -73
  66. package/src/subsystem/nodes.tsx +6 -6
  67. package/src/utils/elkLayout.ts +148 -58
  68. package/dist/components/ConfigurationSelector.d.ts +0 -35
  69. package/dist/components/ConfigurationSelector.d.ts.map +0 -1
  70. package/dist/components/ConfigurationSelector.js +0 -63
  71. package/dist/components/ConfigurationSelector.js.map +0 -1
  72. package/dist/components/GraphRenderer.d.ts +0 -295
  73. package/dist/components/GraphRenderer.d.ts.map +0 -1
  74. package/dist/components/GraphRenderer.js +0 -2008
  75. package/dist/components/GraphRenderer.js.map +0 -1
  76. package/dist/components/MultiCanvasRenderer.d.ts +0 -75
  77. package/dist/components/MultiCanvasRenderer.d.ts.map +0 -1
  78. package/dist/components/MultiCanvasRenderer.js +0 -203
  79. package/dist/components/MultiCanvasRenderer.js.map +0 -1
  80. package/dist/components/NodeTooltip.d.ts +0 -24
  81. package/dist/components/NodeTooltip.d.ts.map +0 -1
  82. package/dist/components/NodeTooltip.js +0 -160
  83. package/dist/components/NodeTooltip.js.map +0 -1
  84. package/dist/components/SelectionSidebar.d.ts +0 -18
  85. package/dist/components/SelectionSidebar.d.ts.map +0 -1
  86. package/dist/components/SelectionSidebar.js +0 -190
  87. package/dist/components/SelectionSidebar.js.map +0 -1
  88. package/dist/components/SequenceDiagramRenderer.d.ts +0 -77
  89. package/dist/components/SequenceDiagramRenderer.d.ts.map +0 -1
  90. package/dist/components/SequenceDiagramRenderer.js +0 -604
  91. package/dist/components/SequenceDiagramRenderer.js.map +0 -1
  92. package/dist/components/WorkflowSequenceDiagram.d.ts +0 -63
  93. package/dist/components/WorkflowSequenceDiagram.d.ts.map +0 -1
  94. package/dist/components/WorkflowSequenceDiagram.js +0 -147
  95. package/dist/components/WorkflowSequenceDiagram.js.map +0 -1
  96. package/dist/components/dashboard/DashboardRenderer.d.ts +0 -10
  97. package/dist/components/dashboard/DashboardRenderer.d.ts.map +0 -1
  98. package/dist/components/dashboard/DashboardRenderer.js +0 -179
  99. package/dist/components/dashboard/DashboardRenderer.js.map +0 -1
  100. package/dist/components/dashboard/MetricPanel.d.ts +0 -10
  101. package/dist/components/dashboard/MetricPanel.d.ts.map +0 -1
  102. package/dist/components/dashboard/MetricPanel.js +0 -103
  103. package/dist/components/dashboard/MetricPanel.js.map +0 -1
  104. package/dist/components/dashboard/MockDataProvider.d.ts +0 -30
  105. package/dist/components/dashboard/MockDataProvider.d.ts.map +0 -1
  106. package/dist/components/dashboard/MockDataProvider.js +0 -270
  107. package/dist/components/dashboard/MockDataProvider.js.map +0 -1
  108. package/dist/components/dashboard/components/BarChart.d.ts +0 -10
  109. package/dist/components/dashboard/components/BarChart.d.ts.map +0 -1
  110. package/dist/components/dashboard/components/BarChart.js +0 -167
  111. package/dist/components/dashboard/components/BarChart.js.map +0 -1
  112. package/dist/components/dashboard/components/LineChart.d.ts +0 -10
  113. package/dist/components/dashboard/components/LineChart.d.ts.map +0 -1
  114. package/dist/components/dashboard/components/LineChart.js +0 -141
  115. package/dist/components/dashboard/components/LineChart.js.map +0 -1
  116. package/dist/components/dashboard/components/MetricCard.d.ts +0 -9
  117. package/dist/components/dashboard/components/MetricCard.d.ts.map +0 -1
  118. package/dist/components/dashboard/components/MetricCard.js +0 -163
  119. package/dist/components/dashboard/components/MetricCard.js.map +0 -1
  120. package/dist/components/dashboard/components/SourceLink.d.ts +0 -9
  121. package/dist/components/dashboard/components/SourceLink.d.ts.map +0 -1
  122. package/dist/components/dashboard/components/SourceLink.js +0 -39
  123. package/dist/components/dashboard/components/SourceLink.js.map +0 -1
  124. package/dist/components/dashboard/components/TimeRangeSelector.d.ts +0 -9
  125. package/dist/components/dashboard/components/TimeRangeSelector.d.ts.map +0 -1
  126. package/dist/components/dashboard/components/TimeRangeSelector.js +0 -167
  127. package/dist/components/dashboard/components/TimeRangeSelector.js.map +0 -1
  128. package/dist/components/dashboard/components/index.d.ts +0 -6
  129. package/dist/components/dashboard/components/index.d.ts.map +0 -1
  130. package/dist/components/dashboard/components/index.js +0 -6
  131. package/dist/components/dashboard/components/index.js.map +0 -1
  132. package/dist/components/dashboard/index.d.ts +0 -6
  133. package/dist/components/dashboard/index.d.ts.map +0 -1
  134. package/dist/components/dashboard/index.js +0 -8
  135. package/dist/components/dashboard/index.js.map +0 -1
  136. package/dist/components/dashboard/types.d.ts +0 -74
  137. package/dist/components/dashboard/types.d.ts.map +0 -1
  138. package/dist/components/dashboard/types.js +0 -8
  139. package/dist/components/dashboard/types.js.map +0 -1
  140. package/dist/components/state-view/PipelineView.d.ts +0 -14
  141. package/dist/components/state-view/PipelineView.d.ts.map +0 -1
  142. package/dist/components/state-view/PipelineView.js +0 -195
  143. package/dist/components/state-view/PipelineView.js.map +0 -1
  144. package/dist/components/state-view/index.d.ts +0 -14
  145. package/dist/components/state-view/index.d.ts.map +0 -1
  146. package/dist/components/state-view/index.js +0 -12
  147. package/dist/components/state-view/index.js.map +0 -1
  148. package/dist/components/state-view/types.d.ts +0 -188
  149. package/dist/components/state-view/types.d.ts.map +0 -1
  150. package/dist/components/state-view/types.js +0 -10
  151. package/dist/components/state-view/types.js.map +0 -1
  152. package/dist/components/state-view/useStateView.d.ts +0 -32
  153. package/dist/components/state-view/useStateView.d.ts.map +0 -1
  154. package/dist/components/state-view/useStateView.js +0 -129
  155. package/dist/components/state-view/useStateView.js.map +0 -1
  156. package/dist/contexts/GraphEditContext.d.ts +0 -20
  157. package/dist/contexts/GraphEditContext.d.ts.map +0 -1
  158. package/dist/contexts/GraphEditContext.js +0 -8
  159. package/dist/contexts/GraphEditContext.js.map +0 -1
  160. package/dist/contexts/TooltipPortalContext.d.ts +0 -8
  161. package/dist/contexts/TooltipPortalContext.d.ts.map +0 -1
  162. package/dist/contexts/TooltipPortalContext.js +0 -8
  163. package/dist/contexts/TooltipPortalContext.js.map +0 -1
  164. package/dist/edges/CustomEdge.d.ts +0 -24
  165. package/dist/edges/CustomEdge.d.ts.map +0 -1
  166. package/dist/edges/CustomEdge.js +0 -222
  167. package/dist/edges/CustomEdge.js.map +0 -1
  168. package/dist/edges/GenericEdge.d.ts +0 -18
  169. package/dist/edges/GenericEdge.d.ts.map +0 -1
  170. package/dist/edges/GenericEdge.js +0 -10
  171. package/dist/edges/GenericEdge.js.map +0 -1
  172. package/dist/graphify/kind.d.ts +0 -23
  173. package/dist/graphify/kind.d.ts.map +0 -1
  174. package/dist/graphify/kind.js +0 -77
  175. package/dist/graphify/kind.js.map +0 -1
  176. package/dist/hooks/usePathBasedEvents.d.ts +0 -42
  177. package/dist/hooks/usePathBasedEvents.d.ts.map +0 -1
  178. package/dist/hooks/usePathBasedEvents.js +0 -119
  179. package/dist/hooks/usePathBasedEvents.js.map +0 -1
  180. package/dist/hooks/useSequenceLayout.d.ts +0 -186
  181. package/dist/hooks/useSequenceLayout.d.ts.map +0 -1
  182. package/dist/hooks/useSequenceLayout.js +0 -327
  183. package/dist/hooks/useSequenceLayout.js.map +0 -1
  184. package/dist/hooks/useUndoRedo.d.ts +0 -80
  185. package/dist/hooks/useUndoRedo.d.ts.map +0 -1
  186. package/dist/hooks/useUndoRedo.js +0 -70
  187. package/dist/hooks/useUndoRedo.js.map +0 -1
  188. package/dist/nodes/CustomNode.d.ts +0 -28
  189. package/dist/nodes/CustomNode.d.ts.map +0 -1
  190. package/dist/nodes/CustomNode.js +0 -820
  191. package/dist/nodes/CustomNode.js.map +0 -1
  192. package/dist/nodes/GenericNode.d.ts +0 -20
  193. package/dist/nodes/GenericNode.d.ts.map +0 -1
  194. package/dist/nodes/GenericNode.js +0 -20
  195. package/dist/nodes/GenericNode.js.map +0 -1
  196. package/dist/nodes/otel/OtelBoundaryNode.d.ts +0 -55
  197. package/dist/nodes/otel/OtelBoundaryNode.d.ts.map +0 -1
  198. package/dist/nodes/otel/OtelBoundaryNode.js +0 -81
  199. package/dist/nodes/otel/OtelBoundaryNode.js.map +0 -1
  200. package/dist/nodes/otel/OtelEventNode.d.ts +0 -59
  201. package/dist/nodes/otel/OtelEventNode.d.ts.map +0 -1
  202. package/dist/nodes/otel/OtelEventNode.js +0 -82
  203. package/dist/nodes/otel/OtelEventNode.js.map +0 -1
  204. package/dist/nodes/otel/OtelResourceNode.d.ts +0 -53
  205. package/dist/nodes/otel/OtelResourceNode.d.ts.map +0 -1
  206. package/dist/nodes/otel/OtelResourceNode.js +0 -105
  207. package/dist/nodes/otel/OtelResourceNode.js.map +0 -1
  208. package/dist/nodes/otel/OtelScopeNode.d.ts +0 -53
  209. package/dist/nodes/otel/OtelScopeNode.d.ts.map +0 -1
  210. package/dist/nodes/otel/OtelScopeNode.js +0 -81
  211. package/dist/nodes/otel/OtelScopeNode.js.map +0 -1
  212. package/dist/nodes/otel/OtelSpanConventionNode.d.ts +0 -61
  213. package/dist/nodes/otel/OtelSpanConventionNode.d.ts.map +0 -1
  214. package/dist/nodes/otel/OtelSpanConventionNode.js +0 -131
  215. package/dist/nodes/otel/OtelSpanConventionNode.js.map +0 -1
  216. package/dist/nodes/otel/index.d.ts +0 -17
  217. package/dist/nodes/otel/index.d.ts.map +0 -1
  218. package/dist/nodes/otel/index.js +0 -13
  219. package/dist/nodes/otel/index.js.map +0 -1
  220. package/dist/nodes/otel/shared/NodeBadges.d.ts +0 -10
  221. package/dist/nodes/otel/shared/NodeBadges.d.ts.map +0 -1
  222. package/dist/nodes/otel/shared/NodeBadges.js +0 -178
  223. package/dist/nodes/otel/shared/NodeBadges.js.map +0 -1
  224. package/dist/nodes/otel/shared/NodeContent.d.ts +0 -10
  225. package/dist/nodes/otel/shared/NodeContent.d.ts.map +0 -1
  226. package/dist/nodes/otel/shared/NodeContent.js +0 -96
  227. package/dist/nodes/otel/shared/NodeContent.js.map +0 -1
  228. package/dist/nodes/otel/shared/index.d.ts +0 -8
  229. package/dist/nodes/otel/shared/index.d.ts.map +0 -1
  230. package/dist/nodes/otel/shared/index.js +0 -8
  231. package/dist/nodes/otel/shared/index.js.map +0 -1
  232. package/dist/nodes/otel/shared/types.d.ts +0 -129
  233. package/dist/nodes/otel/shared/types.d.ts.map +0 -1
  234. package/dist/nodes/otel/shared/types.js +0 -5
  235. package/dist/nodes/otel/shared/types.js.map +0 -1
  236. package/dist/nodes/otel/shared/useNodeBehavior.d.ts +0 -42
  237. package/dist/nodes/otel/shared/useNodeBehavior.d.ts.map +0 -1
  238. package/dist/nodes/otel/shared/useNodeBehavior.js +0 -61
  239. package/dist/nodes/otel/shared/useNodeBehavior.js.map +0 -1
  240. package/dist/pierre/PierreThroughlineCodeView.d.ts +0 -22
  241. package/dist/pierre/PierreThroughlineCodeView.d.ts.map +0 -1
  242. package/dist/pierre/PierreThroughlineCodeView.js +0 -206
  243. package/dist/pierre/PierreThroughlineCodeView.js.map +0 -1
  244. package/dist/subsystem/SubsystemCarousel.d.ts +0 -36
  245. package/dist/subsystem/SubsystemCarousel.d.ts.map +0 -1
  246. package/dist/subsystem/SubsystemCarousel.js +0 -163
  247. package/dist/subsystem/SubsystemCarousel.js.map +0 -1
  248. package/dist/utils/animationMapping.d.ts +0 -53
  249. package/dist/utils/animationMapping.d.ts.map +0 -1
  250. package/dist/utils/animationMapping.js +0 -126
  251. package/dist/utils/animationMapping.js.map +0 -1
  252. package/dist/utils/canvasBounds.d.ts +0 -50
  253. package/dist/utils/canvasBounds.d.ts.map +0 -1
  254. package/dist/utils/canvasBounds.js +0 -88
  255. package/dist/utils/canvasBounds.js.map +0 -1
  256. package/dist/utils/graphConverter.d.ts +0 -18
  257. package/dist/utils/graphConverter.d.ts.map +0 -1
  258. package/dist/utils/graphConverter.js +0 -114
  259. package/dist/utils/graphConverter.js.map +0 -1
  260. package/dist/utils/iconResolver.d.ts +0 -29
  261. package/dist/utils/iconResolver.d.ts.map +0 -1
  262. package/dist/utils/iconResolver.js +0 -30
  263. package/dist/utils/iconResolver.js.map +0 -1
  264. package/dist/utils/orientationUtils.d.ts +0 -19
  265. package/dist/utils/orientationUtils.d.ts.map +0 -1
  266. package/dist/utils/orientationUtils.js +0 -62
  267. package/dist/utils/orientationUtils.js.map +0 -1
@@ -73,12 +73,13 @@ export interface ElkLayoutOptions {
73
73
  direction?: 'RIGHT' | 'LEFT' | 'DOWN' | 'UP';
74
74
 
75
75
  /**
76
- * Compound groups — each becomes a nested ELK parent whose `memberIds`
77
- * are laid out inside it. Members reference the group via React Flow
78
- * `parentId`; ELK returns parent-relative child positions which this
79
- * module flattens back to absolute flow coordinates.
76
+ * Compound groups — each becomes an ELK parent whose `memberIds` are laid
77
+ * out inside it. `memberIds` may be leaf node ids or other group ids
78
+ * (for nesting, e.g. process → module → leaves). Optional `parentId`
79
+ * nests this group under another group; omit for a root-level frame.
80
+ * Members reference their immediate parent via React Flow `parentId`.
80
81
  */
81
- groups?: Array<{ id: string; memberIds: string[] }>;
82
+ groups?: Array<{ id: string; memberIds: string[]; parentId?: string }>;
82
83
  }
83
84
 
84
85
  /** Result of ELK layout computation */
@@ -502,51 +503,134 @@ export async function computeElkLayout(
502
503
 
503
504
  // Partition leaf nodes into compound parents when groups are given.
504
505
  // Group shells themselves are NOT part of `nodes` — they are reconstructed
505
- // by the caller from `groupBounds`. Only leaf ids in `memberIds` nest.
506
+ // by the caller from `groupBounds`. `memberIds` may reference leaves or
507
+ // other group ids (process → module → leaves).
506
508
  const groupDefs = (options.groups ?? []).filter((g) => g.memberIds.length > 0);
507
- const memberToGroup = new Map<string, string>();
509
+ const groupById = new Map(groupDefs.map((g) => [g.id, g]));
510
+ const elkById = new Map(elkNodes.map((n) => [n.id, n]));
511
+
512
+ const compoundLayoutOptions: LayoutOptions = {
513
+ 'elk.algorithm': 'layered',
514
+ 'elk.direction': direction,
515
+ 'elk.padding': '[top=48,left=24,bottom=24,right=24]',
516
+ 'elk.spacing.nodeNode': '40',
517
+ };
518
+
519
+ /** Descendant leaf count for singleton checks (nested groups count through). */
520
+ const leafDescendantCount = (memberIds: string[]): number => {
521
+ let n = 0;
522
+ for (const mid of memberIds) {
523
+ if (elkById.has(mid)) n += 1;
524
+ else {
525
+ const g = groupById.get(mid);
526
+ if (g) n += leafDescendantCount(g.memberIds);
527
+ }
528
+ }
529
+ return n;
530
+ };
531
+
532
+ const builtGroups = new Map<string, ElkNode>();
533
+ const skippedGroups = new Set<string>();
534
+ const pending = [...groupDefs];
535
+ // Build bottom-up: a group is ready when every member is a leaf or an
536
+ // already-built / skipped group. Skipped groups promote their members.
537
+ while (pending.length > 0) {
538
+ let progress = false;
539
+ for (let i = pending.length - 1; i >= 0; i--) {
540
+ const g = pending[i]!;
541
+ const childNodes: ElkNode[] = [];
542
+ let ready = true;
543
+ for (const mid of g.memberIds) {
544
+ if (elkById.has(mid)) {
545
+ childNodes.push(elkById.get(mid)!);
546
+ continue;
547
+ }
548
+ if (skippedGroups.has(mid)) {
549
+ // Promote skipped group's members into this parent.
550
+ const skipped = groupById.get(mid);
551
+ if (!skipped) {
552
+ ready = false;
553
+ break;
554
+ }
555
+ for (const sm of skipped.memberIds) {
556
+ if (elkById.has(sm)) childNodes.push(elkById.get(sm)!);
557
+ else if (builtGroups.has(sm)) childNodes.push(builtGroups.get(sm)!);
558
+ else if (!skippedGroups.has(sm)) {
559
+ ready = false;
560
+ break;
561
+ }
562
+ }
563
+ if (!ready) break;
564
+ continue;
565
+ }
566
+ if (builtGroups.has(mid)) {
567
+ childNodes.push(builtGroups.get(mid)!);
568
+ continue;
569
+ }
570
+ if (groupById.has(mid)) {
571
+ ready = false;
572
+ break;
573
+ }
574
+ // Unknown id — ignore (external stubs etc. may be absent).
575
+ }
576
+ if (!ready) continue;
577
+
578
+ pending.splice(i, 1);
579
+ progress = true;
580
+
581
+ // Skip frames with fewer than 2 leaf descendants — promote children up.
582
+ if (leafDescendantCount(g.memberIds) < 2 || childNodes.length < 1) {
583
+ skippedGroups.add(g.id);
584
+ continue;
585
+ }
586
+
587
+ builtGroups.set(g.id, {
588
+ id: g.id,
589
+ children: childNodes,
590
+ layoutOptions: compoundLayoutOptions,
591
+ });
592
+ }
593
+ if (!progress) {
594
+ // Cycle or unresolved refs — leave remaining groups unbuilt.
595
+ for (const g of pending) skippedGroups.add(g.id);
596
+ break;
597
+ }
598
+ }
599
+
508
600
  const groupedLeafIds = new Set<string>();
509
- for (const g of groupDefs) {
510
- for (const mid of g.memberIds) {
511
- if (!memberToGroup.has(mid)) {
512
- memberToGroup.set(mid, g.id);
513
- groupedLeafIds.add(mid);
601
+ const markLeaves = (memberIds: string[]) => {
602
+ for (const mid of memberIds) {
603
+ if (elkById.has(mid)) groupedLeafIds.add(mid);
604
+ else {
605
+ const g = groupById.get(mid);
606
+ if (g && builtGroups.has(g.id)) markLeaves(g.memberIds);
607
+ else if (g && skippedGroups.has(g.id)) markLeaves(g.memberIds);
514
608
  }
515
609
  }
610
+ };
611
+ for (const [id] of builtGroups) {
612
+ const g = groupById.get(id);
613
+ if (g) markLeaves(g.memberIds);
516
614
  }
517
- const elkById = new Map(elkNodes.map((n) => [n.id, n]));
615
+
518
616
  const ungroupedElkNodes: ElkNode[] = [];
519
617
  for (const n of elkNodes) {
520
618
  if (!groupedLeafIds.has(n.id)) ungroupedElkNodes.push(n);
521
619
  }
620
+
621
+ // Root-level compound parents: built groups with no parent, or whose parent
622
+ // was skipped / never built.
522
623
  const elkParents: ElkNode[] = [];
523
- for (const g of groupDefs) {
524
- const children = g.memberIds
525
- .map((mid) => elkById.get(mid))
526
- .filter((n): n is ElkNode => !!n);
527
- // Skip groups with <2 real members — a single-child frame adds noise;
528
- // the caller drops the shell and leaves the node top-level.
529
- if (children.length < 2) {
530
- for (const c of children) ungroupedElkNodes.push(c);
531
- memberToGroup.delete(g.memberIds[0]);
532
- groupedLeafIds.delete(g.memberIds[0]);
533
- continue;
534
- }
535
- elkParents.push({
536
- id: g.id,
537
- children,
538
- layoutOptions: {
539
- 'elk.algorithm': 'layered',
540
- 'elk.direction': direction,
541
- 'elk.padding': '[top=48,left=24,bottom=24,right=24]',
542
- 'elk.spacing.nodeNode': '40',
543
- },
544
- });
624
+ for (const [id, node] of builtGroups) {
625
+ const g = groupById.get(id);
626
+ const parentId = g?.parentId;
627
+ if (parentId && builtGroups.has(parentId)) continue; // nested inside parent
628
+ elkParents.push(node);
545
629
  }
546
630
 
547
631
  // Create ELK graph
548
632
  const rootOptions = getElkOptions(options);
549
- if (elkParents.length > 0) {
633
+ if (elkParents.length > 0 || builtGroups.size > 0) {
550
634
  rootOptions['elk.hierarchyHandling'] = 'INCLUDE_CHILDREN';
551
635
  }
552
636
  const elkGraph: ElkNode = {
@@ -562,9 +646,6 @@ export async function computeElkLayout(
562
646
  // Build maps of ELK-computed positions. Nested children report
563
647
  // parent-relative coords — flatten to absolute for edges, and keep the
564
648
  // relative form for React Flow children (whose position is parent-relative).
565
- // Absolute offset of every ELK node (parents included), accumulated down
566
- // the ancestor chain — edge sections/labels are relative to their
567
- // `container`, so each edge needs its container's absolute offset.
568
649
  const elkAbsOffsets = new Map<string, { x: number; y: number }>();
569
650
  const elkPositions = new Map<string, { x: number; y: number }>();
570
651
  const elkRelativePositions = new Map<string, { x: number; y: number }>();
@@ -576,27 +657,36 @@ export async function computeElkLayout(
576
657
  for (const c of n.children ?? []) walkElk(c, ax, ay);
577
658
  };
578
659
  walkElk(layoutedGraph, 0, 0);
660
+
661
+ const collectGroupResults = (n: ElkNode, isRootChild: boolean) => {
662
+ const isGroup = builtGroups.has(n.id);
663
+ if (isGroup) {
664
+ // Nested group positions are parent-relative (RF child semantics);
665
+ // root-level groups use absolute coords.
666
+ groupBounds.set(n.id, {
667
+ x: n.x ?? 0,
668
+ y: n.y ?? 0,
669
+ width: n.width ?? 0,
670
+ height: n.height ?? 0,
671
+ });
672
+ for (const c of n.children ?? []) {
673
+ const rx = c.x ?? 0;
674
+ const ry = c.y ?? 0;
675
+ elkRelativePositions.set(c.id, { x: rx, y: ry });
676
+ const abs = elkAbsOffsets.get(c.id) ?? { x: rx, y: ry };
677
+ elkPositions.set(c.id, abs);
678
+ if (builtGroups.has(c.id)) collectGroupResults(c, false);
679
+ }
680
+ return;
681
+ }
682
+ if (isRootChild) {
683
+ elkPositions.set(n.id, { x: n.x ?? 0, y: n.y ?? 0 });
684
+ elkRelativePositions.set(n.id, { x: n.x ?? 0, y: n.y ?? 0 });
685
+ }
686
+ };
579
687
  if (layoutedGraph.children) {
580
688
  for (const child of layoutedGraph.children) {
581
- if (child.children && child.children.length > 0 && groupDefs.some((g) => g.id === child.id)) {
582
- const gx = child.x ?? 0;
583
- const gy = child.y ?? 0;
584
- groupBounds.set(child.id, {
585
- x: gx,
586
- y: gy,
587
- width: child.width ?? 0,
588
- height: child.height ?? 0,
589
- });
590
- for (const grand of child.children) {
591
- const rx = grand.x ?? 0;
592
- const ry = grand.y ?? 0;
593
- elkRelativePositions.set(grand.id, { x: rx, y: ry });
594
- elkPositions.set(grand.id, { x: gx + rx, y: gy + ry });
595
- }
596
- } else {
597
- elkPositions.set(child.id, { x: child.x ?? 0, y: child.y ?? 0 });
598
- elkRelativePositions.set(child.id, { x: child.x ?? 0, y: child.y ?? 0 });
599
- }
689
+ collectGroupResults(child, true);
600
690
  }
601
691
  }
602
692
 
@@ -1,35 +0,0 @@
1
- import React from 'react';
2
- import type { ConfigurationFile } from '@principal-ai/subsystems-core';
3
- export interface ConfigurationSelectorProps {
4
- /** Available configurations */
5
- configurations: ConfigurationFile[];
6
- /** Currently selected configuration name */
7
- selectedConfig: string;
8
- /** Callback when configuration changes */
9
- onConfigChange: (configName: string) => void;
10
- /** Optional custom className */
11
- className?: string;
12
- /** Optional custom styles */
13
- style?: React.CSSProperties;
14
- /** Whether to show description */
15
- showDescription?: boolean;
16
- /** Label text for the selector */
17
- label?: string;
18
- }
19
- /**
20
- * Configuration selector component for switching between multiple graph configurations
21
- *
22
- * @example
23
- * ```tsx
24
- * const [selectedConfig, setSelectedConfig] = useState('simple-service');
25
- *
26
- * <ConfigurationSelector
27
- * configurations={loadedConfigs}
28
- * selectedConfig={selectedConfig}
29
- * onConfigChange={setSelectedConfig}
30
- * showDescription
31
- * />
32
- * ```
33
- */
34
- export declare const ConfigurationSelector: React.FC<ConfigurationSelectorProps>;
35
- //# sourceMappingURL=ConfigurationSelector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConfigurationSelector.d.ts","sourceRoot":"","sources":["../../src/components/ConfigurationSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,WAAW,0BAA0B;IACzC,+BAA+B;IAC/B,cAAc,EAAE,iBAAiB,EAAE,CAAC;IAEpC,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IAEvB,0CAA0C;IAC1C,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAE5B,kCAAkC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CA2FtE,CAAC"}
@@ -1,63 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * Configuration selector component for switching between multiple graph configurations
4
- *
5
- * @example
6
- * ```tsx
7
- * const [selectedConfig, setSelectedConfig] = useState('simple-service');
8
- *
9
- * <ConfigurationSelector
10
- * configurations={loadedConfigs}
11
- * selectedConfig={selectedConfig}
12
- * onConfigChange={setSelectedConfig}
13
- * showDescription
14
- * />
15
- * ```
16
- */
17
- export const ConfigurationSelector = ({ configurations, selectedConfig, onConfigChange, className, style, showDescription = false, label = 'Graph Configuration', }) => {
18
- const handleChange = (event) => {
19
- onConfigChange(event.target.value);
20
- };
21
- const selectedConfigData = configurations.find((c) => c.name === selectedConfig);
22
- const defaultStyle = {
23
- backgroundColor: 'white',
24
- padding: '12px 16px',
25
- borderRadius: '8px',
26
- boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
27
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
28
- ...style,
29
- };
30
- const labelStyle = {
31
- display: 'block',
32
- fontSize: '14px',
33
- fontWeight: 600,
34
- marginBottom: '8px',
35
- color: '#333',
36
- };
37
- const selectStyle = {
38
- width: '100%',
39
- padding: '8px 12px',
40
- fontSize: '14px',
41
- border: '1px solid #ddd',
42
- borderRadius: '4px',
43
- backgroundColor: 'white',
44
- cursor: 'pointer',
45
- outline: 'none',
46
- transition: 'border-color 0.2s',
47
- };
48
- const infoStyle = {
49
- marginTop: '8px',
50
- fontSize: '12px',
51
- color: '#666',
52
- lineHeight: '1.5',
53
- };
54
- if (configurations.length === 0) {
55
- return (_jsx("div", { className: className, style: defaultStyle, children: _jsx("div", { style: { ...labelStyle, color: '#999' }, children: "No configurations available" }) }));
56
- }
57
- return (_jsxs("div", { className: className, style: defaultStyle, children: [_jsx("label", { style: labelStyle, htmlFor: "config-selector", children: label }), _jsx("select", { id: "config-selector", value: selectedConfig, onChange: handleChange, style: selectStyle, onMouseEnter: (e) => {
58
- e.currentTarget.style.borderColor = '#4A90E2';
59
- }, onMouseLeave: (e) => {
60
- e.currentTarget.style.borderColor = '#ddd';
61
- }, children: configurations.map((config) => (_jsx("option", { value: config.name, children: config.config.metadata.name }, config.name))) }), selectedConfigData && showDescription && selectedConfigData.config.metadata.description && (_jsx("div", { style: infoStyle, children: _jsx("div", { children: selectedConfigData.config.metadata.description }) }))] }));
62
- };
63
- //# sourceMappingURL=ConfigurationSelector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConfigurationSelector.js","sourceRoot":"","sources":["../../src/components/ConfigurationSelector.tsx"],"names":[],"mappings":";AA0BA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAyC,CAAC,EAC1E,cAAc,EACd,cAAc,EACd,cAAc,EACd,SAAS,EACT,KAAK,EACL,eAAe,GAAG,KAAK,EACvB,KAAK,GAAG,qBAAqB,GAC9B,EAAE,EAAE;IACH,MAAM,YAAY,GAAG,CAAC,KAA2C,EAAE,EAAE;QACnE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAwB;QACxC,eAAe,EAAE,OAAO;QACxB,OAAO,EAAE,WAAW;QACpB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,2BAA2B;QACtC,UAAU,EAAE,mEAAmE;QAC/E,GAAG,KAAK;KACT,CAAC;IAEF,MAAM,UAAU,GAAwB;QACtC,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,GAAG;QACf,YAAY,EAAE,KAAK;QACnB,KAAK,EAAE,MAAM;KACd,CAAC;IAEF,MAAM,WAAW,GAAwB;QACvC,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,gBAAgB;QACxB,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,OAAO;QACxB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,mBAAmB;KAChC,CAAC;IAEF,MAAM,SAAS,GAAwB;QACrC,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,KAAK;KAClB,CAAC;IAEF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;QAC/B,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,YAC5C,cAAK,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,4CAAmC,GAC3E,CACP,CAAC;KACH;IAED,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,aAC5C,gBAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAC,iBAAiB,YAChD,KAAK,GACA,EAER,iBACE,EAAE,EAAC,iBAAiB,EACpB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;oBAClB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;gBAChD,CAAC,EACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;oBAClB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC;gBAC7C,CAAC,YAEA,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC9B,iBAA0B,KAAK,EAAE,MAAM,CAAC,IAAI,YACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IADjB,MAAM,CAAC,IAAI,CAEf,CACV,CAAC,GACK,EAER,kBAAkB,IAAI,eAAe,IAAI,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,IAAI,CAC1F,cAAK,KAAK,EAAE,SAAS,YACnB,wBAAM,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAO,GACvD,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -1,295 +0,0 @@
1
- import React from 'react';
2
- import type { Violation, GraphEvent, ExtendedCanvas, ComponentLibrary } from '@principal-ai/subsystems-core';
3
- import { TooltipPortalContext } from '../contexts/TooltipPortalContext';
4
- export { TooltipPortalContext };
5
- /** Position change event for tracking node movements */
6
- export interface NodePositionChange {
7
- nodeId: string;
8
- position: {
9
- x: number;
10
- y: number;
11
- };
12
- }
13
- /** Dimension change event for tracking node resizing */
14
- export interface NodeDimensionChange {
15
- nodeId: string;
16
- dimensions: {
17
- width: number;
18
- height: number;
19
- };
20
- }
21
- /** Text change event for tracking inline text edits */
22
- export interface NodeTextChange {
23
- nodeId: string;
24
- text: string;
25
- }
26
- /** All pending changes that can be saved */
27
- export interface PendingChanges {
28
- /** Node position changes */
29
- positionChanges: NodePositionChange[];
30
- /** Node dimension changes (from resizing) */
31
- dimensionChanges: NodeDimensionChange[];
32
- /** Text changes for text and group nodes */
33
- textChanges: NodeTextChange[];
34
- /** Node updates (type, data changes) */
35
- nodeUpdates: Array<{
36
- nodeId: string;
37
- updates: {
38
- type?: string;
39
- data?: Record<string, unknown>;
40
- };
41
- }>;
42
- /** Deleted node IDs */
43
- deletedNodeIds: string[];
44
- /** New edges created (with optional handle info for connection points) */
45
- createdEdges: Array<{
46
- from: string;
47
- to: string;
48
- type: string;
49
- sourceHandle?: string;
50
- targetHandle?: string;
51
- }>;
52
- /** Deleted edges (with full connection info for config removal) */
53
- deletedEdges: Array<{
54
- from: string;
55
- to: string;
56
- type: string;
57
- }>;
58
- /** Whether there are any changes */
59
- hasChanges: boolean;
60
- }
61
- /** Ref handle for imperative actions */
62
- export interface GraphRendererHandle {
63
- /** Get all pending changes */
64
- getPendingChanges: () => PendingChanges;
65
- /** Reset edit state to match current props */
66
- resetEditState: () => void;
67
- /** Check if there are unsaved changes */
68
- hasUnsavedChanges: () => boolean;
69
- /** Whether there are changes that can be undone */
70
- canUndo: () => boolean;
71
- /** Whether there are changes that can be redone */
72
- canRedo: () => boolean;
73
- /** Undo the last change */
74
- undo: () => void;
75
- /** Redo the last undone change */
76
- redo: () => void;
77
- }
78
- /** Base props shared by all render modes */
79
- interface GraphRendererBaseProps {
80
- /** Optional violations to highlight */
81
- violations?: Violation[];
82
- /**
83
- * Duration of the fitView animation in milliseconds.
84
- * Set to 0 for instant positioning (no animation).
85
- * Defaults to 200.
86
- */
87
- fitViewDuration?: number;
88
- /**
89
- * Whether to show tooltips on hover for nodes and edges.
90
- * Defaults to true.
91
- */
92
- showTooltips?: boolean;
93
- /**
94
- * Optional node ID to highlight (e.g., when playing back execution events).
95
- * Highlighted nodes will have a special visual treatment.
96
- */
97
- highlightedNodeId?: string | null;
98
- /**
99
- * Optional list of active node IDs (nodes involved in current execution scenario).
100
- * Nodes NOT in this list will be dimmed (reduced opacity).
101
- * If undefined or empty, all nodes are shown at full opacity.
102
- */
103
- activeNodeIds?: string[] | null;
104
- /** Optional configuration name for identification (used with multi-config setups) */
105
- configName?: string;
106
- /** Optional class name */
107
- className?: string;
108
- /** Optional width */
109
- width?: number | string;
110
- /** Optional height */
111
- height?: number | string;
112
- /** Whether to show minimap */
113
- showMinimap?: boolean;
114
- /** Whether to show controls */
115
- showControls?: boolean;
116
- /** Whether to show background */
117
- showBackground?: boolean;
118
- /**
119
- * Background variant style.
120
- * - 'dots': Small dots pattern
121
- * - 'lines': Grid lines (default)
122
- * - 'cross': Cross pattern
123
- */
124
- backgroundVariant?: 'dots' | 'lines' | 'cross';
125
- /**
126
- * Gap between background pattern elements in pixels.
127
- * Defaults to 50 for lines/cross, 16 for dots.
128
- */
129
- backgroundGap?: number;
130
- /**
131
- * Whether to show a center indicator at the canvas origin (0,0).
132
- * Useful for visualizing where the center point is when items aren't centered.
133
- * Defaults to false.
134
- */
135
- showCenterIndicator?: boolean;
136
- /** Optional event stream for triggering animations */
137
- events?: GraphEvent[];
138
- /** Optional callback when an event is processed */
139
- onEventProcessed?: (event: GraphEvent) => void;
140
- /**
141
- * Whether edit mode is enabled.
142
- * When true, nodes can be dragged, edited, deleted, and edges can be created/deleted.
143
- * All changes are tracked internally and can be retrieved via ref.getPendingChanges()
144
- */
145
- editable?: boolean;
146
- /**
147
- * Callback when pending changes state changes.
148
- * Called with true when there are unsaved changes, false when there are none.
149
- * Use this to enable/disable save buttons in the parent component.
150
- */
151
- onPendingChangesChange?: (hasChanges: boolean) => void;
152
- /**
153
- * Callback when a node is clicked.
154
- * Receives the node ID and the click event. If provided, overrides default node selection behavior.
155
- */
156
- onNodeClick?: (nodeId: string, event: React.MouseEvent) => void;
157
- /**
158
- * When set, fits the viewport to show these specific nodes.
159
- * Useful for focusing on a subset of the graph (e.g., scenario nodes).
160
- * Pass null/undefined/empty array to use default fitView behavior.
161
- */
162
- fitViewToNodeIds?: string[] | null;
163
- /**
164
- * Padding around nodes when fitting view to specific nodes.
165
- * @default 0.2
166
- */
167
- fitViewPadding?: number;
168
- /**
169
- * Set of node IDs that should be draggable even when editable=false.
170
- * Useful for allowing specific nodes (like group containers) to be moved
171
- * while keeping other nodes locked in place.
172
- */
173
- draggableNodeIds?: Set<string>;
174
- /**
175
- * Callback fired when a node drag operation completes.
176
- * Receives the node ID and its new position.
177
- */
178
- onNodeDragStop?: (nodeId: string, position: {
179
- x: number;
180
- y: number;
181
- }) => void;
182
- /**
183
- * Callback fired when user presses Cmd+C (Mac) or Ctrl+C (Windows/Linux)
184
- * with nodes selected. Receives the array of selected node IDs.
185
- * Use this to implement custom copy behavior.
186
- */
187
- onCopy?: (selectedNodeIds: string[]) => void;
188
- /**
189
- * Container width in pixels. When provided along with containerHeight,
190
- * enables calculating the initial viewport synchronously to avoid the
191
- * "zoom in then animate out" effect on initial render.
192
- */
193
- containerWidth?: number;
194
- /**
195
- * Container height in pixels. When provided along with containerWidth,
196
- * enables calculating the initial viewport synchronously to avoid the
197
- * "zoom in then animate out" effect on initial render.
198
- */
199
- containerHeight?: number;
200
- /**
201
- * ELK layout configuration for circuit-board style edge routing.
202
- * When enabled, edges are routed with orthogonal paths that don't overlap.
203
- */
204
- elkLayout?: {
205
- /**
206
- * Whether ELK layout is enabled
207
- * @default false
208
- */
209
- enabled: boolean;
210
- /**
211
- * Edge routing style
212
- * - 'orthogonal': Circuit-board style with 90-degree angles (default)
213
- * - 'splines': Smooth curved edges
214
- * - 'polyline': Straight line segments
215
- */
216
- routingStyle?: 'orthogonal' | 'splines' | 'polyline';
217
- /**
218
- * Minimum spacing between parallel edges in pixels
219
- * @default 15
220
- */
221
- edgeSpacing?: number;
222
- /**
223
- * Spacing between edges and nodes in pixels
224
- * @default 20
225
- */
226
- edgeNodeSpacing?: number;
227
- };
228
- /**
229
- * Scenario-derived edges with sequence information.
230
- * When provided, edges matching these transitions will show sequence numbers.
231
- * Use with deriveEdgesFromSequence() from @principal-ai/core to generate these.
232
- */
233
- scenarioEdges?: Array<{
234
- fromSpan: string;
235
- toSpan: string;
236
- sequenceNumber: number;
237
- }>;
238
- /**
239
- * Whether to show sequence labels on edges when scenarioEdges is provided.
240
- * @default true
241
- */
242
- showSequenceLabels?: boolean;
243
- }
244
- /** GraphRenderer props - canvas format only */
245
- export interface GraphRendererProps extends GraphRendererBaseProps {
246
- /** Extended Canvas document */
247
- canvas: ExtendedCanvas;
248
- /**
249
- * Optional component library containing reusable node and edge type definitions.
250
- * Types from the library are merged with canvas-level types, with canvas types taking precedence.
251
- * This allows sharing type definitions across multiple canvas files via a library.yaml file.
252
- */
253
- library?: ComponentLibrary;
254
- /**
255
- * Optional spans canvas containing span convention definitions.
256
- * Span colors from this canvas are used as fill colors for event nodes.
257
- * When provided with workflowSpanPattern, events will be colored based on their span.
258
- */
259
- spansCanvas?: ExtendedCanvas;
260
- /**
261
- * Optional scopes canvas containing scope definitions with colors.
262
- * Required for scope-based node coloring.
263
- * Replaces library.scopes (which is now deprecated).
264
- */
265
- scopesCanvas?: ExtendedCanvas;
266
- /**
267
- * Optional span pattern for the current workflow context.
268
- * When provided, event nodes will use the span color from spansCanvas as their fill.
269
- * This should match a spanPattern from a workflow.json file.
270
- */
271
- workflowSpanPattern?: string;
272
- }
273
- /**
274
- * Core graph visualization component using xyflow.
275
- *
276
- * Accepts an ExtendedCanvas document for rendering.
277
- *
278
- * When `editable` is true, the component manages its own edit state internally.
279
- * Use the ref to get pending changes when the user wants to save:
280
- *
281
- * ```tsx
282
- * <GraphRenderer canvas={myCanvas} />
283
- *
284
- * // With edit mode
285
- * const graphRef = useRef<GraphRendererHandle>(null);
286
- * <GraphRenderer
287
- * ref={graphRef}
288
- * canvas={myCanvas}
289
- * editable={isEditMode}
290
- * onPendingChangesChange={setHasUnsavedChanges}
291
- * />
292
- * ```
293
- */
294
- export declare const GraphRenderer: React.ForwardRefExoticComponent<GraphRendererProps & React.RefAttributes<GraphRendererHandle>>;
295
- //# sourceMappingURL=GraphRenderer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GraphRenderer.d.ts","sourceRoot":"","sources":["../../src/components/GraphRenderer.tsx"],"names":[],"mappings":"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"}