@flowdrop/flowdrop 2.0.0-beta.2 → 2.0.0-beta.4

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 (113) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/MIGRATION-2.0.md +13 -0
  3. package/README.md +5 -5
  4. package/dist/components/App.svelte +36 -191
  5. package/dist/components/App.svelte.d.ts +2 -7
  6. package/dist/components/Button.stories.svelte +65 -0
  7. package/dist/components/Button.stories.svelte.d.ts +19 -0
  8. package/dist/components/Button.svelte +62 -0
  9. package/dist/components/Button.svelte.d.ts +24 -0
  10. package/dist/components/CanvasIconButton.svelte +76 -0
  11. package/dist/components/CanvasIconButton.svelte.d.ts +18 -0
  12. package/dist/components/ConfigForm.svelte +4 -23
  13. package/dist/components/ConfigPanel.svelte +4 -3
  14. package/dist/components/EditorStatusBar.stories.svelte +44 -0
  15. package/dist/components/EditorStatusBar.stories.svelte.d.ts +27 -0
  16. package/dist/components/EditorStatusBar.svelte +99 -0
  17. package/dist/components/EditorStatusBar.svelte.d.ts +15 -0
  18. package/dist/components/IconButton.svelte +80 -0
  19. package/dist/components/IconButton.svelte.d.ts +30 -0
  20. package/dist/components/Input.svelte +74 -0
  21. package/dist/components/Input.svelte.d.ts +17 -0
  22. package/dist/components/LogoWordmark.svelte +113 -0
  23. package/dist/components/LogoWordmark.svelte.d.ts +26 -0
  24. package/dist/components/Navbar.svelte +17 -63
  25. package/dist/components/Navbar.svelte.d.ts +3 -0
  26. package/dist/components/NodeSidebar.svelte +17 -122
  27. package/dist/components/NodeSwapPicker.svelte +10 -28
  28. package/dist/components/PortMappingRow.svelte +0 -2
  29. package/dist/components/SchemaForm.svelte +0 -12
  30. package/dist/components/Select.svelte +53 -0
  31. package/dist/components/Select.svelte.d.ts +15 -0
  32. package/dist/components/SettingsModal.svelte +0 -5
  33. package/dist/components/SettingsPanel.svelte +2 -6
  34. package/dist/components/Textarea.svelte +39 -0
  35. package/dist/components/Textarea.svelte.d.ts +12 -0
  36. package/dist/components/ThemeToggle.svelte +15 -94
  37. package/dist/components/UniversalNode.svelte +32 -1
  38. package/dist/components/WorkflowEditor.svelte +62 -51
  39. package/dist/components/WorkflowEditor.svelte.d.ts +18 -0
  40. package/dist/components/chat/AIChatPanel.svelte +1 -1
  41. package/dist/components/console/ConsoleAutocomplete.svelte +1 -1
  42. package/dist/components/console/ConsoleOutput.svelte +2 -2
  43. package/dist/components/form/FormArray.svelte +37 -173
  44. package/dist/components/form/FormAutocomplete.svelte +10 -6
  45. package/dist/components/form/FormCheckboxGroup.svelte +1 -5
  46. package/dist/components/form/FormCodeEditor.svelte +9 -7
  47. package/dist/components/form/FormField.svelte +5 -44
  48. package/dist/components/form/FormFieldLight.svelte +8 -47
  49. package/dist/components/form/FormFieldset.svelte +1 -1
  50. package/dist/components/form/FormMarkdownEditor.svelte +8 -5
  51. package/dist/components/form/FormNumberField.svelte +4 -36
  52. package/dist/components/form/FormRangeField.svelte +18 -27
  53. package/dist/components/form/FormSelect.svelte +13 -75
  54. package/dist/components/form/FormTemplateEditor.svelte +6 -4
  55. package/dist/components/form/FormTextField.svelte +3 -35
  56. package/dist/components/form/FormTextarea.svelte +4 -39
  57. package/dist/components/form/FormToggle.svelte +0 -4
  58. package/dist/components/form/resolveFieldType.d.ts +24 -0
  59. package/dist/components/form/resolveFieldType.js +55 -0
  60. package/dist/components/icons/CloseIcon.svelte +6 -0
  61. package/dist/components/icons/CloseIcon.svelte.d.ts +26 -0
  62. package/dist/components/icons/CommandLineIcon.svelte +15 -0
  63. package/dist/components/icons/CommandLineIcon.svelte.d.ts +26 -0
  64. package/dist/components/icons/MenuIcon.svelte +4 -0
  65. package/dist/components/icons/MenuIcon.svelte.d.ts +26 -0
  66. package/dist/components/icons/MenuOpenIcon.svelte +6 -0
  67. package/dist/components/icons/MenuOpenIcon.svelte.d.ts +26 -0
  68. package/dist/components/interrupt/ChoicePrompt.svelte +0 -10
  69. package/dist/components/interrupt/ConfirmationPrompt.svelte +0 -5
  70. package/dist/components/interrupt/InterruptBubble.svelte +0 -10
  71. package/dist/components/interrupt/ReviewPrompt.svelte +0 -20
  72. package/dist/components/interrupt/TextInputPrompt.svelte +0 -6
  73. package/dist/components/layouts/MainLayout.svelte +4 -5
  74. package/dist/components/nodes/AtomNode.svelte +46 -34
  75. package/dist/components/nodes/GatewayNode.svelte +91 -99
  76. package/dist/components/nodes/IdeaNode.svelte +62 -90
  77. package/dist/components/nodes/NodeConfigButton.svelte +86 -0
  78. package/dist/components/nodes/NodeConfigButton.svelte.d.ts +15 -0
  79. package/dist/components/nodes/NotesNode.svelte +70 -81
  80. package/dist/components/nodes/SimpleNode.svelte +28 -78
  81. package/dist/components/nodes/SquareNode.svelte +79 -109
  82. package/dist/components/nodes/TerminalNode.svelte +28 -86
  83. package/dist/components/nodes/ToolNode.svelte +82 -95
  84. package/dist/components/nodes/WorkflowNode.svelte +91 -100
  85. package/dist/components/playground/ChatInput.svelte +0 -1
  86. package/dist/components/playground/InputCollector.svelte +11 -48
  87. package/dist/components/playground/PlaygroundApp.svelte +1 -1
  88. package/dist/components/playground/PlaygroundStudio.svelte +0 -5
  89. package/dist/messages/index.d.ts +1 -1
  90. package/dist/messages/index.js +1 -1
  91. package/dist/openapi/v1/openapi.yaml +2 -2
  92. package/dist/playground/mount.d.ts +9 -5
  93. package/dist/playground/mount.js +9 -5
  94. package/dist/skins/drafter.d.ts +30 -0
  95. package/dist/skins/drafter.js +198 -0
  96. package/dist/skins/index.d.ts +2 -1
  97. package/dist/skins/index.js +4 -2
  98. package/dist/styles/base.css +285 -14
  99. package/dist/styles/tokens.css +60 -2
  100. package/dist/svelte-app.d.ts +6 -0
  101. package/dist/svelte-app.js +71 -109
  102. package/dist/themes/drafter.d.ts +2 -0
  103. package/dist/themes/drafter.js +15 -0
  104. package/dist/themes/index.d.ts +2 -1
  105. package/dist/themes/index.js +8 -2
  106. package/dist/types/events.d.ts +18 -0
  107. package/dist/types/events.js +2 -1
  108. package/dist/types/settings.d.ts +1 -1
  109. package/dist/types/settings.js +1 -1
  110. package/dist/types/skin.d.ts +1 -1
  111. package/dist/types/theme.d.ts +16 -2
  112. package/dist/utils/connections.js +14 -50
  113. package/package.json +1 -1
