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

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 (85) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/MIGRATION-2.0.md +13 -0
  3. package/dist/components/App.svelte +21 -45
  4. package/dist/components/App.svelte.d.ts +2 -7
  5. package/dist/components/CanvasIconButton.svelte +76 -0
  6. package/dist/components/CanvasIconButton.svelte.d.ts +18 -0
  7. package/dist/components/ConfigForm.svelte +0 -19
  8. package/dist/components/ConfigPanel.svelte +4 -3
  9. package/dist/components/LogoWordmark.svelte +113 -0
  10. package/dist/components/LogoWordmark.svelte.d.ts +26 -0
  11. package/dist/components/Navbar.svelte +8 -59
  12. package/dist/components/NodeSidebar.svelte +4 -11
  13. package/dist/components/NodeSwapPicker.svelte +0 -2
  14. package/dist/components/PortMappingRow.svelte +0 -2
  15. package/dist/components/SchemaForm.svelte +0 -12
  16. package/dist/components/SettingsModal.svelte +0 -5
  17. package/dist/components/SettingsPanel.svelte +2 -6
  18. package/dist/components/ThemeToggle.svelte +0 -5
  19. package/dist/components/UniversalNode.svelte +32 -1
  20. package/dist/components/WorkflowEditor.svelte +62 -51
  21. package/dist/components/WorkflowEditor.svelte.d.ts +18 -0
  22. package/dist/components/chat/AIChatPanel.svelte +1 -1
  23. package/dist/components/console/ConsoleAutocomplete.svelte +1 -1
  24. package/dist/components/console/ConsoleOutput.svelte +2 -2
  25. package/dist/components/form/FormArray.svelte +0 -16
  26. package/dist/components/form/FormAutocomplete.svelte +10 -6
  27. package/dist/components/form/FormCheckboxGroup.svelte +0 -4
  28. package/dist/components/form/FormCodeEditor.svelte +9 -7
  29. package/dist/components/form/FormFieldLight.svelte +3 -3
  30. package/dist/components/form/FormMarkdownEditor.svelte +8 -5
  31. package/dist/components/form/FormNumberField.svelte +0 -4
  32. package/dist/components/form/FormRangeField.svelte +1 -20
  33. package/dist/components/form/FormSelect.svelte +10 -6
  34. package/dist/components/form/FormTemplateEditor.svelte +6 -4
  35. package/dist/components/form/FormTextField.svelte +10 -6
  36. package/dist/components/form/FormTextarea.svelte +10 -6
  37. package/dist/components/form/FormToggle.svelte +0 -4
  38. package/dist/components/icons/CommandLineIcon.svelte +15 -0
  39. package/dist/components/icons/CommandLineIcon.svelte.d.ts +26 -0
  40. package/dist/components/icons/MenuIcon.svelte +4 -0
  41. package/dist/components/icons/MenuIcon.svelte.d.ts +26 -0
  42. package/dist/components/icons/MenuOpenIcon.svelte +6 -0
  43. package/dist/components/icons/MenuOpenIcon.svelte.d.ts +26 -0
  44. package/dist/components/interrupt/ChoicePrompt.svelte +0 -10
  45. package/dist/components/interrupt/ConfirmationPrompt.svelte +0 -5
  46. package/dist/components/interrupt/InterruptBubble.svelte +0 -10
  47. package/dist/components/interrupt/ReviewPrompt.svelte +0 -20
  48. package/dist/components/interrupt/TextInputPrompt.svelte +0 -6
  49. package/dist/components/layouts/MainLayout.svelte +4 -5
  50. package/dist/components/nodes/AtomNode.svelte +46 -34
  51. package/dist/components/nodes/GatewayNode.svelte +91 -99
  52. package/dist/components/nodes/IdeaNode.svelte +62 -90
  53. package/dist/components/nodes/NodeConfigButton.svelte +86 -0
  54. package/dist/components/nodes/NodeConfigButton.svelte.d.ts +15 -0
  55. package/dist/components/nodes/NotesNode.svelte +70 -81
  56. package/dist/components/nodes/SimpleNode.svelte +28 -78
  57. package/dist/components/nodes/SquareNode.svelte +79 -109
  58. package/dist/components/nodes/TerminalNode.svelte +28 -86
  59. package/dist/components/nodes/ToolNode.svelte +82 -95
  60. package/dist/components/nodes/WorkflowNode.svelte +91 -100
  61. package/dist/components/playground/ChatInput.svelte +0 -1
  62. package/dist/components/playground/InputCollector.svelte +0 -2
  63. package/dist/components/playground/PlaygroundApp.svelte +1 -1
  64. package/dist/components/playground/PlaygroundStudio.svelte +0 -5
  65. package/dist/playground/mount.d.ts +9 -5
  66. package/dist/playground/mount.js +9 -5
  67. package/dist/skins/drafter.d.ts +30 -0
  68. package/dist/skins/drafter.js +185 -0
  69. package/dist/skins/index.d.ts +2 -1
  70. package/dist/skins/index.js +4 -2
  71. package/dist/styles/base.css +38 -9
  72. package/dist/styles/tokens.css +54 -2
  73. package/dist/svelte-app.d.ts +6 -0
  74. package/dist/svelte-app.js +3 -2
  75. package/dist/themes/drafter.d.ts +2 -0
  76. package/dist/themes/drafter.js +15 -0
  77. package/dist/themes/index.d.ts +2 -1
  78. package/dist/themes/index.js +8 -2
  79. package/dist/types/events.d.ts +18 -0
  80. package/dist/types/events.js +2 -1
  81. package/dist/types/settings.d.ts +1 -1
  82. package/dist/types/settings.js +1 -1
  83. package/dist/types/skin.d.ts +1 -1
  84. package/dist/types/theme.d.ts +16 -2
  85. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.0.0-beta.3] - 2026-06-12
