@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.
- package/README.md +11 -85
- package/dist/index.d.ts +7 -44
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -32
- package/dist/index.js.map +1 -1
- package/dist/subsystem/SubsystemCarousel.d.ts +36 -0
- package/dist/subsystem/SubsystemCarousel.d.ts.map +1 -0
- package/dist/subsystem/SubsystemCarousel.js +163 -0
- package/dist/subsystem/SubsystemCarousel.js.map +1 -0
- package/dist/subsystem/SubsystemComponentGraph.d.ts +25 -0
- package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -1
- package/dist/subsystem/SubsystemComponentGraph.js +329 -68
- package/dist/subsystem/SubsystemComponentGraph.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +9 -199
- package/src/subsystem/SubsystemComponentGraph.tsx +396 -50
- package/src/components/ConfigurationSelector.tsx +0 -133
- package/src/components/GraphRenderer.tsx +0 -3195
- package/src/components/MultiCanvasRenderer.tsx +0 -295
- package/src/components/NodeTooltip.tsx +0 -279
- package/src/components/PendingChanges.test.tsx +0 -375
- package/src/components/SelectionSidebar.tsx +0 -352
- package/src/components/SequenceDiagramRenderer.tsx +0 -1156
- package/src/components/WorkflowSequenceDiagram.tsx +0 -270
- package/src/components/dashboard/DashboardRenderer.tsx +0 -317
- package/src/components/dashboard/MetricPanel.tsx +0 -254
- package/src/components/dashboard/MockDataProvider.ts +0 -330
- package/src/components/dashboard/components/BarChart.tsx +0 -299
- package/src/components/dashboard/components/LineChart.tsx +0 -279
- package/src/components/dashboard/components/MetricCard.tsx +0 -270
- package/src/components/dashboard/components/SourceLink.tsx +0 -63
- package/src/components/dashboard/components/TimeRangeSelector.tsx +0 -280
- package/src/components/dashboard/components/index.ts +0 -5
- package/src/components/dashboard/index.ts +0 -47
- package/src/components/dashboard/types.ts +0 -126
- package/src/components/state-view/PipelineView.tsx +0 -347
- package/src/components/state-view/index.ts +0 -14
- package/src/components/state-view/types.ts +0 -261
- package/src/components/state-view/useStateView.ts +0 -205
- package/src/contexts/GraphEditContext.tsx +0 -27
- package/src/contexts/TooltipPortalContext.ts +0 -8
- package/src/edges/CustomEdge.tsx +0 -402
- package/src/edges/GenericEdge.tsx +0 -36
- package/src/hooks/usePathBasedEvents.ts +0 -192
- package/src/hooks/useSequenceLayout.ts +0 -543
- package/src/hooks/useUndoRedo.ts +0 -144
- package/src/nodes/CustomNode.tsx +0 -1231
- package/src/nodes/GenericNode.tsx +0 -55
- package/src/nodes/otel/OtelBoundaryNode.tsx +0 -224
- package/src/nodes/otel/OtelEventNode.tsx +0 -225
- package/src/nodes/otel/OtelResourceNode.tsx +0 -251
- package/src/nodes/otel/OtelScopeNode.tsx +0 -221
- package/src/nodes/otel/OtelSpanConventionNode.tsx +0 -295
- package/src/nodes/otel/index.ts +0 -23
- package/src/nodes/otel/shared/NodeBadges.tsx +0 -295
- package/src/nodes/otel/shared/NodeContent.tsx +0 -204
- package/src/nodes/otel/shared/index.ts +0 -8
- package/src/nodes/otel/shared/types.ts +0 -138
- package/src/nodes/otel/shared/useNodeBehavior.ts +0 -114
- package/src/stories/Audit/BoundaryNodes.stories.tsx +0 -385
- package/src/stories/Audit/CanvasEdgeTypes.stories.tsx +0 -1448
- package/src/stories/Audit/CanvasNodeTypes.stories.tsx +0 -1049
- package/src/stories/Audit/ColorPriority.stories.tsx +0 -895
- package/src/stories/Audit/DiamondBadges.stories.tsx +0 -629
- package/src/stories/Audit/NodeDimensionsTesting.stories.tsx +0 -724
- package/src/stories/Audit/NodeFieldsAudit.stories.tsx +0 -996
- package/src/stories/Audit/NodeFontSizeTesting.stories.tsx +0 -715
- package/src/stories/Audit/NodeShapes.stories.tsx +0 -1208
- package/src/stories/Audit/WideNodesTesting.stories.tsx +0 -1045
- package/src/stories/Components/DashboardRenderer.stories.tsx +0 -263
- package/src/stories/Components/GraphRenderer.stories.tsx +0 -3236
- package/src/stories/Components/MultiCanvasRenderer.stories.tsx +0 -370
- package/src/stories/Components/SequenceDiagram.stories.tsx +0 -255
- package/src/stories/Components/StateView.stories.tsx +0 -417
- package/src/stories/Components/TraceViewer.stories.tsx +0 -442
- package/src/stories/Components/WorkflowSequenceDiagram.stories.tsx +0 -802
- package/src/stories/Features/AnimationWorkshop.stories.tsx +0 -727
- package/src/stories/Features/ChangeTypeVisual.stories.tsx +0 -67
- package/src/stories/Features/EventDrivenAnimations.stories.tsx +0 -513
- package/src/stories/Features/MultiConfig.stories.tsx +0 -539
- package/src/stories/Layout/ElkEdgeRouting.stories.tsx +0 -539
- package/src/stories/Layout/GraphOrientation.stories.tsx +0 -500
- package/src/stories/Layout/MultiDirectionalConnections.stories.tsx +0 -352
- package/src/stories/Nodes/NodeDefinitionComparison.stories.tsx +0 -560
- package/src/stories/Nodes/NodeNameFallbacks.stories.tsx +0 -491
- package/src/stories/Nodes/NumericColors.stories.tsx +0 -440
- package/src/stories/OTEL/EventNameDisplay.stories.tsx +0 -694
- package/src/stories/OTEL/EventNameFallback.stories.tsx +0 -578
- package/src/stories/OTEL/OtelComponents.stories.tsx +0 -422
- package/src/stories/OTEL/OtelNodeTypesPrototype.stories.tsx +0 -806
- package/src/stories/OTEL/RawEventCards.stories.tsx +0 -57
- package/src/stories/OTEL/SpanBadges.stories.tsx +0 -840
- package/src/stories/OTEL/ValidationEventsCanvas.stories.tsx +0 -209
- package/src/stories/RealWorld/BacklogMdCanvases.stories.tsx +0 -721
- package/src/stories/RealWorld/FileCitySequence.stories.tsx +0 -516
- package/src/stories/RealWorld/RealCanvasFiles.stories.tsx +0 -336
- package/src/stories/__traces__/test-run.canvas.json +0 -241
- package/src/stories/data/activity-feed-analytics.dashboard.json +0 -300
- package/src/stories/data/file-city-images-transformed.otel.canvas.json +0 -295
- package/src/stories/data/file-city-workflows.json +0 -269
- package/src/stories/data/graph-converter-test-execution.json +0 -443
- package/src/stories/data/graph-converter-test.workflow.json +0 -105
- package/src/stories/data/graph-converter-validated-execution.json +0 -58
- package/src/utils/animationMapping.ts +0 -166
- package/src/utils/canvasBounds.ts +0 -146
- package/src/utils/graphConverter.ts +0 -148
- package/src/utils/iconResolver.tsx +0 -53
- 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
|
-
};
|