@@ -0,0 +1,113 @@
1
+ <!--
2
+ FlowDrop horizontal lockup: rocket mark + "FlowDrop" wordmark.
3
+ Theme-aware via the same --fd-logo-* variables as Logo.svelte, plus
4
+ --fd-logo-text for the wordmark glyphs.
5
+ -->
6
+ <div class="flowdrop-logo-wordmark">
7
+ <svg viewBox="0 0 2500 499.99999" version="1.1" xmlns="http://www.w3.org/2000/svg">
8
+ <g transform="translate(472.2413,571.30469)">
9
+ <g transform="matrix(1.2053353,0,0,1.2053353,-1246.7763,-599.46548)">
10
+ <path
11
+ style="fill:var(--logo-line-fill);stroke-width:10;stroke-dasharray:none"
12
+ d="M 850,120 V 310 Z"
13
+ />
14
+ <path
15
+ style="fill:var(--logo-line-fill);stroke:var(--logo-stroke);stroke-width:16.59289328;stroke-dasharray:none;stroke-opacity:1"
16
+ d="M 850,110 V 310"
17
+ />
18
+ <path
19
+ style="fill:none;stroke:var(--logo-stroke);stroke-width:14.98546028;stroke-dasharray:none;stroke-opacity:1"
20
+ d="m 850,158.973 v 36.70355 8.15635 c 0,0 1.19184,39.5038 -36.01255,65.25076 -29.46481,20.39086 -52.3819,16.31269 -55.65576,65.25076 v 44.8599"
21
+ />
22
+ <path
23
+ style="fill:none;stroke:var(--logo-stroke);stroke-width:15.05060005;stroke-dasharray:none;stroke-opacity:1"
24
+ d="m 850,158.973 v 37.02335 8.22741 c 0,0 -1.19184,39.84799 36.01255,65.81929 29.46481,20.56853 52.3819,16.45482 55.65576,65.81929 v 45.25076"
25
+ />
26
+ <path
27
+ d="m 849.41763,64.456369 25.36824,31.087262 c 6.23336,6.364119 10.06921,15.063569 10.06921,24.656839 0,19.50109 -15.85132,35.30988 -35.42373,35.30988 -19.57241,0 -35.43242,-15.80879 -35.43242,-35.30988 0,-9.49405 3.75813,-18.11351 9.87536,-24.458879 z"
28
+ style="fill:var(--logo-drop);stroke:var(--logo-stroke);stroke-width:16.59289932;stroke-dasharray:none;paint-order:fill"
29
+ />
30
+ <circle
31
+ style="fill:var(--logo-circle);stroke:var(--logo-stroke);stroke-width:16.59289932;stroke-dasharray:none"
32
+ cx="849.427"
33
+ cy="326.5929"
34
+ r="30"
35
+ />
36
+ <ellipse
37
+ style="fill:var(--logo-left);stroke:var(--logo-stroke);stroke-width:16.59289932;stroke-dasharray:none"
38
+ cx="759.99994"
39
+ cy="369.44669"
40
+ rx="29.999952"
41
+ ry="30.000004"
42
+ />
43
+ <ellipse
44
+ style="fill:var(--logo-right);stroke:var(--logo-stroke);stroke-width:16.59289932;stroke-dasharray:none"
45
+ cx="939.99963"
46
+ cy="369.44669"
47
+ rx="29.999952"
48
+ ry="30.000004"
49
+ />
50
+ </g>
51
+ </g>
52
+ <g aria-label="FlowDrop" style="font-size:400.327px;fill:var(--logo-text);stroke-width:10.4252">
53
+ <path
54
+ d="M 710.85926,99.779646 V 116.59025 H 584.38877 v 92.65381 h 91.48097 v 16.81061 H 584.38877 V 358.97574 H 540.79848 V 99.779646 Z"
55
+ style="fill:var(--logo-text)"
56
+ />
57
+ <path
58
+ d="M 788.07077,358.97574 H 748.19445 V 68.113156 L 776.53791,56.77577 h 11.53286 z"
59
+ style="fill:var(--logo-text)"
60
+ />
61
+ <path
62
+ d="m 950.50815,363.27613 q -23.06571,0 -42.41746,-8.01436 -19.35174,-8.01436 -33.42574,-21.69741 -14.07399,-13.87853 -22.08835,-32.25291 -7.81889,-18.56986 -7.81889,-39.68085 0,-22.08835 7.81889,-41.4401 8.01436,-19.54722 22.08835,-34.01216 14.074,-14.46494 33.42574,-22.67477 19.35175,-8.4053 42.41746,-8.4053 22.87025,0 42.02652,7.62341 19.35173,7.62342 33.42573,20.91553 14.074,13.2921 21.8929,31.27554 8.0144,17.78797 8.0144,38.31255 0,22.67477 -8.0144,42.8084 -7.8189,19.93816 -21.8929,34.98952 -14.074,14.85588 -33.42573,23.65213 -19.15627,8.60078 -42.02652,8.60078 z m 7.62342,-14.66042 q 11.72833,0 21.50194,-6.05963 9.77361,-6.05964 16.8106,-16.22419 7.03699,-10.36003 10.94649,-23.84761 3.9094,-13.48758 3.9094,-28.53893 0,-21.69741 -3.714,-40.65821 -3.7139,-18.9608 -12.11925,-33.0348 -8.4053,-14.074 -21.89288,-22.08835 -13.48758,-8.20984 -32.83932,-8.20984 -9.96908,0 -19.35175,5.86417 -9.38266,5.66869 -16.61513,15.63777 -7.037,9.96908 -11.33739,23.45666 -4.30039,13.29211 -4.30039,28.34347 0,21.89288 4.49586,41.04915 4.69134,19.15627 13.48758,33.42574 8.99172,14.26947 21.69741,22.67477 12.90117,8.20983 29.32083,8.20983 z"
63
+ style="fill:var(--logo-text)"
64
+ />
65
+ <path
66
+ d="m 1122.7191,158.81224 63.333,146.21318 62.7465,-146.21318 63.1375,146.21318 55.9051,-146.21318 h 19.1563 l -81.7074,202.31369 h -13.4876 l -55.905,-130.77088 -56.1005,130.77088 h -12.3148 l -87.5715,-202.31369 z"
67
+ style="fill:var(--logo-text)"
68
+ />
69
+ <path
70
+ d="m 1424.9191,99.779646 h 86.3987 q 39.8763,0 68.6107,7.427944 28.7345,7.42794 47.8907,23.8476 21.8929,18.76533 32.8394,43.00388 11.1419,24.23855 11.1419,52.97296 0,27.3661 -9.9691,51.40918 -9.7736,24.04307 -28.9299,42.02651 -18.9608,17.78797 -47.1088,28.14799 -27.9525,10.36003 -64.1149,10.36003 h -96.7587 z m 43.5903,240.235294 h 46.3269 q 21.8929,0 41.2446,-7.23247 19.3518,-7.23247 33.6213,-21.50194 14.4649,-14.26947 22.6747,-34.98952 8.4053,-20.91552 8.4053,-48.28162 0,-24.04308 -7.8189,-43.98124 -7.8188,-20.13363 -21.8928,-34.59857 -14.074,-14.46494 -33.6213,-22.4793 -19.3517,-8.01436 -42.4174,-8.01436 h -46.5224 z"
71
+ style="fill:var(--logo-text)"
72
+ />
73
+ <path
74
+ d="m 1758.7855,155.09827 h 6.0597 l 5.2777,40.85368 q 4.6914,-8.99172 11.7283,-16.41966 7.037,-7.42794 15.4424,-12.90116 8.6007,-5.47322 17.9834,-8.40531 9.5781,-3.12755 19.3517,-3.12755 8.7963,0 17.2016,2.34567 8.6008,2.34566 16.0287,7.42794 l -12.5102,33.42574 q -3.9095,-4.30039 -8.2098,-6.84153 -4.3004,-2.73661 -8.7963,-4.10491 -4.4959,-1.56378 -9.1872,-1.95472 -4.6913,-0.39095 -9.3827,-0.39095 -7.4279,0 -14.6604,2.15019 -7.037,2.1502 -13.4875,6.45059 -6.4506,4.10491 -11.9238,10.75097 -5.4733,6.45058 -9.5782,15.24682 v 139.37166 h -39.6808 V 166.04471 Z"
75
+ style="fill:var(--logo-text)"
76
+ />
77
+ <path
78
+ d="m 1995.6979,363.27613 q -23.0658,0 -42.4175,-8.01436 -19.3518,-8.01436 -33.4257,-21.69741 -14.074,-13.87853 -22.0884,-32.25291 -7.8189,-18.56986 -7.8189,-39.68085 0,-22.08835 7.8189,-41.4401 8.0144,-19.54722 22.0884,-34.01216 14.0739,-14.46494 33.4257,-22.67477 19.3517,-8.4053 42.4175,-8.4053 22.8702,0 42.0265,7.62341 19.3517,7.62342 33.4257,20.91553 14.074,13.2921 21.8929,31.27554 8.0143,17.78797 8.0143,38.31255 0,22.67477 -8.0143,42.8084 -7.8189,19.93816 -21.8929,34.98952 -14.074,14.85588 -33.4257,23.65213 -19.1563,8.60078 -42.0265,8.60078 z m 7.6234,-14.66042 q 11.7283,0 21.5019,-6.05963 9.7736,-6.05964 16.8106,-16.22419 7.037,-10.36003 10.9465,-23.84761 3.9094,-13.48758 3.9094,-28.53893 0,-21.69741 -3.714,-40.65821 -3.7139,-18.9608 -12.1192,-33.0348 -8.4054,-14.074 -21.8929,-22.08835 -13.4876,-8.20984 -32.8394,-8.20984 -9.969,0 -19.3517,5.86417 -9.3827,5.66869 -16.6151,15.63777 -7.037,9.96908 -11.3374,23.45666 -4.3004,13.29211 -4.3004,28.34347 0,21.89288 4.4959,41.04915 4.6913,19.15627 13.4875,33.42574 8.9918,14.26947 21.6974,22.67477 12.9012,8.20983 29.3209,8.20983 z"
79
+ style="fill:var(--logo-text)"
80
+ />
81
+ <path
82
+ d="m 2186.0877,155.09827 h 11.3374 v 44.9586 q 6.0596,-7.62342 13.2921,-15.63778 7.4279,-8.01435 16.2242,-14.46494 8.9917,-6.64605 19.7427,-10.75097 10.7509,-4.10491 23.4566,-4.10491 17.788,0 32.2529,7.42794 14.465,7.42794 24.6295,20.13363 10.3601,12.7057 15.8333,29.90725 5.6687,17.00607 5.6687,36.35782 0,24.82496 -6.8416,45.93596 -6.8415,20.91552 -19.5472,36.16235 -12.7057,15.24683 -30.8846,23.8476 -18.1789,8.40531 -40.6582,8.40531 -8.2098,0 -15.4423,-0.97736 -7.037,-0.78189 -13.4876,-2.54114 -6.2551,-1.75925 -12.3147,-4.49586 -5.8642,-2.73661 -11.9238,-6.64606 v 94.60853 h -39.8763 V 166.24018 Z m 11.3374,149.92715 q 0,8.99172 3.9094,17.00608 3.9095,7.81889 10.9465,13.87852 7.037,5.86417 16.8106,9.38267 9.7736,3.32302 21.5019,3.32302 11.1419,0 20.9155,-5.66869 9.9691,-5.66869 17.2016,-16.02872 7.4279,-10.55549 11.5328,-25.02043 4.3004,-14.46494 4.3004,-32.05744 0,-22.08835 -3.9094,-38.50802 -3.9095,-16.61513 -10.9465,-27.56157 -6.8415,-10.94644 -16.4196,-16.41966 -9.3827,-5.47322 -20.7201,-5.47322 -8.6007,0 -16.6151,2.73661 -7.8189,2.54113 -14.8559,7.03699 -7.037,4.49586 -13.0966,10.36003 -5.8642,5.86416 -10.5555,12.31475 z"
83
+ style="fill:var(--logo-text)"
84
+ />
85
+ </g>
86
+ </svg>
87
+ </div>
88
+
89
+ <style>
90
+ .flowdrop-logo-wordmark {
91
+ --logo-stroke: var(--fd-logo-stroke, #000000);
92
+ --logo-text: var(--fd-logo-text, #000000);
93
+ --logo-line-fill: var(--fd-logo-line-fill, #000000);
94
+ --logo-drop: var(--fd-logo-drop, #009cde);
95
+ --logo-circle: var(--fd-logo-circle, #f46351);
96
+ --logo-left: var(--fd-logo-left, #ccbaf4);
97
+ --logo-right: var(--fd-logo-right, #ffc423);
98
+ }
99
+
100
+ :global([data-theme='dark']) .flowdrop-logo-wordmark {
101
+ /* Stroke, wordmark, and the center line go white in dark; the brand-color
102
+ dots (drop/circle/left/right) keep their fills, same as light mode. */
103
+ --logo-stroke: var(--fd-logo-stroke, #ffffff);
104
+ --logo-text: var(--fd-logo-text, #ffffff);
105
+ --logo-line-fill: var(--fd-logo-line-fill, #ffffff);
106
+ }
107
+
108
+ .flowdrop-logo-wordmark :global(svg) {
109
+ display: block;
110
+ width: 100%;
111
+ height: 100%;
112
+ }
113
+ </style>
@@ -0,0 +1,26 @@
1
+ export default LogoWordmark;
2
+ type LogoWordmark = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const LogoWordmark: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -7,8 +7,9 @@
7
7
  -->
8
8
 
9
9
  <script lang="ts">
10
+ import type { Snippet } from 'svelte';
10
11
  import Icon from '@iconify/svelte';
11
- import Logo from './Logo.svelte';
12
+ import LogoWordmark from './LogoWordmark.svelte';
12
13
  import SettingsModal from './SettingsModal.svelte';
13
14
  import type { SettingsCategory } from '../types/settings.js';
14
15
  import type { NavbarAction } from '../types/navbar.js';
@@ -37,6 +38,8 @@
37
38
  showSettingsSyncButton?: boolean;
38
39
  /** Show the reset buttons in the settings modal */
39
40
  showSettingsResetButton?: boolean;
41
+ /** Custom content rendered in the trailing (right) region, before the settings gear */
42
+ end?: Snippet;
40
43
  }
41
44
 
42
45
  let {
@@ -47,7 +50,8 @@
47
50
  showSettings = true,
48
51
  settingsCategories,
49
52
  showSettingsSyncButton,
50
- showSettingsResetButton
53
+ showSettingsResetButton,
54
+ end
51
55
  }: Props = $props();
52
56
 
53
57
  // Dropdown state
@@ -97,16 +101,10 @@
97
101
 
98
102
  <div class="flowdrop-navbar">
99
103
  <div class="flowdrop-navbar__start">
100
- <!-- Logo and Title -->
104
+ <!-- Logo (rocket + FlowDrop wordmark) -->
101
105
  <div class="flowdrop-logo--container">
102
- <div class="flowdrop-flex flowdrop-gap--3">
103
- <div class="flowdrop-logo--header">
104
- <Logo />
105
- </div>
106
- <div>
107
- <h1 class="flowdrop-text--logo flowdrop-font--bold">{nav.appName}</h1>
108
- <p class="flowdrop-text--tagline flowdrop-text--gray">{nav.tagline}</p>
109
- </div>
106
+ <div class="flowdrop-logo--header">
107
+ <LogoWordmark />
110
108
  </div>
111
109
  </div>
112
110
  </div>
@@ -277,6 +275,7 @@
277
275
  </div>
278
276
 
279
277
  <div class="flowdrop-navbar__end">
278
+ {@render end?.()}
280
279
  {#if showSettings}
281
280
  <button
282
281
  class="flowdrop-navbar__settings-btn"
@@ -331,10 +330,10 @@
331
330
  }
332
331
 
333
332
  .flowdrop-logo--header {
334
- width: 40px;
335
- height: 40px;
336
- font-size: 1.25rem;
337
- padding: 2px;
333
+ /* Wordmark lockup is 5:1; keep it within the start column. */
334
+ height: 32px;
335
+ width: 160px;
336
+ padding: 2px 0;
338
337
  }
339
338
 
340
339
  .flowdrop-navbar__center {
@@ -525,7 +524,7 @@
525
524
  transition: all var(--fd-transition-normal);
526
525
  font-weight: 500;
527
526
  font-size: var(--fd-text-sm);
528
- height: 2.5rem;
527
+ height: var(--fd-size-btn-min);
529
528
  box-sizing: border-box;
530
529
  background-color: var(--fd-background);
531
530
  color: var(--fd-foreground);
@@ -541,7 +540,7 @@
541
540
  position: relative;
542
541
  display: flex;
543
542
  align-items: center;
544
- height: 2.5rem;
543
+ height: var(--fd-size-btn-min);
545
544
  }
546
545
 
547
546
  .flowdrop-navbar__dropdown-trigger {
@@ -549,7 +548,7 @@
549
548
  align-items: center;
550
549
  justify-content: center;
551
550
  width: 2rem;
552
- height: 2.5rem;
551
+ height: var(--fd-size-btn-min);
553
552
  border: 1px solid var(--fd-border-strong);
554
553
  border-left: none;
555
554
  border-radius: 0 var(--fd-radius-md) var(--fd-radius-md) 0;
@@ -724,11 +723,6 @@
724
723
  border-color: var(--fd-border-strong);
725
724
  }
726
725
 
727
- .flowdrop-navbar__settings-btn:focus {
728
- outline: none;
729
- box-shadow: 0 0 0 2px var(--fd-ring);
730
- }
731
-
732
726
  .flowdrop-navbar__settings-btn:active {
733
727
  transform: scale(0.95);
734
728
  }
@@ -753,38 +747,6 @@
753
747
  background-color: var(--fd-success);
754
748
  }
755
749
 
756
- /* Utility classes */
757
- .flowdrop-flex {
758
- display: flex;
759
- }
760
-
761
- .flowdrop-gap--3 {
762
- gap: 0.75rem;
763
- }
764
-
765
- .flowdrop-text--logo {
766
- font-size: 1.125rem;
767
- line-height: 0;
768
- }
769
-
770
- .flowdrop-text--tagline {
771
- font-size: var(--fd-text-xs);
772
- line-height: 0.5rem;
773
- }
774
-
775
- .flowdrop-text--xs {
776
- font-size: var(--fd-text-xs);
777
- line-height: 1rem;
778
- }
779
-
780
- .flowdrop-text--gray {
781
- color: var(--fd-muted-foreground);
782
- }
783
-
784
- .flowdrop-font--bold {
785
- font-weight: 700;
786
- }
787
-
788
750
  /* Responsive design */
789
751
  @media (max-width: 768px) {
790
752
  .flowdrop-navbar {
@@ -834,14 +796,6 @@
834
796
  border-radius: var(--fd-radius-md) 0 0 var(--fd-radius-md);
835
797
  }
836
798
 
837
- .flowdrop-text--logo {
838
- display: none;
839
- }
840
-
841
- .flowdrop-text--tagline {
842
- display: none;
843
- }
844
-
845
799
  .flowdrop-navbar__title-text {
846
800
  font-size: 0.875rem;
847
801
  max-width: 300px;
@@ -1,3 +1,4 @@
1
+ import type { Snippet } from 'svelte';
1
2
  import type { SettingsCategory } from '../types/settings.js';
2
3
  import type { NavbarAction } from '../types/navbar.js';
3
4
  interface BreadcrumbItem {
@@ -22,6 +23,8 @@ interface Props {
22
23
  showSettingsSyncButton?: boolean;
23
24
  /** Show the reset buttons in the settings modal */
24
25
  showSettingsResetButton?: boolean;
26
+ /** Custom content rendered in the trailing (right) region, before the settings gear */
27
+ end?: Snippet;
25
28
  }
26
29
  declare const Navbar: import("svelte").Component<Props, {}, "">;
27
30
  type Navbar = ReturnType<typeof Navbar>;
@@ -7,6 +7,7 @@
7
7
  <script lang="ts">
8
8
  import type { NodeMetadata, NodeCategory, WorkflowFormat } from '../types/index.js';
9
9
  import LoadingSpinner from './LoadingSpinner.svelte';
10
+ import Input from './Input.svelte';
10
11
  import Icon from '@iconify/svelte';
11
12
  import { getNodeIcon, getCategoryIcon } from '../utils/icons.js';
12
13
  import { getCategoryColorToken } from '../utils/colors.js';
@@ -161,19 +162,17 @@
161
162
  >
162
163
  <!-- Search Section — visibility controlled by --fd-sidebar-search-display -->
163
164
  <div class="flowdrop-sidebar__search">
164
- <div class="flowdrop-join flowdrop-w--full">
165
- <div class="flowdrop-join__item flowdrop-flex--1">
166
- <input
167
- type="text"
168
- placeholder={m().layout.searchComponents}
169
- class="flowdrop-input flowdrop-join__item flowdrop-w--full"
170
- bind:value={searchInput}
171
- />
172
- </div>
173
- <button class="flowdrop-btn flowdrop-join__item" aria-label={m().layout.searchComponents}>
174
- <Icon icon="mdi:magnify" class="flowdrop-icon" />
175
- </button>
176
- </div>
165
+ <Input
166
+ type="text"
167
+ placeholder={m().layout.searchComponents}
168
+ aria-label={m().layout.searchComponents}
169
+ value={searchInput}
170
+ oninput={(e) => (searchInput = e.currentTarget.value)}
171
+ >
172
+ {#snippet leading()}
173
+ <Icon icon="mdi:magnify" />
174
+ {/snippet}
175
+ </Input>
177
176
  </div>
178
177
 
179
178
  <!-- Node Types List -->
@@ -408,7 +407,8 @@
408
407
  /* Components Sidebar - Always Visible */
409
408
  .flowdrop-sidebar {
410
409
  height: calc(100vh - var(--fd-navbar-height)); /* Account for navbar height */
411
- background-color: var(--fd-background);
410
+ background-color: var(--fd-panel-bg);
411
+ backdrop-filter: var(--fd-panel-backdrop-filter);
412
412
  border-right: 1px solid var(--fd-border);
413
413
  display: flex;
414
414
  flex-direction: column;
@@ -460,7 +460,7 @@
460
460
 
461
461
  .flowdrop-sidebar__search {
462
462
  padding: 0.75rem 1rem;
463
- background-color: var(--fd-background);
463
+ background-color: transparent;
464
464
  border-bottom: 1px solid var(--fd-border);
465
465
  display: var(--fd-sidebar-search-display, block);
466
466
  }
@@ -485,7 +485,7 @@
485
485
 
486
486
  .flowdrop-sidebar__content::-webkit-scrollbar-thumb {
487
487
  background: var(--fd-scrollbar-thumb);
488
- border-radius: 4px;
488
+ border-radius: var(--fd-scrollbar-radius);
489
489
  min-height: 20px; /* Ensure thumb has minimum height for visibility */
490
490
  }
491
491
 
@@ -593,114 +593,9 @@
593
593
  margin-left: 0;
594
594
  }
595
595
 
596
- /* Form Elements - Matching App Design System */
597
- .flowdrop-input {
598
- padding: 0.625rem 0.75rem;
599
- border: 1px solid var(--fd-border-strong);
600
- border-radius: var(--fd-radius-md);
601
- font-size: var(--fd-text-sm);
602
- color: var(--fd-foreground);
603
- background-color: var(--fd-background);
604
- transition:
605
- border-color var(--fd-transition-normal),
606
- box-shadow var(--fd-transition-normal);
607
- width: 100%;
608
- height: 2.5rem;
609
- box-sizing: border-box;
610
- }
611
-
612
- .flowdrop-input:focus {
613
- outline: none;
614
- border-color: var(--fd-ring);
615
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
616
- }
617
-
618
- .flowdrop-input::placeholder {
619
- color: var(--fd-muted-foreground);
620
- }
621
-
622
- .flowdrop-btn {
623
- padding: 0.625rem 0.75rem;
624
- border-radius: var(--fd-radius-md);
625
- font-size: var(--fd-text-sm);
626
- font-weight: 500;
627
- cursor: pointer;
628
- transition: all var(--fd-transition-normal);
629
- border: 1px solid var(--fd-border-strong);
630
- display: flex;
631
- align-items: center;
632
- justify-content: center;
633
- gap: 0.5rem;
634
- background-color: var(--fd-muted);
635
- color: var(--fd-foreground);
636
- height: 2.5rem;
637
- min-width: 2.5rem;
638
- box-sizing: border-box;
639
- }
640
-
641
- .flowdrop-btn:hover {
642
- background-color: var(--fd-subtle);
643
- border-color: var(--fd-border-strong);
644
- }
645
-
646
- .flowdrop-btn:active {
647
- background-color: var(--fd-border);
648
- border-color: var(--fd-muted-foreground);
649
- }
650
-
651
- .flowdrop-btn:focus {
652
- outline: none;
653
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
654
- }
655
-
656
- .flowdrop-btn:disabled {
657
- background-color: var(--fd-muted-foreground);
658
- border-color: var(--fd-muted-foreground);
659
- cursor: not-allowed;
660
- opacity: 0.6;
661
- }
662
-
663
- /* Join component styles - Seamless integration */
664
- .flowdrop-join {
665
- display: flex;
666
- width: 100%;
667
- border-radius: var(--fd-radius-md);
668
- overflow: hidden;
669
- border: 1px solid var(--fd-border-strong);
670
- background-color: var(--fd-background);
671
- }
672
-
673
- .flowdrop-join__item {
674
- border: none;
675
- border-radius: 0;
676
- background-color: transparent;
677
- }
678
-
679
- .flowdrop-join__item:first-child {
680
- border-right: 1px solid var(--fd-border-strong);
681
- flex: 1;
682
- }
683
-
684
- .flowdrop-join__item:last-child {
685
- border-left: none;
686
- background-color: var(--fd-muted);
687
- color: var(--fd-foreground);
688
- }
689
-
690
- .flowdrop-join__item:last-child:hover {
691
- background-color: var(--fd-subtle);
692
- }
693
-
694
- .flowdrop-join:focus-within {
695
- border-color: var(--fd-ring);
696
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
697
- }
596
+ /* Search field renders through the shared Input primitive (base.css). */
698
597
 
699
598
  /* Utility classes */
700
- .flowdrop-w--full {
701
- width: 100%;
702
- }
703
-
704
599
  .flowdrop-flex--1 {
705
600
  flex: 1;
706
601
  }
@@ -8,6 +8,7 @@
8
8
  <script lang="ts">
9
9
  import type { NodeMetadata, NodeCategory, WorkflowFormat, WorkflowNode } from '../types/index.js';
10
10
  import Icon from '@iconify/svelte';
11
+ import Input from './Input.svelte';
11
12
  import { getNodeIcon, getCategoryIcon } from '../utils/icons.js';
12
13
  import { getCategoryColorToken } from '../utils/colors.js';
13
14
  import { m } from '../messages/index.js';
@@ -115,12 +116,17 @@
115
116
 
116
117
  <!-- Search (hidden in minimal via --fd-sidebar-search-display) -->
117
118
  <div class="swap-picker__search">
118
- <input
119
+ <Input
119
120
  type="text"
120
121
  placeholder="Search node types..."
121
- class="swap-picker__input"
122
- bind:value={searchInput}
123
- />
122
+ aria-label="Search node types"
123
+ value={searchInput}
124
+ oninput={(e) => (searchInput = e.currentTarget.value)}
125
+ >
126
+ {#snippet leading()}
127
+ <Icon icon="mdi:magnify" />
128
+ {/snippet}
129
+ </Input>
124
130
  </div>
125
131
 
126
132
  <!-- Node list -->
@@ -298,30 +304,6 @@
298
304
  flex-shrink: 0;
299
305
  }
300
306
 
301
- .swap-picker__input {
302
- width: 100%;
303
- padding: 0.5rem 0.75rem;
304
- border: 1px solid var(--fd-border-strong);
305
- border-radius: var(--fd-radius-md);
306
- font-size: var(--fd-text-sm);
307
- color: var(--fd-foreground);
308
- background-color: var(--fd-background);
309
- box-sizing: border-box;
310
- transition:
311
- border-color var(--fd-transition-normal),
312
- box-shadow var(--fd-transition-normal);
313
- }
314
-
315
- .swap-picker__input:focus {
316
- outline: none;
317
- border-color: var(--fd-ring);
318
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
319
- }
320
-
321
- .swap-picker__input::placeholder {
322
- color: var(--fd-muted-foreground);
323
- }
324
-
325
307
  .swap-picker__list {
326
308
  flex: 1;
327
309
  overflow-y: auto;
@@ -136,9 +136,7 @@
136
136
  }
137
137
 
138
138
  .port-mapping-row__select:focus {
139
- outline: none;
140
139
  border-color: var(--fd-ring);
141
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
142
140
  }
143
141
 
144
142
  .port-mapping-row__select--dropped {
@@ -473,11 +473,6 @@
473
473
  color: var(--fd-foreground);
474
474
  }
475
475
 
476
- .schema-form__button--secondary:focus-visible {
477
- outline: none;
478
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2);
479
- }
480
-
481
476
  .schema-form__button--primary {
482
477
  background: linear-gradient(135deg, var(--fd-primary) 0%, var(--fd-primary-hover) 100%);
483
478
  color: var(--fd-primary-foreground);
@@ -498,13 +493,6 @@
498
493
  transform: translateY(0);
499
494
  }
500
495
 
501
- .schema-form__button--primary:focus-visible {
502
- outline: none;
503
- box-shadow:
504
- 0 0 0 3px rgba(59, 130, 246, 0.4),
505
- 0 4px 12px rgba(59, 130, 246, 0.35);
506
- }
507
-
508
496
  .schema-form__button-spinner {
509
497
  width: 1rem;
510
498
  height: 1rem;
@@ -0,0 +1,53 @@
1
+ <!--
2
+ Select — typed wrapper over the shared `.flowdrop-input` system (base.css).
3
+
4
+ Renders the field shell (`.flowdrop-input .flowdrop-input--select`) plus a
5
+ built-in chevron overlay (`.flowdrop-select-wrap`), so selects match the exact
6
+ look of Input/Textarea. The native arrow is removed; the chevron tints to
7
+ --fd-primary on focus. Pass <option>/<optgroup> as children. Native attributes
8
+ (value, disabled, id, aria-*, onchange…) forward to the underlying <select>.
9
+
10
+ Internal for now; see Button.svelte / Input.svelte for the pattern.
11
+ -->
12
+
13
+ <script lang="ts">
14
+ import type { Snippet } from 'svelte';
15
+ import type { HTMLSelectAttributes } from 'svelte/elements';
16
+
17
+ // Omit native numeric `size` so our design-token size (matching Button) wins.
18
+ interface Props extends Omit<HTMLSelectAttributes, 'size'> {
19
+ /** Size — `md` is the base; `sm`/`lg` add a modifier */
20
+ size?: 'sm' | 'md' | 'lg';
21
+ /** Renders the error-border state */
22
+ invalid?: boolean;
23
+ /** Extra classes appended to the <select> */
24
+ class?: string;
25
+ /** The <option>/<optgroup> elements */
26
+ children: Snippet;
27
+ }
28
+
29
+ let { size = 'md', invalid = false, class: className = '', children, ...rest }: Props = $props();
30
+
31
+ const selectClass = $derived(
32
+ [
33
+ 'flowdrop-input',
34
+ 'flowdrop-input--select',
35
+ size === 'md' ? '' : `flowdrop-input--${size}`,
36
+ invalid ? 'flowdrop-input--invalid' : '',
37
+ className
38
+ ]
39
+ .filter(Boolean)
40
+ .join(' ')
41
+ );
42
+ </script>
43
+
44
+ <div class="flowdrop-select-wrap">
45
+ <select class={selectClass} {...rest}>
46
+ {@render children()}
47
+ </select>
48
+ <span class="flowdrop-select-wrap__icon" aria-hidden="true">
49
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
50
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 9l6 6 6-6" />
51
+ </svg>
52
+ </span>
53
+ </div>
@@ -0,0 +1,15 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLSelectAttributes } from 'svelte/elements';
3
+ interface Props extends Omit<HTMLSelectAttributes, 'size'> {
4
+ /** Size — `md` is the base; `sm`/`lg` add a modifier */
5
+ size?: 'sm' | 'md' | 'lg';
6
+ /** Renders the error-border state */
7
+ invalid?: boolean;
8
+ /** Extra classes appended to the <select> */
9
+ class?: string;
10
+ /** The <option>/<optgroup> elements */
11
+ children: Snippet;
12
+ }
13
+ declare const Select: import("svelte").Component<Props, {}, "">;
14
+ type Select = ReturnType<typeof Select>;
15
+ export default Select;
@@ -259,11 +259,6 @@
259
259
  color: var(--fd-foreground);
260
260
  }
261
261
 
262
- .flowdrop-settings-modal__close:focus {
263
- outline: none;
264
- box-shadow: 0 0 0 2px var(--fd-ring);
265
- }
266
-
267
262
  /* Content */
268
263
  .flowdrop-settings-modal__content {
269
264
  flex: 1;