@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,1049 +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
-
7
- const meta = {
8
- title: 'Audit/CanvasNodeTypes',
9
- component: GraphRenderer,
10
- parameters: {
11
- layout: 'centered',
12
- },
13
- tags: ['autodocs'],
14
- decorators: [
15
- (Story) => (
16
- <ThemeProvider theme={defaultEditorTheme}>
17
- <Story />
18
- </ThemeProvider>
19
- ),
20
- ],
21
- } satisfies Meta<typeof GraphRenderer>;
22
-
23
- export default meta;
24
- type Story = StoryObj<typeof meta>;
25
-
26
- /**
27
- * Canvas showing all standard JSON Canvas node types
28
- */
29
- const allNodeTypesCanvas: ExtendedCanvas = {
30
- nodes: [
31
- // Text Node
32
- {
33
- id: 'text-node',
34
- type: 'text',
35
- x: 100,
36
- y: 100,
37
- width: 180,
38
- height: 100,
39
- text: '# Text Node\n\nMarkdown content here',
40
- color: 6, // purple
41
- pv: {
42
- nodeType: 'text-example',
43
- shape: 'rectangle',
44
- icon: 'FileText',
45
- },
46
- },
47
- // File Node
48
- {
49
- id: 'file-node',
50
- type: 'file',
51
- x: 350,
52
- y: 100,
53
- width: 180,
54
- height: 100,
55
- file: 'src/components/App.tsx',
56
- color: 4, // green
57
- pv: {
58
- nodeType: 'file-example',
59
- shape: 'rectangle',
60
- icon: 'FileCode',
61
- },
62
- },
63
- // Link Node
64
- {
65
- id: 'link-node',
66
- type: 'link',
67
- x: 600,
68
- y: 100,
69
- width: 180,
70
- height: 100,
71
- url: 'https://github.com/example/repo',
72
- color: 5, // cyan
73
- pv: {
74
- nodeType: 'link-example',
75
- shape: 'rectangle',
76
- icon: 'Link',
77
- },
78
- },
79
- // Group Node (rendered as container)
80
- {
81
- id: 'group-node',
82
- type: 'group',
83
- x: 100,
84
- y: 280,
85
- width: 300,
86
- height: 150,
87
- label: 'Group Container',
88
- color: 3, // yellow
89
- pv: {
90
- nodeType: 'group-example',
91
- shape: 'rectangle',
92
- icon: 'Folder',
93
- },
94
- },
95
- // Text node inside group
96
- {
97
- id: 'grouped-text',
98
- type: 'text',
99
- x: 130,
100
- y: 320,
101
- width: 120,
102
- height: 60,
103
- text: 'Inside Group',
104
- color: 6,
105
- pv: {
106
- nodeType: 'grouped-item',
107
- shape: 'rectangle',
108
- },
109
- },
110
- ],
111
- edges: [],
112
- pv: {
113
- version: '1.0.0',
114
- name: 'Canvas Node Types',
115
- description: 'All standard JSON Canvas node types',
116
- edgeTypes: {},
117
- },
118
- };
119
-
120
- export const AllNodeTypes: Story = {
121
- args: {
122
- canvas: allNodeTypesCanvas,
123
- width: 900,
124
- height: 500,
125
- },
126
- parameters: {
127
- docs: {
128
- description: {
129
- story: `
130
- **All JSON Canvas Node Types**
131
-
132
- This story displays the 4 standard JSON Canvas node types:
133
-
134
- - **Text Node** - Contains markdown text content (\`text\` field)
135
- - **File Node** - References a file path (\`file\` field)
136
- - **Link Node** - References a URL (\`url\` field)
137
- - **Group Node** - Container for grouping other nodes (\`label\` field)
138
- `,
139
- },
140
- },
141
- },
142
- };
143
-
144
- /**
145
- * Canvas showing text nodes with different content types
146
- */
147
- const textNodesCanvas: ExtendedCanvas = {
148
- nodes: [
149
- {
150
- id: 'text-plain',
151
- type: 'text',
152
- x: 100,
153
- y: 100,
154
- width: 160,
155
- height: 80,
156
- text: 'Plain text content',
157
- color: 6,
158
- pv: {
159
- nodeType: 'text-plain',
160
- shape: 'rectangle',
161
- icon: 'Type',
162
- },
163
- },
164
- {
165
- id: 'text-heading',
166
- type: 'text',
167
- x: 300,
168
- y: 100,
169
- width: 160,
170
- height: 80,
171
- text: '# Heading\n\nWith paragraph',
172
- color: 6,
173
- pv: {
174
- nodeType: 'text-heading',
175
- shape: 'rectangle',
176
- icon: 'Heading',
177
- },
178
- },
179
- {
180
- id: 'text-list',
181
- type: 'text',
182
- x: 500,
183
- y: 100,
184
- width: 180,
185
- height: 100,
186
- text: '# Todo List\n\n- Item 1\n- Item 2\n- Item 3',
187
- color: 6,
188
- pv: {
189
- nodeType: 'text-list',
190
- shape: 'rectangle',
191
- icon: 'List',
192
- },
193
- },
194
- {
195
- id: 'text-code',
196
- type: 'text',
197
- x: 100,
198
- y: 240,
199
- width: 200,
200
- height: 100,
201
- text: '# Code Block\n\n```js\nconst x = 1;\n```',
202
- color: 6,
203
- pv: {
204
- nodeType: 'text-code',
205
- shape: 'rectangle',
206
- icon: 'Code',
207
- },
208
- },
209
- {
210
- id: 'text-long',
211
- type: 'text',
212
- x: 340,
213
- y: 240,
214
- width: 220,
215
- height: 120,
216
- text: '# Long Content\n\nThis is a longer text node with multiple paragraphs.\n\nIt demonstrates how text wraps within the node bounds.',
217
- color: 6,
218
- pv: {
219
- nodeType: 'text-long',
220
- shape: 'rectangle',
221
- icon: 'AlignLeft',
222
- },
223
- },
224
- ],
225
- edges: [],
226
- pv: {
227
- version: '1.0.0',
228
- name: 'Text Node Variations',
229
- description: 'Different text content types',
230
- edgeTypes: {},
231
- },
232
- };
233
-
234
- export const TextNodes: Story = {
235
- args: {
236
- canvas: textNodesCanvas,
237
- width: 800,
238
- height: 420,
239
- },
240
- parameters: {
241
- docs: {
242
- description: {
243
- story: `
244
- **Text Node Variations**
245
-
246
- Text nodes (\`type: 'text'\`) can contain various markdown content:
247
- - Plain text
248
- - Headings with paragraphs
249
- - Lists
250
- - Code blocks
251
- - Long multi-paragraph content
252
- `,
253
- },
254
- },
255
- },
256
- };
257
-
258
- /**
259
- * Canvas showing file nodes with different file types
260
- */
261
- const fileNodesCanvas: ExtendedCanvas = {
262
- nodes: [
263
- {
264
- id: 'file-ts',
265
- type: 'file',
266
- x: 100,
267
- y: 100,
268
- width: 180,
269
- height: 80,
270
- file: 'src/index.ts',
271
- color: 4,
272
- pv: {
273
- nodeType: 'file-typescript',
274
- shape: 'rectangle',
275
- icon: 'FileCode',
276
- },
277
- },
278
- {
279
- id: 'file-tsx',
280
- type: 'file',
281
- x: 320,
282
- y: 100,
283
- width: 200,
284
- height: 80,
285
- file: 'src/components/App.tsx',
286
- color: 5,
287
- pv: {
288
- nodeType: 'file-react',
289
- shape: 'rectangle',
290
- icon: 'Component',
291
- },
292
- },
293
- {
294
- id: 'file-json',
295
- type: 'file',
296
- x: 560,
297
- y: 100,
298
- width: 160,
299
- height: 80,
300
- file: 'package.json',
301
- color: 3,
302
- pv: {
303
- nodeType: 'file-json',
304
- shape: 'rectangle',
305
- icon: 'Braces',
306
- },
307
- },
308
- {
309
- id: 'file-md',
310
- type: 'file',
311
- x: 100,
312
- y: 220,
313
- width: 160,
314
- height: 80,
315
- file: 'docs/README.md',
316
- color: 6,
317
- pv: {
318
- nodeType: 'file-markdown',
319
- shape: 'rectangle',
320
- icon: 'BookOpen',
321
- },
322
- },
323
- {
324
- id: 'file-subpath',
325
- type: 'file',
326
- x: 300,
327
- y: 220,
328
- width: 220,
329
- height: 100,
330
- file: 'docs/architecture.md',
331
- subpath: '#database-schema',
332
- color: 6,
333
- pv: {
334
- nodeType: 'file-with-subpath',
335
- shape: 'rectangle',
336
- icon: 'Hash',
337
- },
338
- },
339
- {
340
- id: 'file-image',
341
- type: 'file',
342
- x: 560,
343
- y: 220,
344
- width: 160,
345
- height: 80,
346
- file: 'assets/logo.png',
347
- color: 2,
348
- pv: {
349
- nodeType: 'file-image',
350
- shape: 'rectangle',
351
- icon: 'Image',
352
- },
353
- },
354
- ],
355
- edges: [],
356
- pv: {
357
- version: '1.0.0',
358
- name: 'File Node Variations',
359
- description: 'Different file types and subpaths',
360
- edgeTypes: {},
361
- },
362
- };
363
-
364
- export const FileNodes: Story = {
365
- args: {
366
- canvas: fileNodesCanvas,
367
- width: 800,
368
- height: 380,
369
- },
370
- parameters: {
371
- docs: {
372
- description: {
373
- story: `
374
- **File Node Variations**
375
-
376
- File nodes (\`type: 'file'\`) reference external files:
377
- - TypeScript files
378
- - React components (TSX)
379
- - JSON config files
380
- - Markdown documentation
381
- - Files with subpath (heading/block link)
382
- - Image assets
383
-
384
- The \`file\` field contains the path, and optional \`subpath\` can reference a specific section.
385
- `,
386
- },
387
- },
388
- },
389
- };
390
-
391
- /**
392
- * Canvas showing link nodes with different URL types
393
- */
394
- const linkNodesCanvas: ExtendedCanvas = {
395
- nodes: [
396
- {
397
- id: 'link-github',
398
- type: 'link',
399
- x: 100,
400
- y: 100,
401
- width: 200,
402
- height: 80,
403
- url: 'https://github.com/anthropics/claude',
404
- color: 0, // default/gray
405
- pv: {
406
- nodeType: 'link-github',
407
- shape: 'rectangle',
408
- icon: 'Github',
409
- },
410
- },
411
- {
412
- id: 'link-docs',
413
- type: 'link',
414
- x: 340,
415
- y: 100,
416
- width: 200,
417
- height: 80,
418
- url: 'https://docs.example.com/api',
419
- color: 5,
420
- pv: {
421
- nodeType: 'link-documentation',
422
- shape: 'rectangle',
423
- icon: 'Book',
424
- },
425
- },
426
- {
427
- id: 'link-api',
428
- type: 'link',
429
- x: 580,
430
- y: 100,
431
- width: 180,
432
- height: 80,
433
- url: 'https://api.example.com/v1',
434
- color: 4,
435
- pv: {
436
- nodeType: 'link-api',
437
- shape: 'rectangle',
438
- icon: 'Cloud',
439
- },
440
- },
441
- {
442
- id: 'link-jira',
443
- type: 'link',
444
- x: 100,
445
- y: 220,
446
- width: 200,
447
- height: 80,
448
- url: 'https://jira.example.com/browse/PROJ-123',
449
- color: 5,
450
- pv: {
451
- nodeType: 'link-ticket',
452
- shape: 'rectangle',
453
- icon: 'Ticket',
454
- },
455
- },
456
- {
457
- id: 'link-figma',
458
- type: 'link',
459
- x: 340,
460
- y: 220,
461
- width: 200,
462
- height: 80,
463
- url: 'https://figma.com/file/abc123',
464
- color: 6,
465
- pv: {
466
- nodeType: 'link-design',
467
- shape: 'rectangle',
468
- icon: 'Palette',
469
- },
470
- },
471
- {
472
- id: 'link-slack',
473
- type: 'link',
474
- x: 580,
475
- y: 220,
476
- width: 180,
477
- height: 80,
478
- url: 'https://slack.com/channel/dev',
479
- color: 2,
480
- pv: {
481
- nodeType: 'link-chat',
482
- shape: 'rectangle',
483
- icon: 'MessageCircle',
484
- },
485
- },
486
- ],
487
- edges: [],
488
- pv: {
489
- version: '1.0.0',
490
- name: 'Link Node Variations',
491
- description: 'Different URL/link types',
492
- edgeTypes: {},
493
- },
494
- };
495
-
496
- export const LinkNodes: Story = {
497
- args: {
498
- canvas: linkNodesCanvas,
499
- width: 850,
500
- height: 380,
501
- },
502
- parameters: {
503
- docs: {
504
- description: {
505
- story: `
506
- **Link Node Variations**
507
-
508
- Link nodes (\`type: 'link'\`) reference external URLs:
509
- - GitHub repositories
510
- - Documentation sites
511
- - API endpoints
512
- - Issue trackers (Jira, Linear)
513
- - Design tools (Figma)
514
- - Communication tools (Slack)
515
-
516
- The \`url\` field contains the full URL.
517
- `,
518
- },
519
- },
520
- },
521
- };
522
-
523
- /**
524
- * Canvas showing a realistic mixed-type diagram
525
- */
526
- const mixedTypesCanvas: ExtendedCanvas = {
527
- nodes: [
528
- // Documentation (file)
529
- {
530
- id: 'docs',
531
- type: 'file',
532
- x: 100,
533
- y: 100,
534
- width: 160,
535
- height: 80,
536
- file: 'docs/architecture.md',
537
- color: 6,
538
- pv: {
539
- nodeType: 'documentation',
540
- shape: 'rectangle',
541
- icon: 'BookOpen',
542
- },
543
- },
544
- // Design link
545
- {
546
- id: 'design',
547
- type: 'link',
548
- x: 100,
549
- y: 220,
550
- width: 160,
551
- height: 80,
552
- url: 'https://figma.com/file/design',
553
- color: 6,
554
- pv: {
555
- nodeType: 'design-spec',
556
- shape: 'rectangle',
557
- icon: 'Palette',
558
- },
559
- },
560
- // Main component (file)
561
- {
562
- id: 'component',
563
- type: 'file',
564
- x: 350,
565
- y: 160,
566
- width: 180,
567
- height: 80,
568
- file: 'src/components/Feature.tsx',
569
- color: 4,
570
- pv: {
571
- nodeType: 'component',
572
- shape: 'rectangle',
573
- icon: 'Component',
574
- },
575
- },
576
- // Notes (text)
577
- {
578
- id: 'notes',
579
- type: 'text',
580
- x: 350,
581
- y: 280,
582
- width: 180,
583
- height: 100,
584
- text: '# Implementation Notes\n\n- Check edge cases\n- Add tests\n- Update docs',
585
- color: 3,
586
- pv: {
587
- nodeType: 'notes',
588
- shape: 'rectangle',
589
- icon: 'StickyNote',
590
- },
591
- },
592
- // API endpoint (link)
593
- {
594
- id: 'api',
595
- type: 'link',
596
- x: 600,
597
- y: 100,
598
- width: 160,
599
- height: 80,
600
- url: 'https://api.example.com/feature',
601
- color: 5,
602
- pv: {
603
- nodeType: 'api-endpoint',
604
- shape: 'rectangle',
605
- icon: 'Cloud',
606
- },
607
- },
608
- // Test file (file)
609
- {
610
- id: 'tests',
611
- type: 'file',
612
- x: 600,
613
- y: 220,
614
- width: 160,
615
- height: 80,
616
- file: 'src/components/Feature.test.tsx',
617
- color: 4,
618
- pv: {
619
- nodeType: 'test-file',
620
- shape: 'rectangle',
621
- icon: 'TestTube',
622
- },
623
- },
624
- // Issue tracker (link)
625
- {
626
- id: 'ticket',
627
- type: 'link',
628
- x: 600,
629
- y: 340,
630
- width: 160,
631
- height: 80,
632
- url: 'https://jira.example.com/PROJ-456',
633
- color: 5,
634
- pv: {
635
- nodeType: 'ticket',
636
- shape: 'rectangle',
637
- icon: 'Ticket',
638
- },
639
- },
640
- ],
641
- edges: [
642
- {
643
- id: 'docs-to-component',
644
- fromNode: 'docs',
645
- toNode: 'component',
646
- fromSide: 'right',
647
- toSide: 'left',
648
- pv: { edgeType: 'reference' },
649
- },
650
- {
651
- id: 'design-to-component',
652
- fromNode: 'design',
653
- toNode: 'component',
654
- fromSide: 'right',
655
- toSide: 'left',
656
- pv: { edgeType: 'reference' },
657
- },
658
- {
659
- id: 'component-to-api',
660
- fromNode: 'component',
661
- toNode: 'api',
662
- fromSide: 'right',
663
- toSide: 'left',
664
- pv: { edgeType: 'uses' },
665
- },
666
- {
667
- id: 'component-to-tests',
668
- fromNode: 'component',
669
- toNode: 'tests',
670
- fromSide: 'right',
671
- toSide: 'left',
672
- pv: { edgeType: 'tested-by' },
673
- },
674
- {
675
- id: 'notes-to-ticket',
676
- fromNode: 'notes',
677
- toNode: 'ticket',
678
- fromSide: 'right',
679
- toSide: 'left',
680
- pv: { edgeType: 'tracks' },
681
- },
682
- ],
683
- pv: {
684
- version: '1.0.0',
685
- name: 'Feature Development Map',
686
- description: 'Mixed node types showing a feature development context',
687
- edgeTypes: {
688
- reference: {
689
- style: 'dashed',
690
- color: '#8b5cf6',
691
- directed: true,
692
- },
693
- uses: {
694
- style: 'solid',
695
- color: '#22c55e',
696
- directed: true,
697
- },
698
- 'tested-by': {
699
- style: 'dotted',
700
- color: '#3b82f6',
701
- directed: true,
702
- },
703
- tracks: {
704
- style: 'dashed',
705
- color: '#f97316',
706
- directed: true,
707
- },
708
- },
709
- },
710
- };
711
-
712
- export const MixedTypes: Story = {
713
- args: {
714
- canvas: mixedTypesCanvas,
715
- width: 850,
716
- height: 500,
717
- },
718
- parameters: {
719
- docs: {
720
- description: {
721
- story: `
722
- **Mixed Node Types - Feature Development Map**
723
-
724
- A realistic example showing how different node types work together:
725
- - **File nodes**: Source code, tests, documentation
726
- - **Link nodes**: API endpoints, design specs, issue trackers
727
- - **Text nodes**: Notes and annotations
728
-
729
- This demonstrates a typical feature development context where you'd reference:
730
- - Architecture docs (file)
731
- - Figma designs (link)
732
- - Source components (file)
733
- - API endpoints (link)
734
- - Test files (file)
735
- - Issue tickets (link)
736
- - Implementation notes (text)
737
- `,
738
- },
739
- },
740
- },
741
- };
742
-
743
- /**
744
- * Canvas demonstrating edges rendering above group nodes
745
- */
746
- const edgesOverGroupCanvas: ExtendedCanvas = {
747
- nodes: [
748
- // Group node (should render behind edges)
749
- {
750
- id: 'group-1',
751
- type: 'group',
752
- x: 150,
753
- y: 80,
754
- width: 300,
755
- height: 200,
756
- label: 'Processing Group',
757
- color: 3, // yellow
758
- pv: {
759
- nodeType: 'group',
760
- shape: 'rectangle',
761
- },
762
- },
763
- // Node before group
764
- {
765
- id: 'start',
766
- type: 'text',
767
- x: 20,
768
- y: 150,
769
- width: 100,
770
- height: 60,
771
- text: 'Start',
772
- color: 4,
773
- pv: {
774
- nodeType: 'process',
775
- shape: 'rectangle',
776
- icon: 'Play',
777
- },
778
- },
779
- // Node inside group
780
- {
781
- id: 'process-1',
782
- type: 'text',
783
- x: 200,
784
- y: 120,
785
- width: 100,
786
- height: 60,
787
- text: 'Process A',
788
- color: 5,
789
- pv: {
790
- nodeType: 'process',
791
- shape: 'rectangle',
792
- icon: 'Settings',
793
- },
794
- },
795
- // Another node inside group
796
- {
797
- id: 'process-2',
798
- type: 'text',
799
- x: 200,
800
- y: 200,
801
- width: 100,
802
- height: 60,
803
- text: 'Process B',
804
- color: 5,
805
- pv: {
806
- nodeType: 'process',
807
- shape: 'rectangle',
808
- icon: 'Cog',
809
- },
810
- },
811
- // Node after group
812
- {
813
- id: 'end',
814
- type: 'text',
815
- x: 500,
816
- y: 150,
817
- width: 100,
818
- height: 60,
819
- text: 'End',
820
- color: 4,
821
- pv: {
822
- nodeType: 'process',
823
- shape: 'rectangle',
824
- icon: 'CheckCircle',
825
- },
826
- },
827
- ],
828
- edges: [
829
- // Edge crossing over the group
830
- {
831
- id: 'start-to-process1',
832
- fromNode: 'start',
833
- toNode: 'process-1',
834
- fromSide: 'right',
835
- toSide: 'left',
836
- pv: { edgeType: 'flow' },
837
- },
838
- // Edge within group
839
- {
840
- id: 'process1-to-process2',
841
- fromNode: 'process-1',
842
- toNode: 'process-2',
843
- fromSide: 'bottom',
844
- toSide: 'top',
845
- pv: { edgeType: 'flow' },
846
- },
847
- // Edge crossing out of group
848
- {
849
- id: 'process2-to-end',
850
- fromNode: 'process-2',
851
- toNode: 'end',
852
- fromSide: 'right',
853
- toSide: 'left',
854
- pv: { edgeType: 'flow' },
855
- },
856
- ],
857
- pv: {
858
- version: '1.0.0',
859
- name: 'Edges Over Groups',
860
- description: 'Test that edges render above group nodes',
861
- edgeTypes: {
862
- flow: {
863
- style: 'solid',
864
- color: '#3b82f6',
865
- directed: true,
866
- },
867
- },
868
- },
869
- };
870
-
871
- export const EdgesOverGroups: Story = {
872
- args: {
873
- canvas: edgesOverGroupCanvas,
874
- width: 650,
875
- height: 350,
876
- },
877
- parameters: {
878
- docs: {
879
- description: {
880
- story: `
881
- **Edges Rendering Above Groups**
882
-
883
- This story tests that edges properly render above group nodes.
884
- - The yellow group container should be behind all edges
885
- - Edges connecting to nodes inside the group should be visible
886
- - Edges crossing over the group should not be hidden
887
- `,
888
- },
889
- },
890
- },
891
- };
892
-
893
- /**
894
- * Interactive comparison template
895
- */
896
- const NodeTypeComparisonTemplate = () => {
897
- return (
898
- <div style={{ padding: 20, fontFamily: 'system-ui' }}>
899
- <h2 style={{ marginBottom: 20 }}>JSON Canvas Node Types Comparison</h2>
900
-
901
- <div
902
- style={{
903
- display: 'grid',
904
- gridTemplateColumns: 'repeat(4, 1fr)',
905
- gap: 20,
906
- marginBottom: 30,
907
- }}
908
- >
909
- <div
910
- style={{
911
- padding: 16,
912
- backgroundColor: '#f3e8ff',
913
- borderRadius: 8,
914
- border: '2px solid #8b5cf6',
915
- }}
916
- >
917
- <h4 style={{ margin: '0 0 8px 0', color: '#6b21a8' }}>Text Node</h4>
918
- <code style={{ fontSize: 11, display: 'block', marginBottom: 8 }}>type: 'text'</code>
919
- <div style={{ fontSize: 12, color: '#6b21a8' }}>
920
- <strong>Fields:</strong>
921
- <ul style={{ margin: '4px 0', paddingLeft: 16 }}>
922
- <li>
923
- <code>text</code> - Markdown content
924
- </li>
925
- </ul>
926
- </div>
927
- </div>
928
-
929
- <div
930
- style={{
931
- padding: 16,
932
- backgroundColor: '#dcfce7',
933
- borderRadius: 8,
934
- border: '2px solid #22c55e',
935
- }}
936
- >
937
- <h4 style={{ margin: '0 0 8px 0', color: '#166534' }}>File Node</h4>
938
- <code style={{ fontSize: 11, display: 'block', marginBottom: 8 }}>type: 'file'</code>
939
- <div style={{ fontSize: 12, color: '#166534' }}>
940
- <strong>Fields:</strong>
941
- <ul style={{ margin: '4px 0', paddingLeft: 16 }}>
942
- <li>
943
- <code>file</code> - File path
944
- </li>
945
- <li>
946
- <code>subpath?</code> - Section link
947
- </li>
948
- </ul>
949
- </div>
950
- </div>
951
-
952
- <div
953
- style={{
954
- padding: 16,
955
- backgroundColor: '#cffafe',
956
- borderRadius: 8,
957
- border: '2px solid #06b6d4',
958
- }}
959
- >
960
- <h4 style={{ margin: '0 0 8px 0', color: '#0e7490' }}>Link Node</h4>
961
- <code style={{ fontSize: 11, display: 'block', marginBottom: 8 }}>type: 'link'</code>
962
- <div style={{ fontSize: 12, color: '#0e7490' }}>
963
- <strong>Fields:</strong>
964
- <ul style={{ margin: '4px 0', paddingLeft: 16 }}>
965
- <li>
966
- <code>url</code> - Full URL
967
- </li>
968
- </ul>
969
- </div>
970
- </div>
971
-
972
- <div
973
- style={{
974
- padding: 16,
975
- backgroundColor: '#fef9c3',
976
- borderRadius: 8,
977
- border: '2px solid #eab308',
978
- }}
979
- >
980
- <h4 style={{ margin: '0 0 8px 0', color: '#a16207' }}>Group Node</h4>
981
- <code style={{ fontSize: 11, display: 'block', marginBottom: 8 }}>type: 'group'</code>
982
- <div style={{ fontSize: 12, color: '#a16207' }}>
983
- <strong>Fields:</strong>
984
- <ul style={{ margin: '4px 0', paddingLeft: 16 }}>
985
- <li>
986
- <code>label?</code> - Group name
987
- </li>
988
- <li>
989
- <code>background?</code> - Image
990
- </li>
991
- </ul>
992
- </div>
993
- </div>
994
- </div>
995
-
996
- <h3 style={{ marginBottom: 16 }}>Live Example: All Node Types</h3>
997
- <GraphRenderer canvas={allNodeTypesCanvas} width={900} height={500} />
998
-
999
- <div
1000
- style={{
1001
- marginTop: 24,
1002
- padding: 16,
1003
- backgroundColor: '#f5f5f5',
1004
- borderRadius: 8,
1005
- }}
1006
- >
1007
- <h4 style={{ margin: '0 0 12px 0' }}>JSON Canvas Spec</h4>
1008
- <p style={{ fontSize: 13, margin: 0, lineHeight: 1.6 }}>
1009
- These node types follow the{' '}
1010
- <a
1011
- href="https://jsoncanvas.org/"
1012
- target="_blank"
1013
- rel="noopener noreferrer"
1014
- style={{ color: '#3b82f6' }}
1015
- >
1016
- JSON Canvas specification
1017
- </a>
1018
- . Each node type serves a specific purpose:
1019
- </p>
1020
- <ul style={{ fontSize: 13, lineHeight: 1.8, margin: '8px 0 0 0', paddingLeft: 20 }}>
1021
- <li>
1022
- <strong>Text</strong> - For notes, descriptions, and embedded markdown content
1023
- </li>
1024
- <li>
1025
- <strong>File</strong> - For referencing local files in your project
1026
- </li>
1027
- <li>
1028
- <strong>Link</strong> - For external resources, APIs, documentation, tools
1029
- </li>
1030
- <li>
1031
- <strong>Group</strong> - For visually organizing related nodes together
1032
- </li>
1033
- </ul>
1034
- </div>
1035
- </div>
1036
- );
1037
- };
1038
-
1039
- export const NodeTypeComparison: Story = {
1040
- render: () => <NodeTypeComparisonTemplate />,
1041
- parameters: {
1042
- docs: {
1043
- description: {
1044
- story:
1045
- 'Interactive comparison view showing all JSON Canvas node types with field documentation.',
1046
- },
1047
- },
1048
- },
1049
- };