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.
- flock/dashboard/launcher.py +1 -1
- flock/frontend/README.md +678 -0
- flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
- flock/frontend/index.html +12 -0
- flock/frontend/package-lock.json +4347 -0
- flock/frontend/package.json +48 -0
- flock/frontend/src/App.tsx +79 -0
- flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +587 -0
- flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +387 -0
- flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +640 -0
- flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
- flock/frontend/src/components/common/BuildInfo.tsx +39 -0
- flock/frontend/src/components/common/EmptyState.module.css +115 -0
- flock/frontend/src/components/common/EmptyState.tsx +128 -0
- flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
- flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
- flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
- flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
- flock/frontend/src/components/controls/PublishControl.css +547 -0
- flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
- flock/frontend/src/components/controls/PublishControl.tsx +432 -0
- flock/frontend/src/components/details/DetailWindowContainer.tsx +62 -0
- flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
- flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
- flock/frontend/src/components/details/MessageHistoryTab.tsx +299 -0
- flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
- flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
- flock/frontend/src/components/details/RunStatusTab.tsx +307 -0
- flock/frontend/src/components/details/tabs.test.tsx +1015 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
- flock/frontend/src/components/filters/FilterBar.module.css +29 -0
- flock/frontend/src/components/filters/FilterBar.test.tsx +133 -0
- flock/frontend/src/components/filters/FilterBar.tsx +33 -0
- flock/frontend/src/components/filters/FilterPills.module.css +79 -0
- flock/frontend/src/components/filters/FilterPills.test.tsx +173 -0
- flock/frontend/src/components/filters/FilterPills.tsx +67 -0
- flock/frontend/src/components/filters/TimeRangeFilter.module.css +91 -0
- flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
- flock/frontend/src/components/filters/TimeRangeFilter.tsx +105 -0
- flock/frontend/src/components/graph/AgentNode.test.tsx +75 -0
- flock/frontend/src/components/graph/AgentNode.tsx +322 -0
- flock/frontend/src/components/graph/GraphCanvas.tsx +406 -0
- flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
- flock/frontend/src/components/graph/MessageNode.test.tsx +62 -0
- flock/frontend/src/components/graph/MessageNode.tsx +116 -0
- flock/frontend/src/components/graph/MiniMap.tsx +47 -0
- flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
- flock/frontend/src/components/layout/DashboardLayout.css +407 -0
- flock/frontend/src/components/layout/DashboardLayout.tsx +300 -0
- flock/frontend/src/components/layout/Header.module.css +88 -0
- flock/frontend/src/components/layout/Header.tsx +52 -0
- flock/frontend/src/components/modules/EventLogModule.test.tsx +401 -0
- flock/frontend/src/components/modules/EventLogModule.tsx +396 -0
- flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +17 -0
- flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
- flock/frontend/src/components/modules/ModuleRegistry.ts +85 -0
- flock/frontend/src/components/modules/ModuleWindow.tsx +155 -0
- flock/frontend/src/components/modules/registerModules.ts +20 -0
- flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
- flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
- flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
- flock/frontend/src/components/settings/SettingsPanel.css +327 -0
- flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
- flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
- flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
- flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
- flock/frontend/src/hooks/useModulePersistence.ts +154 -0
- flock/frontend/src/hooks/useModules.ts +139 -0
- flock/frontend/src/hooks/usePersistence.ts +139 -0
- flock/frontend/src/main.tsx +13 -0
- flock/frontend/src/services/api.ts +213 -0
- flock/frontend/src/services/indexeddb.test.ts +793 -0
- flock/frontend/src/services/indexeddb.ts +794 -0
- flock/frontend/src/services/layout.test.ts +437 -0
- flock/frontend/src/services/layout.ts +146 -0
- flock/frontend/src/services/themeApplicator.ts +140 -0
- flock/frontend/src/services/themeService.ts +77 -0
- flock/frontend/src/services/websocket.test.ts +595 -0
- flock/frontend/src/services/websocket.ts +685 -0
- flock/frontend/src/store/filterStore.test.ts +242 -0
- flock/frontend/src/store/filterStore.ts +103 -0
- flock/frontend/src/store/graphStore.test.ts +186 -0
- flock/frontend/src/store/graphStore.ts +414 -0
- flock/frontend/src/store/moduleStore.test.ts +253 -0
- flock/frontend/src/store/moduleStore.ts +57 -0
- flock/frontend/src/store/settingsStore.ts +188 -0
- flock/frontend/src/store/streamStore.ts +68 -0
- flock/frontend/src/store/uiStore.test.ts +54 -0
- flock/frontend/src/store/uiStore.ts +110 -0
- flock/frontend/src/store/wsStore.ts +34 -0
- flock/frontend/src/styles/index.css +15 -0
- flock/frontend/src/styles/scrollbar.css +47 -0
- flock/frontend/src/styles/variables.css +488 -0
- flock/frontend/src/test/setup.ts +1 -0
- flock/frontend/src/types/filters.ts +14 -0
- flock/frontend/src/types/graph.ts +55 -0
- flock/frontend/src/types/modules.ts +7 -0
- flock/frontend/src/types/theme.ts +55 -0
- flock/frontend/src/utils/mockData.ts +85 -0
- flock/frontend/src/utils/performance.ts +16 -0
- flock/frontend/src/utils/transforms.test.ts +860 -0
- flock/frontend/src/utils/transforms.ts +323 -0
- flock/frontend/src/vite-env.d.ts +17 -0
- flock/frontend/tsconfig.json +27 -0
- flock/frontend/tsconfig.node.json +11 -0
- flock/frontend/vite.config.ts +25 -0
- flock/frontend/vitest.config.ts +11 -0
- flock/helper/cli_helper.py +1 -1
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/METADATA +1 -1
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/RECORD +117 -7
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/WHEEL +0 -0
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/entry_points.txt +0 -0
- {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;
|