@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.
Files changed (97) hide show
  1. package/README.md +8 -8
  2. package/dist/api/enhanced-client.d.ts +3 -1
  3. package/dist/api/enhanced-client.js +35 -5
  4. package/dist/components/App.svelte +68 -34
  5. package/dist/components/ConfigForm.svelte +169 -142
  6. package/dist/components/ConfigForm.svelte.d.ts +4 -2
  7. package/dist/components/ConfigPanel.svelte +42 -15
  8. package/dist/components/LogsSidebar.svelte +20 -19
  9. package/dist/components/Navbar.svelte +150 -80
  10. package/dist/components/Navbar.svelte.d.ts +8 -0
  11. package/dist/components/NodeSidebar.svelte +334 -217
  12. package/dist/components/PipelineStatus.svelte +6 -1
  13. package/dist/components/ReadOnlyDetails.svelte +14 -14
  14. package/dist/components/SchemaForm.svelte +49 -30
  15. package/dist/components/SchemaForm.svelte.d.ts +11 -1
  16. package/dist/components/SettingsModal.svelte +279 -0
  17. package/dist/components/SettingsModal.svelte.d.ts +23 -0
  18. package/dist/components/SettingsPanel.svelte +615 -0
  19. package/dist/components/SettingsPanel.svelte.d.ts +21 -0
  20. package/dist/components/ThemeToggle.svelte +186 -0
  21. package/dist/components/ThemeToggle.svelte.d.ts +14 -0
  22. package/dist/components/WorkflowEditor.svelte +114 -38
  23. package/dist/components/form/FormArray.svelte +81 -81
  24. package/dist/components/form/FormAutocomplete.svelte +1014 -0
  25. package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
  26. package/dist/components/form/FormCheckboxGroup.svelte +16 -16
  27. package/dist/components/form/FormCodeEditor.svelte +26 -26
  28. package/dist/components/form/FormField.svelte +52 -21
  29. package/dist/components/form/FormFieldLight.svelte +19 -19
  30. package/dist/components/form/FormFieldWrapper.svelte +4 -4
  31. package/dist/components/form/FormMarkdownEditor.svelte +124 -57
  32. package/dist/components/form/FormNumberField.svelte +13 -13
  33. package/dist/components/form/FormRangeField.svelte +16 -16
  34. package/dist/components/form/FormSelect.svelte +15 -15
  35. package/dist/components/form/FormTemplateEditor.svelte +34 -34
  36. package/dist/components/form/FormTextField.svelte +13 -13
  37. package/dist/components/form/FormTextarea.svelte +13 -13
  38. package/dist/components/form/FormToggle.svelte +8 -8
  39. package/dist/components/form/index.d.ts +1 -0
  40. package/dist/components/form/index.js +1 -0
  41. package/dist/components/form/types.d.ts +133 -8
  42. package/dist/components/form/types.js +50 -1
  43. package/dist/components/interrupt/ChoicePrompt.svelte +45 -38
  44. package/dist/components/interrupt/ConfirmationPrompt.svelte +35 -35
  45. package/dist/components/interrupt/FormPrompt.svelte +27 -20
  46. package/dist/components/interrupt/InterruptBubble.svelte +50 -50
  47. package/dist/components/interrupt/TextInputPrompt.svelte +39 -32
  48. package/dist/components/layouts/MainLayout.svelte +233 -34
  49. package/dist/components/layouts/MainLayout.svelte.d.ts +12 -0
  50. package/dist/components/nodes/GatewayNode.svelte +175 -125
  51. package/dist/components/nodes/IdeaNode.svelte +70 -84
  52. package/dist/components/nodes/NotesNode.svelte +124 -88
  53. package/dist/components/nodes/SimpleNode.svelte +91 -69
  54. package/dist/components/nodes/SquareNode.svelte +102 -75
  55. package/dist/components/nodes/TerminalNode.svelte +127 -113
  56. package/dist/components/nodes/ToolNode.svelte +125 -76
  57. package/dist/components/nodes/WorkflowNode.svelte +164 -108
  58. package/dist/components/playground/ChatPanel.svelte +76 -76
  59. package/dist/components/playground/ExecutionLogs.svelte +71 -69
  60. package/dist/components/playground/InputCollector.svelte +59 -59
  61. package/dist/components/playground/MessageBubble.svelte +111 -112
  62. package/dist/components/playground/Playground.svelte +184 -138
  63. package/dist/components/playground/PlaygroundModal.svelte +18 -19
  64. package/dist/components/playground/SessionManager.svelte +68 -67
  65. package/dist/config/defaultPortConfig.js +22 -22
  66. package/dist/core/index.d.ts +2 -0
  67. package/dist/core/index.js +1 -0
  68. package/dist/form/fieldRegistry.d.ts +17 -1
  69. package/dist/form/fieldRegistry.js +18 -2
  70. package/dist/form/index.d.ts +20 -2
  71. package/dist/form/index.js +19 -1
  72. package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
  73. package/dist/helpers/nodeLayoutHelper.js +19 -0
  74. package/dist/helpers/workflowEditorHelper.js +23 -11
  75. package/dist/index.d.ts +5 -0
  76. package/dist/index.js +13 -0
  77. package/dist/services/autoSaveService.d.ts +112 -0
  78. package/dist/services/autoSaveService.js +223 -0
  79. package/dist/services/settingsService.d.ts +92 -0
  80. package/dist/services/settingsService.js +202 -0
  81. package/dist/services/toastService.d.ts +9 -0
  82. package/dist/services/toastService.js +30 -1
  83. package/dist/stores/settingsStore.d.ts +128 -0
  84. package/dist/stores/settingsStore.js +488 -0
  85. package/dist/stores/themeStore.d.ts +68 -0
  86. package/dist/stores/themeStore.js +215 -0
  87. package/dist/styles/base.css +338 -621
  88. package/dist/styles/toast.css +33 -0
  89. package/dist/styles/tokens.css +402 -0
  90. package/dist/types/index.d.ts +78 -0
  91. package/dist/types/index.js +2 -0
  92. package/dist/types/playground.d.ts +12 -0
  93. package/dist/types/settings.d.ts +185 -0
  94. package/dist/types/settings.js +101 -0
  95. package/dist/utils/colors.d.ts +100 -7
  96. package/dist/utils/colors.js +228 -67
  97. 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: #ffffff;
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 #e5e7eb;
98
- background-color: #f9fafb;
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: #111827;
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: #6b7280;
116
+ color: var(--fd-muted-foreground);
116
117
  padding: 0.25rem;
