flock-core 0.5.0b50__py3-none-any.whl → 0.5.0b52__py3-none-any.whl

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.

Potentially problematic release.


This version of flock-core might be problematic. Click here for more details.

Files changed (117) hide show
  1. flock/dashboard/launcher.py +1 -1
  2. flock/frontend/README.md +678 -0
  3. flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
  4. flock/frontend/index.html +12 -0
  5. flock/frontend/package-lock.json +4347 -0
  6. flock/frontend/package.json +48 -0
  7. flock/frontend/src/App.tsx +79 -0
  8. flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +587 -0
  9. flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +387 -0
  10. flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +640 -0
  11. flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
  12. flock/frontend/src/components/common/BuildInfo.tsx +39 -0
  13. flock/frontend/src/components/common/EmptyState.module.css +115 -0
  14. flock/frontend/src/components/common/EmptyState.tsx +128 -0
  15. flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
  16. flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
  17. flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
  18. flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
  19. flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
  20. flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
  21. flock/frontend/src/components/controls/PublishControl.css +547 -0
  22. flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
  23. flock/frontend/src/components/controls/PublishControl.tsx +432 -0
  24. flock/frontend/src/components/details/DetailWindowContainer.tsx +62 -0
  25. flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
  26. flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
  27. flock/frontend/src/components/details/MessageHistoryTab.tsx +299 -0
  28. flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
  29. flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
  30. flock/frontend/src/components/details/RunStatusTab.tsx +307 -0
  31. flock/frontend/src/components/details/tabs.test.tsx +1015 -0
  32. flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
  33. flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
  34. flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
  35. flock/frontend/src/components/filters/FilterBar.module.css +29 -0
  36. flock/frontend/src/components/filters/FilterBar.test.tsx +133 -0
  37. flock/frontend/src/components/filters/FilterBar.tsx +33 -0
  38. flock/frontend/src/components/filters/FilterPills.module.css +79 -0
  39. flock/frontend/src/components/filters/FilterPills.test.tsx +173 -0
  40. flock/frontend/src/components/filters/FilterPills.tsx +67 -0
  41. flock/frontend/src/components/filters/TimeRangeFilter.module.css +91 -0
  42. flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
  43. flock/frontend/src/components/filters/TimeRangeFilter.tsx +105 -0
  44. flock/frontend/src/components/graph/AgentNode.test.tsx +75 -0
  45. flock/frontend/src/components/graph/AgentNode.tsx +322 -0
  46. flock/frontend/src/components/graph/GraphCanvas.tsx +406 -0
  47. flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
  48. flock/frontend/src/components/graph/MessageNode.test.tsx +62 -0
  49. flock/frontend/src/components/graph/MessageNode.tsx +116 -0
  50. flock/frontend/src/components/graph/MiniMap.tsx +47 -0
  51. flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
  52. flock/frontend/src/components/layout/DashboardLayout.css +407 -0
  53. flock/frontend/src/components/layout/DashboardLayout.tsx +300 -0
  54. flock/frontend/src/components/layout/Header.module.css +88 -0
  55. flock/frontend/src/components/layout/Header.tsx +52 -0
  56. flock/frontend/src/components/modules/EventLogModule.test.tsx +401 -0
  57. flock/frontend/src/components/modules/EventLogModule.tsx +396 -0
  58. flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +17 -0
  59. flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
  60. flock/frontend/src/components/modules/ModuleRegistry.ts +85 -0
  61. flock/frontend/src/components/modules/ModuleWindow.tsx +155 -0
  62. flock/frontend/src/components/modules/registerModules.ts +20 -0
  63. flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
  64. flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
  65. flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
  66. flock/frontend/src/components/settings/SettingsPanel.css +327 -0
  67. flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
  68. flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
  69. flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
  70. flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
  71. flock/frontend/src/hooks/useModulePersistence.ts +154 -0
  72. flock/frontend/src/hooks/useModules.ts +139 -0
  73. flock/frontend/src/hooks/usePersistence.ts +139 -0
  74. flock/frontend/src/main.tsx +13 -0
  75. flock/frontend/src/services/api.ts +213 -0
  76. flock/frontend/src/services/indexeddb.test.ts +793 -0
  77. flock/frontend/src/services/indexeddb.ts +794 -0
  78. flock/frontend/src/services/layout.test.ts +437 -0
  79. flock/frontend/src/services/layout.ts +146 -0
  80. flock/frontend/src/services/themeApplicator.ts +140 -0
  81. flock/frontend/src/services/themeService.ts +77 -0
  82. flock/frontend/src/services/websocket.test.ts +595 -0
  83. flock/frontend/src/services/websocket.ts +685 -0
  84. flock/frontend/src/store/filterStore.test.ts +242 -0
  85. flock/frontend/src/store/filterStore.ts +103 -0
  86. flock/frontend/src/store/graphStore.test.ts +186 -0
  87. flock/frontend/src/store/graphStore.ts +414 -0
  88. flock/frontend/src/store/moduleStore.test.ts +253 -0
  89. flock/frontend/src/store/moduleStore.ts +57 -0
  90. flock/frontend/src/store/settingsStore.ts +188 -0
  91. flock/frontend/src/store/streamStore.ts +68 -0
  92. flock/frontend/src/store/uiStore.test.ts +54 -0
  93. flock/frontend/src/store/uiStore.ts +110 -0
  94. flock/frontend/src/store/wsStore.ts +34 -0
  95. flock/frontend/src/styles/index.css +15 -0
  96. flock/frontend/src/styles/scrollbar.css +47 -0
  97. flock/frontend/src/styles/variables.css +488 -0
  98. flock/frontend/src/test/setup.ts +1 -0
  99. flock/frontend/src/types/filters.ts +14 -0
  100. flock/frontend/src/types/graph.ts +55 -0
  101. flock/frontend/src/types/modules.ts +7 -0
  102. flock/frontend/src/types/theme.ts +55 -0
  103. flock/frontend/src/utils/mockData.ts +85 -0
  104. flock/frontend/src/utils/performance.ts +16 -0
  105. flock/frontend/src/utils/transforms.test.ts +860 -0
  106. flock/frontend/src/utils/transforms.ts +323 -0
  107. flock/frontend/src/vite-env.d.ts +17 -0
  108. flock/frontend/tsconfig.json +27 -0
  109. flock/frontend/tsconfig.node.json +11 -0
  110. flock/frontend/vite.config.ts +25 -0
  111. flock/frontend/vitest.config.ts +11 -0
  112. flock/helper/cli_helper.py +1 -1
  113. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/METADATA +1 -1
  114. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/RECORD +117 -7
  115. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/WHEEL +0 -0
  116. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/entry_points.txt +0 -0
  117. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Advanced Settings Tab
