@principal-ai/principal-view-react 0.6.6

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 (96) hide show
  1. package/README.md +111 -0
  2. package/dist/components/ConfigurationSelector.d.ts +37 -0
  3. package/dist/components/ConfigurationSelector.d.ts.map +1 -0
  4. package/dist/components/ConfigurationSelector.js +67 -0
  5. package/dist/components/ConfigurationSelector.js.map +1 -0
  6. package/dist/components/EdgeInfoPanel.d.ts +16 -0
  7. package/dist/components/EdgeInfoPanel.d.ts.map +1 -0
  8. package/dist/components/EdgeInfoPanel.js +85 -0
  9. package/dist/components/EdgeInfoPanel.js.map +1 -0
  10. package/dist/components/EventLog.d.ts +20 -0
  11. package/dist/components/EventLog.d.ts.map +1 -0
  12. package/dist/components/EventLog.js +13 -0
  13. package/dist/components/EventLog.js.map +1 -0
  14. package/dist/components/EventLog.test.d.ts +2 -0
  15. package/dist/components/EventLog.test.d.ts.map +1 -0
  16. package/dist/components/EventLog.test.js +73 -0
  17. package/dist/components/EventLog.test.js.map +1 -0
  18. package/dist/components/GraphRenderer.d.ts +121 -0
  19. package/dist/components/GraphRenderer.d.ts.map +1 -0
  20. package/dist/components/GraphRenderer.js +809 -0
  21. package/dist/components/GraphRenderer.js.map +1 -0
  22. package/dist/components/GraphRenderer.test.d.ts +2 -0
  23. package/dist/components/GraphRenderer.test.d.ts.map +1 -0
  24. package/dist/components/GraphRenderer.test.js +88 -0
  25. package/dist/components/GraphRenderer.test.js.map +1 -0
  26. package/dist/components/MetricsDashboard.d.ts +14 -0
  27. package/dist/components/MetricsDashboard.d.ts.map +1 -0
  28. package/dist/components/MetricsDashboard.js +13 -0
  29. package/dist/components/MetricsDashboard.js.map +1 -0
  30. package/dist/components/NodeInfoPanel.d.ts +21 -0
  31. package/dist/components/NodeInfoPanel.d.ts.map +1 -0
  32. package/dist/components/NodeInfoPanel.js +217 -0
  33. package/dist/components/NodeInfoPanel.js.map +1 -0
  34. package/dist/edges/CustomEdge.d.ts +16 -0
  35. package/dist/edges/CustomEdge.d.ts.map +1 -0
  36. package/dist/edges/CustomEdge.js +200 -0
  37. package/dist/edges/CustomEdge.js.map +1 -0
  38. package/dist/edges/GenericEdge.d.ts +18 -0
  39. package/dist/edges/GenericEdge.d.ts.map +1 -0
  40. package/dist/edges/GenericEdge.js +14 -0
  41. package/dist/edges/GenericEdge.js.map +1 -0
  42. package/dist/hooks/usePathBasedEvents.d.ts +42 -0
  43. package/dist/hooks/usePathBasedEvents.d.ts.map +1 -0
  44. package/dist/hooks/usePathBasedEvents.js +122 -0
  45. package/dist/hooks/usePathBasedEvents.js.map +1 -0
  46. package/dist/index.d.ts +33 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +41 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/nodes/CustomNode.d.ts +18 -0
  51. package/dist/nodes/CustomNode.d.ts.map +1 -0
  52. package/dist/nodes/CustomNode.js +298 -0
  53. package/dist/nodes/CustomNode.js.map +1 -0
  54. package/dist/nodes/GenericNode.d.ts +20 -0
  55. package/dist/nodes/GenericNode.d.ts.map +1 -0
  56. package/dist/nodes/GenericNode.js +24 -0
  57. package/dist/nodes/GenericNode.js.map +1 -0
  58. package/dist/utils/animationMapping.d.ts +53 -0
  59. package/dist/utils/animationMapping.d.ts.map +1 -0
  60. package/dist/utils/animationMapping.js +133 -0
  61. package/dist/utils/animationMapping.js.map +1 -0
  62. package/dist/utils/graphConverter.d.ts +22 -0
  63. package/dist/utils/graphConverter.d.ts.map +1 -0
  64. package/dist/utils/graphConverter.js +176 -0
  65. package/dist/utils/graphConverter.js.map +1 -0
  66. package/dist/utils/iconResolver.d.ts +29 -0
  67. package/dist/utils/iconResolver.d.ts.map +1 -0
  68. package/dist/utils/iconResolver.js +68 -0
  69. package/dist/utils/iconResolver.js.map +1 -0
  70. package/package.json +61 -0
  71. package/src/components/ConfigurationSelector.tsx +147 -0
  72. package/src/components/EdgeInfoPanel.tsx +198 -0
  73. package/src/components/EventLog.test.tsx +85 -0
  74. package/src/components/EventLog.tsx +51 -0
  75. package/src/components/GraphRenderer.test.tsx +118 -0
  76. package/src/components/GraphRenderer.tsx +1222 -0
  77. package/src/components/MetricsDashboard.tsx +40 -0
  78. package/src/components/NodeInfoPanel.tsx +425 -0
  79. package/src/edges/CustomEdge.tsx +344 -0
  80. package/src/edges/GenericEdge.tsx +40 -0
  81. package/src/hooks/usePathBasedEvents.ts +182 -0
  82. package/src/index.ts +67 -0
  83. package/src/nodes/CustomNode.tsx +432 -0
  84. package/src/nodes/GenericNode.tsx +54 -0
  85. package/src/stories/AnimationWorkshop.stories.tsx +608 -0
  86. package/src/stories/EventDrivenAnimations.stories.tsx +499 -0
  87. package/src/stories/EventLog.stories.tsx +161 -0
  88. package/src/stories/GraphRenderer.stories.tsx +628 -0
  89. package/src/stories/Introduction.mdx +51 -0
  90. package/src/stories/MetricsDashboard.stories.tsx +227 -0
  91. package/src/stories/MultiConfig.stories.tsx +531 -0
  92. package/src/stories/MultiDirectionalConnections.stories.tsx +345 -0
  93. package/src/stories/NodeShapes.stories.tsx +769 -0
  94. package/src/utils/animationMapping.ts +170 -0
  95. package/src/utils/graphConverter.ts +218 -0
  96. package/src/utils/iconResolver.tsx +49 -0
