@d34dman/flowdrop 0.0.1 → 0.0.2

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 (119) hide show
  1. package/README.md +307 -215
  2. package/dist/adapters/WorkflowAdapter.d.ts +1 -1
  3. package/dist/adapters/WorkflowAdapter.js +30 -30
  4. package/dist/api/client.d.ts +24 -1
  5. package/dist/api/client.js +55 -38
  6. package/dist/api/enhanced-client.d.ts +46 -0
  7. package/dist/api/enhanced-client.js +211 -0
  8. package/dist/clients/ApiClient.d.ts +19 -23
  9. package/dist/clients/ApiClient.js +36 -34
  10. package/dist/components/App.svelte +1299 -230
  11. package/dist/components/App.svelte.d.ts +21 -1
  12. package/dist/components/CanvasBanner.svelte +50 -44
  13. package/dist/components/CanvasBanner.svelte.d.ts +5 -19
  14. package/dist/components/ConfigForm.svelte +555 -0
  15. package/dist/components/ConfigForm.svelte.d.ts +32 -0
  16. package/dist/components/ConfigModal.svelte +261 -0
  17. package/dist/components/ConfigModal.svelte.d.ts +31 -0
  18. package/dist/components/ConfigSidebar.svelte +934 -0
  19. package/dist/components/ConfigSidebar.svelte.d.ts +51 -0
  20. package/dist/components/ConnectionLine.svelte +32 -0
  21. package/dist/components/ConnectionLine.svelte.d.ts +3 -0
  22. package/dist/components/GatewayNode.svelte +471 -0
  23. package/dist/components/GatewayNode.svelte.d.ts +15 -0
  24. package/dist/components/LoadingSpinner.svelte +23 -23
  25. package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
  26. package/dist/components/Logo.svelte +82 -0
  27. package/dist/components/Logo.svelte.d.ts +26 -0
  28. package/dist/components/LogsSidebar.svelte +565 -0
  29. package/dist/components/LogsSidebar.svelte.d.ts +34 -0
  30. package/dist/components/MarkdownDisplay.svelte +28 -0
  31. package/dist/components/MarkdownDisplay.svelte.d.ts +7 -0
  32. package/dist/components/Navbar.svelte +663 -0
  33. package/dist/components/Navbar.svelte.d.ts +21 -0
  34. package/dist/components/NodeSidebar.svelte +629 -488
  35. package/dist/components/NodeSidebar.svelte.d.ts +1 -2
  36. package/dist/components/NodeStatusOverlay.svelte +327 -0
  37. package/dist/components/NodeStatusOverlay.svelte.d.ts +11 -0
  38. package/dist/components/NotesNode.svelte +566 -0
  39. package/dist/components/NotesNode.svelte.d.ts +43 -0
  40. package/dist/components/PipelineStatus.svelte +331 -0
  41. package/dist/components/PipelineStatus.svelte.d.ts +18 -0
  42. package/dist/components/SimpleNode.svelte +447 -0
  43. package/dist/components/SimpleNode.svelte.d.ts +24 -0
  44. package/dist/components/SquareNode.svelte +346 -0
  45. package/dist/components/SquareNode.svelte.d.ts +24 -0
  46. package/dist/components/StatusIcon.svelte +112 -0
  47. package/dist/components/StatusIcon.svelte.d.ts +10 -0
  48. package/dist/components/StatusLabel.svelte +33 -0
  49. package/dist/components/StatusLabel.svelte.d.ts +7 -0
  50. package/dist/components/ToolNode.svelte +385 -0
  51. package/dist/components/ToolNode.svelte.d.ts +36 -0
  52. package/dist/components/UniversalNode.svelte +126 -0
  53. package/dist/components/UniversalNode.svelte.d.ts +15 -0
  54. package/dist/components/WorkflowEditor.svelte +871 -528
  55. package/dist/components/WorkflowEditor.svelte.d.ts +15 -5
  56. package/dist/components/WorkflowNode.svelte +428 -542
  57. package/dist/components/WorkflowNode.svelte.d.ts +7 -3
  58. package/dist/config/apiConfig.d.ts +33 -0
  59. package/dist/config/apiConfig.js +39 -0
  60. package/dist/config/defaultPortConfig.d.ts +6 -0
  61. package/dist/config/defaultPortConfig.js +192 -0
  62. package/dist/config/demo.d.ts +58 -0
  63. package/dist/config/demo.js +142 -0
  64. package/dist/config/endpoints.d.ts +106 -0
  65. package/dist/config/endpoints.js +128 -0
  66. package/dist/data/samples.d.ts +38 -4
  67. package/dist/data/samples.js +2789 -737
  68. package/dist/examples/adapter-usage.d.ts +4 -4
  69. package/dist/examples/adapter-usage.js +21 -26
  70. package/dist/examples/api-client-usage.d.ts +6 -6
  71. package/dist/examples/api-client-usage.js +55 -54
  72. package/dist/index.d.ts +23 -15
  73. package/dist/index.js +23 -15
  74. package/dist/mocks/app-environment.d.ts +8 -0
  75. package/dist/mocks/app-environment.js +16 -0
  76. package/dist/mocks/app-forms.d.ts +2 -0
  77. package/dist/mocks/app-forms.js +21 -0
  78. package/dist/mocks/app-navigation.d.ts +5 -0
  79. package/dist/mocks/app-navigation.js +34 -0
  80. package/dist/mocks/app-stores.d.ts +14 -0
  81. package/dist/mocks/app-stores.js +26 -0
  82. package/dist/services/api.d.ts +13 -3
  83. package/dist/services/api.js +91 -36
  84. package/dist/services/globalSave.d.ts +20 -0
  85. package/dist/services/globalSave.js +165 -0
  86. package/dist/services/nodeExecutionService.d.ts +63 -0
  87. package/dist/services/nodeExecutionService.js +261 -0
  88. package/dist/services/portConfigApi.d.ts +14 -0
  89. package/dist/services/portConfigApi.js +69 -0
  90. package/dist/services/toastService.d.ts +147 -0
  91. package/dist/services/toastService.js +235 -0
  92. package/dist/services/workflowStorage.d.ts +2 -2
  93. package/dist/services/workflowStorage.js +10 -10
  94. package/dist/stores/workflowStore.d.ts +53 -0
  95. package/dist/stores/workflowStore.js +264 -0
  96. package/dist/styles/base.css +896 -363
  97. package/dist/svelte-app.d.ts +52 -5
  98. package/dist/svelte-app.js +128 -6
  99. package/dist/types/config.d.ts +291 -0
  100. package/dist/types/config.js +4 -0
  101. package/dist/types/index.d.ts +231 -19
  102. package/dist/types/index.js +1 -1
  103. package/dist/utils/colors.d.ts +67 -33
  104. package/dist/utils/colors.js +183 -118
  105. package/dist/utils/config.d.ts +41 -0
  106. package/dist/utils/config.js +248 -0
  107. package/dist/utils/connections.d.ts +40 -3
  108. package/dist/utils/connections.js +115 -44
  109. package/dist/utils/icons.d.ts +1 -1
  110. package/dist/utils/icons.js +71 -70
  111. package/dist/utils/nodeStatus.d.ts +53 -0
  112. package/dist/utils/nodeStatus.js +183 -0
  113. package/dist/utils/nodeTypes.d.ts +57 -0
  114. package/dist/utils/nodeTypes.js +109 -0
  115. package/dist/utils/nodeWrapper.d.ts +39 -0
  116. package/dist/utils/nodeWrapper.js +62 -0
  117. package/package.json +129 -97
  118. package/dist/components/Node.svelte +0 -38
  119. package/dist/components/Node.svelte.d.ts +0 -4