117
- border-radius: 0.25rem;
118
+ border-radius: var(--fd-radius-sm);
118
119
  transition:
119
- color 0.15s,
120
- background-color 0.15s;
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: #374151;
125
- background-color: #f3f4f6;
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 #f3f4f6;
131
- background-color: #fafafa;
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: 0.75rem;
150
+ font-size: var(--fd-text-xs);
150
151
  font-weight: 600;
151
- color: #6b7280;
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 '#ef4444';
74
+ return 'var(--fd-error)';
74
75
  case 'warning':
75
- return '#f59e0b';
76
+ return 'var(--fd-warning)';
76
77
  case 'success':
77
- return '#10b981';
78
+ return 'var(--fd-success)';
78
79
  case 'info':
79
- return '#3b82f6';
80
+ return 'var(--fd-info)';
80
81
  default:
81
- return '#6b7280';
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(--flowdrop-navbar-height, 60px); /* Start below navbar */
286
+ top: var(--fd-navbar-height); /* Start below navbar */
286
287
  right: 0;
287
288
  width: 400px;
288
- height: calc(100vh - var(--flowdrop-navbar-height, 60px)); /* Account for navbar height */
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: #f9fafb;
392
- border: 1px solid #e5e7eb;
393
- border-radius: 0.5rem;
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 0.2s ease-in-out;
396
+ transition: all var(--fd-transition-fast);
396
397
  }
397
398
 