@@ -0,0 +1,608 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { ReactFlow, ReactFlowProvider, Background, Controls } from '@xyflow/react';
3
+ import '@xyflow/react/dist/style.css';
4
+ import { CustomNode } from '../nodes/CustomNode';
5
+ import { CustomEdge } from '../edges/CustomEdge';
6
+ import type { CustomNodeData } from '../nodes/CustomNode';
7
+ import type { CustomEdgeData } from '../edges/CustomEdge';
8
+ import type { NodeTypeDefinition, EdgeTypeDefinition } from '@principal-ai/principal-view-core';
9
+ import React from 'react';
10
+
11
+ const meta = {
12
+ title: 'Workshop/Animation',
13
+ component: ReactFlow,
14
+ parameters: {
15
+ layout: 'fullscreen',
16
+ },
17
+ tags: ['autodocs'],
18
+ } satisfies Meta<typeof ReactFlow>;
19
+
20
+ export default meta;
21
+ type Story = StoryObj<typeof meta>;
22
+
23
+ // Define custom node and edge types
24
+ const nodeTypes = {
25
+ custom: CustomNode,
26
+ };
27
+
28
+ const edgeTypes = {
29
+ custom: CustomEdge,
30
+ };
31
+
32
+ // Sample type definitions
33
+ const processNodeType: NodeTypeDefinition = {
34
+ shape: 'rectangle',
35
+ color: '#4A90E2',
36
+ icon: 'Settings',
37
+ dataSchema: {
38
+ name: { type: 'string', required: true, displayInLabel: true },
39
+ },
40
+ };
41
+
42
+ const dataNodeType: NodeTypeDefinition = {
43
+ shape: 'circle',
44
+ color: '#7B68EE',
45
+ icon: 'Database',
46
+ dataSchema: {
47
+ name: { type: 'string', required: true, displayInLabel: true },
48
+ },
49
+ };
50
+
51
+ const edgeTypeDefinition: EdgeTypeDefinition = {
52
+ style: 'solid',
53
+ color: '#50E3C2',
54
+ directed: true,
55
+ width: 2,
56
+ animation: {
57
+ type: 'flow',
58
+ color: '#00D9FF',
59
+ },
60
+ };
61
+
62
+ /**
63
+ * Story 1: Edge Flow Animations
64
+ * Demonstrates forward, backward, and bidirectional flow animations
65
+ */
66
+ export const EdgeFlowAnimations: Story = {
67
+ render: () => (
68
+ <ReactFlowProvider>
69
+ <div style={{ width: '100vw', height: '100vh' }}>
70
+ <ReactFlow
71
+ nodes={[
72
+ {
73
+ id: 'node-1',
74
+ type: 'custom',
75
+ position: { x: 100, y: 100 },
76
+ data: {
77
+ label: 'Source',
78
+ typeDefinition: processNodeType,
79
+ data: { name: 'Source' },
80
+ } as CustomNodeData,
81
+ },
82
+ {
83
+ id: 'node-2',
84
+ type: 'custom',
85
+ position: { x: 400, y: 100 },
86
+ data: {
87
+ label: 'Target',
88
+ typeDefinition: dataNodeType,
89
+ data: { name: 'Target' },
90
+ } as CustomNodeData,
91
+ },
92
+ {
93
+ id: 'node-3',
94
+ type: 'custom',
95
+ position: { x: 100, y: 250 },
96
+ data: {
97
+ label: 'Backward',
98
+ typeDefinition: processNodeType,
99
+ data: { name: 'Backward' },
100
+ } as CustomNodeData,
101
+ },
102
+ {
103
+ id: 'node-4',
104
+ type: 'custom',
105
+ position: { x: 400, y: 250 },
106
+ data: {
107
+ label: 'Backward Target',
108
+ typeDefinition: dataNodeType,
109
+ data: { name: 'Backward Target' },
110
+ } as CustomNodeData,
111
+ },
112
+ {
113
+ id: 'node-5',
114
+ type: 'custom',
115
+ position: { x: 100, y: 400 },
116
+ data: {
117
+ label: 'Bidirectional A',
118
+ typeDefinition: processNodeType,
119
+ data: { name: 'Bidirectional A' },
120
+ } as CustomNodeData,
121
+ },
122
+ {
123
+ id: 'node-6',
124
+ type: 'custom',
125
+ position: { x: 400, y: 400 },
126
+ data: {
127
+ label: 'Bidirectional B',
128
+ typeDefinition: dataNodeType,
129
+ data: { name: 'Bidirectional B' },
130
+ } as CustomNodeData,
131
+ },
132
+ ]}
133
+ edges={[
134
+ {
135
+ id: 'edge-1',
136
+ source: 'node-1',
137
+ target: 'node-2',
138
+ type: 'custom',
139
+ label: 'Forward Flow',
140
+ data: {
141
+ typeDefinition: edgeTypeDefinition,
142
+ animationType: 'flow',
143
+ animationDirection: 'forward',
144
+ animationDuration: 1000,
145
+ } as CustomEdgeData,
146
+ },
147
+ {
148
+ id: 'edge-2',
149
+ source: 'node-3',
150
+ target: 'node-4',
151
+ type: 'custom',
152
+ label: 'Backward Flow',
153
+ data: {
154
+ typeDefinition: edgeTypeDefinition,
155
+ animationType: 'flow',
156
+ animationDirection: 'backward',
157
+ animationDuration: 1000,
158
+ } as CustomEdgeData,
159
+ },
160
+ {
161
+ id: 'edge-3',
162
+ source: 'node-5',
163
+ target: 'node-6',
164
+ type: 'custom',
165
+ label: 'Bidirectional Flow',
166
+ data: {
167
+ typeDefinition: edgeTypeDefinition,
168
+ animationType: 'flow',
169
+ animationDirection: 'bidirectional',
170
+ animationDuration: 2000,
171
+ } as CustomEdgeData,
172
+ },
173
+ ]}
174
+ nodeTypes={nodeTypes}
175
+ edgeTypes={edgeTypes}
176
+ fitView
177
+ >
178
+ <Background />
179
+ <Controls />
180
+ </ReactFlow>
181
+ </div>
182
+ </ReactFlowProvider>
183
+ ),
184
+ };
185
+
186
+ /**
187
+ * Story 2: Edge Particle Animation
188
+ * Shows particle traveling along edges with different speeds
189
+ */
190
+ export const EdgeParticleAnimation: Story = {
191
+ render: () => (
192
+ <ReactFlowProvider>
193
+ <div style={{ width: '100vw', height: '100vh' }}>
194
+ <ReactFlow
195
+ nodes={[
196
+ {
197
+ id: 'node-1',
198
+ type: 'custom',
199
+ position: { x: 100, y: 150 },
200
+ data: {
201
+ label: 'Fast',
202
+ typeDefinition: processNodeType,
203
+ data: { name: 'Fast' },
204
+ } as CustomNodeData,
205
+ },
206
+ {
207
+ id: 'node-2',
208
+ type: 'custom',
209
+ position: { x: 400, y: 150 },
210
+ data: {
211
+ label: 'Fast Target',
212
+ typeDefinition: dataNodeType,
213
+ data: { name: 'Fast Target' },
214
+ } as CustomNodeData,
215
+ },
216
+ {
217
+ id: 'node-3',
218
+ type: 'custom',
219
+ position: { x: 100, y: 300 },
220
+ data: {
221
+ label: 'Slow',
222
+ typeDefinition: processNodeType,
223
+ data: { name: 'Slow' },
224
+ } as CustomNodeData,
225
+ },
226
+ {
227
+ id: 'node-4',
228
+ type: 'custom',
229
+ position: { x: 400, y: 300 },
230
+ data: {
231
+ label: 'Slow Target',
232
+ typeDefinition: dataNodeType,
233
+ data: { name: 'Slow Target' },
234
+ } as CustomNodeData,
235
+ },
236
+ ]}
237
+ edges={[
238
+ {
239
+ id: 'edge-1',
240
+ source: 'node-1',
241
+ target: 'node-2',
242
+ type: 'custom',
243
+ label: 'Fast Particle (500ms)',
244
+ data: {
245
+ typeDefinition: edgeTypeDefinition,
246
+ animationType: 'particle',
247
+ animationDuration: 500,
248
+ animationDirection: 'forward',
249
+ } as CustomEdgeData,
250
+ },
251
+ {
252
+ id: 'edge-2',
253
+ source: 'node-3',
254
+ target: 'node-4',
255
+ type: 'custom',
256
+ label: 'Slow Particle (2000ms)',
257
+ data: {
258
+ typeDefinition: edgeTypeDefinition,
259
+ animationType: 'particle',
260
+ animationDuration: 2000,
261
+ animationDirection: 'forward',
262
+ } as CustomEdgeData,
263
+ },
264
+ ]}
265
+ nodeTypes={nodeTypes}
266
+ edgeTypes={edgeTypes}
267
+ fitView
268
+ >
269
+ <Background />
270
+ <Controls />
271
+ </ReactFlow>
272
+ </div>
273
+ </ReactFlowProvider>
274
+ ),
275
+ };
276
+
277
+ /**
278
+ * Story 3: Edge Pulse and Glow
279
+ * Demonstrates pulse and glow effects on edges
280
+ */
281
+ export const EdgePulseAndGlow: Story = {
282
+ render: () => (
283
+ <ReactFlowProvider>
284
+ <div style={{ width: '100vw', height: '100vh' }}>
285
+ <ReactFlow
286
+ nodes={[
287
+ {
288
+ id: 'node-1',
289
+ type: 'custom',
290
+ position: { x: 100, y: 150 },
291
+ data: {
292
+ label: 'Pulse Source',
293
+ typeDefinition: processNodeType,
294
+ data: { name: 'Pulse Source' },
295
+ } as CustomNodeData,
296
+ },
297
+ {
298
+ id: 'node-2',
299
+ type: 'custom',
300
+ position: { x: 400, y: 150 },
301
+ data: {
302
+ label: 'Pulse Target',
303
+ typeDefinition: dataNodeType,
304
+ data: { name: 'Pulse Target' },
305
+ } as CustomNodeData,
306
+ },
307
+ {
308
+ id: 'node-3',
309
+ type: 'custom',
310
+ position: { x: 100, y: 300 },
311
+ data: {
312
+ label: 'Glow Source',
313
+ typeDefinition: processNodeType,
314
+ data: { name: 'Glow Source' },
315
+ } as CustomNodeData,
316
+ },
317
+ {
318
+ id: 'node-4',
319
+ type: 'custom',
320
+ position: { x: 400, y: 300 },
321
+ data: {
322
+ label: 'Glow Target',
323
+ typeDefinition: dataNodeType,
324
+ data: { name: 'Glow Target' },
325
+ } as CustomNodeData,
326
+ },
327
+ ]}
328
+ edges={[
329
+ {
330
+ id: 'edge-1',
331
+ source: 'node-1',
332
+ target: 'node-2',
333
+ type: 'custom',
334
+ label: 'Pulse Animation',
335
+ data: {
336
+ typeDefinition: edgeTypeDefinition,
337
+ animationType: 'pulse',
338
+ animationDuration: 1500,
339
+ } as CustomEdgeData,
340
+ },
341
+ {
342
+ id: 'edge-2',
343
+ source: 'node-3',
344
+ target: 'node-4',
345
+ type: 'custom',
346
+ label: 'Glow Animation',
347
+ data: {
348
+ typeDefinition: edgeTypeDefinition,
349
+ animationType: 'glow',
350
+ animationDuration: 1000,
351
+ } as CustomEdgeData,
352
+ },
353
+ ]}
354
+ nodeTypes={nodeTypes}
355
+ edgeTypes={edgeTypes}
356
+ fitView
357
+ >
358
+ <Background />
359
+ <Controls />
360
+ </ReactFlow>
361
+ </div>
362
+ </ReactFlowProvider>
363
+ ),
364
+ };
365
+
366
+ /**
367
+ * Story 4: Node Animations
368
+ * Shows processing pulse, success flash, error shake, and entry animations
369
+ */
370
+ export const NodeAnimations: Story = {
371
+ render: () => (
372
+ <ReactFlowProvider>
373
+ <div style={{ width: '100vw', height: '100vh' }}>
374
+ <ReactFlow
375
+ nodes={[
376
+ {
377
+ id: 'node-1',
378
+ type: 'custom',
379
+ position: { x: 100, y: 100 },
380
+ data: {
381
+ label: 'Processing',
382
+ typeDefinition: processNodeType,
383
+ data: { name: 'Processing' },
384
+ animationType: 'pulse',
385
+ animationDuration: 1500,
386
+ } as CustomNodeData,
387
+ },
388
+ {
389
+ id: 'node-2',
390
+ type: 'custom',
391
+ position: { x: 300, y: 100 },
392
+ data: {
393
+ label: 'Success',
394
+ typeDefinition: dataNodeType,
395
+ data: { name: 'Success' },
396
+ animationType: 'flash',
397
+ animationDuration: 1000,
398
+ } as CustomNodeData,
399
+ },
400
+ {
401
+ id: 'node-3',
402
+ type: 'custom',
403
+ position: { x: 100, y: 250 },
404
+ data: {
405
+ label: 'Error',
406
+ typeDefinition: processNodeType,
407
+ data: { name: 'Error' },
408
+ animationType: 'shake',
409
+ animationDuration: 500,
410
+ hasViolations: true,
411
+ } as CustomNodeData,
412
+ },
413
+ {
414
+ id: 'node-4',
415
+ type: 'custom',
416
+ position: { x: 300, y: 250 },
417
+ data: {
418
+ label: 'Entry',
419
+ typeDefinition: dataNodeType,
420
+ data: { name: 'Entry' },
421
+ animationType: 'entry',
422
+ animationDuration: 600,
423
+ } as CustomNodeData,
424
+ },
425
+ ]}
426
+ edges={[]}
427
+ nodeTypes={nodeTypes}
428
+ edgeTypes={edgeTypes}
429
+ fitView
430
+ >
431
+ <Background />
432
+ <Controls />
433
+ </ReactFlow>
434
+ </div>
435
+ </ReactFlowProvider>
436
+ ),
437
+ };
438
+
439
+ /**
440
+ * Story 5: Combined Pipeline Animation
441
+ * Shows a realistic data pipeline with coordinated animations
442
+ */
443
+ export const CombinedPipelineAnimation: Story = {
444
+ render: () => (
445
+ <ReactFlowProvider>
446
+ <div style={{ width: '100vw', height: '100vh' }}>
447
+ <ReactFlow
448
+ nodes={[
449
+ {
450
+ id: 'input',
451
+ type: 'custom',
452
+ position: { x: 50, y: 200 },
453
+ data: {
454
+ label: 'Input',
455
+ typeDefinition: { ...processNodeType, color: '#10B981' },
456
+ data: { name: 'Data Input' },
457
+ animationType: 'pulse',
458
+ animationDuration: 2000,
459
+ } as CustomNodeData,
460
+ },
461
+ {
462
+ id: 'validate',
463
+ type: 'custom',
464
+ position: { x: 250, y: 200 },
465
+ data: {
466
+ label: 'Validate',
467
+ typeDefinition: processNodeType,
468
+ data: { name: 'Validator' },
469
+ } as CustomNodeData,
470
+ },
471
+ {
472
+ id: 'transform',
473
+ type: 'custom',
474
+ position: { x: 450, y: 200 },
475
+ data: {
476
+ label: 'Transform',
477
+ typeDefinition: processNodeType,
478
+ data: { name: 'Transformer' },
479
+ } as CustomNodeData,
480
+ },
481
+ {
482
+ id: 'output',
483
+ type: 'custom',
484
+ position: { x: 650, y: 200 },
485
+ data: {
486
+ label: 'Output',
487
+ typeDefinition: { ...dataNodeType, color: '#10B981' },
488
+ data: { name: 'Data Output' },
489
+ animationType: 'flash',
490
+ animationDuration: 1500,
491
+ } as CustomNodeData,
492
+ },
493
+ {
494
+ id: 'error',
495
+ type: 'custom',
496
+ position: { x: 250, y: 350 },
497
+ data: {
498
+ label: 'Error Handler',
499
+ typeDefinition: { ...processNodeType, color: '#EF4444' },
500
+ data: { name: 'Error Handler' },
501
+ animationType: 'shake',
502
+ animationDuration: 400,
503
+ hasViolations: true,
504
+ } as CustomNodeData,
505
+ },
506
+ ]}
507
+ edges={[
508
+ {
509
+ id: 'edge-1',
510
+ source: 'input',
511
+ target: 'validate',
512
+ type: 'custom',
513
+ data: {
514
+ typeDefinition: edgeTypeDefinition,
515
+ animationType: 'particle',
516
+ animationDuration: 1000,
517
+ animationDirection: 'forward',
518
+ } as CustomEdgeData,
519
+ },
520
+ {
521
+ id: 'edge-2',
522
+ source: 'validate',
523
+ target: 'transform',
524
+ type: 'custom',
525
+ data: {
526
+ typeDefinition: edgeTypeDefinition,
527
+ animationType: 'flow',
528
+ animationDuration: 800,
529
+ animationDirection: 'forward',
530
+ } as CustomEdgeData,
531
+ },
532
+ {
533
+ id: 'edge-3',
534
+ source: 'transform',
535
+ target: 'output',
536
+ type: 'custom',
537
+ data: {
538
+ typeDefinition: edgeTypeDefinition,
539
+ animationType: 'particle',
540
+ animationDuration: 1000,
541
+ animationDirection: 'forward',
542
+ } as CustomEdgeData,
543
+ },
544
+ {
545
+ id: 'edge-error',
546
+ source: 'validate',
547
+ target: 'error',
548
+ type: 'custom',
549
+ data: {
550
+ typeDefinition: { ...edgeTypeDefinition, color: '#EF4444' },
551
+ animationType: 'glow',
552
+ animationDuration: 1000,
553
+ } as CustomEdgeData,
554
+ },
555
+ ]}
556
+ nodeTypes={nodeTypes}
557
+ edgeTypes={edgeTypes}
558
+ fitView
559
+ >
560
+ <Background />
561
+ <Controls />
562
+ </ReactFlow>
563
+ </div>
564
+ </ReactFlowProvider>
565
+ ),
566
+ };
567
+
568
+ /**
569
+ * Story 6: All Animations Showcase
570
+ * Grid layout showing all animation types simultaneously
571
+ */
572
+ export const AllAnimationsShowcase: Story = {
573
+ render: () => (
574
+ <ReactFlowProvider>
575
+ <div style={{ width: '100vw', height: '100vh' }}>
576
+ <ReactFlow
577
+ nodes={[
578
+ // Row 1: Edge animations
579
+ { id: 'flow-1', type: 'custom', position: { x: 50, y: 50 }, data: { label: 'Flow', typeDefinition: processNodeType, data: { name: 'Flow Start' } } as CustomNodeData },
580
+ { id: 'flow-2', type: 'custom', position: { x: 200, y: 50 }, data: { label: 'Flow', typeDefinition: dataNodeType, data: { name: 'Flow End' } } as CustomNodeData },
581
+
582
+ { id: 'particle-1', type: 'custom', position: { x: 280, y: 50 }, data: { label: 'Particle', typeDefinition: processNodeType, data: { name: 'Particle Start' } } as CustomNodeData },
583
+ { id: 'particle-2', type: 'custom', position: { x: 430, y: 50 }, data: { label: 'Particle', typeDefinition: dataNodeType, data: { name: 'Particle End' } } as CustomNodeData },
584
+
585
+ { id: 'pulse-1', type: 'custom', position: { x: 510, y: 50 }, data: { label: 'Pulse', typeDefinition: processNodeType, data: { name: 'Pulse Start' } } as CustomNodeData },
586
+ { id: 'pulse-2', type: 'custom', position: { x: 660, y: 50 }, data: { label: 'Pulse', typeDefinition: dataNodeType, data: { name: 'Pulse End' } } as CustomNodeData },
587
+
588
+ // Row 2: Node animations
589
+ { id: 'node-pulse', type: 'custom', position: { x: 100, y: 180 }, data: { label: 'Processing Pulse', typeDefinition: processNodeType, data: { name: 'Processing' }, animationType: 'pulse', animationDuration: 1500 } as CustomNodeData },
590
+ { id: 'node-flash', type: 'custom', position: { x: 300, y: 180 }, data: { label: 'Success Flash', typeDefinition: dataNodeType, data: { name: 'Success' }, animationType: 'flash', animationDuration: 1000 } as CustomNodeData },
591
+ { id: 'node-shake', type: 'custom', position: { x: 500, y: 180 }, data: { label: 'Error Shake', typeDefinition: processNodeType, data: { name: 'Error' }, animationType: 'shake', animationDuration: 500, hasViolations: true } as CustomNodeData },
592
+ ]}
593
+ edges={[
594
+ { id: 'e-flow', source: 'flow-1', target: 'flow-2', type: 'custom', data: { typeDefinition: edgeTypeDefinition, animationType: 'flow', animationDirection: 'forward', animationDuration: 1000 } as CustomEdgeData },
595
+ { id: 'e-particle', source: 'particle-1', target: 'particle-2', type: 'custom', data: { typeDefinition: edgeTypeDefinition, animationType: 'particle', animationDuration: 1200 } as CustomEdgeData },
596
+ { id: 'e-pulse', source: 'pulse-1', target: 'pulse-2', type: 'custom', data: { typeDefinition: edgeTypeDefinition, animationType: 'pulse', animationDuration: 1500 } as CustomEdgeData },
597
+ ]}
598
+ nodeTypes={nodeTypes}
599
+ edgeTypes={edgeTypes}
600
+ fitView
601
+ >
602
+ <Background />
603
+ <Controls />
604
+ </ReactFlow>
605
+ </div>
606
+ </ReactFlowProvider>
607
+ ),
608
+ };