@principal-ai/subsystems-react 0.17.0 → 0.18.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 (98) hide show
  1. package/dist/index.d.ts +7 -44
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +6 -32
  4. package/dist/index.js.map +1 -1
  5. package/package.json +2 -2
  6. package/src/index.ts +9 -199
  7. package/src/components/ConfigurationSelector.tsx +0 -133
  8. package/src/components/GraphRenderer.tsx +0 -3195
  9. package/src/components/MultiCanvasRenderer.tsx +0 -295
  10. package/src/components/NodeTooltip.tsx +0 -279
  11. package/src/components/PendingChanges.test.tsx +0 -375
  12. package/src/components/SelectionSidebar.tsx +0 -352
  13. package/src/components/SequenceDiagramRenderer.tsx +0 -1156
  14. package/src/components/WorkflowSequenceDiagram.tsx +0 -270
  15. package/src/components/dashboard/DashboardRenderer.tsx +0 -317
  16. package/src/components/dashboard/MetricPanel.tsx +0 -254
  17. package/src/components/dashboard/MockDataProvider.ts +0 -330
  18. package/src/components/dashboard/components/BarChart.tsx +0 -299
  19. package/src/components/dashboard/components/LineChart.tsx +0 -279
  20. package/src/components/dashboard/components/MetricCard.tsx +0 -270
  21. package/src/components/dashboard/components/SourceLink.tsx +0 -63
  22. package/src/components/dashboard/components/TimeRangeSelector.tsx +0 -280
  23. package/src/components/dashboard/components/index.ts +0 -5
  24. package/src/components/dashboard/index.ts +0 -47
  25. package/src/components/dashboard/types.ts +0 -126
  26. package/src/components/state-view/PipelineView.tsx +0 -347
  27. package/src/components/state-view/index.ts +0 -14
  28. package/src/components/state-view/types.ts +0 -261
  29. package/src/components/state-view/useStateView.ts +0 -205
  30. package/src/contexts/GraphEditContext.tsx +0 -27
  31. package/src/contexts/TooltipPortalContext.ts +0 -8
  32. package/src/edges/CustomEdge.tsx +0 -402
  33. package/src/edges/GenericEdge.tsx +0 -36
  34. package/src/hooks/usePathBasedEvents.ts +0 -192
  35. package/src/hooks/useSequenceLayout.ts +0 -543
  36. package/src/hooks/useUndoRedo.ts +0 -144
  37. package/src/nodes/CustomNode.tsx +0 -1231
  38. package/src/nodes/GenericNode.tsx +0 -55
  39. package/src/nodes/otel/OtelBoundaryNode.tsx +0 -224
  40. package/src/nodes/otel/OtelEventNode.tsx +0 -225
  41. package/src/nodes/otel/OtelResourceNode.tsx +0 -251
  42. package/src/nodes/otel/OtelScopeNode.tsx +0 -221
  43. package/src/nodes/otel/OtelSpanConventionNode.tsx +0 -295
  44. package/src/nodes/otel/index.ts +0 -23
  45. package/src/nodes/otel/shared/NodeBadges.tsx +0 -295
  46. package/src/nodes/otel/shared/NodeContent.tsx +0 -204
  47. package/src/nodes/otel/shared/index.ts +0 -8
  48. package/src/nodes/otel/shared/types.ts +0 -138
  49. package/src/nodes/otel/shared/useNodeBehavior.ts +0 -114
  50. package/src/stories/Audit/BoundaryNodes.stories.tsx +0 -385
  51. package/src/stories/Audit/CanvasEdgeTypes.stories.tsx +0 -1448
  52. package/src/stories/Audit/CanvasNodeTypes.stories.tsx +0 -1049
  53. package/src/stories/Audit/ColorPriority.stories.tsx +0 -895
  54. package/src/stories/Audit/DiamondBadges.stories.tsx +0 -629
  55. package/src/stories/Audit/NodeDimensionsTesting.stories.tsx +0 -724
  56. package/src/stories/Audit/NodeFieldsAudit.stories.tsx +0 -996
  57. package/src/stories/Audit/NodeFontSizeTesting.stories.tsx +0 -715
  58. package/src/stories/Audit/NodeShapes.stories.tsx +0 -1208
  59. package/src/stories/Audit/WideNodesTesting.stories.tsx +0 -1045
  60. package/src/stories/Components/DashboardRenderer.stories.tsx +0 -263
  61. package/src/stories/Components/GraphRenderer.stories.tsx +0 -3236
  62. package/src/stories/Components/MultiCanvasRenderer.stories.tsx +0 -370
  63. package/src/stories/Components/SequenceDiagram.stories.tsx +0 -255
  64. package/src/stories/Components/StateView.stories.tsx +0 -417
  65. package/src/stories/Components/TraceViewer.stories.tsx +0 -442
  66. package/src/stories/Components/WorkflowSequenceDiagram.stories.tsx +0 -802
  67. package/src/stories/Features/AnimationWorkshop.stories.tsx +0 -727
  68. package/src/stories/Features/ChangeTypeVisual.stories.tsx +0 -67
  69. package/src/stories/Features/EventDrivenAnimations.stories.tsx +0 -513
  70. package/src/stories/Features/MultiConfig.stories.tsx +0 -539
  71. package/src/stories/Layout/ElkEdgeRouting.stories.tsx +0 -539
  72. package/src/stories/Layout/GraphOrientation.stories.tsx +0 -500
  73. package/src/stories/Layout/MultiDirectionalConnections.stories.tsx +0 -352
  74. package/src/stories/Nodes/NodeDefinitionComparison.stories.tsx +0 -560
  75. package/src/stories/Nodes/NodeNameFallbacks.stories.tsx +0 -491
  76. package/src/stories/Nodes/NumericColors.stories.tsx +0 -440
  77. package/src/stories/OTEL/EventNameDisplay.stories.tsx +0 -694
  78. package/src/stories/OTEL/EventNameFallback.stories.tsx +0 -578
  79. package/src/stories/OTEL/OtelComponents.stories.tsx +0 -422
  80. package/src/stories/OTEL/OtelNodeTypesPrototype.stories.tsx +0 -806
  81. package/src/stories/OTEL/RawEventCards.stories.tsx +0 -57
  82. package/src/stories/OTEL/SpanBadges.stories.tsx +0 -840
  83. package/src/stories/OTEL/ValidationEventsCanvas.stories.tsx +0 -209
  84. package/src/stories/RealWorld/BacklogMdCanvases.stories.tsx +0 -721
  85. package/src/stories/RealWorld/FileCitySequence.stories.tsx +0 -516
  86. package/src/stories/RealWorld/RealCanvasFiles.stories.tsx +0 -336
  87. package/src/stories/__traces__/test-run.canvas.json +0 -241
  88. package/src/stories/data/activity-feed-analytics.dashboard.json +0 -300
  89. package/src/stories/data/file-city-images-transformed.otel.canvas.json +0 -295
  90. package/src/stories/data/file-city-workflows.json +0 -269
  91. package/src/stories/data/graph-converter-test-execution.json +0 -443
  92. package/src/stories/data/graph-converter-test.workflow.json +0 -105
  93. package/src/stories/data/graph-converter-validated-execution.json +0 -58
  94. package/src/utils/animationMapping.ts +0 -166
  95. package/src/utils/canvasBounds.ts +0 -146
  96. package/src/utils/graphConverter.ts +0 -148
  97. package/src/utils/iconResolver.tsx +0 -53
  98. 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
- };