3
+ *
4
+ * Power-user settings:
5
+ * - Layout direction (top-bottom vs left-right) for manual layout
6
+ * - Node and rank spacing for manual layout algorithm
7
+ * - Debug mode (show node IDs, verbose logging)
8
+ * - Performance mode (disable animations/effects)
9
+ */
10
+
11
+ import React, { useEffect, useState } from 'react';
12
+ import { useSettingsStore } from '../../store/settingsStore';
13
+
14
+ const AdvancedSettings: React.FC = () => {
15
+ const layoutDirection = useSettingsStore((state) => state.advanced.layoutDirection);
16
+ const nodeSpacing = useSettingsStore((state) => state.advanced.nodeSpacing);
17
+ const rankSpacing = useSettingsStore((state) => state.advanced.rankSpacing);
18
+ const debugMode = useSettingsStore((state) => state.advanced.debugMode);
19
+ const performanceMode = useSettingsStore((state) => state.advanced.performanceMode);
20
+
21
+ const setLayoutDirection = useSettingsStore((state) => state.setLayoutDirection);
22
+ const setNodeSpacing = useSettingsStore((state) => state.setNodeSpacing);
23
+ const setRankSpacing = useSettingsStore((state) => state.setRankSpacing);
24
+ const setDebugMode = useSettingsStore((state) => state.setDebugMode);
25
+ const setPerformanceMode = useSettingsStore((state) => state.setPerformanceMode);
26
+
27
+ // Version information state
28
+ const [backendVersion, setBackendVersion] = useState<string>('Loading...');
29
+ const dashboardVersion = '0.1.1'; // From package.json
30
+
31
+ // Fetch version information from backend
32
+ useEffect(() => {
33
+ const fetchVersion = async () => {
34
+ try {
35
+ const response = await fetch('/api/version');
36
+ if (response.ok) {
37
+ const data = await response.json();
38
+ setBackendVersion(data.backend_version || 'Unknown');
39
+ } else {
40
+ setBackendVersion('Error fetching version');
41
+ }
42
+ } catch (error) {
43
+ console.error('Failed to fetch version:', error);
44
+ setBackendVersion('Error fetching version');
45
+ }
46
+ };
47
+
48
+ fetchVersion();
49
+ }, []);
50
+
51
+ return (
52
+ <div>
53
+ <div className="settings-section">
54
+ <h3 className="settings-section-title">Graph Layout</h3>
55
+
56
+ <div className="settings-field">
57
+ <label htmlFor="layout-direction" className="settings-label">
58
+ Layout Direction
59
+ </label>
60
+ <p className="settings-description">
61
+ Direction for manual layout algorithm (right-click → Auto Layout)
62
+ </p>
63
+ <select
64
+ id="layout-direction"
65
+ value={layoutDirection}
66
+ onChange={(e) => setLayoutDirection(e.target.value as typeof layoutDirection)}
67
+ className="settings-select"
68
+ >
69
+ <option value="LR">Left to Right (Default)</option>
70
+ <option value="TB">Top to Bottom</option>
71
+ </select>
72
+ </div>
73
+
74
+ <div className="settings-field">
75
+ <label htmlFor="node-spacing" className="settings-label">
76
+ Node Spacing: {nodeSpacing}px
77
+ </label>
78
+ <p className="settings-description">
79
+ Horizontal space between nodes when using manual layout (affects edge label visibility)
80
+ </p>
81
+ <input
82
+ id="node-spacing"
83
+ type="range"
84
+ min="25"
85
+ max="150"
86
+ step="5"
87
+ value={nodeSpacing}
88
+ onChange={(e) => setNodeSpacing(parseFloat(e.target.value))}
89
+ className="settings-input"
90
+ />
91
+ </div>
92
+
93
+ <div className="settings-field">
94
+ <label htmlFor="rank-spacing" className="settings-label">
95
+ Rank Spacing: {rankSpacing}px
96
+ </label>
97
+ <p className="settings-description">
98
+ Vertical space between graph layers when using manual layout
99
+ </p>
100
+ <input
101
+ id="rank-spacing"
102
+ type="range"
103
+ min="50"
104
+ max="300"
105
+ step="10"
106
+ value={rankSpacing}
107
+ onChange={(e) => setRankSpacing(parseFloat(e.target.value))}
108
+ className="settings-input"
109
+ />
110
+ </div>
111
+ </div>
112
+
113
+ <div className="settings-section">
114
+ <h3 className="settings-section-title">Developer Options</h3>
115
+
116
+ <div className="settings-field">
117
+ <div className="settings-checkbox-wrapper">
118
+ <input
119
+ id="debug-mode"
120
+ type="checkbox"
121
+ checked={debugMode}
122
+ onChange={(e) => setDebugMode(e.target.checked)}
123
+ className="settings-checkbox"
124
+ />
125
+ <label htmlFor="debug-mode" className="settings-checkbox-label">
126
+ Debug mode
127
+ </label>
128
+ </div>
129
+ <p className="settings-description">
130
+ Show node IDs, detailed message counts, and verbose console logging
131
+ </p>
132
+ </div>
133
+
134
+ <div className="settings-field">
135
+ <div className="settings-checkbox-wrapper">
136
+ <input
137
+ id="performance-mode"
138
+ type="checkbox"
139
+ checked={performanceMode}
140
+ onChange={(e) => setPerformanceMode(e.target.checked)}
141
+ className="settings-checkbox"
142
+ />
143
+ <label htmlFor="performance-mode" className="settings-checkbox-label">
144
+ Performance mode
145
+ </label>
146
+ </div>
147
+ <p className="settings-description">
148
+ Disable animations, shadows, and blur effects for better performance
149
+ </p>
150
+ </div>
151
+ </div>
152
+
153
+ <div className="settings-section">
154
+ <h3 className="settings-section-title">Information</h3>
155
+
156
+ <div className="settings-field">
157
+ <p className="settings-description" style={{ marginBottom: 'var(--spacing-2)' }}>
158
+ <strong>Dashboard Version:</strong> {dashboardVersion}
159
+ </p>
160
+ <p className="settings-description" style={{ marginBottom: 'var(--spacing-2)' }}>
161
+ <strong>Backend Version:</strong> {backendVersion}
162
+ </p>
163
+ <p className="settings-description" style={{ marginBottom: 'var(--spacing-2)' }}>
164
+ <strong>React Flow Version:</strong> 12.8.6
165
+ </p>
166
+ <p className="settings-description">
167
+ <strong>Local Storage Used:</strong> {localStorage.length} keys
168
+ </p>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ );
173
+ };
174
+
175
+ export default AdvancedSettings;
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Appearance Settings Tab
3
+ *
4
+ * Visual customization options:
5
+ * - Theme selection (300+ terminal themes)
6
+ * - Agent node colors (idle, active, error)
7
+ * - Node shadow intensity
8
+ * - Status pulse animation
9
+ * - Compact view mode
10
+ */
11
+
12
+ import React from 'react';
13
+ import { useSettingsStore } from '../../store/settingsStore';
14
+ import ThemeSelector from './ThemeSelector';
15
+
16
+ const AppearanceSettings: React.FC = () => {
17
+ const agentIdleColor = useSettingsStore((state) => state.appearance.agentIdleColor);
18
+ const agentActiveColor = useSettingsStore((state) => state.appearance.agentActiveColor);
19
+ const agentErrorColor = useSettingsStore((state) => state.appearance.agentErrorColor);
20
+ const nodeShadow = useSettingsStore((state) => state.appearance.nodeShadow);
21
+ const showStatusPulse = useSettingsStore((state) => state.appearance.showStatusPulse);
22
+ const compactNodeView = useSettingsStore((state) => state.appearance.compactNodeView);
23
+
24
+ const setAgentIdleColor = useSettingsStore((state) => state.setAgentIdleColor);
25
+ const setAgentActiveColor = useSettingsStore((state) => state.setAgentActiveColor);
26
+ const setAgentErrorColor = useSettingsStore((state) => state.setAgentErrorColor);
27
+ const setNodeShadow = useSettingsStore((state) => state.setNodeShadow);
28
+ const setShowStatusPulse = useSettingsStore((state) => state.setShowStatusPulse);
29
+ const setCompactNodeView = useSettingsStore((state) => state.setCompactNodeView);
30
+
31
+ return (
32
+ <div>
33
+ <div className="settings-section">
34
+ <h3 className="settings-section-title">Theme</h3>
35
+
36
+ <p className="settings-description" style={{ marginBottom: 'var(--space-component-md)' }}>
37
+ Choose from 300+ terminal color themes. Themes are loaded from the backend and applied in real-time.
38
+ </p>
39
+
40
+ <ThemeSelector />
41
+ </div>
42
+
43
+ <div className="settings-section">
44
+ <h3 className="settings-section-title">Agent Colors</h3>
45
+
46
+ <div className="settings-field">
47
+ <label htmlFor="idle-color" className="settings-label">
48
+ Idle Agent Color
49
+ </label>
50
+ <p className="settings-description">
51
+ Border and indicator color for idle agents
52
+ </p>
53
+ <div style={{ display: 'flex', gap: 'var(--gap-sm)', alignItems: 'center' }}>
54
+ <input
55
+ id="idle-color"
56
+ type="color"
57
+ value={agentIdleColor}
58
+ onChange={(e) => setAgentIdleColor(e.target.value)}
59
+ style={{ width: '60px', height: '36px', cursor: 'pointer' }}
60
+ />
61
+ <input
62
+ type="text"
63
+ value={agentIdleColor}
64
+ onChange={(e) => setAgentIdleColor(e.target.value)}
65
+ className="settings-input"
66
+ placeholder="#60a5fa"
67
+ />
68
+ </div>
69
+ </div>
70
+
71
+ <div className="settings-field">
72
+ <label htmlFor="active-color" className="settings-label">
73
+ Active Agent Color
74
+ </label>
75
+ <p className="settings-description">
76
+ Border and indicator color for running agents (thick border)
77
+ </p>
78
+ <div style={{ display: 'flex', gap: 'var(--gap-sm)', alignItems: 'center' }}>
79
+ <input
80
+ id="active-color"
81
+ type="color"
82
+ value={agentActiveColor}
83
+ onChange={(e) => setAgentActiveColor(e.target.value)}
84
+ style={{ width: '60px', height: '36px', cursor: 'pointer' }}
85
+ />
86
+ <input
87
+ type="text"
88
+ value={agentActiveColor}
89
+ onChange={(e) => setAgentActiveColor(e.target.value)}
90
+ className="settings-input"
91
+ placeholder="#10b981"
92
+ />
93
+ </div>
94
+ </div>
95
+
96
+ <div className="settings-field">
97
+ <label htmlFor="error-color" className="settings-label">
98
+ Error Agent Color
99
+ </label>
100
+ <p className="settings-description">
101
+ Border and indicator color for agents in error state
102
+ </p>
103
+ <div style={{ display: 'flex', gap: 'var(--gap-sm)', alignItems: 'center' }}>
104
+ <input
105
+ id="error-color"
106
+ type="color"
107
+ value={agentErrorColor}
108
+ onChange={(e) => setAgentErrorColor(e.target.value)}
109
+ style={{ width: '60px', height: '36px', cursor: 'pointer' }}
110
+ />
111
+ <input
112
+ type="text"
113
+ value={agentErrorColor}
114
+ onChange={(e) => setAgentErrorColor(e.target.value)}
115
+ className="settings-input"
116
+ placeholder="#ef4444"
117
+ />
118
+ </div>
119
+ </div>
120
+ </div>
121
+
122
+ <div className="settings-section">
123
+ <h3 className="settings-section-title">Node Appearance</h3>
124
+
125
+ <div className="settings-field">
126
+ <label htmlFor="node-shadow" className="settings-label">
127
+ Node Shadow
128
+ </label>
129
+ <p className="settings-description">
130
+ Shadow intensity for node elevation effect
131
+ </p>
132
+ <select
133
+ id="node-shadow"
134
+ value={nodeShadow}
135
+ onChange={(e) => setNodeShadow(e.target.value as typeof nodeShadow)}
136
+ className="settings-select"
137
+ >
138
+ <option value="none">None</option>
139
+ <option value="small">Small</option>
140
+ <option value="medium">Medium (Default)</option>
141
+ <option value="large">Large</option>
142
+ </select>
143
+ </div>
144
+
145
+ <div className="settings-field">
146
+ <div className="settings-checkbox-wrapper">
147
+ <input
148
+ id="status-pulse"
149
+ type="checkbox"
150
+ checked={showStatusPulse}
151
+ onChange={(e) => setShowStatusPulse(e.target.checked)}
152
+ className="settings-checkbox"
153
+ />
154
+ <label htmlFor="status-pulse" className="settings-checkbox-label">
155
+ Show status pulse animation
156
+ </label>
157
+ </div>
158
+ <p className="settings-description">
159
+ Animate status indicator for running agents
160
+ </p>
161
+ </div>
162
+
163
+ <div className="settings-field">
164
+ <div className="settings-checkbox-wrapper">
165
+ <input
166
+ id="compact-view"
167
+ type="checkbox"
168
+ checked={compactNodeView}
169
+ onChange={(e) => setCompactNodeView(e.target.checked)}
170
+ className="settings-checkbox"
171
+ />
172
+ <label htmlFor="compact-view" className="settings-checkbox-label">
173
+ Compact node view
174
+ </label>
175
+ </div>
176
+ <p className="settings-description">
177
+ Reduce node size and spacing (useful for large graphs)
178
+ </p>
179
+ </div>
180
+ </div>
181
+ </div>
182
+ );
183
+ };
184
+
185
+ export default AppearanceSettings;
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Graph Settings Tab
3
+ *
4
+ * Customization options for graph visualization:
5
+ * - Edge type (bezier, straight, smoothstep)
6
+ * - Edge stroke width
7
+ * - Edge animation
8
+ * - Edge labels visibility
9
+ */
10
+
11
+ import React from 'react';
12
+ import { useSettingsStore } from '../../store/settingsStore';
13
+
14
+ const GraphSettings: React.FC = () => {
15
+ const edgeType = useSettingsStore((state) => state.graph.edgeType);
16
+ const edgeStrokeWidth = useSettingsStore((state) => state.graph.edgeStrokeWidth);
17
+ const edgeAnimation = useSettingsStore((state) => state.graph.edgeAnimation);
18
+ const showEdgeLabels = useSettingsStore((state) => state.graph.showEdgeLabels);
19
+
20
+ const setEdgeType = useSettingsStore((state) => state.setEdgeType);
21
+ const setEdgeStrokeWidth = useSettingsStore((state) => state.setEdgeStrokeWidth);
22
+ const setEdgeAnimation = useSettingsStore((state) => state.setEdgeAnimation);
23
+ const setShowEdgeLabels = useSettingsStore((state) => state.setShowEdgeLabels);
24
+
25
+ return (
26
+ <div>
27
+ <div className="settings-section">
28
+ <h3 className="settings-section-title">Edge Appearance</h3>
29
+
30
+ <div className="settings-field">
31
+ <label htmlFor="edge-type" className="settings-label">
32
+ Edge Type
33
+ </label>
34
+ <p className="settings-description">
35
+ Choose how connections between nodes are drawn
36
+ </p>
37
+ <select
38
+ id="edge-type"
39
+ value={edgeType}
40
+ onChange={(e) => setEdgeType(e.target.value as typeof edgeType)}
41
+ className="settings-select"
42
+ >
43
+ <option value="bezier">Bezier (Curved) - Default</option>
44
+ <option value="smoothstep">Smooth Step</option>
45
+ <option value="straight">Straight (90° Angles)</option>
46
+ <option value="simplebezier">Simple Bezier</option>
47
+ </select>
48
+ </div>
49
+
50
+ <div className="settings-field">
51
+ <label htmlFor="edge-width" className="settings-label">
52
+ Edge Stroke Width: {edgeStrokeWidth}px
53
+ </label>
54
+ <input
55
+ id="edge-width"
56
+ type="range"
57
+ min="1"
58
+ max="5"
59
+ step="0.5"
60
+ value={edgeStrokeWidth}
61
+ onChange={(e) => setEdgeStrokeWidth(parseFloat(e.target.value))}
62
+ className="settings-input"
63
+ />
64
+ </div>
65
+ </div>
66
+
67
+ <div className="settings-section">
68
+ <h3 className="settings-section-title">Edge Behavior</h3>
69
+
70
+ <div className="settings-field">
71
+ <div className="settings-checkbox-wrapper">
72
+ <input
73
+ id="edge-animation"
74
+ type="checkbox"
75
+ checked={edgeAnimation}
76
+ onChange={(e) => setEdgeAnimation(e.target.checked)}
77
+ className="settings-checkbox"
78
+ />
79
+ <label htmlFor="edge-animation" className="settings-checkbox-label">
80
+ Enable edge animation
81
+ </label>
82
+ </div>
83
+ <p className="settings-description">
84
+ Animate message flow along edges (may impact performance)
85
+ </p>
86
+ </div>
87
+
88
+ <div className="settings-field">
89
+ <div className="settings-checkbox-wrapper">
90
+ <input
91
+ id="edge-labels"
92
+ type="checkbox"
93
+ checked={showEdgeLabels}
94
+ onChange={(e) => setShowEdgeLabels(e.target.checked)}
95
+ className="settings-checkbox"
96
+ />
97
+ <label htmlFor="edge-labels" className="settings-checkbox-label">
98
+ Show edge labels
99
+ </label>
100
+ </div>
101
+ <p className="settings-description">
102
+ Display correlation IDs and other metadata on edges
103
+ </p>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ );
108
+ };
109
+
110
+ export default GraphSettings;