11
+
12
+ Third 2.0 beta, published under the npm `beta` dist-tag (`npm install @flowdrop/flowdrop@beta`). `latest` remains 1.15.0 until 2.0.0 GA. This release finishes the navbar/theme defaults pass started in beta.2 (navbar opt-in everywhere, light as the default theme, the FlowDrop wordmark in the header), adds the **Drafter** blueprint theme with per-theme canvas grids, and lands a keyboard-navigation and focus-ring overhaul alongside the 20px node-grid alignment.
13
+
14
+ ### Breaking Changes
15
+
16
+ - **`mountPlaygroundApp` / `<PlaygroundApp>` no longer render the navbar by default.** `showNavbar` now defaults to `false`, matching `mountFlowDropApp` / `<App>` — so every mount path is navbar-off by default and embedding FlowDrop into a page that already has its own header never double-stacks a header. Pass `showNavbar: true` to opt back into the FlowDrop navbar (logo, branding, settings modal) when FlowDrop owns the whole page.
17
+
18
+ ### Added
19
+
20
+ - **Drafter blueprint theme.** A third built-in editor theme (`'drafter'`), shipping light + dark variants: a blueprint aesthetic with a soft mint canvas, a subtle emerald line grid, and translucent green-tinted flat nodes. Data-type port colors and category icon colors are left untouched so they keep popping against the muted draft surface. Selectable from the Settings → UI Theme picker; the `FlowDropSkinName` / theme / skin name unions gain `'drafter'`.
21
+ - **Per-theme canvas grid.** A new `FlowDropGridVariant` type (`'dots' | 'lines' | 'cross'`) and `themeConfig.canvas.grid` config let any theme drive the editor's background grid (previously hardcoded to dots). The grid pattern color is the `--fd-grid-pattern-color` token, whose default matches xyflow's dot color, so the default/minimal themes render unchanged. `resolveTheme` now merges `config.canvas` alongside `config.sidebar`.
22
+ - **`features.builtinEditors` opt-out.** The built-in markdown/code/template editors are batteries-included in the full editor by default. Pass `features: { builtinEditors: false }` to `mountFlowDropApp` (or `builtinEditors: false` to `mountWorkflowEditor` / `<WorkflowEditor>`) to skip registering them — keeping the textarea fallback or leaving room to register your own field components via `instance.fields.register(...)`. The corrected fallback hint now points at the registry-scoped API (`registerMarkdownEditorField(instance.fields)`).
23
+ - **FlowDrop wordmark logo in the navbar.** The header now renders the FlowDrop wordmark in place of the plain text title.
24
+
25
+ ### Changed
26
+
27
+ - **The default theme preference is now `'light'` (was `'dark'`).** `DEFAULT_THEME_SETTINGS.preference` was hardcoded to `'dark'`, so any embed with no persisted theme choice rendered dark. Embeds now default to light; hosts that want dark by default should set the preference explicitly.
28
+ - **Editor / node / chrome surface tokens are scoped per surface,** refining how themes (including Drafter) tint the canvas, nodes, and surrounding chrome independently.
29
+
30
+ ### Fixed
31
+
32
+ - **Nodes are a single tab stop again.** The node config (gear) button sat in the tab order, so leaving a node required a second `Tab` press. The gear button is removed from the tab order (it stays mouse/Enter-activatable), and node focus defers to xyflow's own node focus — Tab now moves one node per press. `nodesFocusable` redundancy was removed to eliminate the duplicate stop.
33
+ - **The full editor renders markdown/code/config editors out of the box again.** The beta.2 light-entry split made the heavy form editors opt-in everywhere, which inadvertently left `<WorkflowEditor>` / `<App>` / the playground showing the "Editor component not registered" textarea fallback for node config fields with `format: 'markdown' | 'code' | 'template'`. The full editor now registers the built-in editors on its own instance's field registry on mount. Registration uses a dynamic `import()`, so the chunks stay code-split (loaded lazily) and the light `/editor` static bundle is unaffected — the bundle guard still passes. The standalone `@flowdrop/flowdrop/form` primitive is unchanged and remains opt-in.
34
+ - **`<App navbarActions>` accepts the full `NavbarAction` shape.** The component prop was typed with an inline subset that silently dropped `external` and `group`, even though the underlying `<Navbar>` (and the `mountFlowDropApp` option) already supported them. It now uses the canonical `NavbarAction` type, so external-link and grouped actions type-check through the component as they always did through the mount API.
35
+ - **The node header no longer shows a top-accent line.**
36
+
37
+ ### Changed (internal — no API change)
38
+
39
+ - **One centralized focus ring across the whole component library.** New `--fd-ring-width` / `--fd-ring-offset` tokens and a single `.flowdrop-root :focus-visible` rule in `base.css` replace ~200 lines of component-local focus CSS (mismatched outlines, hardcoded `rgba(59,130,246)` box-shadow glows, `color-mix` rings) removed across 41 files. CodeMirror editors in `overflow:hidden` containers use a `:focus-within` ring (outline paints outside the box and would clip); range-input thumbs ring on the parent.
40
+ - **Extracted shared `NodeConfigButton` and `CanvasIconButton` components,** replacing per-node config-button and per-canvas floating-button duplication (including an inline-SVG cog) with one keyboard-correct implementation each.
41
+ - **Node geometry converted from `rem` to `px` and snapped to a 20px grid** across all eight node types — header, port rows (fixed 60px), icon sizes, paddings, gaps, and font sizes — so nodes stay aligned to the canvas coordinate grid regardless of the host's root font-size.
42
+ - **The code / markdown / template editors now rest on the shared input surface** instead of carrying their own background.
43
+
10
44
  ## [2.0.0-beta.2] - 2026-06-09
