@principal-ai/subsystems-react 0.17.0 → 0.19.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 (108) hide show
  1. package/README.md +11 -85
  2. package/dist/index.d.ts +7 -44
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +6 -32
  5. package/dist/index.js.map +1 -1
  6. package/dist/subsystem/SubsystemCarousel.d.ts +36 -0
  7. package/dist/subsystem/SubsystemCarousel.d.ts.map +1 -0
  8. package/dist/subsystem/SubsystemCarousel.js +163 -0
  9. package/dist/subsystem/SubsystemCarousel.js.map +1 -0
  10. package/dist/subsystem/SubsystemComponentGraph.d.ts +25 -0
  11. package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -1
  12. package/dist/subsystem/SubsystemComponentGraph.js +329 -68
  13. package/dist/subsystem/SubsystemComponentGraph.js.map +1 -1
  14. package/package.json +4 -4
  15. package/src/index.ts +9 -199
  16. package/src/subsystem/SubsystemComponentGraph.tsx +396 -50
  17. package/src/components/ConfigurationSelector.tsx +0 -133
  18. package/src/components/GraphRenderer.tsx +0 -3195
  19. package/src/components/MultiCanvasRenderer.tsx +0 -295
  20. package/src/components/NodeTooltip.tsx +0 -279
  21. package/src/components/PendingChanges.test.tsx +0 -375
  22. package/src/components/SelectionSidebar.tsx +0 -352
  23. package/src/components/SequenceDiagramRenderer.tsx +0 -1156
  24. package/src/components/WorkflowSequenceDiagram.tsx +0 -270
  25. package/src/components/dashboard/DashboardRenderer.tsx +0 -317
  26. package/src/components/dashboard/MetricPanel.tsx +0 -254
  27. package/src/components/dashboard/MockDataProvider.ts +0 -330
  28. package/src/components/dashboard/components/BarChart.tsx +0 -299
  29. package/src/components/dashboard/components/LineChart.tsx +0 -279
  30. package/src/components/dashboard/components/MetricCard.tsx +0 -270
  31. package/src/components/dashboard/components/SourceLink.tsx +0 -63
  32. package/src/components/dashboard/components/TimeRangeSelector.tsx +0 -280
  33. package/src/components/dashboard/components/index.ts +0 -5
  34. package/src/components/dashboard/index.ts +0 -47
  35. package/src/components/dashboard/types.ts +0 -126
  36. package/src/components/state-view/PipelineView.tsx +0 -347
  37. package/src/components/state-view/index.ts +0 -14
  38. package/src/components/state-view/types.ts +0 -261
  39. package/src/components/state-view/useStateView.ts +0 -205
  40. package/src/contexts/GraphEditContext.tsx +0 -27
  41. package/src/contexts/TooltipPortalContext.ts +0 -8
  42. package/src/edges/CustomEdge.tsx +0 -402
  43. package/src/edges/GenericEdge.tsx +0 -36
  44. package/src/hooks/usePathBasedEvents.ts +0 -192
  45. package/src/hooks/useSequenceLayout.ts +0 -543
  46. package/src/hooks/useUndoRedo.ts +0 -144
  47. package/src/nodes/CustomNode.tsx +0 -1231
  48. package/src/nodes/GenericNode.tsx +0 -55
  49. package/src/nodes/otel/OtelBoundaryNode.tsx +0 -224
  50. package/src/nodes/otel/OtelEventNode.tsx +0 -225
  51. package/src/nodes/otel/OtelResourceNode.tsx +0 -251
  52. package/src/nodes/otel/OtelScopeNode.tsx +0 -221
  53. package/src/nodes/otel/OtelSpanConventionNode.tsx +0 -295
  54. package/src/nodes/otel/index.ts +0 -23
  55. package/src/nodes/otel/shared/NodeBadges.tsx +0 -295
  56. package/src/nodes/otel/shared/NodeContent.tsx +0 -204
  57. package/src/nodes/otel/shared/index.ts +0 -8
  58. package/src/nodes/otel/shared/types.ts +0 -138
  59. package/src/nodes/otel/shared/useNodeBehavior.ts +0 -114
  60. package/src/stories/Audit/BoundaryNodes.stories.tsx +0 -385
  61. package/src/stories/Audit/CanvasEdgeTypes.stories.tsx +0 -1448
  62. package/src/stories/Audit/CanvasNodeTypes.stories.tsx +0 -1049
  63. package/src/stories/Audit/ColorPriority.stories.tsx +0 -895
  64. package/src/stories/Audit/DiamondBadges.stories.tsx +0 -629
  65. package/src/stories/Audit/NodeDimensionsTesting.stories.tsx +0 -724
  66. package/src/stories/Audit/NodeFieldsAudit.stories.tsx +0 -996
  67. package/src/stories/Audit/NodeFontSizeTesting.stories.tsx +0 -715
  68. package/src/stories/Audit/NodeShapes.stories.tsx +0 -1208
  69. package/src/stories/Audit/WideNodesTesting.stories.tsx +0 -1045
  70. package/src/stories/Components/DashboardRenderer.stories.tsx +0 -263
  71. package/src/stories/Components/GraphRenderer.stories.tsx +0 -3236
  72. package/src/stories/Components/MultiCanvasRenderer.stories.tsx +0 -370
  73. package/src/stories/Components/SequenceDiagram.stories.tsx +0 -255
  74. package/src/stories/Components/StateView.stories.tsx +0 -417
  75. package/src/stories/Components/TraceViewer.stories.tsx +0 -442
  76. package/src/stories/Components/WorkflowSequenceDiagram.stories.tsx +0 -802
  77. package/src/stories/Features/AnimationWorkshop.stories.tsx +0 -727
  78. package/src/stories/Features/ChangeTypeVisual.stories.tsx +0 -67
  79. package/src/stories/Features/EventDrivenAnimations.stories.tsx +0 -513
  80. package/src/stories/Features/MultiConfig.stories.tsx +0 -539
  81. package/src/stories/Layout/ElkEdgeRouting.stories.tsx +0 -539
  82. package/src/stories/Layout/GraphOrientation.stories.tsx +0 -500
  83. package/src/stories/Layout/MultiDirectionalConnections.stories.tsx +0 -352
  84. package/src/stories/Nodes/NodeDefinitionComparison.stories.tsx +0 -560
  85. package/src/stories/Nodes/NodeNameFallbacks.stories.tsx +0 -491
  86. package/src/stories/Nodes/NumericColors.stories.tsx +0 -440
  87. package/src/stories/OTEL/EventNameDisplay.stories.tsx +0 -694
  88. package/src/stories/OTEL/EventNameFallback.stories.tsx +0 -578
  89. package/src/stories/OTEL/OtelComponents.stories.tsx +0 -422
  90. package/src/stories/OTEL/OtelNodeTypesPrototype.stories.tsx +0 -806
  91. package/src/stories/OTEL/RawEventCards.stories.tsx +0 -57
  92. package/src/stories/OTEL/SpanBadges.stories.tsx +0 -840
  93. package/src/stories/OTEL/ValidationEventsCanvas.stories.tsx +0 -209
  94. package/src/stories/RealWorld/BacklogMdCanvases.stories.tsx +0 -721
  95. package/src/stories/RealWorld/FileCitySequence.stories.tsx +0 -516
  96. package/src/stories/RealWorld/RealCanvasFiles.stories.tsx +0 -336
  97. package/src/stories/__traces__/test-run.canvas.json +0 -241
  98. package/src/stories/data/activity-feed-analytics.dashboard.json +0 -300
  99. package/src/stories/data/file-city-images-transformed.otel.canvas.json +0 -295
  100. package/src/stories/data/file-city-workflows.json +0 -269
  101. package/src/stories/data/graph-converter-test-execution.json +0 -443
  102. package/src/stories/data/graph-converter-test.workflow.json +0 -105
  103. package/src/stories/data/graph-converter-validated-execution.json +0 -58
  104. package/src/utils/animationMapping.ts +0 -166
  105. package/src/utils/canvasBounds.ts +0 -146
  106. package/src/utils/graphConverter.ts +0 -148
  107. package/src/utils/iconResolver.tsx +0 -53
  108. package/src/utils/orientationUtils.ts +0 -73