@@ -0,0 +1,28 @@
1
+ <!--
2
+ MarkdownDisplay Component
3
+ Reusable component for rendering markdown content with consistent styling
4
+ Supports all standard markdown elements with proper typography
5
+ -->
6
+
7
+ <script lang="ts">
8
+ import { marked } from 'marked';
9
+
10
+ interface Props {
11
+ content: string;
12
+ className?: string;
13
+ }
14
+
15
+ let props: Props = $props();
16
+
17
+ // Parse markdown content
18
+ let renderedContent = $derived(marked.parse(props.content || ''));
19
+
20
+ // Default class name if none provided
21
+ let displayClass = $derived(props.className || 'markdown-display');
22
+ </script>
23
+
24
+ <div class={displayClass}>
25
+ <!-- marked.js sanitizes content by default to prevent XSS attacks -->
26
+ <!-- eslint-disable-next-line svelte/no-at-html-tags -->
27
+ {@html renderedContent}
28
+ </div>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ content: string;
3
+ className?: string;
4
+ }
5
+ declare const MarkdownDisplay: import("svelte").Component<Props, {}, "">;
6
+ type MarkdownDisplay = ReturnType<typeof MarkdownDisplay>;
7
+ export default MarkdownDisplay;
@@ -0,0 +1,663 @@
1
+ <!--
2
+ FlowDrop Navbar Component
3
+ Reusable navigation bar with customizable primary actions
4
+ - Logo and branding on the left
5
+ - Primary actions in the center
6
+ - Status indicator on the right
7
+ -->
8
+
9
+ <script lang="ts">
10
+ import Icon from '@iconify/svelte';
11
+ import Logo from './Logo.svelte';
12
+
13
+ interface NavbarAction {
14
+ label: string;
15
+ href: string;
16
+ icon?: string;
17
+ variant?: 'primary' | 'secondary' | 'outline';
18
+ onclick?: (event: Event) => void;
19
+ }
20
+
21
+ interface BreadcrumbItem {
22
+ label: string;
23
+ href?: string;
24
+ icon?: string;
25
+ }
26
+
27
+ interface Props {
28
+ primaryActions?: NavbarAction[];
29
+ showStatus?: boolean;
30
+ title?: string;
31
+ breadcrumbs?: BreadcrumbItem[];
32
+ }
33
+
34
+ let { primaryActions = [], showStatus = true, title, breadcrumbs = [] }: Props = $props();
35
+
36
+ // Simple current path tracking without SvelteKit dependency
37
+ let currentPath = $state(typeof window !== 'undefined' ? window.location.pathname : '/');
38
+
39
+ // Dropdown state
40
+ let isDropdownOpen = $state(false);
41
+
42
+ function isActive(href: string): boolean {
43
+ if (href === '/') {
44
+ return currentPath === '/';
45
+ }
46
+ return currentPath.startsWith(href);
47
+ }
48
+
49
+ // Close dropdown when clicking outside
50
+ function handleClickOutside(event: MouseEvent) {
51
+ const target = event.target as HTMLElement;
52
+ if (!target.closest('.flowdrop-navbar__dropdown')) {
53
+ isDropdownOpen = false;
54
+ }
55
+ }
56
+
57
+ // Add event listener for click outside
58
+ if (typeof window !== 'undefined') {
59
+ document.addEventListener('click', handleClickOutside);
60
+ }
61
+ </script>
62
+
63
+ <div class="flowdrop-navbar">
64
+ <div class="flowdrop-navbar__start">
65
+ <!-- Logo and Title -->
66
+ <div class="flowdrop-logo--container">
67
+ <div class="flowdrop-flex flowdrop-gap--3">
68
+ <div class="flowdrop-logo--header">
69
+ <Logo />
70
+ </div>
71
+ <div>
72
+ <h1 class="flowdrop-text--logo flowdrop-font--bold">FlowDrop</h1>
73
+ <p class="flowdrop-text--tagline flowdrop-text--gray">Visual Workflow Manager</p>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+
79
+ <div class="flowdrop-navbar__center">
80
+ <div class="flowdrop-navbar__center-content">
81
+ <!-- Status Indicator on top -->
82
+ {#if showStatus}
83
+ <div class="flowdrop-navbar__status-container">
84
+ <div class="flowdrop-navbar__status">
85
+ <div class="flowdrop-navbar__status-indicator"></div>
86
+ <span class="flowdrop-navbar__status-text">Connected</span>
87
+ </div>
88
+ </div>
89
+ {/if}
90
+
91
+ <!-- Title or Breadcrumbs on bottom -->
92
+ {#if breadcrumbs.length > 0}
93
+ <div class="flowdrop-navbar__breadcrumb-container">
94
+ <nav class="flowdrop-navbar__breadcrumb" aria-label="Breadcrumb">
95
+ <ol class="flowdrop-navbar__breadcrumb-list">
96
+ {#each breadcrumbs as breadcrumb, index}
97
+ <li class="flowdrop-navbar__breadcrumb-item">
98
+ {#if breadcrumb.href && index < breadcrumbs.length - 1}
99
+ <a href={breadcrumb.href} class="flowdrop-navbar__breadcrumb-link">
100
+ {#if breadcrumb.icon}
101
+ <Icon icon={breadcrumb.icon} class="flowdrop-navbar__breadcrumb-icon" />
102
+ {/if}
103
+ <span class="flowdrop-navbar__breadcrumb-text">{breadcrumb.label}</span>
104
+ </a>
105
+ {:else}
106
+ <span class="flowdrop-navbar__breadcrumb-current">
107
+ {#if breadcrumb.icon}
108
+ <Icon icon={breadcrumb.icon} class="flowdrop-navbar__breadcrumb-icon" />
109
+ {/if}
110
+ <span class="flowdrop-navbar__breadcrumb-text">{breadcrumb.label}</span>
111
+ </span>
112
+ {/if}
113
+ </li>
114
+ {#if index < breadcrumbs.length - 1}
115
+ <li class="flowdrop-navbar__breadcrumb-separator">
116
+ <Icon icon="mdi:chevron-right" class="flowdrop-navbar__breadcrumb-chevron" />
117
+ </li>
118
+ {/if}
119
+ {/each}
120
+ </ol>
121
+ </nav>
122
+ </div>
123
+ {:else if title}
124
+ <div class="flowdrop-navbar__title-container">
125
+ <div class="flowdrop-navbar__title">
126
+ <h2 class="flowdrop-navbar__title-text">{title}</h2>
127
+ </div>
128
+ </div>
129
+ {/if}
130
+ </div>
131
+ </div>
132
+
133
+ <div class="flowdrop-navbar__actions">
134
+ {#if primaryActions.length > 0}
135
+ <!-- Primary Action Button -->
136
+ {#if primaryActions[0]}
137
+ {@const primaryAction = primaryActions[0]}
138
+ <a
139
+ href={primaryAction.href}
140
+ class="flowdrop-navbar__primary-action flowdrop-navbar__action--{primaryAction.variant ||
141
+ 'primary'}"
142
+ onclick={primaryAction.onclick}
143
+ >
144
+ {#if primaryAction.icon}
145
+ <span class="flowdrop-navbar__action-icon">
146
+ <Icon icon={primaryAction.icon} class="w-4 h-4" />
147
+ </span>
148
+ {/if}
149
+ <span class="flowdrop-navbar__action-label">{primaryAction.label}</span>
150
+ </a>
151
+ {/if}
152
+
153
+ <!-- Dropdown for Additional Actions -->
154
+ {#if primaryActions.length > 1}
155
+ <div class="flowdrop-navbar__dropdown">
156
+ <button
157
+ class="flowdrop-navbar__dropdown-trigger"
158
+ onclick={() => (isDropdownOpen = !isDropdownOpen)}
159
+ aria-expanded={isDropdownOpen}
160
+ aria-haspopup="true"
161
+ >
162
+ <Icon icon="heroicons:chevron-down" class="w-4 h-4" />
163
+ </button>
164
+
165
+ {#if isDropdownOpen}
166
+ <div class="flowdrop-navbar__dropdown-menu">
167
+ {#each primaryActions.slice(1) as action (action.label)}
168
+ <a
169
+ href={action.href}
170
+ class="flowdrop-navbar__dropdown-item"
171
+ onclick={(e) => {
172
+ action.onclick?.(e);
173
+ isDropdownOpen = false;
174
+ }}
175
+ >
176
+ {#if action.icon}
177
+ <Icon icon={action.icon} class="w-4 h-4" />
178
+ {/if}
179
+ <span>{action.label}</span>
180
+ </a>
181
+ {/each}
182
+ </div>
183
+ {/if}
184
+ </div>
185
+ {/if}
186
+ {/if}
187
+ </div>
188
+
189
+ <div class="flowdrop-navbar__end">
190
+ <!-- Additional actions or content can go here -->
191
+ </div>
192
+ </div>
193
+
194
+ <style>
195
+ .flowdrop-navbar {
196
+ height: var(--flowdrop-navbar-height, 60px);
197
+ display: flex;
198
+ align-items: center;
199
+ justify-content: space-between;
200
+ padding: 0 1rem;
201
+ background-color: #ffffff;
202
+ border-bottom: 1px solid #e5e7eb;
203
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
204
+ z-index: 10;
205
+ }
206
+
207
+ .flowdrop-navbar__start {
208
+ display: flex;
209
+ align-items: center;
210
+ width: 320px;
211
+ min-width: 320px;
212
+ flex-shrink: 0;
213
+ }
214
+
215
+ .flowdrop-logo--container {
216
+ color: #000;
217
+ }
218
+
219
+ .flowdrop-logo--header {
220
+ width: 40px;
221
+ height: 40px;
222
+ font-size: 1.25rem;
223
+ padding: 2px;
224
+ }
225
+
226
+ .flowdrop-navbar__center {
227
+ flex: 1;
228
+ display: flex;
229
+ justify-content: flex-start;
230
+ align-items: center;
231
+ padding-left: 1rem;
232
+ }
233
+
234
+ .flowdrop-navbar__center-content {
235
+ display: flex;
236
+ flex-direction: column;
237
+ align-items: flex-start;
238
+ justify-content: center;
239
+ gap: 0.25rem;
240
+ }
241
+
242
+ .flowdrop-navbar__title-container {
243
+ display: flex;
244
+ justify-content: flex-start;
245
+ align-items: center;
246
+ }
247
+
248
+ .flowdrop-navbar__title {
249
+ display: flex;
250
+ flex-direction: column;
251
+ align-items: flex-start;
252
+ justify-content: center;
253
+ }
254
+
255
+ .flowdrop-navbar__title-text {
256
+ margin: 0;
257
+ font-size: 1rem;
258
+ font-weight: 600;
259
+ color: #111827;
260
+ white-space: nowrap;
261
+ overflow: hidden;
262
+ text-overflow: ellipsis;
263
+ max-width: 500px;
264
+ text-align: left;
265
+ line-height: 1.2;
266
+ }
267
+
268
+ /* Breadcrumb Styles */
269
+ .flowdrop-navbar__breadcrumb-container {
270
+ display: flex;
271
+ justify-content: flex-start;
272
+ align-items: center;
273
+ }
274
+
275
+ .flowdrop-navbar__breadcrumb {
276
+ display: flex;
277
+ align-items: center;
278
+ }
279
+
280
+ .flowdrop-navbar__breadcrumb-list {
281
+ display: flex;
282
+ align-items: center;
283
+ list-style: none;
284
+ margin: 0;
285
+ padding: 0;
286
+ gap: 0.25rem;
287
+ }
288
+
289
+ .flowdrop-navbar__breadcrumb-item {
290
+ display: flex;
291
+ align-items: center;
292
+ }
293
+
294
+ .flowdrop-navbar__breadcrumb-link {
295
+ display: flex;
296
+ align-items: center;
297
+ gap: 0.25rem;
298
+ padding: 0.25rem 0.5rem;
299
+ border-radius: 0.375rem;
300
+ text-decoration: none;
301
+ color: #6b7280;
302
+ font-size: 0.875rem;
303
+ font-weight: 500;
304
+ transition: all 0.2s ease;
305
+ }
306
+
307
+ .flowdrop-navbar__breadcrumb-link:hover {
308
+ color: #111827;
309
+ background-color: #f3f4f6;
310
+ }
311
+
312
+ .flowdrop-navbar__breadcrumb-current {
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 0.25rem;
316
+ padding: 0.25rem 0.5rem;
317
+ color: #111827;
318
+ font-size: 0.875rem;
319
+ font-weight: 600;
320
+ }
321
+
322
+ .flowdrop-navbar__breadcrumb-icon {
323
+ width: 1rem;
324
+ height: 1rem;
325
+ flex-shrink: 0;
326
+ }
327
+
328
+ .flowdrop-navbar__breadcrumb-text {
329
+ white-space: nowrap;
330
+ }
331
+
332
+ .flowdrop-navbar__breadcrumb-separator {
333
+ display: flex;
334
+ align-items: center;
335
+ color: #9ca3af;
336
+ }
337
+
338
+ .flowdrop-navbar__breadcrumb-chevron {
339
+ width: 0.875rem;
340
+ height: 0.875rem;
341
+ }
342
+
343
+ .flowdrop-navbar__status-container {
344
+ display: flex;
345
+ justify-content: flex-start;
346
+ align-items: center;
347
+ }
348
+
349
+ .flowdrop-navbar__status {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 0.375rem;
353
+ padding: 0.125rem 0.5rem;
354
+ background-color: #f0fdf4;
355
+ border: 1px solid #bbf7d0;
356
+ border-radius: 0.375rem;
357
+ font-size: 0.75rem;
358
+ font-weight: 500;
359
+ }
360
+
361
+ .flowdrop-navbar__status-indicator {
362
+ width: 0.375rem;
363
+ height: 0.375rem;
364
+ background-color: #22c55e;
365
+ border-radius: 50%;
366
+ animation: pulse 2s infinite;
367
+ }
368
+
369
+ .flowdrop-navbar__status-text {
370
+ color: #166534;
371
+ font-size: 0.75rem;
372
+ font-weight: 500;
373
+ }
374
+
375
+ @keyframes pulse {
376
+ 0%,
377
+ 100% {
378
+ opacity: 1;
379
+ }
380
+ 50% {
381
+ opacity: 0.5;
382
+ }
383
+ }
384
+
385
+ .flowdrop-navbar__actions {
386
+ display: flex;
387
+ align-items: center;
388
+ gap: 0;
389
+ margin-left: auto;
390
+ position: relative;
391
+ }
392
+
393
+ .flowdrop-navbar__primary-action {
394
+ display: flex;
395
+ align-items: center;
396
+ gap: 0.5rem;
397
+ padding: 0.5rem 1rem;
398
+ text-decoration: none;
399
+ border: 1px solid #d1d5db;
400
+ border-radius: 0.375rem 0 0 0.375rem;
401
+ transition: all 0.2s ease-in-out;
402
+ font-weight: 500;
403
+ font-size: 0.875rem;
404
+ height: 2.5rem;
405
+ box-sizing: border-box;
406
+ background-color: #ffffff;
407
+ color: #374151;
408
+ border-right: none;
409
+ }
410
+
411
+ .flowdrop-navbar__primary-action:hover {
412
+ background-color: #f9fafb;
413
+ color: #111827;
414
+ }
415
+
416
+ .flowdrop-navbar__dropdown {
417
+ position: relative;
418
+ display: flex;
419
+ align-items: center;
420
+ height: 2.5rem;
421
+ }
422
+
423
+ .flowdrop-navbar__dropdown-trigger {
424
+ display: flex;
425
+ align-items: center;
426
+ justify-content: center;
427
+ width: 2rem;
428
+ height: 2.5rem;
429
+ border: 1px solid #d1d5db;
430
+ border-left: none;
431
+ border-radius: 0 0.375rem 0.375rem 0;
432
+ background-color: #ffffff;
433
+ color: #374151;
434
+ cursor: pointer;
435
+ transition: all 0.2s ease-in-out;
436
+ box-sizing: border-box;
437
+ }
438
+
439
+ .flowdrop-navbar__dropdown-trigger:hover {
440
+ background-color: #f9fafb;
441
+ color: #111827;
442
+ }
443
+
444
+ .flowdrop-navbar__dropdown-trigger[aria-expanded='true'] {
445
+ background-color: #f3f4f6;
446
+ color: #111827;
447
+ }
448
+
449
+ .flowdrop-navbar__dropdown-menu {
450
+ position: absolute;
451
+ top: 100%;
452
+ right: 0;
453
+ z-index: 50;
454
+ margin-top: 0.25rem;
455
+ min-width: 12rem;
456
+ background-color: #ffffff;
457
+ border: 1px solid #e5e7eb;
458
+ border-radius: 0.5rem;
459
+ box-shadow:
460
+ 0 10px 15px -3px rgba(0, 0, 0, 0.1),
461
+ 0 4px 6px -2px rgba(0, 0, 0, 0.05);
462
+ overflow: hidden;
463
+ }
464
+
465
+ .flowdrop-navbar__dropdown-item {
466
+ display: flex;
467
+ align-items: center;
468
+ gap: 0.75rem;
469
+ padding: 0.75rem 1rem;
470
+ text-decoration: none;
471
+ color: #374151;
472
+ font-size: 0.875rem;
473
+ font-weight: 500;
474
+ transition: background-color 0.2s ease-in-out;
475
+ border: none;
476
+ width: 100%;
477
+ text-align: left;
478
+ }
479
+
480
+ .flowdrop-navbar__dropdown-item:hover {
481
+ background-color: #f9fafb;
482
+ color: #111827;
483
+ }
484
+
485
+ .flowdrop-navbar__dropdown-item:first-child {
486
+ border-top: none;
487
+ }
488
+
489
+ .flowdrop-navbar__dropdown-item:last-child {
490
+ border-bottom: none;
491
+ }
492
+
493
+ .flowdrop-navbar__action {
494
+ display: flex;
495
+ align-items: center;
496
+ gap: 0.5rem;
497
+ padding: 0.5rem 1rem;
498
+ text-decoration: none;
499
+ border-radius: 0.375rem;
500
+ transition: all 0.2s ease-in-out;
501
+ font-weight: 500;
502
+ font-size: 0.875rem;
503
+ border: 1px solid transparent;
504
+ }
505
+
506
+ .flowdrop-navbar__action--primary {
507
+ background-color: #3b82f6;
508
+ color: #ffffff;
509
+ border-color: #3b82f6;
510
+ }
511
+
512
+ .flowdrop-navbar__action--primary:hover {
513
+ background-color: #2563eb;
514
+ border-color: #2563eb;
515
+ color: #ffffff;
516
+ }
517
+
518
+ .flowdrop-navbar__action--secondary {
519
+ background-color: #f3f4f6;
520
+ color: #374151;
521
+ border-color: #d1d5db;
522
+ }
523
+
524
+ .flowdrop-navbar__action--secondary:hover {
525
+ background-color: #e5e7eb;
526
+ color: #111827;
527
+ }
528
+
529
+ .flowdrop-navbar__action--outline {
530
+ background-color: transparent;
531
+ color: #374151;
532
+ border-color: #d1d5db;
533
+ }
534
+
535
+ .flowdrop-navbar__action--outline:hover {
536
+ background-color: #f9fafb;
537
+ color: #111827;
538
+ border-color: #9ca3af;
539
+ }
540
+
541
+ .flowdrop-navbar__action--active {
542
+ background-color: #eff6ff;
543
+ color: #1d4ed8;
544
+ border-color: #93c5fd;
545
+ }
546
+
547
+ .flowdrop-navbar__action-icon {
548
+ display: flex;
549
+ align-items: center;
550
+ }
551
+
552
+ .flowdrop-navbar__action-icon :global(svg) {
553
+ width: 1rem;
554
+ height: 1rem;
555
+ }
556
+
557
+ .flowdrop-navbar__action-label {
558
+ font-weight: 500;
559
+ }
560
+
561
+ .flowdrop-navbar__end {
562
+ display: flex;
563
+ align-items: center;
564
+ }
565
+
566
+ .flowdrop-api-status {
567
+ display: flex;
568
+ align-items: center;
569
+ gap: 0.5rem;
570
+ padding: 0.25rem 0.5rem;
571
+ border-radius: 0.375rem;
572
+ background-color: #f3f4f6;
573
+ }
574
+
575
+ .flowdrop-api-status__indicator {
576
+ width: 0.5rem;
577
+ height: 0.5rem;
578
+ border-radius: 50%;
579
+ transition: background-color 0.2s ease-in-out;
580
+ }
581
+
582
+ .flowdrop-api-status__indicator--connected {
583
+ background-color: #10b981;
584
+ }
585
+
586
+ /* Utility classes */
587
+ .flowdrop-flex {
588
+ display: flex;
589
+ }
590
+
591
+ .flowdrop-gap--3 {
592
+ gap: 0.75rem;
593
+ }
594
+
595
+ .flowdrop-text--logo {
596
+ font-size: 1.125rem;
597
+ line-height: 0;
598
+ }
599
+
600
+ .flowdrop-text--tagline {
601
+ font-size: 0.75rem;
602
+ line-height: 0.5rem;
603
+ }
604
+
605
+ .flowdrop-text--xs {
606
+ font-size: 0.75rem;
607
+ line-height: 1rem;
608
+ }
609
+
610
+ .flowdrop-text--gray {
611
+ color: #6b7280;
612
+ }
613
+
614
+ .flowdrop-font--bold {
615
+ font-weight: 700;
616
+ }
617
+
618
+ /* Responsive design */
619
+ @media (max-width: 768px) {
620
+ .flowdrop-navbar {
621
+ padding: 0 0.5rem;
622
+ }
623
+
624
+ .flowdrop-navbar__start {
625
+ width: 280px;
626
+ min-width: 280px;
627
+ }
628
+
629
+ .flowdrop-navbar__actions {
630
+ display: none;
631
+ }
632
+
633
+ .flowdrop-text--logo {
634
+ font-size: 1rem;
635
+ }
636
+
637
+ .flowdrop-text--tagline {
638
+ display: none;
639
+ }
640
+
641
+ .flowdrop-navbar__title-text {
642
+ font-size: 0.875rem;
643
+ max-width: 300px;
644
+ }
645
+
646
+ .flowdrop-navbar__status {
647
+ font-size: 0.625rem;
648
+ padding: 0.125rem 0.375rem;
649
+ }
650
+ }
651
+
652
+ @media (max-width: 480px) {
653
+ .flowdrop-navbar__start {
654
+ width: 240px;
655
+ min-width: 240px;
656
+ }
657
+
658
+ .flowdrop-navbar__title-text {
659
+ font-size: 0.75rem;
660
+ max-width: 200px;
661
+ }
662
+ }
663
+ </style>
@@ -0,0 +1,21 @@
1
+ interface NavbarAction {
2
+ label: string;
3
+ href: string;
4
+ icon?: string;
5
+ variant?: 'primary' | 'secondary' | 'outline';
6
+ onclick?: (event: Event) => void;
7
+ }
8
+ interface BreadcrumbItem {
9
+ label: string;
10
+ href?: string;
11
+ icon?: string;
12
+ }
13
+ interface Props {
14
+ primaryActions?: NavbarAction[];
15
+ showStatus?: boolean;
16
+ title?: string;
17
+ breadcrumbs?: BreadcrumbItem[];
18
+ }
19
+ declare const Navbar: import("svelte").Component<Props, {}, "">;
20
+ type Navbar = ReturnType<typeof Navbar>;
21
+ export default Navbar;