@d34dman/flowdrop 0.0.43 → 0.0.45
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 +8 -8
- package/dist/api/enhanced-client.d.ts +3 -1
- package/dist/api/enhanced-client.js +35 -5
- package/dist/components/App.svelte +68 -34
- package/dist/components/ConfigForm.svelte +169 -142
- package/dist/components/ConfigForm.svelte.d.ts +4 -2
- package/dist/components/ConfigPanel.svelte +42 -15
- package/dist/components/LogsSidebar.svelte +20 -19
- package/dist/components/Navbar.svelte +150 -80
- package/dist/components/Navbar.svelte.d.ts +8 -0
- package/dist/components/NodeSidebar.svelte +334 -217
- package/dist/components/PipelineStatus.svelte +6 -1
- package/dist/components/ReadOnlyDetails.svelte +14 -14
- package/dist/components/SchemaForm.svelte +49 -30
- package/dist/components/SchemaForm.svelte.d.ts +11 -1
- package/dist/components/SettingsModal.svelte +279 -0
- package/dist/components/SettingsModal.svelte.d.ts +23 -0
- package/dist/components/SettingsPanel.svelte +615 -0
- package/dist/components/SettingsPanel.svelte.d.ts +21 -0
- package/dist/components/ThemeToggle.svelte +186 -0
- package/dist/components/ThemeToggle.svelte.d.ts +14 -0
- package/dist/components/WorkflowEditor.svelte +114 -38
- package/dist/components/form/FormArray.svelte +81 -81
- package/dist/components/form/FormAutocomplete.svelte +1014 -0
- package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
- package/dist/components/form/FormCheckboxGroup.svelte +16 -16
- package/dist/components/form/FormCodeEditor.svelte +26 -26
- package/dist/components/form/FormField.svelte +52 -21
- package/dist/components/form/FormFieldLight.svelte +19 -19
- package/dist/components/form/FormFieldWrapper.svelte +4 -4
- package/dist/components/form/FormMarkdownEditor.svelte +124 -57
- package/dist/components/form/FormNumberField.svelte +13 -13
- package/dist/components/form/FormRangeField.svelte +16 -16
- package/dist/components/form/FormSelect.svelte +15 -15
- package/dist/components/form/FormTemplateEditor.svelte +34 -34
- package/dist/components/form/FormTextField.svelte +13 -13
- package/dist/components/form/FormTextarea.svelte +13 -13
- package/dist/components/form/FormToggle.svelte +8 -8
- package/dist/components/form/index.d.ts +1 -0
- package/dist/components/form/index.js +1 -0
- package/dist/components/form/types.d.ts +133 -8
- package/dist/components/form/types.js +50 -1
- package/dist/components/interrupt/ChoicePrompt.svelte +45 -38
- package/dist/components/interrupt/ConfirmationPrompt.svelte +35 -35
- package/dist/components/interrupt/FormPrompt.svelte +27 -20
- package/dist/components/interrupt/InterruptBubble.svelte +50 -50
- package/dist/components/interrupt/TextInputPrompt.svelte +39 -32
- package/dist/components/layouts/MainLayout.svelte +233 -34
- package/dist/components/layouts/MainLayout.svelte.d.ts +12 -0
- package/dist/components/nodes/GatewayNode.svelte +175 -125
- package/dist/components/nodes/IdeaNode.svelte +70 -84
- package/dist/components/nodes/NotesNode.svelte +124 -88
- package/dist/components/nodes/SimpleNode.svelte +91 -69
- package/dist/components/nodes/SquareNode.svelte +102 -75
- package/dist/components/nodes/TerminalNode.svelte +127 -113
- package/dist/components/nodes/ToolNode.svelte +125 -76
- package/dist/components/nodes/WorkflowNode.svelte +164 -108
- package/dist/components/playground/ChatPanel.svelte +76 -76
- package/dist/components/playground/ExecutionLogs.svelte +71 -69
- package/dist/components/playground/InputCollector.svelte +59 -59
- package/dist/components/playground/MessageBubble.svelte +111 -112
- package/dist/components/playground/Playground.svelte +184 -138
- package/dist/components/playground/PlaygroundModal.svelte +18 -19
- package/dist/components/playground/SessionManager.svelte +68 -67
- package/dist/config/defaultPortConfig.js +22 -22
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +1 -0
- package/dist/form/fieldRegistry.d.ts +17 -1
- package/dist/form/fieldRegistry.js +18 -2
- package/dist/form/index.d.ts +20 -2
- package/dist/form/index.js +19 -1
- package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
- package/dist/helpers/nodeLayoutHelper.js +19 -0
- package/dist/helpers/workflowEditorHelper.js +23 -11
- package/dist/index.d.ts +5 -0
- package/dist/index.js +13 -0
- package/dist/services/autoSaveService.d.ts +112 -0
- package/dist/services/autoSaveService.js +223 -0
- package/dist/services/settingsService.d.ts +92 -0
- package/dist/services/settingsService.js +202 -0
- package/dist/services/toastService.d.ts +9 -0
- package/dist/services/toastService.js +30 -1
- package/dist/stores/settingsStore.d.ts +128 -0
- package/dist/stores/settingsStore.js +488 -0
- package/dist/stores/themeStore.d.ts +68 -0
- package/dist/stores/themeStore.js +215 -0
- package/dist/styles/base.css +338 -621
- package/dist/styles/toast.css +33 -0
- package/dist/styles/tokens.css +402 -0
- package/dist/types/index.d.ts +78 -0
- package/dist/types/index.js +2 -0
- package/dist/types/playground.d.ts +12 -0
- package/dist/types/settings.d.ts +185 -0
- package/dist/types/settings.js +101 -0
- package/dist/utils/colors.d.ts +100 -7
- package/dist/utils/colors.js +228 -67
- package/package.json +2 -2
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
<script lang="ts">
|
|
10
10
|
import type { Snippet } from 'svelte';
|
|
11
11
|
import ReadOnlyDetails from './ReadOnlyDetails.svelte';
|
|
12
|
+
import { uiSettings } from '../stores/settingsStore.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* A single detail item with label and value
|
|
@@ -56,7 +57,7 @@
|
|
|
56
57
|
const hasDetails = $derived(id !== undefined || details.length > 0 || description !== undefined);
|
|
57
58
|
</script>
|
|
58
59
|
|
|
59
|
-
<div class="config-panel">
|
|
60
|
+
<div class="config-panel" class:config-panel--compact={$uiSettings.compactMode}>
|
|
60
61
|
<!-- Header -->
|
|
61
62
|
<div class="config-panel__header">
|
|
62
63
|
<h2 class="config-panel__title">{title}</h2>
|
|
@@ -86,7 +87,7 @@
|
|
|
86
87
|
height: 100%;
|
|
87
88
|
display: flex;
|
|
88
89
|
flex-direction: column;
|
|
89
|
-
background-color:
|
|
90
|
+
background-color: var(--fd-background);
|
|
90
91
|
}
|
|
91
92
|
|
|
92
93
|
.config-panel__header {
|
|
@@ -94,8 +95,8 @@
|
|
|
94
95
|
justify-content: space-between;
|
|
95
96
|
align-items: center;
|
|
96
97
|
padding: 0.875rem 1rem;
|
|
97
|
-
border-bottom: 1px solid
|
|
98
|
-
background-color:
|
|
98
|
+
border-bottom: 1px solid var(--fd-border);
|
|
99
|
+
background-color: var(--fd-muted);
|
|
99
100
|
flex-shrink: 0;
|
|
100
101
|
}
|
|
101
102
|
|
|
@@ -103,7 +104,7 @@
|
|
|
103
104
|
margin: 0;
|
|
104
105
|
font-size: 1rem;
|
|
105
106
|
font-weight: 600;
|
|
106
|
-
color:
|
|
107
|
+
color: var(--fd-foreground);
|
|
107
108
|
}
|
|
108
109
|
|
|
109
110
|
.config-panel__close {
|
|
@@ -112,23 +113,23 @@
|
|
|
112
113
|
font-size: 1.25rem;
|
|
113
114
|
line-height: 1;
|
|
114
115
|
cursor: pointer;
|
|
115
|
-
color:
|
|
116
|
+
color: var(--fd-muted-foreground);
|
|
116
117
|
padding: 0.25rem;
|
|
117
|
-
border-radius:
|
|
118
|
+
border-radius: var(--fd-radius-sm);
|
|
118
119
|
transition:
|
|
119
|
-
color
|
|
120
|
-
background-color
|
|
120
|
+
color var(--fd-transition-fast),
|
|
121
|
+
background-color var(--fd-transition-fast);
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
.config-panel__close:hover {
|
|
124
|
-
color:
|
|
125
|
-
background-color:
|
|
125
|
+
color: var(--fd-foreground);
|
|
126
|
+
background-color: var(--fd-subtle);
|
|
126
127
|
}
|
|
127
128
|
|
|
128
129
|
.config-panel__details {
|
|
129
130
|
padding: 0.75rem 1rem;
|
|
130
|
-
border-bottom: 1px solid
|
|
131
|
-
background-color:
|
|
131
|
+
border-bottom: 1px solid var(--fd-border-muted);
|
|
132
|
+
background-color: var(--fd-muted);
|
|
132
133
|
flex-shrink: 0;
|
|
133
134
|
}
|
|
134
135
|
|
|
@@ -146,10 +147,36 @@
|
|
|
146
147
|
|
|
147
148
|
.config-panel__section-title {
|
|
148
149
|
margin: 0;
|
|
149
|
-
font-size:
|
|
150
|
+
font-size: var(--fd-text-xs);
|
|
150
151
|
font-weight: 600;
|
|
151
|
-
color:
|
|
152
|
+
color: var(--fd-muted-foreground);
|
|
152
153
|
text-transform: uppercase;
|
|
153
154
|
letter-spacing: 0.05em;
|
|
154
155
|
}
|
|
156
|
+
|
|
157
|
+
/* Compact Mode Styles */
|
|
158
|
+
.config-panel--compact .config-panel__header {
|
|
159
|
+
padding: 0.5rem 0.75rem;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.config-panel--compact .config-panel__title {
|
|
163
|
+
font-size: 0.875rem;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.config-panel--compact .config-panel__close {
|
|
167
|
+
font-size: 1rem;
|
|
168
|
+
padding: 0.125rem;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.config-panel--compact .config-panel__details {
|
|
172
|
+
padding: 0.5rem 0.75rem;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.config-panel--compact .config-panel__content {
|
|
176
|
+
padding: 0.75rem;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.config-panel--compact .config-panel__section {
|
|
180
|
+
gap: 0.5rem;
|
|
181
|
+
}
|
|
155
182
|
</style>
|
|
@@ -66,19 +66,20 @@
|
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* Get log level color
|
|
69
|
+
* Returns CSS variable references for theme consistency
|
|
69
70
|
*/
|
|
70
71
|
function getLogLevelColor(level: string): string {
|
|
71
72
|
switch (level) {
|
|
72
73
|
case 'error':
|
|
73
|
-
return '
|
|
74
|
+
return 'var(--fd-error)';
|
|
74
75
|
case 'warning':
|
|
75
|
-
return '
|
|
76
|
+
return 'var(--fd-warning)';
|
|
76
77
|
case 'success':
|
|
77
|
-
return '
|
|
78
|
+
return 'var(--fd-success)';
|
|
78
79
|
case 'info':
|
|
79
|
-
return '
|
|
80
|
+
return 'var(--fd-info)';
|
|
80
81
|
default:
|
|
81
|
-
return '
|
|
82
|
+
return 'var(--fd-muted-foreground)';
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
85
|
|
|
@@ -282,10 +283,10 @@
|
|
|
282
283
|
<style>
|
|
283
284
|
.logs-sidebar {
|
|
284
285
|
position: fixed;
|
|
285
|
-
top: var(--
|
|
286
|
+
top: var(--fd-navbar-height); /* Start below navbar */
|
|
286
287
|
right: 0;
|
|
287
288
|
width: 400px;
|
|
288
|
-
height: calc(100vh - var(--
|
|
289
|
+
height: calc(100vh - var(--fd-navbar-height)); /* Account for navbar height */
|
|
289
290
|
background-color: #ffffff;
|
|
290
291
|
border-left: 1px solid #e5e7eb;
|
|
291
292
|
box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);
|
|
@@ -388,31 +389,31 @@
|
|
|
388
389
|
}
|
|
389
390
|
|
|
390
391
|
.logs-sidebar__log-entry {
|
|
391
|
-
background-color:
|
|
392
|
-
border: 1px solid
|
|
393
|
-
border-radius:
|
|
392
|
+
background-color: var(--fd-muted);
|
|
393
|
+
border: 1px solid var(--fd-border);
|
|
394
|
+
border-radius: var(--fd-radius-lg);
|
|
394
395
|
padding: 0.75rem;
|
|
395
|
-
transition: all
|
|
396
|
+
transition: all var(--fd-transition-fast);
|
|
396
397
|
}
|
|
397
398
|
|
|
398
399
|
.logs-sidebar__log-entry--error {
|
|
399
|
-
border-left: 4px solid
|
|
400
|
-
background-color:
|
|
400
|
+
border-left: 4px solid var(--fd-error);
|
|
401
|
+
background-color: var(--fd-error-muted);
|
|
401
402
|
}
|
|
402
403
|
|
|
403
404
|
.logs-sidebar__log-entry--warning {
|
|
404
|
-
border-left: 4px solid
|
|
405
|
-
background-color:
|
|
405
|
+
border-left: 4px solid var(--fd-warning);
|
|
406
|
+
background-color: var(--fd-warning-muted);
|
|
406
407
|
}
|
|
407
408
|
|
|
408
409
|
.logs-sidebar__log-entry--success {
|
|
409
|
-
border-left: 4px solid
|
|
410
|
-
background-color:
|
|
410
|
+
border-left: 4px solid var(--fd-success);
|
|
411
|
+
background-color: var(--fd-success-muted);
|
|
411
412
|
}
|
|
412
413
|
|
|
413
414
|
.logs-sidebar__log-entry--info {
|
|
414
|
-
border-left: 4px solid
|
|
415
|
-
background-color:
|
|
415
|
+
border-left: 4px solid var(--fd-info);
|
|
416
|
+
background-color: var(--fd-info-muted);
|
|
416
417
|
}
|
|
417
418
|
|
|
418
419
|
.logs-sidebar__log-header {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
<script lang="ts">
|
|
10
10
|
import Icon from '@iconify/svelte';
|
|
11
11
|
import Logo from './Logo.svelte';
|
|
12
|
+
import SettingsModal from './SettingsModal.svelte';
|
|
12
13
|
|
|
13
14
|
interface NavbarAction {
|
|
14
15
|
label: string;
|
|
@@ -16,6 +17,8 @@
|
|
|
16
17
|
icon?: string;
|
|
17
18
|
variant?: 'primary' | 'secondary' | 'outline';
|
|
18
19
|
onclick?: (event: Event) => void;
|
|
20
|
+
/** If true, opens link in new tab with proper security attributes */
|
|
21
|
+
external?: boolean;
|
|
19
22
|
}
|
|
20
23
|
|
|
21
24
|
interface BreadcrumbItem {
|
|
@@ -25,17 +28,32 @@
|
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
interface Props {
|
|
31
|
+
/** Primary action buttons */
|
|
28
32
|
primaryActions?: NavbarAction[];
|
|
33
|
+
/** Show connection status indicator */
|
|
29
34
|
showStatus?: boolean;
|
|
35
|
+
/** Page title */
|
|
30
36
|
title?: string;
|
|
37
|
+
/** Breadcrumb navigation items */
|
|
31
38
|
breadcrumbs?: BreadcrumbItem[];
|
|
39
|
+
/** Show settings gear icon */
|
|
40
|
+
showSettings?: boolean;
|
|
32
41
|
}
|
|
33
42
|
|
|
34
|
-
let {
|
|
43
|
+
let {
|
|
44
|
+
primaryActions = [],
|
|
45
|
+
showStatus = true,
|
|
46
|
+
title,
|
|
47
|
+
breadcrumbs = [],
|
|
48
|
+
showSettings = true
|
|
49
|
+
}: Props = $props();
|
|
35
50
|
|
|
36
51
|
// Dropdown state
|
|
37
52
|
let isDropdownOpen = $state(false);
|
|
38
53
|
|
|
54
|
+
// Settings modal state
|
|
55
|
+
let isSettingsOpen = $state(false);
|
|
56
|
+
|
|
39
57
|
// Close dropdown when clicking outside
|
|
40
58
|
function handleClickOutside(event: MouseEvent) {
|
|
41
59
|
const target = event.target as HTMLElement;
|
|
@@ -130,6 +148,8 @@
|
|
|
130
148
|
class="flowdrop-navbar__primary-action flowdrop-navbar__action--{primaryAction.variant ||
|
|
131
149
|
'primary'}"
|
|
132
150
|
onclick={primaryAction.onclick}
|
|
151
|
+
target={primaryAction.external ? '_blank' : undefined}
|
|
152
|
+
rel={primaryAction.external ? 'noopener noreferrer' : undefined}
|
|
133
153
|
>
|
|
134
154
|
{#if primaryAction.icon}
|
|
135
155
|
<span class="flowdrop-navbar__action-icon">
|
|
@@ -162,11 +182,16 @@
|
|
|
162
182
|
action.onclick?.(e);
|
|
163
183
|
isDropdownOpen = false;
|
|
164
184
|
}}
|
|
185
|
+
target={action.external ? '_blank' : undefined}
|
|
186
|
+
rel={action.external ? 'noopener noreferrer' : undefined}
|
|
165
187
|
>
|
|
166
188
|
{#if action.icon}
|
|
167
189
|
<Icon icon={action.icon} class="w-4 h-4" />
|
|
168
190
|
{/if}
|
|
169
191
|
<span>{action.label}</span>
|
|
192
|
+
{#if action.external}
|
|
193
|
+
<Icon icon="mdi:open-in-new" class="w-3 h-3" />
|
|
194
|
+
{/if}
|
|
170
195
|
</a>
|
|
171
196
|
{/each}
|
|
172
197
|
</div>
|
|
@@ -177,21 +202,35 @@
|
|
|
177
202
|
</div>
|
|
178
203
|
|
|
179
204
|
<div class="flowdrop-navbar__end">
|
|
180
|
-
|
|
205
|
+
{#if showSettings}
|
|
206
|
+
<button
|
|
207
|
+
class="flowdrop-navbar__settings-btn"
|
|
208
|
+
onclick={() => (isSettingsOpen = true)}
|
|
209
|
+
title="Settings"
|
|
210
|
+
aria-label="Open settings"
|
|
211
|
+
>
|
|
212
|
+
<Icon icon="mdi:cog" />
|
|
213
|
+
</button>
|
|
214
|
+
{/if}
|
|
181
215
|
</div>
|
|
182
216
|
</div>
|
|
183
217
|
|
|
218
|
+
<!-- Settings Modal -->
|
|
219
|
+
{#if showSettings}
|
|
220
|
+
<SettingsModal bind:open={isSettingsOpen} />
|
|
221
|
+
{/if}
|
|
222
|
+
|
|
184
223
|
<style>
|
|
185
224
|
.flowdrop-navbar {
|
|
186
|
-
height: var(--
|
|
225
|
+
height: var(--fd-navbar-height);
|
|
187
226
|
width: 100%;
|
|
188
227
|
max-width: 100%;
|
|
189
228
|
display: flex;
|
|
190
229
|
align-items: center;
|
|
191
230
|
justify-content: space-between;
|
|
192
231
|
padding: 0 1rem;
|
|
193
|
-
background-color:
|
|
194
|
-
border-bottom: 1px solid
|
|
232
|
+
background-color: var(--fd-background);
|
|
233
|
+
border-bottom: 1px solid var(--fd-border);
|
|
195
234
|
z-index: 10;
|
|
196
235
|
}
|
|
197
236
|
|
|
@@ -204,7 +243,7 @@
|
|
|
204
243
|
}
|
|
205
244
|
|
|
206
245
|
.flowdrop-logo--container {
|
|
207
|
-
color:
|
|
246
|
+
color: var(--fd-foreground);
|
|
208
247
|
}
|
|
209
248
|
|
|
210
249
|
.flowdrop-logo--header {
|
|
@@ -247,7 +286,7 @@
|
|
|
247
286
|
margin: 0;
|
|
248
287
|
font-size: 1rem;
|
|
249
288
|
font-weight: 600;
|
|
250
|
-
color:
|
|
289
|
+
color: var(--fd-foreground);
|
|
251
290
|
white-space: nowrap;
|
|
252
291
|
overflow: hidden;
|
|
253
292
|
text-overflow: ellipsis;
|
|
@@ -287,17 +326,17 @@
|
|
|
287
326
|
align-items: center;
|
|
288
327
|
gap: 0.25rem;
|
|
289
328
|
padding: 0.25rem 0.5rem;
|
|
290
|
-
border-radius:
|
|
329
|
+
border-radius: var(--fd-radius-md);
|
|
291
330
|
text-decoration: none;
|
|
292
|
-
color:
|
|
293
|
-
font-size:
|
|
331
|
+
color: var(--fd-muted-foreground);
|
|
332
|
+
font-size: var(--fd-text-sm);
|
|
294
333
|
font-weight: 500;
|
|
295
|
-
transition: all
|
|
334
|
+
transition: all var(--fd-transition-normal);
|
|
296
335
|
}
|
|
297
336
|
|
|
298
337
|
.flowdrop-navbar__breadcrumb-link:hover {
|
|
299
|
-
color:
|
|
300
|
-
background-color:
|
|
338
|
+
color: var(--fd-foreground);
|
|
339
|
+
background-color: var(--fd-muted);
|
|
301
340
|
}
|
|
302
341
|
|
|
303
342
|
.flowdrop-navbar__breadcrumb-current {
|
|
@@ -305,8 +344,8 @@
|
|
|
305
344
|
align-items: center;
|
|
306
345
|
gap: 0.25rem;
|
|
307
346
|
padding: 0.25rem 0.5rem;
|
|
308
|
-
color:
|
|
309
|
-
font-size:
|
|
347
|
+
color: var(--fd-foreground);
|
|
348
|
+
font-size: var(--fd-text-sm);
|
|
310
349
|
font-weight: 600;
|
|
311
350
|
}
|
|
312
351
|
|
|
@@ -323,7 +362,7 @@
|
|
|
323
362
|
.flowdrop-navbar__breadcrumb-separator {
|
|
324
363
|
display: flex;
|
|
325
364
|
align-items: center;
|
|
326
|
-
color:
|
|
365
|
+
color: var(--fd-muted-foreground);
|
|
327
366
|
}
|
|
328
367
|
|
|
329
368
|
.flowdrop-navbar__breadcrumb-chevron {
|
|
@@ -342,24 +381,24 @@
|
|
|
342
381
|
align-items: center;
|
|
343
382
|
gap: 0.375rem;
|
|
344
383
|
padding: 0.125rem 0.5rem;
|
|
345
|
-
background-color:
|
|
346
|
-
border: 1px solid
|
|
347
|
-
border-radius:
|
|
348
|
-
font-size:
|
|
384
|
+
background-color: var(--fd-success-muted);
|
|
385
|
+
border: 1px solid var(--fd-success);
|
|
386
|
+
border-radius: var(--fd-radius-md);
|
|
387
|
+
font-size: var(--fd-text-xs);
|
|
349
388
|
font-weight: 500;
|
|
350
389
|
}
|
|
351
390
|
|
|
352
391
|
.flowdrop-navbar__status-indicator {
|
|
353
392
|
width: 0.375rem;
|
|
354
393
|
height: 0.375rem;
|
|
355
|
-
background-color:
|
|
394
|
+
background-color: var(--fd-success);
|
|
356
395
|
border-radius: 50%;
|
|
357
396
|
animation: pulse 2s infinite;
|
|
358
397
|
}
|
|
359
398
|
|
|
360
399
|
.flowdrop-navbar__status-text {
|
|
361
|
-
color:
|
|
362
|
-
font-size:
|
|
400
|
+
color: var(--fd-success);
|
|
401
|
+
font-size: var(--fd-text-xs);
|
|
363
402
|
font-weight: 500;
|
|
364
403
|
}
|
|
365
404
|
|
|
@@ -387,21 +426,21 @@
|
|
|
387
426
|
gap: 0.5rem;
|
|
388
427
|
padding: 0.5rem 1rem;
|
|
389
428
|
text-decoration: none;
|
|
390
|
-
border: 1px solid
|
|
391
|
-
border-radius:
|
|
392
|
-
transition: all
|
|
429
|
+
border: 1px solid var(--fd-border-strong);
|
|
430
|
+
border-radius: var(--fd-radius-md) 0 0 var(--fd-radius-md);
|
|
431
|
+
transition: all var(--fd-transition-normal);
|
|
393
432
|
font-weight: 500;
|
|
394
|
-
font-size:
|
|
433
|
+
font-size: var(--fd-text-sm);
|
|
395
434
|
height: 2.5rem;
|
|
396
435
|
box-sizing: border-box;
|
|
397
|
-
background-color:
|
|
398
|
-
color:
|
|
436
|
+
background-color: var(--fd-background);
|
|
437
|
+
color: var(--fd-foreground);
|
|
399
438
|
border-right: none;
|
|
400
439
|
}
|
|
401
440
|
|
|
402
441
|
.flowdrop-navbar__primary-action:hover {
|
|
403
|
-
background-color:
|
|
404
|
-
color:
|
|
442
|
+
background-color: var(--fd-muted);
|
|
443
|
+
color: var(--fd-foreground);
|
|
405
444
|
}
|
|
406
445
|
|
|
407
446
|
.flowdrop-navbar__dropdown {
|
|
@@ -417,24 +456,24 @@
|
|
|
417
456
|
justify-content: center;
|
|
418
457
|
width: 2rem;
|
|
419
458
|
height: 2.5rem;
|
|
420
|
-
border: 1px solid
|
|
459
|
+
border: 1px solid var(--fd-border-strong);
|
|
421
460
|
border-left: none;
|
|
422
|
-
border-radius: 0
|
|
423
|
-
background-color:
|
|
424
|
-
color:
|
|
461
|
+
border-radius: 0 var(--fd-radius-md) var(--fd-radius-md) 0;
|
|
462
|
+
background-color: var(--fd-background);
|
|
463
|
+
color: var(--fd-foreground);
|
|
425
464
|
cursor: pointer;
|
|
426
|
-
transition: all
|
|
465
|
+
transition: all var(--fd-transition-normal);
|
|
427
466
|
box-sizing: border-box;
|
|
428
467
|
}
|
|
429
468
|
|
|
430
469
|
.flowdrop-navbar__dropdown-trigger:hover {
|
|
431
|
-
background-color:
|
|
432
|
-
color:
|
|
470
|
+
background-color: var(--fd-muted);
|
|
471
|
+
color: var(--fd-foreground);
|
|
433
472
|
}
|
|
434
473
|
|
|
435
474
|
.flowdrop-navbar__dropdown-trigger[aria-expanded='true'] {
|
|
436
|
-
background-color:
|
|
437
|
-
color:
|
|
475
|
+
background-color: var(--fd-subtle);
|
|
476
|
+
color: var(--fd-foreground);
|
|
438
477
|
}
|
|
439
478
|
|
|
440
479
|
.flowdrop-navbar__dropdown-menu {
|
|
@@ -444,12 +483,10 @@
|
|
|
444
483
|
z-index: 50;
|
|
445
484
|
margin-top: 0.25rem;
|
|
446
485
|
min-width: 12rem;
|
|
447
|
-
background-color:
|
|
448
|
-
border: 1px solid
|
|
449
|
-
border-radius:
|
|
450
|
-
box-shadow:
|
|
451
|
-
0 10px 15px -3px rgba(0, 0, 0, 0.1),
|
|
452
|
-
0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
|
486
|
+
background-color: var(--fd-card);
|
|
487
|
+
border: 1px solid var(--fd-border);
|
|
488
|
+
border-radius: var(--fd-radius-lg);
|
|
489
|
+
box-shadow: var(--fd-shadow-lg);
|
|
453
490
|
overflow: hidden;
|
|
454
491
|
}
|
|
455
492
|
|
|
@@ -459,18 +496,19 @@
|
|
|
459
496
|
gap: 0.75rem;
|
|
460
497
|
padding: 0.75rem 1rem;
|
|
461
498
|
text-decoration: none;
|
|
462
|
-
color:
|
|
463
|
-
font-size:
|
|
499
|
+
color: var(--fd-foreground);
|
|
500
|
+
font-size: var(--fd-text-sm);
|
|
464
501
|
font-weight: 500;
|
|
465
|
-
transition: background-color
|
|
502
|
+
transition: background-color var(--fd-transition-normal);
|
|
466
503
|
border: none;
|
|
467
504
|
width: 100%;
|
|
468
505
|
text-align: left;
|
|
506
|
+
background-color: transparent;
|
|
469
507
|
}
|
|
470
508
|
|
|
471
509
|
.flowdrop-navbar__dropdown-item:hover {
|
|
472
|
-
background-color:
|
|
473
|
-
color:
|
|
510
|
+
background-color: var(--fd-muted);
|
|
511
|
+
color: var(--fd-foreground);
|
|
474
512
|
}
|
|
475
513
|
|
|
476
514
|
.flowdrop-navbar__dropdown-item:first-child {
|
|
@@ -487,52 +525,52 @@
|
|
|
487
525
|
gap: 0.5rem;
|
|
488
526
|
padding: 0.5rem 1rem;
|
|
489
527
|
text-decoration: none;
|
|
490
|
-
border-radius:
|
|
491
|
-
transition: all
|
|
528
|
+
border-radius: var(--fd-radius-md);
|
|
529
|
+
transition: all var(--fd-transition-normal);
|
|
492
530
|
font-weight: 500;
|
|
493
|
-
font-size:
|
|
531
|
+
font-size: var(--fd-text-sm);
|
|
494
532
|
border: 1px solid transparent;
|
|
495
533
|
}
|
|
496
534
|
|
|
497
535
|
.flowdrop-navbar__action--primary {
|
|
498
|
-
background-color:
|
|
499
|
-
color:
|
|
500
|
-
border-color:
|
|
536
|
+
background-color: var(--fd-primary);
|
|
537
|
+
color: var(--fd-primary-foreground);
|
|
538
|
+
border-color: var(--fd-primary);
|
|
501
539
|
}
|
|
502
540
|
|
|
503
541
|
.flowdrop-navbar__action--primary:hover {
|
|
504
|
-
background-color:
|
|
505
|
-
border-color:
|
|
506
|
-
color:
|
|
542
|
+
background-color: var(--fd-primary-hover);
|
|
543
|
+
border-color: var(--fd-primary-hover);
|
|
544
|
+
color: var(--fd-primary-foreground);
|
|
507
545
|
}
|
|
508
546
|
|
|
509
547
|
.flowdrop-navbar__action--secondary {
|
|
510
|
-
background-color:
|
|
511
|
-
color:
|
|
512
|
-
border-color:
|
|
548
|
+
background-color: var(--fd-secondary);
|
|
549
|
+
color: var(--fd-secondary-foreground);
|
|
550
|
+
border-color: var(--fd-border-strong);
|
|
513
551
|
}
|
|
514
552
|
|
|
515
553
|
.flowdrop-navbar__action--secondary:hover {
|
|
516
|
-
background-color:
|
|
517
|
-
color:
|
|
554
|
+
background-color: var(--fd-secondary-hover);
|
|
555
|
+
color: var(--fd-foreground);
|
|
518
556
|
}
|
|
519
557
|
|
|
520
558
|
.flowdrop-navbar__action--outline {
|
|
521
559
|
background-color: transparent;
|
|
522
|
-
color:
|
|
523
|
-
border-color:
|
|
560
|
+
color: var(--fd-foreground);
|
|
561
|
+
border-color: var(--fd-border-strong);
|
|
524
562
|
}
|
|
525
563
|
|
|
526
564
|
.flowdrop-navbar__action--outline:hover {
|
|
527
|
-
background-color:
|
|
528
|
-
color:
|
|
529
|
-
border-color:
|
|
565
|
+
background-color: var(--fd-muted);
|
|
566
|
+
color: var(--fd-foreground);
|
|
567
|
+
border-color: var(--fd-muted-foreground);
|
|
530
568
|
}
|
|
531
569
|
|
|
532
570
|
.flowdrop-navbar__action--active {
|
|
533
|
-
background-color:
|
|
534
|
-
color:
|
|
535
|
-
border-color:
|
|
571
|
+
background-color: var(--fd-primary-muted);
|
|
572
|
+
color: var(--fd-primary);
|
|
573
|
+
border-color: var(--fd-primary);
|
|
536
574
|
}
|
|
537
575
|
|
|
538
576
|
.flowdrop-navbar__action-icon {
|
|
@@ -552,6 +590,38 @@
|
|
|
552
590
|
.flowdrop-navbar__end {
|
|
553
591
|
display: flex;
|
|
554
592
|
align-items: center;
|
|
593
|
+
gap: var(--fd-space-2);
|
|
594
|
+
margin-left: var(--fd-space-3);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
.flowdrop-navbar__settings-btn {
|
|
598
|
+
display: flex;
|
|
599
|
+
align-items: center;
|
|
600
|
+
justify-content: center;
|
|
601
|
+
width: 36px;
|
|
602
|
+
height: 36px;
|
|
603
|
+
border: 1px solid var(--fd-border);
|
|
604
|
+
border-radius: var(--fd-radius-md);
|
|
605
|
+
background-color: var(--fd-background);
|
|
606
|
+
color: var(--fd-muted-foreground);
|
|
607
|
+
font-size: 1.25rem;
|
|
608
|
+
cursor: pointer;
|
|
609
|
+
transition: all var(--fd-transition-fast);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
.flowdrop-navbar__settings-btn:hover {
|
|
613
|
+
background-color: var(--fd-muted);
|
|
614
|
+
color: var(--fd-foreground);
|
|
615
|
+
border-color: var(--fd-border-strong);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
.flowdrop-navbar__settings-btn:focus {
|
|
619
|
+
outline: none;
|
|
620
|
+
box-shadow: 0 0 0 2px var(--fd-ring);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
.flowdrop-navbar__settings-btn:active {
|
|
624
|
+
transform: scale(0.95);
|
|
555
625
|
}
|
|
556
626
|
|
|
557
627
|
.flowdrop-api-status {
|
|
@@ -559,19 +629,19 @@
|
|
|
559
629
|
align-items: center;
|
|
560
630
|
gap: 0.5rem;
|
|
561
631
|
padding: 0.25rem 0.5rem;
|
|
562
|
-
border-radius:
|
|
563
|
-
background-color:
|
|
632
|
+
border-radius: var(--fd-radius-md);
|
|
633
|
+
background-color: var(--fd-muted);
|
|
564
634
|
}
|
|
565
635
|
|
|
566
636
|
.flowdrop-api-status__indicator {
|
|
567
637
|
width: 0.5rem;
|
|
568
638
|
height: 0.5rem;
|
|
569
639
|
border-radius: 50%;
|
|
570
|
-
transition: background-color
|
|
640
|
+
transition: background-color var(--fd-transition-normal);
|
|
571
641
|
}
|
|
572
642
|
|
|
573
643
|
.flowdrop-api-status__indicator--connected {
|
|
574
|
-
background-color:
|
|
644
|
+
background-color: var(--fd-success);
|
|
575
645
|
}
|
|
576
646
|
|
|
577
647
|
/* Utility classes */
|
|
@@ -589,17 +659,17 @@
|
|
|
589
659
|
}
|
|
590
660
|
|
|
591
661
|
.flowdrop-text--tagline {
|
|
592
|
-
font-size:
|
|
662
|
+
font-size: var(--fd-text-xs);
|
|
593
663
|
line-height: 0.5rem;
|
|
594
664
|
}
|
|
595
665
|
|
|
596
666
|
.flowdrop-text--xs {
|
|
597
|
-
font-size:
|
|
667
|
+
font-size: var(--fd-text-xs);
|
|
598
668
|
line-height: 1rem;
|
|
599
669
|
}
|
|
600
670
|
|
|
601
671
|
.flowdrop-text--gray {
|
|
602
|
-
color:
|
|
672
|
+
color: var(--fd-muted-foreground);
|
|
603
673
|
}
|
|
604
674
|
|
|
605
675
|
.flowdrop-font--bold {
|
|
@@ -4,6 +4,8 @@ interface NavbarAction {
|
|
|
4
4
|
icon?: string;
|
|
5
5
|
variant?: 'primary' | 'secondary' | 'outline';
|
|
6
6
|
onclick?: (event: Event) => void;
|
|
7
|
+
/** If true, opens link in new tab with proper security attributes */
|
|
8
|
+
external?: boolean;
|
|
7
9
|
}
|
|
8
10
|
interface BreadcrumbItem {
|
|
9
11
|
label: string;
|
|
@@ -11,10 +13,16 @@ interface BreadcrumbItem {
|
|
|
11
13
|
icon?: string;
|
|
12
14
|
}
|
|
13
15
|
interface Props {
|
|
16
|
+
/** Primary action buttons */
|
|
14
17
|
primaryActions?: NavbarAction[];
|
|
18
|
+
/** Show connection status indicator */
|
|
15
19
|
showStatus?: boolean;
|
|
20
|
+
/** Page title */
|
|
16
21
|
title?: string;
|
|
22
|
+
/** Breadcrumb navigation items */
|
|
17
23
|
breadcrumbs?: BreadcrumbItem[];
|
|
24
|
+
/** Show settings gear icon */
|
|
25
|
+
showSettings?: boolean;
|
|
18
26
|
}
|
|
19
27
|
declare const Navbar: import("svelte").Component<Props, {}, "">;
|
|
20
28
|
type Navbar = ReturnType<typeof Navbar>;
|