@@ -1,694 +0,0 @@
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: 'OTEL/EventNameDisplay',
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
- * Shows event names appearing under display names when they differ
30
- */
31
- export const EventNameUnderDisplayName: Story = {
32
- render: () => {
33
- const theme = defaultEditorTheme;
34
-
35
- const canvas: ExtendedCanvas = {
36
- nodes: [
37
- // Node where display name matches event name (no sub-text shown)
38
- {
39
- id: 'matching-name',
40
- type: 'text',
41
- x: 100,
42
- y: 100,
43
- width: 200,
44
- height: 90,
45
- text: 'analysis.started',
46
- color: '#22c55e',
47
- pv: {
48
- name: 'analysis.started',
49
- shape: 'roundedRect',
50
- event: {
51
- name: 'analysis.started',
52
- attributes: {
53
- 'repository.path': {
54
- type: 'string',
55
- required: true,
56
- },
57
- },
58
- },
59
- otel: {
60
- kind: 'event',
61
- category: 'lifecycle',
62
- },
63
- },
64
- },
65
- // Node where display name differs from event name (shows both)
66
- {
67
- id: 'different-name-1',
68
- type: 'text',
69
- x: 350,
70
- y: 100,
71
- width: 200,
72
- height: 90,
73
- text: 'Analysis Started',
74
- color: '#22c55e',
75
- pv: {
76
- name: 'Analysis Started',
77
- shape: 'roundedRect',
78
- event: {
79
- name: 'analysis.started',
80
- attributes: {
81
- 'repository.path': {
82
- type: 'string',
83
- required: true,
84
- },
85
- },
86
- },
87
- otel: {
88
- kind: 'event',
89
- category: 'lifecycle',
90
- },
91
- },
92
- },
93
- // Another example
94
- {
95
- id: 'different-name-2',
96
- type: 'text',
97
- x: 600,
98
- y: 100,
99
- width: 200,
100
- height: 90,
101
- text: 'File Parsed',
102
- color: '#3b82f6',
103
- pv: {
104
- name: 'File Parsed',
105
- shape: 'roundedRect',
106
- event: {
107
- name: 'file.parsed',
108
- attributes: {
109
- 'file.path': {
110
- type: 'string',
111
- required: true,
112
- },
113
- },
114
- },
115
- otel: {
116
- kind: 'event',
117
- category: 'operation',
118
- },
119
- },
120
- },
121
- // Node with no event (no sub-text)
122
- {
123
- id: 'no-event',
124
- type: 'text',
125
- x: 850,
126
- y: 100,
127
- width: 200,
128
- height: 90,
129
- text: 'Regular Node',
130
- color: '#6b7280',
131
- pv: {
132
- name: 'Regular Node',
133
- shape: 'roundedRect',
134
- },
135
- },
136
- ],
137
- edges: [],
138
- };
139
-
140
- return (
141
- <div style={{ padding: '32px' }}>
142
- <h1 style={{
143
- marginBottom: '16px',
144
- fontSize: theme.fontSizes[7],
145
- color: theme.colors.text,
146
- }}>
147
- Event Name Display Feature
148
- </h1>
149
- <p style={{
150
- marginBottom: '32px',
151
- fontSize: theme.fontSizes[2],
152
- color: theme.colors.textSecondary,
153
- maxWidth: '1000px',
154
- }}>
155
- When a node has both a display name and an event name, and they differ, the event name
156
- is shown underneath in smaller text (75% size, monospace, 50% opacity).
157
- </p>
158
-
159
- <div style={{
160
- marginBottom: '24px',
161
- padding: '20px',
162
- backgroundColor: theme.colors.surface,
163
- borderRadius: '8px',
164
- border: `1px solid ${theme.colors.border}`,
165
- }}>
166
- <h3 style={{
167
- marginBottom: '12px',
168
- fontSize: theme.fontSizes[3],
169
- color: theme.colors.text,
170
- }}>
171
- How it Works
172
- </h3>
173
- <div style={{
174
- fontSize: theme.fontSizes[1],
175
- color: theme.colors.textSecondary,
176
- lineHeight: 1.8,
177
- }}>
178
- <div style={{ marginBottom: '12px' }}>
179
- <strong>Node 1:</strong> name = "analysis.started", event.name = "analysis.started"
180
- <br />
181
- → Shows only: <code style={{
182
- fontFamily: theme.fonts.monospace,
183
- backgroundColor: theme.colors.backgroundSecondary,
184
- padding: '2px 6px',
185
- borderRadius: '4px',
186
- }}>analysis.started</code>
187
- </div>
188
- <div style={{ marginBottom: '12px' }}>
189
- <strong>Node 2:</strong> name = "Analysis Started", event.name = "analysis.started"
190
- <br />
191
- → Shows: <code style={{
192
- fontFamily: theme.fonts.monospace,
193
- backgroundColor: theme.colors.backgroundSecondary,
194
- padding: '2px 6px',
195
- borderRadius: '4px',
196
- }}>Analysis Started</code> (main) + <code style={{
197
- fontFamily: theme.fonts.monospace,
198
- backgroundColor: theme.colors.backgroundSecondary,
199
- padding: '2px 6px',
200
- borderRadius: '4px',
201
- fontSize: theme.fontSizes[0],
202
- opacity: 0.6,
203
- }}>analysis.started</code> (sub)
204
- </div>
205
- <div>
206
- <strong>Node 4:</strong> name = "Regular Node", no event
207
- <br />
208
- → Shows only: <code style={{
209
- fontFamily: theme.fonts.monospace,
210
- backgroundColor: theme.colors.backgroundSecondary,
211
- padding: '2px 6px',
212
- borderRadius: '4px',
213
- }}>Regular Node</code>
214
- </div>
215
- </div>
216
- </div>
217
-
218
- <div style={{
219
- backgroundColor: theme.colors.background,
220
- border: `2px solid ${theme.colors.border}`,
221
- borderRadius: '8px',
222
- overflow: 'hidden',
223
- padding: '40px',
224
- }}>
225
- <ThemeProvider theme={theme16px}>
226
- <GraphRenderer
227
- canvas={canvas}
228
- height={300}
229
- width="100%"
230
- />
231
- </ThemeProvider>
232
- </div>
233
- </div>
234
- );
235
- },
236
- };
237
-
238
- /**
239
- * Real validation workflow showing mixed display and event names
240
- */
241
- export const ValidationWorkflowWithEventNames: Story = {
242
- render: () => {
243
- const theme = defaultEditorTheme;
244
-
245
- const canvas: ExtendedCanvas = {
246
- nodes: [
247
- {
248
- id: 'node-1',
249
- type: 'text',
250
- x: 100,
251
- y: 80,
252
- width: 200,
253
- height: 90,
254
- text: 'Analysis Started',
255
- color: '#22c55e',
256
- pv: {
257
- name: 'Analysis Started',
258
- shape: 'roundedRect',
259
- event: {
260
- name: 'analysis.started',
261
- attributes: {},
262
- },
263
- otel: { kind: 'event', category: 'lifecycle' },
264
- },
265
- },
266
- {
267
- id: 'node-2',
268
- type: 'text',
269
- x: 100,
270
- y: 220,
271
- width: 200,
272
- height: 90,
273
- text: 'FileTree Built',
274
- color: '#3b82f6',
275
- pv: {
276
- name: 'FileTree Built',
277
- shape: 'roundedRect',
278
- event: {
279
- name: 'filetree.built',
280
- attributes: {},
281
- },
282
- otel: { kind: 'event', category: 'operation' },
283
- },
284
- },
285
- {
286
- id: 'node-3',
287
- type: 'text',
288
- x: 100,
289
- y: 360,
290
- width: 200,
291
- height: 90,
292
- text: 'Packages Discovered',
293
- color: '#f59e0b',
294
- pv: {
295
- name: 'Packages Discovered',
296
- shape: 'roundedRect',
297
- event: {
298
- name: 'packages.discovered',
299
- attributes: {},
300
- },
301
- otel: { kind: 'event', category: 'operation' },
302
- },
303
- },
304
- {
305
- id: 'node-4',
306
- type: 'text',
307
- x: 100,
308
- y: 500,
309
- width: 200,
310
- height: 90,
311
- text: 'Canvases Discovered',
312
- color: '#8b5cf6',
313
- pv: {
314
- name: 'Canvases Discovered',
315
- shape: 'roundedRect',
316
- event: {
317
- name: 'canvases.discovered',
318
- attributes: {},
319
- },
320
- otel: { kind: 'event', category: 'operation' },
321
- },
322
- },
323
- {
324
- id: 'node-5',
325
- type: 'text',
326
- x: 100,
327
- y: 640,
328
- width: 200,
329
- height: 90,
330
- text: 'Discovery Complete',
331
- color: '#f59e0b',
332
- pv: {
333
- name: 'Discovery Complete',
334
- shape: 'roundedRect',
335
- event: {
336
- name: 'discovery.complete',
337
- attributes: {},
338
- },
339
- otel: { kind: 'event', category: 'operation' },
340
- },
341
- },
342
- {
343
- id: 'node-6',
344
- type: 'text',
345
- x: 100,
346
- y: 780,
347
- width: 200,
348
- height: 90,
349
- text: 'Validation Started',
350
- color: '#22c55e',
351
- pv: {
352
- name: 'Validation Started',
353
- shape: 'roundedRect',
354
- event: {
355
- name: 'validation.started',
356
- attributes: {},
357
- },
358
- otel: { kind: 'event', category: 'lifecycle' },
359
- },
360
- },
361
- {
362
- id: 'node-7',
363
- type: 'text',
364
- x: 100,
365
- y: 920,
366
- width: 200,
367
- height: 90,
368
- text: 'Canvas Validated',
369
- color: '#8b5cf6',
370
- pv: {
371
- name: 'Canvas Validated',
372
- shape: 'roundedRect',
373
- event: {
374
- name: 'canvas.validated',
375
- attributes: {},
376
- },
377
- otel: { kind: 'event', category: 'operation' },
378
- },
379
- },
380
- {
381
- id: 'node-8',
382
- type: 'text',
383
- x: 100,
384
- y: 1060,
385
- width: 200,
386
- height: 90,
387
- text: 'Validation Complete',
388
- color: '#22c55e',
389
- pv: {
390
- name: 'Validation Complete',
391
- shape: 'roundedRect',
392
- event: {
393
- name: 'validation.complete',
394
- attributes: {},
395
- },
396
- otel: { kind: 'event', category: 'lifecycle' },
397
- },
398
- },
399
- ],
400
- edges: Array.from({ length: 7 }, (_, i) => ({
401
- id: `edge-${i}`,
402
- fromNode: `node-${i + 1}`,
403
- toNode: `node-${i + 2}`,
404
- fromSide: 'bottom' as const,
405
- toSide: 'top' as const,
406
- })),
407
- };
408
-
409
- return (
410
- <div style={{ padding: '32px' }}>
411
- <h1 style={{
412
- marginBottom: '16px',
413
- fontSize: theme.fontSizes[7],
414
- color: theme.colors.text,
415
- }}>
416
- Validation Workflow with Event Names
417
- </h1>
418
- <p style={{
419
- marginBottom: '32px',
420
- fontSize: theme.fontSizes[2],
421
- color: theme.colors.textSecondary,
422
- maxWidth: '1000px',
423
- }}>
424
- Real validation workflow showing human-readable display names with machine-readable event names underneath.
425
- This combines the best of both worlds: clear labels for humans, technical identifiers for machines.
426
- </p>
427
-
428
- <div style={{
429
- marginBottom: '24px',
430
- padding: '20px',
431
- backgroundColor: theme.colors.surface,
432
- borderRadius: '8px',
433
- border: `2px solid ${theme.colors.primary}`,
434
- }}>
435
- <h3 style={{
436
- marginBottom: '12px',
437
- fontSize: theme.fontSizes[3],
438
- color: theme.colors.text,
439
- }}>
440
- Design Pattern
441
- </h3>
442
- <div style={{
443
- display: 'grid',
444
- gridTemplateColumns: '1fr 1fr',
445
- gap: '24px',
446
- fontSize: theme.fontSizes[1],
447
- lineHeight: 1.8,
448
- }}>
449
- <div>
450
- <strong style={{ color: theme.colors.primary }}>Display Name (Top)</strong>
451
- <ul style={{ paddingLeft: '20px', marginTop: '8px', color: theme.colors.text }}>
452
- <li>Human-readable</li>
453
- <li>Title Case formatting</li>
454
- <li>Clear and descriptive</li>
455
- <li>Main font size (16px)</li>
456
- </ul>
457
- </div>
458
- <div>
459
- <strong style={{ color: theme.colors.primary }}>Event Name (Bottom)</strong>
460
- <ul style={{ paddingLeft: '20px', marginTop: '8px', color: theme.colors.text }}>
461
- <li>Machine-readable</li>
462
- <li>kebab-case formatting</li>
463
- <li>Technical identifier</li>
464
- <li>Smaller font (12px, 50% opacity)</li>
465
- </ul>
466
- </div>
467
- </div>
468
- </div>
469
-
470
- <div style={{
471
- backgroundColor: theme.colors.background,
472
- border: `2px solid ${theme.colors.border}`,
473
- borderRadius: '8px',
474
- overflow: 'hidden',
475
- }}>
476
- <ThemeProvider theme={theme16px}>
477
- <GraphRenderer
478
- canvas={canvas}
479
- height={1300}
480
- width="100%"
481
- />
482
- </ThemeProvider>
483
- </div>
484
-
485
- <div style={{
486
- marginTop: '32px',
487
- padding: '20px',
488
- backgroundColor: theme.colors.surface,
489
- borderRadius: '8px',
490
- }}>
491
- <h3 style={{
492
- marginBottom: '12px',
493
- fontSize: theme.fontSizes[3],
494
- color: theme.colors.text,
495
- }}>
496
- Benefits
497
- </h3>
498
- <ul style={{
499
- fontSize: theme.fontSizes[1],
500
- color: theme.colors.textSecondary,
501
- lineHeight: 1.8,
502
- paddingLeft: '20px',
503
- }}>
504
- <li><strong>Clarity:</strong> Users see friendly names like "Analysis Started"</li>
505
- <li><strong>Traceability:</strong> Technical event names visible for debugging</li>
506
- <li><strong>Documentation:</strong> Event schema is self-documenting in the visual</li>
507
- <li><strong>Flexibility:</strong> Can use different naming conventions for each audience</li>
508
- <li><strong>Consistency:</strong> Event names match OTEL telemetry data exactly</li>
509
- </ul>
510
- </div>
511
- </div>
512
- );
513
- },
514
- };
515
-
516
- /**
517
- * Comparison: Backlog.md style (technical names) vs validation.otel.canvas style (friendly names)
518
- */
519
- export const NamingStyleComparison: Story = {
520
- render: () => {
521
- const theme = defaultEditorTheme;
522
-
523
- const events = [
524
- { display: 'Task Created', event: 'task.create.started' },
525
- { display: 'File Validated', event: 'task.create.validated' },
526
- { display: 'Task Saved', event: 'task.create.saved' },
527
- { display: 'Git Committed', event: 'task.create.committed' },
528
- ];
529
-
530
- return (
531
- <div style={{ padding: '32px' }}>
532
- <h1 style={{
533
- marginBottom: '16px',
534
- fontSize: theme.fontSizes[7],
535
- color: theme.colors.text,
536
- }}>
537
- Naming Style Comparison
538
- </h1>
539
- <p style={{
540
- marginBottom: '32px',
541
- fontSize: theme.fontSizes[2],
542
- color: theme.colors.textSecondary,
543
- maxWidth: '1000px',
544
- }}>
545
- Comparing Backlog.md style (technical event names as display) vs validation.otel.canvas style
546
- (friendly display names with event names shown below).
547
- </p>
548
-
549
- <div style={{
550
- display: 'grid',
551
- gridTemplateColumns: '1fr 1fr',
552
- gap: '32px',
553
- }}>
554
- {/* Backlog.md style */}
555
- <div>
556
- <h3 style={{
557
- marginBottom: '16px',
558
- fontSize: theme.fontSizes[3],
559
- color: theme.colors.text,
560
- }}>
561
- Backlog.md Style
562
- </h3>
563
- <p style={{
564
- marginBottom: '16px',
565
- fontSize: theme.fontSizes[1],
566
- color: theme.colors.textSecondary,
567
- }}>
568
- Display name = event name (technical, no sub-text)
569
- </p>
570
- <div style={{
571
- backgroundColor: theme.colors.background,
572
- border: `2px solid ${theme.colors.border}`,
573
- borderRadius: '8px',
574
- overflow: 'hidden',
575
- }}>
576
- <ThemeProvider theme={theme16px}>
577
- <GraphRenderer
578
- canvas={{
579
- nodes: events.map((evt, idx) => ({
580
- id: `backlog-${idx}`,
581
- type: 'text',
582
- x: 100,
583
- y: 80 + idx * 140,
584
- width: 200,
585
- height: 90,
586
- text: evt.event,
587
- color: '#3b82f6',
588
- pv: {
589
- name: evt.event,
590
- shape: 'roundedRect',
591
- event: {
592
- name: evt.event,
593
- attributes: {},
594
- },
595
- },
596
- })),
597
- edges: Array.from({ length: events.length - 1 }, (_, i) => ({
598
- id: `edge-backlog-${i}`,
599
- fromNode: `backlog-${i}`,
600
- toNode: `backlog-${i + 1}`,
601
- fromSide: 'bottom' as const,
602
- toSide: 'top' as const,
603
- })),
604
- }}
605
- height={700}
606
- width="100%"
607
- />
608
- </ThemeProvider>
609
- </div>
610
- <div style={{
611
- marginTop: '16px',
612
- padding: '12px',
613
- backgroundColor: theme.colors.surface,
614
- borderRadius: '6px',
615
- fontSize: theme.fontSizes[1],
616
- color: theme.colors.textSecondary,
617
- }}>
618
- <strong>Best for:</strong> Developer-focused workflows, technical documentation
619
- </div>
620
- </div>
621
-
622
- {/* validation.otel.canvas style */}
623
- <div>
624
- <h3 style={{
625
- marginBottom: '16px',
626
- fontSize: theme.fontSizes[3],
627
- color: theme.colors.text,
628
- }}>
629
- Validation.otel.canvas Style
630
- </h3>
631
- <p style={{
632
- marginBottom: '16px',
633
- fontSize: theme.fontSizes[1],
634
- color: theme.colors.textSecondary,
635
- }}>
636
- Friendly display name + event name shown below
637
- </p>
638
- <div style={{
639
- backgroundColor: theme.colors.background,
640
- border: `2px solid ${theme.colors.primary}`,
641
- borderRadius: '8px',
642
- overflow: 'hidden',
643
- }}>
644
- <ThemeProvider theme={theme16px}>
645
- <GraphRenderer
646
- canvas={{
647
- nodes: events.map((evt, idx) => ({
648
- id: `validation-${idx}`,
649
- type: 'text',
650
- x: 100,
651
- y: 80 + idx * 140,
652
- width: 200,
653
- height: 90,
654
- text: evt.display,
655
- color: '#3b82f6',
656
- pv: {
657
- name: evt.display,
658
- shape: 'roundedRect',
659
- event: {
660
- name: evt.event,
661
- attributes: {},
662
- },
663
- },
664
- })),
665
- edges: Array.from({ length: events.length - 1 }, (_, i) => ({
666
- id: `edge-validation-${i}`,
667
- fromNode: `validation-${i}`,
668
- toNode: `validation-${i + 1}`,
669
- fromSide: 'bottom' as const,
670
- toSide: 'top' as const,
671
- })),
672
- }}
673
- height={700}
674
- width="100%"
675
- />
676
- </ThemeProvider>
677
- </div>
678
- <div style={{
679
- marginTop: '16px',
680
- padding: '12px',
681
- backgroundColor: theme.colors.surface,
682
- borderRadius: '6px',
683
- fontSize: theme.fontSizes[1],
684
- color: theme.colors.text,
685
- border: `2px solid ${theme.colors.primary}`,
686
- }}>
687
- <strong>Best for:</strong> User-facing documentation, presentations, broader audiences
688
- </div>
689
- </div>
690
- </div>
691
- </div>
692
- );
693
- },
694
- };