@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,715 +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: 'Audit/NodeFontSizeTesting',
|
|
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 custom themes with different font sizes
|
|
22
|
-
*/
|
|
23
|
-
const createThemeWithFontSize = (baseFontSize: number): Theme => ({
|
|
24
|
-
...defaultEditorTheme,
|
|
25
|
-
fontSizes: [baseFontSize, baseFontSize + 2, baseFontSize + 4, baseFontSize + 6, baseFontSize + 8, baseFontSize + 12, baseFontSize + 20, baseFontSize + 36, baseFontSize + 52, baseFontSize + 84],
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const TEXT_SAMPLES = {
|
|
29
|
-
veryShort: 'Init',
|
|
30
|
-
short: 'File Parsed',
|
|
31
|
-
medium: 'Validation Started',
|
|
32
|
-
long: 'Canvas Validated Successfully',
|
|
33
|
-
veryLong: 'Complete Validation Process',
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const DIMENSIONS = {
|
|
37
|
-
compact: { width: 160, height: 80 },
|
|
38
|
-
standard: { width: 200, height: 100 },
|
|
39
|
-
wide: { width: 240, height: 100 },
|
|
40
|
-
tall: { width: 200, height: 120 },
|
|
41
|
-
large: { width: 240, height: 120 },
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Font size comparison grid - same dimensions, different font sizes
|
|
46
|
-
*/
|
|
47
|
-
export const FontSizeGrid: Story = {
|
|
48
|
-
render: () => {
|
|
49
|
-
const theme = defaultEditorTheme;
|
|
50
|
-
|
|
51
|
-
const fontSizes = [
|
|
52
|
-
{ label: '10px', size: 10 },
|
|
53
|
-
{ label: '12px (current)', size: 12 },
|
|
54
|
-
{ label: '14px', size: 14 },
|
|
55
|
-
{ label: '16px', size: 16 },
|
|
56
|
-
{ label: '18px', size: 18 },
|
|
57
|
-
];
|
|
58
|
-
|
|
59
|
-
const textSamples = [
|
|
60
|
-
{ label: 'Very Short', text: TEXT_SAMPLES.veryShort },
|
|
61
|
-
{ label: 'Short', text: TEXT_SAMPLES.short },
|
|
62
|
-
{ label: 'Medium', text: TEXT_SAMPLES.medium },
|
|
63
|
-
{ label: 'Long', text: TEXT_SAMPLES.long },
|
|
64
|
-
{ label: 'Very Long', text: TEXT_SAMPLES.veryLong },
|
|
65
|
-
];
|
|
66
|
-
|
|
67
|
-
return (
|
|
68
|
-
<div style={{ padding: '32px', fontFamily: theme.fonts.body }}>
|
|
69
|
-
<h1 style={{
|
|
70
|
-
marginBottom: '16px',
|
|
71
|
-
fontFamily: theme.fonts.heading,
|
|
72
|
-
fontSize: theme.fontSizes[7],
|
|
73
|
-
color: theme.colors.text,
|
|
74
|
-
}}>
|
|
75
|
-
Font Size Impact on Readability
|
|
76
|
-
</h1>
|
|
77
|
-
<p style={{
|
|
78
|
-
marginBottom: '32px',
|
|
79
|
-
fontSize: theme.fontSizes[2],
|
|
80
|
-
color: theme.colors.textSecondary,
|
|
81
|
-
maxWidth: '1000px',
|
|
82
|
-
}}>
|
|
83
|
-
Testing font sizes from 10px to 18px with various text lengths. All nodes are 200×100 (standard size), no icons.
|
|
84
|
-
</p>
|
|
85
|
-
|
|
86
|
-
{/* Column headers */}
|
|
87
|
-
<div style={{
|
|
88
|
-
marginBottom: '16px',
|
|
89
|
-
paddingLeft: '180px',
|
|
90
|
-
display: 'flex',
|
|
91
|
-
gap: '40px',
|
|
92
|
-
}}>
|
|
93
|
-
{fontSizes.map(fs => (
|
|
94
|
-
<div
|
|
95
|
-
key={fs.size}
|
|
96
|
-
style={{
|
|
97
|
-
width: 200,
|
|
98
|
-
textAlign: 'center',
|
|
99
|
-
fontSize: theme.fontSizes[1],
|
|
100
|
-
fontWeight: theme.fontWeights.semibold,
|
|
101
|
-
color: theme.colors.textSecondary,
|
|
102
|
-
fontFamily: theme.fonts.monospace,
|
|
103
|
-
}}
|
|
104
|
-
>
|
|
105
|
-
{fs.label}
|
|
106
|
-
</div>
|
|
107
|
-
))}
|
|
108
|
-
</div>
|
|
109
|
-
|
|
110
|
-
{/* Rows */}
|
|
111
|
-
{textSamples.map((sample, rowIdx) => (
|
|
112
|
-
<div key={rowIdx} style={{ marginBottom: '32px' }}>
|
|
113
|
-
<div style={{
|
|
114
|
-
display: 'flex',
|
|
115
|
-
alignItems: 'flex-start',
|
|
116
|
-
}}>
|
|
117
|
-
{/* Row label */}
|
|
118
|
-
<div style={{
|
|
119
|
-
width: '180px',
|
|
120
|
-
paddingTop: '40px',
|
|
121
|
-
paddingRight: '20px',
|
|
122
|
-
}}>
|
|
123
|
-
<div style={{
|
|
124
|
-
fontSize: theme.fontSizes[1],
|
|
125
|
-
fontWeight: theme.fontWeights.semibold,
|
|
126
|
-
color: theme.colors.textSecondary,
|
|
127
|
-
marginBottom: '4px',
|
|
128
|
-
}}>
|
|
129
|
-
{sample.label}
|
|
130
|
-
</div>
|
|
131
|
-
<div style={{
|
|
132
|
-
fontSize: theme.fontSizes[0],
|
|
133
|
-
fontFamily: theme.fonts.monospace,
|
|
134
|
-
color: theme.colors.textMuted,
|
|
135
|
-
}}>
|
|
136
|
-
"{sample.text}"
|
|
137
|
-
</div>
|
|
138
|
-
</div>
|
|
139
|
-
|
|
140
|
-
{/* Font size variations */}
|
|
141
|
-
<div style={{ display: 'flex', gap: '40px' }}>
|
|
142
|
-
{fontSizes.map(fs => {
|
|
143
|
-
const customTheme = createThemeWithFontSize(fs.size);
|
|
144
|
-
const canvas: ExtendedCanvas = {
|
|
145
|
-
nodes: [{
|
|
146
|
-
id: `${rowIdx}-${fs.size}`,
|
|
147
|
-
type: 'text',
|
|
148
|
-
x: 50,
|
|
149
|
-
y: 50,
|
|
150
|
-
width: 200,
|
|
151
|
-
height: 100,
|
|
152
|
-
text: sample.text,
|
|
153
|
-
color: '#3b82f6',
|
|
154
|
-
pv: {
|
|
155
|
-
name: sample.text,
|
|
156
|
-
shape: 'roundedRect',
|
|
157
|
-
// NO icon
|
|
158
|
-
},
|
|
159
|
-
}],
|
|
160
|
-
edges: [],
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
return (
|
|
164
|
-
<div
|
|
165
|
-
key={fs.size}
|
|
166
|
-
style={{
|
|
167
|
-
backgroundColor: theme.colors.background,
|
|
168
|
-
border: `2px solid ${theme.colors.border}`,
|
|
169
|
-
borderRadius: '6px',
|
|
170
|
-
overflow: 'hidden',
|
|
171
|
-
}}
|
|
172
|
-
>
|
|
173
|
-
<ThemeProvider theme={customTheme}>
|
|
174
|
-
<GraphRenderer
|
|
175
|
-
canvas={canvas}
|
|
176
|
-
height={200}
|
|
177
|
-
width={300}
|
|
178
|
-
/>
|
|
179
|
-
</ThemeProvider>
|
|
180
|
-
</div>
|
|
181
|
-
);
|
|
182
|
-
})}
|
|
183
|
-
</div>
|
|
184
|
-
</div>
|
|
185
|
-
</div>
|
|
186
|
-
))}
|
|
187
|
-
|
|
188
|
-
<div style={{
|
|
189
|
-
marginTop: '40px',
|
|
190
|
-
padding: '24px',
|
|
191
|
-
backgroundColor: theme.colors.surface,
|
|
192
|
-
border: `1px solid ${theme.colors.border}`,
|
|
193
|
-
borderRadius: '8px',
|
|
194
|
-
}}>
|
|
195
|
-
<h3 style={{
|
|
196
|
-
marginBottom: '12px',
|
|
197
|
-
fontSize: theme.fontSizes[3],
|
|
198
|
-
color: theme.colors.text,
|
|
199
|
-
}}>
|
|
200
|
-
Observations
|
|
201
|
-
</h3>
|
|
202
|
-
<ul style={{
|
|
203
|
-
fontSize: theme.fontSizes[1],
|
|
204
|
-
color: theme.colors.textSecondary,
|
|
205
|
-
lineHeight: 1.8,
|
|
206
|
-
paddingLeft: '20px',
|
|
207
|
-
}}>
|
|
208
|
-
<li><strong>10px:</strong> Very compact, may be hard to read at a glance</li>
|
|
209
|
-
<li><strong>12px (current):</strong> Good balance for dense workflows</li>
|
|
210
|
-
<li><strong>14px:</strong> More readable, slightly more space needed</li>
|
|
211
|
-
<li><strong>16px:</strong> Very readable, but may feel cramped in standard dimensions</li>
|
|
212
|
-
<li><strong>18px:</strong> Maximum readability, requires larger node dimensions</li>
|
|
213
|
-
</ul>
|
|
214
|
-
</div>
|
|
215
|
-
</div>
|
|
216
|
-
);
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Dimension variations with different font sizes
|
|
222
|
-
*/
|
|
223
|
-
export const DimensionsVsFontSize: Story = {
|
|
224
|
-
render: () => {
|
|
225
|
-
const theme = defaultEditorTheme;
|
|
226
|
-
|
|
227
|
-
const testCases = [
|
|
228
|
-
{
|
|
229
|
-
title: 'Compact Nodes (160×80)',
|
|
230
|
-
dimensions: DIMENSIONS.compact,
|
|
231
|
-
bestFontSizes: [10, 12],
|
|
232
|
-
},
|
|
233
|
-
{
|
|
234
|
-
title: 'Standard Nodes (200×100) - Current',
|
|
235
|
-
dimensions: DIMENSIONS.standard,
|
|
236
|
-
bestFontSizes: [12, 14],
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
title: 'Wide Nodes (240×100)',
|
|
240
|
-
dimensions: DIMENSIONS.wide,
|
|
241
|
-
bestFontSizes: [12, 14, 16],
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
title: 'Tall Nodes (200×120)',
|
|
245
|
-
dimensions: DIMENSIONS.tall,
|
|
246
|
-
bestFontSizes: [12, 14, 16],
|
|
247
|
-
},
|
|
248
|
-
{
|
|
249
|
-
title: 'Large Nodes (240×120)',
|
|
250
|
-
dimensions: DIMENSIONS.large,
|
|
251
|
-
bestFontSizes: [14, 16, 18],
|
|
252
|
-
},
|
|
253
|
-
];
|
|
254
|
-
|
|
255
|
-
const sampleText = 'Validation Started';
|
|
256
|
-
|
|
257
|
-
return (
|
|
258
|
-
<div style={{ padding: '32px' }}>
|
|
259
|
-
<h1 style={{
|
|
260
|
-
marginBottom: '16px',
|
|
261
|
-
fontSize: theme.fontSizes[7],
|
|
262
|
-
color: theme.colors.text,
|
|
263
|
-
}}>
|
|
264
|
-
Optimal Font Size for Each Dimension
|
|
265
|
-
</h1>
|
|
266
|
-
<p style={{
|
|
267
|
-
marginBottom: '32px',
|
|
268
|
-
fontSize: theme.fontSizes[2],
|
|
269
|
-
color: theme.colors.textSecondary,
|
|
270
|
-
}}>
|
|
271
|
-
Finding the best font sizes for different node dimensions. Text: "{sampleText}"
|
|
272
|
-
</p>
|
|
273
|
-
|
|
274
|
-
{testCases.map((testCase, idx) => (
|
|
275
|
-
<div
|
|
276
|
-
key={idx}
|
|
277
|
-
style={{
|
|
278
|
-
marginBottom: '40px',
|
|
279
|
-
padding: '24px',
|
|
280
|
-
backgroundColor: theme.colors.surface,
|
|
281
|
-
border: `1px solid ${theme.colors.border}`,
|
|
282
|
-
borderRadius: '8px',
|
|
283
|
-
}}
|
|
284
|
-
>
|
|
285
|
-
<div style={{
|
|
286
|
-
display: 'flex',
|
|
287
|
-
justifyContent: 'space-between',
|
|
288
|
-
alignItems: 'center',
|
|
289
|
-
marginBottom: '16px',
|
|
290
|
-
}}>
|
|
291
|
-
<h3 style={{
|
|
292
|
-
fontSize: theme.fontSizes[3],
|
|
293
|
-
color: theme.colors.text,
|
|
294
|
-
}}>
|
|
295
|
-
{testCase.title}
|
|
296
|
-
</h3>
|
|
297
|
-
<div style={{
|
|
298
|
-
fontSize: theme.fontSizes[1],
|
|
299
|
-
fontFamily: theme.fonts.monospace,
|
|
300
|
-
color: theme.colors.textMuted,
|
|
301
|
-
}}>
|
|
302
|
-
Recommended: {testCase.bestFontSizes.join('px, ')}px
|
|
303
|
-
</div>
|
|
304
|
-
</div>
|
|
305
|
-
|
|
306
|
-
<div style={{
|
|
307
|
-
display: 'flex',
|
|
308
|
-
gap: '24px',
|
|
309
|
-
flexWrap: 'wrap',
|
|
310
|
-
}}>
|
|
311
|
-
{[10, 12, 14, 16, 18].map(fontSize => {
|
|
312
|
-
const customTheme = createThemeWithFontSize(fontSize);
|
|
313
|
-
const isRecommended = testCase.bestFontSizes.includes(fontSize);
|
|
314
|
-
const canvas: ExtendedCanvas = {
|
|
315
|
-
nodes: [{
|
|
316
|
-
id: `${idx}-${fontSize}`,
|
|
317
|
-
type: 'text',
|
|
318
|
-
x: 50,
|
|
319
|
-
y: 50,
|
|
320
|
-
width: testCase.dimensions.width,
|
|
321
|
-
height: testCase.dimensions.height,
|
|
322
|
-
text: sampleText,
|
|
323
|
-
color: '#3b82f6',
|
|
324
|
-
pv: {
|
|
325
|
-
name: sampleText,
|
|
326
|
-
shape: 'roundedRect',
|
|
327
|
-
},
|
|
328
|
-
}],
|
|
329
|
-
edges: [],
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
return (
|
|
333
|
-
<div key={fontSize} style={{ position: 'relative' }}>
|
|
334
|
-
{isRecommended && (
|
|
335
|
-
<div style={{
|
|
336
|
-
position: 'absolute',
|
|
337
|
-
top: -10,
|
|
338
|
-
right: -10,
|
|
339
|
-
backgroundColor: theme.colors.success,
|
|
340
|
-
color: 'white',
|
|
341
|
-
padding: '4px 8px',
|
|
342
|
-
borderRadius: '4px',
|
|
343
|
-
fontSize: theme.fontSizes[0],
|
|
344
|
-
fontWeight: theme.fontWeights.bold,
|
|
345
|
-
zIndex: 10,
|
|
346
|
-
}}>
|
|
347
|
-
✓
|
|
348
|
-
</div>
|
|
349
|
-
)}
|
|
350
|
-
<div style={{
|
|
351
|
-
marginBottom: '8px',
|
|
352
|
-
fontSize: theme.fontSizes[1],
|
|
353
|
-
fontFamily: theme.fonts.monospace,
|
|
354
|
-
color: isRecommended ? theme.colors.success : theme.colors.textMuted,
|
|
355
|
-
fontWeight: isRecommended ? theme.fontWeights.semibold : theme.fontWeights.normal,
|
|
356
|
-
}}>
|
|
357
|
-
{fontSize}px
|
|
358
|
-
</div>
|
|
359
|
-
<div style={{
|
|
360
|
-
backgroundColor: theme.colors.background,
|
|
361
|
-
border: `2px solid ${isRecommended ? theme.colors.success : theme.colors.border}`,
|
|
362
|
-
borderRadius: '6px',
|
|
363
|
-
overflow: 'hidden',
|
|
364
|
-
}}>
|
|
365
|
-
<ThemeProvider theme={customTheme}>
|
|
366
|
-
<GraphRenderer
|
|
367
|
-
canvas={canvas}
|
|
368
|
-
height={testCase.dimensions.height + 100}
|
|
369
|
-
width={testCase.dimensions.width + 100}
|
|
370
|
-
/>
|
|
371
|
-
</ThemeProvider>
|
|
372
|
-
</div>
|
|
373
|
-
</div>
|
|
374
|
-
);
|
|
375
|
-
})}
|
|
376
|
-
</div>
|
|
377
|
-
</div>
|
|
378
|
-
))}
|
|
379
|
-
</div>
|
|
380
|
-
);
|
|
381
|
-
},
|
|
382
|
-
};
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Real workflow with different font sizes
|
|
386
|
-
*/
|
|
387
|
-
export const WorkflowFontComparison: Story = {
|
|
388
|
-
render: () => {
|
|
389
|
-
const theme = defaultEditorTheme;
|
|
390
|
-
|
|
391
|
-
const fontSizes = [
|
|
392
|
-
{ label: '12px (Current)', size: 12 },
|
|
393
|
-
{ label: '14px (Larger)', size: 14 },
|
|
394
|
-
{ label: '16px (Maximum)', size: 16 },
|
|
395
|
-
];
|
|
396
|
-
|
|
397
|
-
const events = [
|
|
398
|
-
{ name: 'Analysis Started', color: '#22c55e' },
|
|
399
|
-
{ name: 'File Parsed', color: '#3b82f6' },
|
|
400
|
-
{ name: 'Type Detected', color: '#f59e0b' },
|
|
401
|
-
{ name: 'Canvas Validated', color: '#8b5cf6' },
|
|
402
|
-
{ name: 'Results Aggregated', color: '#f59e0b' },
|
|
403
|
-
{ name: 'Validation Complete', color: '#22c55e' },
|
|
404
|
-
];
|
|
405
|
-
|
|
406
|
-
return (
|
|
407
|
-
<div style={{ padding: '32px' }}>
|
|
408
|
-
<h1 style={{
|
|
409
|
-
marginBottom: '16px',
|
|
410
|
-
fontSize: theme.fontSizes[7],
|
|
411
|
-
color: theme.colors.text,
|
|
412
|
-
}}>
|
|
413
|
-
Workflow Font Size Comparison
|
|
414
|
-
</h1>
|
|
415
|
-
<p style={{
|
|
416
|
-
marginBottom: '32px',
|
|
417
|
-
fontSize: theme.fontSizes[2],
|
|
418
|
-
color: theme.colors.textSecondary,
|
|
419
|
-
}}>
|
|
420
|
-
Same validation workflow with different font sizes. All nodes are 200×100, no icons.
|
|
421
|
-
</p>
|
|
422
|
-
|
|
423
|
-
<div style={{
|
|
424
|
-
display: 'grid',
|
|
425
|
-
gridTemplateColumns: 'repeat(3, 1fr)',
|
|
426
|
-
gap: '32px',
|
|
427
|
-
}}>
|
|
428
|
-
{fontSizes.map(fs => {
|
|
429
|
-
const customTheme = createThemeWithFontSize(fs.size);
|
|
430
|
-
const canvas: ExtendedCanvas = {
|
|
431
|
-
nodes: events.map((event, idx) => ({
|
|
432
|
-
id: `${fs.size}-${idx}`,
|
|
433
|
-
type: 'text',
|
|
434
|
-
x: 100,
|
|
435
|
-
y: 80 + idx * 150,
|
|
436
|
-
width: 200,
|
|
437
|
-
height: 100,
|
|
438
|
-
text: event.name,
|
|
439
|
-
color: event.color,
|
|
440
|
-
pv: {
|
|
441
|
-
name: event.name,
|
|
442
|
-
shape: 'roundedRect',
|
|
443
|
-
otel: {
|
|
444
|
-
kind: 'event',
|
|
445
|
-
category: idx === 0 || idx === 5 ? 'lifecycle' : 'operation',
|
|
446
|
-
},
|
|
447
|
-
},
|
|
448
|
-
})),
|
|
449
|
-
edges: events.slice(0, -1).map((_, idx) => ({
|
|
450
|
-
id: `edge-${fs.size}-${idx}`,
|
|
451
|
-
fromNode: `${fs.size}-${idx}`,
|
|
452
|
-
toNode: `${fs.size}-${idx + 1}`,
|
|
453
|
-
fromSide: 'bottom' as const,
|
|
454
|
-
toSide: 'top' as const,
|
|
455
|
-
})),
|
|
456
|
-
};
|
|
457
|
-
|
|
458
|
-
return (
|
|
459
|
-
<div key={fs.size}>
|
|
460
|
-
<h3 style={{
|
|
461
|
-
fontSize: theme.fontSizes[3],
|
|
462
|
-
fontWeight: theme.fontWeights.semibold,
|
|
463
|
-
color: theme.colors.text,
|
|
464
|
-
marginBottom: '12px',
|
|
465
|
-
}}>
|
|
466
|
-
{fs.label}
|
|
467
|
-
</h3>
|
|
468
|
-
<div style={{
|
|
469
|
-
backgroundColor: theme.colors.background,
|
|
470
|
-
border: `2px solid ${theme.colors.border}`,
|
|
471
|
-
borderRadius: '8px',
|
|
472
|
-
overflow: 'hidden',
|
|
473
|
-
}}>
|
|
474
|
-
<ThemeProvider theme={customTheme}>
|
|
475
|
-
<GraphRenderer
|
|
476
|
-
canvas={canvas}
|
|
477
|
-
height={1000}
|
|
478
|
-
width="100%"
|
|
479
|
-
/>
|
|
480
|
-
</ThemeProvider>
|
|
481
|
-
</div>
|
|
482
|
-
</div>
|
|
483
|
-
);
|
|
484
|
-
})}
|
|
485
|
-
</div>
|
|
486
|
-
|
|
487
|
-
<div style={{
|
|
488
|
-
marginTop: '40px',
|
|
489
|
-
padding: '24px',
|
|
490
|
-
backgroundColor: theme.colors.backgroundSecondary,
|
|
491
|
-
border: `2px solid ${theme.colors.primary}`,
|
|
492
|
-
borderRadius: '8px',
|
|
493
|
-
}}>
|
|
494
|
-
<h3 style={{
|
|
495
|
-
marginBottom: '16px',
|
|
496
|
-
fontSize: theme.fontSizes[4],
|
|
497
|
-
color: theme.colors.text,
|
|
498
|
-
}}>
|
|
499
|
-
Font Size Recommendations
|
|
500
|
-
</h3>
|
|
501
|
-
<div style={{
|
|
502
|
-
display: 'grid',
|
|
503
|
-
gridTemplateColumns: '1fr 1fr',
|
|
504
|
-
gap: '24px',
|
|
505
|
-
fontSize: theme.fontSizes[1],
|
|
506
|
-
color: theme.colors.text,
|
|
507
|
-
lineHeight: 1.8,
|
|
508
|
-
}}>
|
|
509
|
-
<div>
|
|
510
|
-
<div style={{ marginBottom: '12px' }}>
|
|
511
|
-
<strong style={{ color: theme.colors.primary }}>12px (Current Default)</strong>
|
|
512
|
-
<div style={{ paddingLeft: '20px', color: theme.colors.textSecondary }}>
|
|
513
|
-
• Best for dense workflows with many nodes<br/>
|
|
514
|
-
• Maximizes canvas space efficiency<br/>
|
|
515
|
-
• Good for technical/developer audiences<br/>
|
|
516
|
-
• Requires good screen resolution
|
|
517
|
-
</div>
|
|
518
|
-
</div>
|
|
519
|
-
</div>
|
|
520
|
-
<div>
|
|
521
|
-
<div style={{ marginBottom: '12px' }}>
|
|
522
|
-
<strong style={{ color: theme.colors.primary }}>14px (Balanced)</strong>
|
|
523
|
-
<div style={{ paddingLeft: '20px', color: theme.colors.textSecondary }}>
|
|
524
|
-
• Improved readability without major space cost<br/>
|
|
525
|
-
• Good for presentations and documentation<br/>
|
|
526
|
-
• Works well on various screen sizes<br/>
|
|
527
|
-
• Sweet spot for most use cases
|
|
528
|
-
</div>
|
|
529
|
-
</div>
|
|
530
|
-
</div>
|
|
531
|
-
<div>
|
|
532
|
-
<div>
|
|
533
|
-
<strong style={{ color: theme.colors.primary }}>16px (Maximum Readability)</strong>
|
|
534
|
-
<div style={{ paddingLeft: '20px', color: theme.colors.textSecondary }}>
|
|
535
|
-
• Maximum readability and accessibility<br/>
|
|
536
|
-
• Best for presentations and demos<br/>
|
|
537
|
-
• Requires larger node dimensions<br/>
|
|
538
|
-
• May need wider canvas (240×120)
|
|
539
|
-
</div>
|
|
540
|
-
</div>
|
|
541
|
-
</div>
|
|
542
|
-
</div>
|
|
543
|
-
</div>
|
|
544
|
-
</div>
|
|
545
|
-
);
|
|
546
|
-
},
|
|
547
|
-
};
|
|
548
|
-
|
|
549
|
-
/**
|
|
550
|
-
* Side-by-side: Font size vs Node dimension matrix
|
|
551
|
-
*/
|
|
552
|
-
export const FontSizeDimensionMatrix: Story = {
|
|
553
|
-
render: () => {
|
|
554
|
-
const theme = defaultEditorTheme;
|
|
555
|
-
|
|
556
|
-
const dimensions = [
|
|
557
|
-
{ label: '160×80', ...DIMENSIONS.compact },
|
|
558
|
-
{ label: '200×100', ...DIMENSIONS.standard },
|
|
559
|
-
{ label: '240×120', ...DIMENSIONS.large },
|
|
560
|
-
];
|
|
561
|
-
|
|
562
|
-
const fontSizes = [
|
|
563
|
-
{ label: '12px', size: 12 },
|
|
564
|
-
{ label: '14px', size: 14 },
|
|
565
|
-
{ label: '16px', size: 16 },
|
|
566
|
-
];
|
|
567
|
-
|
|
568
|
-
const sampleTexts = [
|
|
569
|
-
'File Parsed',
|
|
570
|
-
'Validation Started',
|
|
571
|
-
'Canvas Validated',
|
|
572
|
-
];
|
|
573
|
-
|
|
574
|
-
return (
|
|
575
|
-
<div style={{ padding: '32px' }}>
|
|
576
|
-
<h1 style={{
|
|
577
|
-
marginBottom: '16px',
|
|
578
|
-
fontSize: theme.fontSizes[7],
|
|
579
|
-
color: theme.colors.text,
|
|
580
|
-
}}>
|
|
581
|
-
Font Size × Dimension Matrix
|
|
582
|
-
</h1>
|
|
583
|
-
<p style={{
|
|
584
|
-
marginBottom: '32px',
|
|
585
|
-
fontSize: theme.fontSizes[2],
|
|
586
|
-
color: theme.colors.textSecondary,
|
|
587
|
-
}}>
|
|
588
|
-
Complete matrix showing all combinations of font sizes and node dimensions. No icons.
|
|
589
|
-
</p>
|
|
590
|
-
|
|
591
|
-
{/* Column headers */}
|
|
592
|
-
<div style={{
|
|
593
|
-
marginBottom: '16px',
|
|
594
|
-
paddingLeft: '140px',
|
|
595
|
-
display: 'flex',
|
|
596
|
-
gap: '60px',
|
|
597
|
-
}}>
|
|
598
|
-
{dimensions.map(dim => (
|
|
599
|
-
<div
|
|
600
|
-
key={dim.label}
|
|
601
|
-
style={{
|
|
602
|
-
width: dim.width + 100,
|
|
603
|
-
textAlign: 'center',
|
|
604
|
-
fontSize: theme.fontSizes[1],
|
|
605
|
-
fontWeight: theme.fontWeights.semibold,
|
|
606
|
-
color: theme.colors.textSecondary,
|
|
607
|
-
fontFamily: theme.fonts.monospace,
|
|
608
|
-
}}
|
|
609
|
-
>
|
|
610
|
-
{dim.label}
|
|
611
|
-
</div>
|
|
612
|
-
))}
|
|
613
|
-
</div>
|
|
614
|
-
|
|
615
|
-
{/* Rows by font size */}
|
|
616
|
-
{fontSizes.map(fs => (
|
|
617
|
-
<div key={fs.size} style={{ marginBottom: '40px' }}>
|
|
618
|
-
<div style={{ display: 'flex', alignItems: 'flex-start' }}>
|
|
619
|
-
{/* Font size label */}
|
|
620
|
-
<div style={{
|
|
621
|
-
width: '140px',
|
|
622
|
-
paddingTop: '100px',
|
|
623
|
-
paddingRight: '20px',
|
|
624
|
-
}}>
|
|
625
|
-
<div style={{
|
|
626
|
-
fontSize: theme.fontSizes[2],
|
|
627
|
-
fontWeight: theme.fontWeights.semibold,
|
|
628
|
-
color: theme.colors.text,
|
|
629
|
-
fontFamily: theme.fonts.monospace,
|
|
630
|
-
}}>
|
|
631
|
-
{fs.label}
|
|
632
|
-
</div>
|
|
633
|
-
</div>
|
|
634
|
-
|
|
635
|
-
{/* Dimension variations */}
|
|
636
|
-
<div style={{ display: 'flex', gap: '60px' }}>
|
|
637
|
-
{dimensions.map(dim => {
|
|
638
|
-
const customTheme = createThemeWithFontSize(fs.size);
|
|
639
|
-
const canvas: ExtendedCanvas = {
|
|
640
|
-
nodes: sampleTexts.map((text, idx) => ({
|
|
641
|
-
id: `${fs.size}-${dim.label}-${idx}`,
|
|
642
|
-
type: 'text',
|
|
643
|
-
x: 50,
|
|
644
|
-
y: 50 + idx * (dim.height + 20),
|
|
645
|
-
width: dim.width,
|
|
646
|
-
height: dim.height,
|
|
647
|
-
text,
|
|
648
|
-
color: '#3b82f6',
|
|
649
|
-
pv: {
|
|
650
|
-
name: text,
|
|
651
|
-
shape: 'roundedRect',
|
|
652
|
-
},
|
|
653
|
-
})),
|
|
654
|
-
edges: [],
|
|
655
|
-
};
|
|
656
|
-
|
|
657
|
-
return (
|
|
658
|
-
<div
|
|
659
|
-
key={dim.label}
|
|
660
|
-
style={{
|
|
661
|
-
backgroundColor: theme.colors.background,
|
|
662
|
-
border: `2px solid ${theme.colors.border}`,
|
|
663
|
-
borderRadius: '6px',
|
|
664
|
-
overflow: 'hidden',
|
|
665
|
-
}}
|
|
666
|
-
>
|
|
667
|
-
<ThemeProvider theme={customTheme}>
|
|
668
|
-
<GraphRenderer
|
|
669
|
-
canvas={canvas}
|
|
670
|
-
height={450}
|
|
671
|
-
width={dim.width + 100}
|
|
672
|
-
/>
|
|
673
|
-
</ThemeProvider>
|
|
674
|
-
</div>
|
|
675
|
-
);
|
|
676
|
-
})}
|
|
677
|
-
</div>
|
|
678
|
-
</div>
|
|
679
|
-
</div>
|
|
680
|
-
))}
|
|
681
|
-
|
|
682
|
-
<div style={{
|
|
683
|
-
marginTop: '40px',
|
|
684
|
-
padding: '24px',
|
|
685
|
-
backgroundColor: theme.colors.surface,
|
|
686
|
-
border: `1px solid ${theme.colors.border}`,
|
|
687
|
-
borderRadius: '8px',
|
|
688
|
-
}}>
|
|
689
|
-
<h3 style={{
|
|
690
|
-
marginBottom: '16px',
|
|
691
|
-
fontSize: theme.fontSizes[3],
|
|
692
|
-
color: theme.colors.text,
|
|
693
|
-
}}>
|
|
694
|
-
Best Combinations
|
|
695
|
-
</h3>
|
|
696
|
-
<div style={{
|
|
697
|
-
fontSize: theme.fontSizes[1],
|
|
698
|
-
color: theme.colors.text,
|
|
699
|
-
lineHeight: 1.8,
|
|
700
|
-
}}>
|
|
701
|
-
<div style={{ marginBottom: '8px' }}>
|
|
702
|
-
<strong>160×80:</strong> <span style={{ color: theme.colors.success }}>12px</span> (compact workflows)
|
|
703
|
-
</div>
|
|
704
|
-
<div style={{ marginBottom: '8px' }}>
|
|
705
|
-
<strong>200×100:</strong> <span style={{ color: theme.colors.success }}>12px, 14px</span> (standard, versatile)
|
|
706
|
-
</div>
|
|
707
|
-
<div>
|
|
708
|
-
<strong>240×120:</strong> <span style={{ color: theme.colors.success }}>14px, 16px</span> (large, readable)
|
|
709
|
-
</div>
|
|
710
|
-
</div>
|
|
711
|
-
</div>
|
|
712
|
-
</div>
|
|
713
|
-
);
|
|
714
|
-
},
|
|
715
|
-
};
|