11
45
 
12
46
  Second 2.0 beta, published under the npm `beta` dist-tag (`npm install @flowdrop/flowdrop@beta`). This release tightens the 2.0 package boundaries, finishes `AuthProvider` propagation across the editor and playground runtime surfaces, and adds a regression guard for light-entry bundle size.
package/MIGRATION-2.0.md CHANGED
@@ -295,6 +295,19 @@ import { getInstance } from '@flowdrop/flowdrop/editor';
295
295
  registerCodeEditorField(getInstance().fields);
296
296
  ```
297
297
 
298
+ **You only need this for the standalone `@flowdrop/flowdrop/form` primitive.**
299
+ The full editor is batteries-included: `<WorkflowEditor>` / `<App>` and the
300
+ playground register the built-in markdown, code, and template editors on their
301
+ own instance's `fields` registry on mount, so node config fields with
302
+ `format: 'markdown' | 'code' | 'template'` render real editors out of the box —
303
+ no host call required. Registration is a dynamic `import()`, so the CodeMirror /
304
+ `marked` chunks stay code-split (the light `/editor` static bundle is
305
+ unaffected) and load lazily on first use. To strip them, pass
306
+ `features: { builtinEditors: false }` to `mountFlowDropApp` (or
307
+ `builtinEditors: false` to `mountWorkflowEditor` / `<WorkflowEditor>`) and either
308
+ accept the textarea fallback or register your own field components via
309
+ `instance.fields.register(...)`.
310
+
298
311
  Category color/icon helpers likewise take a `CategoriesStore` as an explicit
299
312
  parameter — the last global-instance fallback in `utils` is gone.
300
313
 
@@ -9,7 +9,9 @@
9
9
  import MainLayout from './layouts/MainLayout.svelte';
10
10
  import WorkflowEditor from './WorkflowEditor.svelte';
11
11
  import NodeSidebar from './NodeSidebar.svelte';
12
- import Icon from '@iconify/svelte';
12
+ import CanvasIconButton from './CanvasIconButton.svelte';
13
+ import MenuIcon from './icons/MenuIcon.svelte';
14
+ import MenuOpenIcon from './icons/MenuOpenIcon.svelte';
13
15
  import ConfigForm from './ConfigForm.svelte';
14
16
  import ConfigPanel from './ConfigPanel.svelte';
15
17
  import CommandConsole from './console/CommandConsole.svelte';
@@ -18,6 +20,7 @@
18
20
  import NodeSwapPicker from './NodeSwapPicker.svelte';
19
21
  import SwapMappingEditor from './SwapMappingEditor.svelte';
20
22
  import Navbar from './Navbar.svelte';
23
+ import type { NavbarAction } from '../types/navbar.js';
21
24
  import type { NodeMetadata, Workflow, WorkflowNode, ConfigSchema } from '../types/index.js';
22
25
  import type { InteractiveSwapState, SwapEventContext } from '../utils/nodeSwap.js';
23
26
  import {
@@ -98,13 +101,7 @@
98
101
  /** Custom navbar title */
99
102
  navbarTitle?: string;
100
103
  /** Custom navbar actions */
101
- navbarActions?: Array<{
102
- label: string;
103
- href: string;
104
- icon?: string;
105
- variant?: 'primary' | 'secondary' | 'outline';
106
- onclick?: (event: Event) => void;
107
- }>;
104
+ navbarActions?: NavbarAction[];
108
105
  /** Show settings gear icon in navbar */
109
106
  showSettings?: boolean;
110
107
  /** Show the "Connected" status indicator in the navbar (default: true) */
@@ -1278,18 +1275,22 @@
1278
1275
  >
1279
1276
  <!-- Floating sidebar toggle — always visible on the canvas top-left -->
1280
1277
  {#if !disableSidebar}
1281
- <button
1278
+ <CanvasIconButton
1282
1279
  class="flowdrop-sidebar-fab"
1283
- onclick={toggleSidebar}
1284
- aria-label={isSidebarCollapsed
1285
- ? mergedMessages.layout.expandSidebar
1286
- : mergedMessages.layout.collapseSidebar}
1287
- title={isSidebarCollapsed
1280
+ label={isSidebarCollapsed
1288
1281
  ? mergedMessages.layout.expandSidebar
1289
1282
  : mergedMessages.layout.collapseSidebar}
1283
+ active={!isSidebarCollapsed}
1284
+ onclick={toggleSidebar}
1290
1285
  >
1291
- <Icon icon={isSidebarCollapsed ? 'mdi:menu' : 'mdi:menu-open'} />
1292
- </button>
1286
+ {#snippet icon()}
1287
+ {#if isSidebarCollapsed}
1288
+ <MenuIcon />
1289
+ {:else}
1290
+ <MenuOpenIcon />
1291
+ {/if}
1292
+ {/snippet}
1293
+ </CanvasIconButton>
1293
1294
  {/if}
1294
1295
 
1295
1296
  <WorkflowEditor
@@ -1300,6 +1301,8 @@
1300
1301
  {mode}
1301
1302
  {pipelineId}
1302
1303
  {refreshTrigger}
1304
+ builtinEditors={features.builtinEditors}
1305
+ gridVariant={themeConfig?.canvas?.grid ?? 'dots'}
1303
1306
  consoleOpen={getUiSettings().consoleOpen}
1304
1307
  onToggleConsole={toggleConsole}
1305
1308
  />
@@ -1412,38 +1415,11 @@
1412
1415
  font-weight: 500;
1413
1416
  }
1414
1417
 
1415
- /* Floating sidebar toggle button */
1416
- .flowdrop-sidebar-fab {
1417
- position: absolute;
1418
+ /* Floating sidebar toggle button — placement only; visuals live in CanvasIconButton */
1419
+ :global(.flowdrop-sidebar-fab) {
1418
1420
  top: 12px;
1419
1421
  left: 12px;
1420
1422
  z-index: 50;
1421
- display: flex;
1422
- align-items: center;
1423
- justify-content: center;
1424
- width: 2.25rem;
1425
- height: 2.25rem;
1426
- border: 1px solid var(--fd-border);
1427
- border-radius: var(--fd-radius-md);
1428
- background-color: var(--fd-background);
1429
- color: var(--fd-muted-foreground);
1430
- cursor: pointer;
1431
- box-shadow: var(--fd-shadow-md);
1432
- transition:
1433
- color var(--fd-transition-fast),
1434
- background-color var(--fd-transition-fast),
1435
- box-shadow var(--fd-transition-fast);
1436
- }
1437
-
1438
- .flowdrop-sidebar-fab:hover {
1439
- color: var(--fd-foreground);
1440
- background-color: var(--fd-subtle);
1441
- box-shadow: var(--fd-shadow-lg);
1442
- }
1443
-
1444
- .flowdrop-sidebar-fab:focus {
1445
- outline: none;
1446
- box-shadow: 0 0 0 2px var(--fd-ring);
1447
1423
  }
1448
1424
 
1449
1425
  /* Main editor area */
@@ -1,3 +1,4 @@
1
+ import type { NavbarAction } from '../types/navbar.js';
1
2
  import type { NodeMetadata, Workflow, ConfigSchema } from '../types/index.js';
2
3
  import type { SwapStrategy } from '../utils/nodeSwap.js';
3
4
  import type { EndpointConfig } from '../config/endpoints.js';
@@ -53,13 +54,7 @@ interface Props {
53
54
  /** Custom navbar title */
54
55
  navbarTitle?: string;
55
56
  /** Custom navbar actions */
56
- navbarActions?: Array<{
57
- label: string;
58
- href: string;
59
- icon?: string;
60
- variant?: 'primary' | 'secondary' | 'outline';
61
- onclick?: (event: Event) => void;
62
- }>;
57
+ navbarActions?: NavbarAction[];
63
58
  /** Show settings gear icon in navbar */
64
59
  showSettings?: boolean;
65
60
  /** Show the "Connected" status indicator in the navbar (default: true) */
@@ -0,0 +1,76 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ interface Props {
5
+ /**
6
+ * The icon to render — an inline-SVG snippet (offline-safe). Pass a local
7
+ * icon component from `$lib/components/icons/`, not a network-fetched one.
8
+ */
9
+ icon: Snippet;
10
+ /** Accessible label — drives both aria-label and the hover title. */
11
+ label: string;
12
+ /** Renders the active/toggled-on visual state (e.g. the panel it controls is open). */
13
+ active?: boolean;
14
+ onclick: () => void;
15
+ /** Caller-supplied class for positioning (top/left/bottom/z-index). */
16
+ class?: string;
17
+ }
18
+
19
+ let { icon, label, active = false, onclick, class: klass = '' }: Props = $props();
20
+ </script>
21
+
22
+ <button
23
+ class="flowdrop-canvas-btn {klass}"
24
+ class:flowdrop-canvas-btn--active={active}
25
+ {onclick}
26
+ aria-label={label}
27
+ title={label}
28
+ type="button"
29
+ >
30
+ {@render icon()}
31
+ </button>
32
+
33
+ <style>
34
+ .flowdrop-canvas-btn {
35
+ position: absolute;
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ width: 2.25rem;
40
+ height: 2.25rem;
41
+ border: 1px solid var(--fd-border);
42
+ border-radius: var(--fd-radius-md);
43
+ background-color: var(--fd-background);
44
+ color: var(--fd-muted-foreground);
45
+ cursor: pointer;
46
+ box-shadow: var(--fd-shadow-md);
47
+ transition:
48
+ color var(--fd-transition-fast),
49
+ background-color var(--fd-transition-fast),
50
+ box-shadow var(--fd-transition-fast),
51
+ border-color var(--fd-transition-fast);
52
+ }
53
+
54
+ /* Size whatever inline SVG the caller renders. */
55
+ .flowdrop-canvas-btn :global(svg) {
56
+ width: 18px;
57
+ height: 18px;
58
+ }
59
+
60
+ .flowdrop-canvas-btn:hover {
61
+ color: var(--fd-foreground);
62
+ background-color: var(--fd-subtle);
63
+ box-shadow: var(--fd-shadow-lg);
64
+ }
65
+
66
+ .flowdrop-canvas-btn--active {
67
+ color: var(--fd-primary);
68
+ background-color: var(--fd-primary-muted);
69
+ border-color: var(--fd-primary);
70
+ }
71
+
72
+ .flowdrop-canvas-btn--active:hover {
73
+ color: var(--fd-primary);
74
+ background-color: var(--fd-primary-muted);
75
+ }
76
+ </style>
@@ -0,0 +1,18 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /**
4
+ * The icon to render — an inline-SVG snippet (offline-safe). Pass a local
5
+ * icon component from `$lib/components/icons/`, not a network-fetched one.
6
+ */
7
+ icon: Snippet;
8
+ /** Accessible label — drives both aria-label and the hover title. */
9
+ label: string;
10
+ /** Renders the active/toggled-on visual state (e.g. the panel it controls is open). */
11
+ active?: boolean;
12
+ onclick: () => void;
13
+ /** Caller-supplied class for positioning (top/left/bottom/z-index). */
14
+ class?: string;
15
+ }
16
+ declare const CanvasIconButton: import("svelte").Component<Props, {}, "">;
17
+ type CanvasIconButton = ReturnType<typeof CanvasIconButton>;
18
+ export default CanvasIconButton;
@@ -1073,11 +1073,6 @@
1073
1073
  color: var(--fd-foreground);
1074
1074
  }
1075
1075
 
1076
- .config-form__button--secondary:focus-visible {
1077
- outline: none;
1078
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2);
1079
- }
1080
-
1081
1076
  .config-form__button--primary {
1082
1077
  background: linear-gradient(135deg, var(--fd-primary) 0%, var(--fd-primary-hover) 100%);
1083
1078
  color: var(--fd-primary-foreground);
@@ -1098,13 +1093,6 @@
1098
1093
  transform: translateY(0);
1099
1094
  }
1100
1095
 
1101
- .config-form__button--primary:focus-visible {
1102
- outline: none;
1103
- box-shadow:
1104
- 0 0 0 3px rgba(59, 130, 246, 0.4),
1105
- 0 4px 12px rgba(59, 130, 246, 0.35);
1106
- }
1107
-
1108
1096
  /* ============================================
1109
1097
  UI EXTENSIONS SECTION
1110
1098
  ============================================ */
@@ -1559,11 +1547,4 @@
1559
1547
  .config-form__button--external:active {
1560
1548
  transform: translateY(0);
1561
1549
  }
1562
-
1563
- .config-form__button--external:focus-visible {
1564
- outline: none;
1565
- box-shadow:
1566
- 0 0 0 3px rgba(99, 102, 241, 0.4),
1567
- 0 4px 12px rgba(99, 102, 241, 0.35);
1568
- }
1569
1550
  </style>
@@ -110,7 +110,8 @@
110
110
  height: 100%;
111
111
  display: flex;
112
112
  flex-direction: column;
113
- background-color: var(--fd-background);
113
+ background-color: var(--fd-panel-bg);
114
+ backdrop-filter: var(--fd-panel-backdrop-filter);
114
115
  }
115
116
 
116
117
  .config-panel__header {
@@ -119,7 +120,7 @@
119
120
  align-items: center;
120
121
  padding: 0.875rem 1rem;
121
122
  border-bottom: 1px solid var(--fd-border);
122
- background-color: var(--fd-muted);
123
+ background-color: var(--fd-card);
123
124
  flex-shrink: 0;
124
125
  }
125
126
 
@@ -180,7 +181,7 @@
180
181
  .config-panel__details {
181
182
  padding: 0.75rem 1rem;
182
183
  border-bottom: 1px solid var(--fd-border-muted);
183
- background-color: var(--fd-muted);
184
+ background-color: var(--fd-card);
184
185
  flex-shrink: 0;
185
186
  }
186
187
 
@@ -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
+ }
@@ -8,7 +8,7 @@
8
8
 
9
9
  <script lang="ts">
10
10
  import Icon from '@iconify/svelte';
11
- import Logo from './Logo.svelte';
11
+ import LogoWordmark from './LogoWordmark.svelte';
12
12
  import SettingsModal from './SettingsModal.svelte';
13
13
  import type { SettingsCategory } from '../types/settings.js';
14
14
  import type { NavbarAction } from '../types/navbar.js';
@@ -97,16 +97,10 @@
97
97
 
98
98
  <div class="flowdrop-navbar">
99
99
  <div class="flowdrop-navbar__start">
100
- <!-- Logo and Title -->
100
+ <!-- Logo (rocket + FlowDrop wordmark) -->
101
101
  <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>
102
+ <div class="flowdrop-logo--header">
103
+ <LogoWordmark />
110
104
  </div>
111
105
  </div>
112
106
  </div>
@@ -331,10 +325,10 @@
331
325
  }
332
326
 
333
327
  .flowdrop-logo--header {
334
- width: 40px;
335
- height: 40px;
336
- font-size: 1.25rem;
337
- padding: 2px;
328
+ /* Wordmark lockup is 5:1; keep it within the start column. */
329
+ height: 32px;
330
+ width: 160px;
331
+ padding: 2px 0;
338
332
  }
339
333
 
340
334
  .flowdrop-navbar__center {
@@ -724,11 +718,6 @@
724
718
  border-color: var(--fd-border-strong);
725
719
  }
726
720
 
727
- .flowdrop-navbar__settings-btn:focus {
728
- outline: none;
729
- box-shadow: 0 0 0 2px var(--fd-ring);
730
- }
731
-
732
721
  .flowdrop-navbar__settings-btn:active {
733
722
  transform: scale(0.95);
734
723
  }
@@ -753,38 +742,6 @@
753
742
  background-color: var(--fd-success);
754
743
  }
755
744
 
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
745
  /* Responsive design */
789
746
  @media (max-width: 768px) {
790
747
  .flowdrop-navbar {
@@ -834,14 +791,6 @@
834
791
  border-radius: var(--fd-radius-md) 0 0 var(--fd-radius-md);
835
792
  }
836
793
 
837
- .flowdrop-text--logo {
838
- display: none;
839
- }
840
-
841
- .flowdrop-text--tagline {
842
- display: none;
843
- }
844
-
845
794
  .flowdrop-navbar__title-text {
846
795
  font-size: 0.875rem;
847
796
  max-width: 300px;
@@ -408,7 +408,8 @@
408
408
  /* Components Sidebar - Always Visible */
409
409
  .flowdrop-sidebar {
410
410
  height: calc(100vh - var(--fd-navbar-height)); /* Account for navbar height */
411
- background-color: var(--fd-background);
411
+ background-color: var(--fd-panel-bg);
412
+ backdrop-filter: var(--fd-panel-backdrop-filter);
412
413
  border-right: 1px solid var(--fd-border);
413
414
  display: flex;
414
415
  flex-direction: column;
@@ -460,7 +461,7 @@
460
461
 
461
462
  .flowdrop-sidebar__search {
462
463
  padding: 0.75rem 1rem;
463
- background-color: var(--fd-background);
464
+ background-color: transparent;
464
465
  border-bottom: 1px solid var(--fd-border);
465
466
  display: var(--fd-sidebar-search-display, block);
466
467
  }
@@ -485,7 +486,7 @@
485
486
 
486
487
  .flowdrop-sidebar__content::-webkit-scrollbar-thumb {
487
488
  background: var(--fd-scrollbar-thumb);
488
- border-radius: 4px;
489
+ border-radius: var(--fd-scrollbar-radius);
489
490
  min-height: 20px; /* Ensure thumb has minimum height for visibility */
490
491
  }
491
492
 
@@ -610,9 +611,7 @@
610
611
  }
611
612
 
612
613
  .flowdrop-input:focus {
613
- outline: none;
614
614
  border-color: var(--fd-ring);
615
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
616
615
  }
617
616
 
618
617
  .flowdrop-input::placeholder {
@@ -648,11 +647,6 @@
648
647
  border-color: var(--fd-muted-foreground);
649
648
  }
650
649
 
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
650
  .flowdrop-btn:disabled {
657
651
  background-color: var(--fd-muted-foreground);
658
652
  border-color: var(--fd-muted-foreground);
@@ -693,7 +687,6 @@
693
687
 
694
688
  .flowdrop-join:focus-within {
695
689
  border-color: var(--fd-ring);
696
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
697
690
  }
698
691
 
699
692
  /* Utility classes */