398
399
  .logs-sidebar__log-entry--error {
399
- border-left: 4px solid #ef4444;
400
- background-color: #fef2f2;
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 #f59e0b;
405
- background-color: #fffbeb;
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 #10b981;
410
- background-color: #f0fdf4;
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 #3b82f6;
415
- background-color: #eff6ff;
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 { primaryActions = [], showStatus = true, title, breadcrumbs = [] }: Props = $props();
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
- <!-- Additional actions or content can go here -->
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(--flowdrop-navbar-height, 60px);
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: #ffffff;
194
- border-bottom: 1px solid #e5e7eb;
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: #000;
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: #111827;
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: 0.375rem;
329
+ border-radius: var(--fd-radius-md);
291
330
  text-decoration: none;
292
- color: #6b7280;
293
- font-size: 0.875rem;
331
+ color: var(--fd-muted-foreground);
332
+ font-size: var(--fd-text-sm);
294
333
  font-weight: 500;
295
- transition: all 0.2s ease;
334
+ transition: all var(--fd-transition-normal);
296
335
  }
297
336
 
298
337
  .flowdrop-navbar__breadcrumb-link:hover {
299
- color: #111827;
300
- background-color: #f3f4f6;
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: #111827;
309
- font-size: 0.875rem;
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: #9ca3af;
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: #f0fdf4;
346
- border: 1px solid #bbf7d0;
347
- border-radius: 0.375rem;
348
- font-size: 0.75rem;
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: #22c55e;
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: #166534;
362
- font-size: 0.75rem;
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 #d1d5db;
391
- border-radius: 0.375rem 0 0 0.375rem;
392
- transition: all 0.2s ease-in-out;
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: 0.875rem;
433
+ font-size: var(--fd-text-sm);
395
434
  height: 2.5rem;
396
435
  box-sizing: border-box;
397
- background-color: #ffffff;
398
- color: #374151;
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: #f9fafb;
404
- color: #111827;
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 #d1d5db;
459
+ border: 1px solid var(--fd-border-strong);
421
460
  border-left: none;
422
- border-radius: 0 0.375rem 0.375rem 0;
423
- background-color: #ffffff;
424
- color: #374151;
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 0.2s ease-in-out;
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: #f9fafb;
432
- color: #111827;
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: #f3f4f6;
437
- color: #111827;
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: #ffffff;
448
- border: 1px solid #e5e7eb;
449
- border-radius: 0.5rem;
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: #374151;
463
- font-size: 0.875rem;
499
+ color: var(--fd-foreground);
500
+ font-size: var(--fd-text-sm);
464
501
  font-weight: 500;
465
- transition: background-color 0.2s ease-in-out;
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: #f9fafb;
473
- color: #111827;
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: 0.375rem;
491
- transition: all 0.2s ease-in-out;
528
+ border-radius: var(--fd-radius-md);
529
+ transition: all var(--fd-transition-normal);
492
530
  font-weight: 500;
493
- font-size: 0.875rem;
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: #3b82f6;
499
- color: #ffffff;
500
- border-color: #3b82f6;
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: #2563eb;
505
- border-color: #2563eb;
506
- color: #ffffff;
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: #f3f4f6;
511
- color: #374151;
512
- border-color: #d1d5db;
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: #e5e7eb;
517
- color: #111827;
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: #374151;
523
- border-color: #d1d5db;
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: #f9fafb;
528
- color: #111827;
529
- border-color: #9ca3af;
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: #eff6ff;
534
- color: #1d4ed8;
535
- border-color: #93c5fd;
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: 0.375rem;
563
- background-color: #f3f4f6;
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 0.2s ease-in-out;
640
+ transition: background-color var(--fd-transition-normal);
571
641
  }
572
642
 
573
643
  .flowdrop-api-status__indicator--connected {
574
- background-color: #10b981;
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: 0.75rem;
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: 0.75rem;
667
+ font-size: var(--fd-text-xs);
598
668
  line-height: 1rem;
599
669
  }
600
670
 
601
671
  .flowdrop-text--gray {
602
- color: #6b7280;
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>;