@d34dman/flowdrop 0.0.43 → 0.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +8 -8
  2. package/dist/api/enhanced-client.d.ts +3 -1
  3. package/dist/api/enhanced-client.js +35 -5
  4. package/dist/components/App.svelte +68 -34
  5. package/dist/components/ConfigForm.svelte +169 -142
  6. package/dist/components/ConfigForm.svelte.d.ts +4 -2
  7. package/dist/components/ConfigPanel.svelte +42 -15
  8. package/dist/components/LogsSidebar.svelte +20 -19
  9. package/dist/components/Navbar.svelte +150 -80
  10. package/dist/components/Navbar.svelte.d.ts +8 -0
  11. package/dist/components/NodeSidebar.svelte +334 -217
  12. package/dist/components/PipelineStatus.svelte +6 -1
  13. package/dist/components/ReadOnlyDetails.svelte +14 -14
  14. package/dist/components/SchemaForm.svelte +49 -30
  15. package/dist/components/SchemaForm.svelte.d.ts +11 -1
  16. package/dist/components/SettingsModal.svelte +279 -0
  17. package/dist/components/SettingsModal.svelte.d.ts +23 -0
  18. package/dist/components/SettingsPanel.svelte +615 -0
  19. package/dist/components/SettingsPanel.svelte.d.ts +21 -0
  20. package/dist/components/ThemeToggle.svelte +186 -0
  21. package/dist/components/ThemeToggle.svelte.d.ts +14 -0
  22. package/dist/components/WorkflowEditor.svelte +114 -38
  23. package/dist/components/form/FormArray.svelte +81 -81
  24. package/dist/components/form/FormAutocomplete.svelte +1014 -0
  25. package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
  26. package/dist/components/form/FormCheckboxGroup.svelte +16 -16
  27. package/dist/components/form/FormCodeEditor.svelte +26 -26
  28. package/dist/components/form/FormField.svelte +52 -21
  29. package/dist/components/form/FormFieldLight.svelte +19 -19
  30. package/dist/components/form/FormFieldWrapper.svelte +4 -4
  31. package/dist/components/form/FormMarkdownEditor.svelte +124 -57
  32. package/dist/components/form/FormNumberField.svelte +13 -13
  33. package/dist/components/form/FormRangeField.svelte +16 -16
  34. package/dist/components/form/FormSelect.svelte +15 -15
  35. package/dist/components/form/FormTemplateEditor.svelte +34 -34
  36. package/dist/components/form/FormTextField.svelte +13 -13
  37. package/dist/components/form/FormTextarea.svelte +13 -13
  38. package/dist/components/form/FormToggle.svelte +8 -8
  39. package/dist/components/form/index.d.ts +1 -0
  40. package/dist/components/form/index.js +1 -0
  41. package/dist/components/form/types.d.ts +133 -8
  42. package/dist/components/form/types.js +50 -1
  43. package/dist/components/interrupt/ChoicePrompt.svelte +45 -38
  44. package/dist/components/interrupt/ConfirmationPrompt.svelte +35 -35
  45. package/dist/components/interrupt/FormPrompt.svelte +27 -20
  46. package/dist/components/interrupt/InterruptBubble.svelte +50 -50
  47. package/dist/components/interrupt/TextInputPrompt.svelte +39 -32
  48. package/dist/components/layouts/MainLayout.svelte +233 -34
  49. package/dist/components/layouts/MainLayout.svelte.d.ts +12 -0
  50. package/dist/components/nodes/GatewayNode.svelte +175 -125
  51. package/dist/components/nodes/IdeaNode.svelte +70 -84
  52. package/dist/components/nodes/NotesNode.svelte +124 -88
  53. package/dist/components/nodes/SimpleNode.svelte +91 -69
  54. package/dist/components/nodes/SquareNode.svelte +102 -75
  55. package/dist/components/nodes/TerminalNode.svelte +127 -113
  56. package/dist/components/nodes/ToolNode.svelte +125 -76
  57. package/dist/components/nodes/WorkflowNode.svelte +164 -108
  58. package/dist/components/playground/ChatPanel.svelte +76 -76
  59. package/dist/components/playground/ExecutionLogs.svelte +71 -69
  60. package/dist/components/playground/InputCollector.svelte +59 -59
  61. package/dist/components/playground/MessageBubble.svelte +111 -112
  62. package/dist/components/playground/Playground.svelte +184 -138
  63. package/dist/components/playground/PlaygroundModal.svelte +18 -19
  64. package/dist/components/playground/SessionManager.svelte +68 -67
  65. package/dist/config/defaultPortConfig.js +22 -22
  66. package/dist/core/index.d.ts +2 -0
  67. package/dist/core/index.js +1 -0
  68. package/dist/form/fieldRegistry.d.ts +17 -1
  69. package/dist/form/fieldRegistry.js +18 -2
  70. package/dist/form/index.d.ts +20 -2
  71. package/dist/form/index.js +19 -1
  72. package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
  73. package/dist/helpers/nodeLayoutHelper.js +19 -0
  74. package/dist/helpers/workflowEditorHelper.js +23 -11
  75. package/dist/index.d.ts +5 -0
  76. package/dist/index.js +13 -0
  77. package/dist/services/autoSaveService.d.ts +112 -0
  78. package/dist/services/autoSaveService.js +223 -0
  79. package/dist/services/settingsService.d.ts +92 -0
  80. package/dist/services/settingsService.js +202 -0
  81. package/dist/services/toastService.d.ts +9 -0
  82. package/dist/services/toastService.js +30 -1
  83. package/dist/stores/settingsStore.d.ts +128 -0
  84. package/dist/stores/settingsStore.js +488 -0
  85. package/dist/stores/themeStore.d.ts +68 -0
  86. package/dist/stores/themeStore.js +215 -0
  87. package/dist/styles/base.css +338 -621
  88. package/dist/styles/toast.css +33 -0
  89. package/dist/styles/tokens.css +402 -0
  90. package/dist/types/index.d.ts +78 -0
  91. package/dist/types/index.js +2 -0
  92. package/dist/types/playground.d.ts +12 -0
  93. package/dist/types/settings.d.ts +185 -0
  94. package/dist/types/settings.js +101 -0
  95. package/dist/utils/colors.d.ts +100 -7
  96. package/dist/utils/colors.js +228 -67
  97. package/package.json +2 -2
@@ -49,10 +49,12 @@
49
49
  workflowId?: string;
50
50
  /** Whether to also save the workflow when saving config */
51
51
  saveWorkflowWhenSavingConfig?: boolean;
52
+ /** Callback when any field value changes (fired on blur for immediate sync) */
53
+ onChange?: (config: Record<string, unknown>, uiExtensions?: NodeUIExtensions) => void;
52
54
  /** Callback when form is saved (includes both config and extensions if enabled) */
53
- onSave: (config: Record<string, unknown>, uiExtensions?: NodeUIExtensions) => void;
55
+ onSave?: (config: Record<string, unknown>, uiExtensions?: NodeUIExtensions) => void;
54
56
  /** Callback when form is cancelled */
55
- onCancel: () => void;
57
+ onCancel?: () => void;
56
58
  }
57
59
 
58
60
  let {
@@ -62,6 +64,7 @@
62
64
  showUIExtensions = true,
63
65
  workflowId,
64
66
  saveWorkflowWhenSavingConfig = false,
67
+ onChange,
65
68
  onSave,
66
69
  onCancel
67
70
  }: Props = $props();
@@ -276,6 +279,18 @@
276
279
  configValues[key] = value;
277
280
  }
278
281
 
282
+ /**
283
+ * Handle form field blur - sync changes to workflow immediately
284
+ * Uses focusout which bubbles from child elements
285
+ * This enables auto-save behavior without requiring explicit Save button clicks
286
+ */
287
+ function handleFormBlur(): void {
288
+ if (onChange) {
289
+ const extensions = showUIExtensions && node ? uiExtensionValues : undefined;
290
+ onChange({ ...configValues }, extensions);
291
+ }
292
+ }
293
+
279
294
  /**
280
295
  * Handle form submission
281
296
  * Collects both config values and UI extension values
@@ -327,10 +342,12 @@
327
342
  }
328
343
 
329
344
  // Pass UI extensions only if enabled
330
- if (showUIExtensions && node) {
331
- onSave(updatedConfig, uiExtensionValues);
332
- } else {
333
- onSave(updatedConfig);
345
+ if (onSave) {
346
+ if (showUIExtensions && node) {
347
+ onSave(updatedConfig, uiExtensionValues);
348
+ } else {
349
+ onSave(updatedConfig);
350
+ }
334
351
  }
335
352
 
336
353
  // Save workflow if the option is enabled
@@ -424,9 +441,9 @@
424
441
  {:else if configSchema}
425
442
  <form
426
443
  class="config-form"
444
+ onfocusout={handleFormBlur}
427
445
  onsubmit={(e) => {
428
446
  e.preventDefault();
429
- handleSave();
430
447
  }}
431
448
  >
432
449
  <!-- Dynamic Schema Refresh Button -->
@@ -514,31 +531,35 @@
514
531
  </div>
515
532
  {/if}
516
533
 
517
- <!-- Footer Actions -->
518
- <div class="config-form__footer">
519
- <button
520
- type="button"
521
- class="config-form__button config-form__button--secondary"
522
- onclick={onCancel}
523
- disabled={isSavingWorkflow}
524
- >
525
- <Icon icon="heroicons:x-mark" class="config-form__button-icon" />
526
- <span>Cancel</span>
527
- </button>
528
- <button
529
- type="submit"
530
- class="config-form__button config-form__button--primary"
531
- disabled={isSavingWorkflow}
532
- >
533
- {#if isSavingWorkflow}
534
- <span class="config-form__button-spinner"></span>
535
- <span>Saving...</span>
536
- {:else}
537
- <Icon icon="heroicons:check" class="config-form__button-icon" />
538
- <span>Save Changes</span>
539
- {/if}
540
- </button>
541
- </div>
534
+ <!-- Footer Actions - Only shown when onSave is provided and onChange is not -->
535
+ <!-- With onChange (on-blur sync), changes are saved automatically, so no Save button needed -->
536
+ {#if onSave && !onChange}
537
+ <div class="config-form__footer">
538
+ <button
539
+ type="button"
540
+ class="config-form__button config-form__button--secondary"
541
+ onclick={onCancel}
542
+ disabled={isSavingWorkflow}
543
+ >
544
+ <Icon icon="heroicons:x-mark" class="config-form__button-icon" />
545
+ <span>Cancel</span>
546
+ </button>
547
+ <button
548
+ type="submit"
549
+ class="config-form__button config-form__button--primary"
550
+ onclick={handleSave}
551
+ disabled={isSavingWorkflow}
552
+ >
553
+ {#if isSavingWorkflow}
554
+ <span class="config-form__button-spinner"></span>
555
+ <span>Saving...</span>
556
+ {:else}
557
+ <Icon icon="heroicons:check" class="config-form__button-icon" />
558
+ <span>Save Changes</span>
559
+ {/if}
560
+ </button>
561
+ </div>
562
+ {/if}
542
563
  </form>
543
564
  {:else if !dynamicSchemaLoading && !showExternalEditLink}
544
565
  <div class="config-form__empty">
@@ -570,26 +591,27 @@
570
591
  .config-form {
571
592
  display: flex;
572
593
  flex-direction: column;
573
- gap: 1.5rem;
594
+ gap: var(--fd-space-6);
574
595
  }
575
596
 
576
597
  .config-form__fields {
577
598
  display: flex;
578
599
  flex-direction: column;
579
- gap: 1.25rem;
600
+ gap: var(--fd-space-5);
580
601
  }
581
602
 
582
603
  /* ============================================
583
604
  FOOTER ACTIONS
605
+ Only shown when onSave is provided (legacy mode without onChange)
584
606
  ============================================ */
585
607
 
586
608
  .config-form__footer {
587
609
  display: flex;
588
- gap: 0.75rem;
610
+ gap: var(--fd-space-3);
589
611
  justify-content: flex-end;
590
- padding-top: 1rem;
591
- border-top: 1px solid var(--color-ref-gray-100, #f3f4f6);
592
- margin-top: 0.5rem;
612
+ padding-top: var(--fd-space-4);
613
+ border-top: 1px solid var(--fd-border-muted);
614
+ margin-top: var(--fd-space-2);
593
615
  }
594
616
 
595
617
  /* Button Spinner */
@@ -602,18 +624,23 @@
602
624
  animation: config-form-spin 0.6s linear infinite;
603
625
  }
604
626
 
627
+ /* ============================================
628
+ SHARED BUTTON STYLES
629
+ Used by error actions, external config buttons, and footer
630
+ ============================================ */
631
+
605
632
  .config-form__button {
606
633
  display: inline-flex;
607
634
  align-items: center;
608
635
  justify-content: center;
609
- gap: 0.5rem;
610
- padding: 0.625rem 1rem;
611
- border-radius: 0.5rem;
612
- font-size: 0.875rem;
636
+ gap: var(--fd-space-2);
637
+ padding: 0.625rem var(--fd-space-4);
638
+ border-radius: var(--fd-radius-lg);
639
+ font-size: var(--fd-text-sm);
613
640
  font-weight: 600;
614
641
  font-family: inherit;
615
642
  cursor: pointer;
616
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
643
+ transition: all var(--fd-transition-normal);
617
644
  border: 1px solid transparent;
618
645
  min-height: 2.5rem;
619
646
  }
@@ -625,16 +652,16 @@
625
652
  }
626
653
 
627
654
  .config-form__button--secondary {
628
- background-color: #ffffff;
629
- border-color: var(--color-ref-gray-200, #e5e7eb);
630
- color: var(--color-ref-gray-700, #374151);
631
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
655
+ background-color: var(--fd-background);
656
+ border-color: var(--fd-border);
657
+ color: var(--fd-foreground);
658
+ box-shadow: var(--fd-shadow-sm);
632
659
  }
633
660
 
634
661
  .config-form__button--secondary:hover {
635
- background-color: var(--color-ref-gray-50, #f9fafb);
636
- border-color: var(--color-ref-gray-300, #d1d5db);
637
- color: var(--color-ref-gray-900, #111827);
662
+ background-color: var(--fd-muted);
663
+ border-color: var(--fd-border-strong);
664
+ color: var(--fd-foreground);
638
665
  }
639
666
 
640
667
  .config-form__button--secondary:focus-visible {
@@ -645,10 +672,10 @@
645
672
  .config-form__button--primary {
646
673
  background: linear-gradient(
647
674
  135deg,
648
- var(--color-ref-blue-500, #3b82f6) 0%,
649
- var(--color-ref-blue-600, #2563eb) 100%
675
+ var(--fd-primary) 0%,
676
+ var(--fd-primary-hover) 100%
650
677
  );
651
- color: #ffffff;
678
+ color: var(--fd-primary-foreground);
652
679
  box-shadow:
653
680
  0 1px 3px rgba(59, 130, 246, 0.3),
654
681
  inset 0 1px 0 rgba(255, 255, 255, 0.1);
@@ -657,8 +684,8 @@
657
684
  .config-form__button--primary:hover {
658
685
  background: linear-gradient(
659
686
  135deg,
660
- var(--color-ref-blue-600, #2563eb) 0%,
661
- var(--color-ref-blue-700, #1d4ed8) 100%
687
+ var(--fd-primary-hover) 0%,
688
+ var(--fd-primary-hover) 100%
662
689
  );
663
690
  box-shadow:
664
691
  0 4px 12px rgba(59, 130, 246, 0.35),
@@ -682,36 +709,36 @@
682
709
  ============================================ */
683
710
 
684
711
  .config-form__extensions {
685
- background-color: var(--color-ref-slate-50, #f8fafc);
686
- border: 1px solid var(--color-ref-slate-200, #e2e8f0);
687
- border-radius: 0.5rem;
712
+ background-color: var(--fd-muted);
713
+ border: 1px solid var(--fd-border);
714
+ border-radius: var(--fd-radius-lg);
688
715
  overflow: hidden;
689
- margin-top: 0.5rem;
716
+ margin-top: var(--fd-space-2);
690
717
  }
691
718
 
692
719
  .config-form__extensions-header {
693
720
  display: flex;
694
721
  align-items: center;
695
- gap: 0.5rem;
696
- padding: 0.75rem 1rem;
697
- background-color: var(--color-ref-slate-100, #f1f5f9);
698
- border-bottom: 1px solid var(--color-ref-slate-200, #e2e8f0);
722
+ gap: var(--fd-space-2);
723
+ padding: var(--fd-space-3) var(--fd-space-4);
724
+ background-color: var(--fd-subtle);
725
+ border-bottom: 1px solid var(--fd-border);
699
726
  font-size: 0.8125rem;
700
727
  font-weight: 600;
701
- color: var(--color-ref-slate-700, #334155);
728
+ color: var(--fd-foreground);
702
729
  }
703
730
 
704
731
  .config-form__extensions-header :global(svg) {
705
732
  width: 1rem;
706
733
  height: 1rem;
707
- color: var(--color-ref-slate-500, #64748b);
734
+ color: var(--fd-muted-foreground);
708
735
  }
709
736
 
710
737
  .config-form__extensions-content {
711
- padding: 1rem;
738
+ padding: var(--fd-space-4);
712
739
  display: flex;
713
740
  flex-direction: column;
714
- gap: 1rem;
741
+ gap: var(--fd-space-4);
715
742
  }
716
743
 
717
744
  /* ============================================
@@ -719,22 +746,22 @@
719
746
  ============================================ */
720
747
 
721
748
  .config-form__debug {
722
- background-color: var(--color-ref-amber-50, #fffbeb);
723
- border: 1px solid var(--color-ref-amber-200, #fde68a);
724
- border-radius: 0.5rem;
749
+ background-color: var(--fd-warning-muted);
750
+ border: 1px solid var(--fd-warning);
751
+ border-radius: var(--fd-radius-lg);
725
752
  overflow: hidden;
726
753
  }
727
754
 
728
755
  .config-form__debug-header {
729
756
  display: flex;
730
757
  align-items: center;
731
- gap: 0.5rem;
732
- padding: 0.75rem 1rem;
733
- background-color: var(--color-ref-amber-100, #fef3c7);
734
- border-bottom: 1px solid var(--color-ref-amber-200, #fde68a);
758
+ gap: var(--fd-space-2);
759
+ padding: var(--fd-space-3) var(--fd-space-4);
760
+ background-color: var(--fd-warning-muted);
761
+ border-bottom: 1px solid var(--fd-warning);
735
762
  font-size: 0.8125rem;
736
763
  font-weight: 600;
737
- color: var(--color-ref-amber-800, #92400e);
764
+ color: var(--fd-warning-hover);
738
765
  }
739
766
 
740
767
  .config-form__debug-header :global(svg) {
@@ -744,12 +771,12 @@
744
771
 
745
772
  .config-form__debug-content {
746
773
  margin: 0;
747
- padding: 1rem;
748
- font-size: 0.75rem;
774
+ padding: var(--fd-space-4);
775
+ font-size: var(--fd-text-xs);
749
776
  font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
750
- color: var(--color-ref-gray-700, #374151);
777
+ color: var(--fd-foreground);
751
778
  overflow-x: auto;
752
- background-color: #ffffff;
779
+ background-color: var(--fd-background);
753
780
  line-height: 1.5;
754
781
  }
755
782
 
@@ -762,15 +789,15 @@
762
789
  flex-direction: column;
763
790
  align-items: center;
764
791
  justify-content: center;
765
- padding: 3rem 1.5rem;
792
+ padding: var(--fd-space-12) var(--fd-space-6);
766
793
  text-align: center;
767
794
  }
768
795
 
769
796
  .config-form__empty-icon {
770
797
  width: 3rem;
771
798
  height: 3rem;
772
- margin-bottom: 1rem;
773
- color: var(--color-ref-gray-300, #d1d5db);
799
+ margin-bottom: var(--fd-space-4);
800
+ color: var(--fd-border);
774
801
  }
775
802
 
776
803
  .config-form__empty-icon :global(svg) {
@@ -780,14 +807,14 @@
780
807
 
781
808
  .config-form__empty-text {
782
809
  margin: 0;
783
- font-size: 0.875rem;
784
- color: var(--color-ref-gray-500, #6b7280);
810
+ font-size: var(--fd-text-sm);
811
+ color: var(--fd-muted-foreground);
785
812
  font-style: italic;
786
813
  line-height: 1.5;
787
814
  }
788
815
 
789
816
  .config-form__empty-button {
790
- margin-top: 1rem;
817
+ margin-top: var(--fd-space-4);
791
818
  }
792
819
 
793
820
  /* ============================================
@@ -795,42 +822,42 @@
795
822
  ============================================ */
796
823
 
797
824
  .config-form__admin-edit {
798
- background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);
799
- border: 1px solid var(--color-ref-blue-200, #bfdbfe);
825
+ background: linear-gradient(135deg, var(--fd-info-muted) 0%, var(--fd-primary-muted) 100%);
826
+ border: 1px solid var(--fd-primary);
800
827
  border-radius: 0.625rem;
801
828
  overflow: hidden;
802
- margin-bottom: 1rem;
829
+ margin-bottom: var(--fd-space-4);
803
830
  }
804
831
 
805
832
  .config-form__admin-edit-header {
806
833
  display: flex;
807
834
  align-items: center;
808
- gap: 0.5rem;
809
- padding: 0.75rem 1rem;
810
- background: linear-gradient(135deg, #dbeafe 0%, #bfdbfe 100%);
811
- border-bottom: 1px solid var(--color-ref-blue-200, #bfdbfe);
835
+ gap: var(--fd-space-2);
836
+ padding: var(--fd-space-3) var(--fd-space-4);
837
+ background: linear-gradient(135deg, var(--fd-primary-muted) 0%, var(--fd-primary-muted) 100%);
838
+ border-bottom: 1px solid var(--fd-primary);
812
839
  font-size: 0.8125rem;
813
840
  font-weight: 600;
814
- color: var(--color-ref-blue-800, #1e40af);
841
+ color: var(--fd-primary-hover);
815
842
  }
816
843
 
817
844
  .config-form__admin-edit-header :global(svg) {
818
845
  width: 1rem;
819
846
  height: 1rem;
820
- color: var(--color-ref-blue-600, #2563eb);
847
+ color: var(--fd-primary);
821
848
  }
822
849
 
823
850
  .config-form__admin-edit-content {
824
- padding: 1rem;
851
+ padding: var(--fd-space-4);
825
852
  display: flex;
826
853
  flex-direction: column;
827
- gap: 0.75rem;
854
+ gap: var(--fd-space-3);
828
855
  }
829
856
 
830
857
  .config-form__admin-edit-description {
831
858
  margin: 0;
832
859
  font-size: 0.8125rem;
833
- color: var(--color-ref-blue-700, #1d4ed8);
860
+ color: var(--fd-primary-hover);
834
861
  line-height: 1.5;
835
862
  }
836
863
 
@@ -843,15 +870,15 @@
843
870
  flex-direction: column;
844
871
  align-items: center;
845
872
  justify-content: center;
846
- padding: 3rem 1.5rem;
847
- gap: 1rem;
873
+ padding: var(--fd-space-12) var(--fd-space-6);
874
+ gap: var(--fd-space-4);
848
875
  }
849
876
 
850
877
  .config-form__loading-spinner {
851
878
  width: 2.5rem;
852
879
  height: 2.5rem;
853
- border: 3px solid var(--color-ref-blue-100, #dbeafe);
854
- border-top-color: var(--color-ref-blue-500, #3b82f6);
880
+ border: 3px solid var(--fd-primary-muted);
881
+ border-top-color: var(--fd-primary);
855
882
  border-radius: 50%;
856
883
  animation: config-form-spin 0.8s linear infinite;
857
884
  }
@@ -864,8 +891,8 @@
864
891
 
865
892
  .config-form__loading-text {
866
893
  margin: 0;
867
- font-size: 0.875rem;
868
- color: var(--color-ref-gray-600, #4b5563);
894
+ font-size: var(--fd-text-sm);
895
+ color: var(--fd-muted-foreground);
869
896
  }
870
897
 
871
898
  /* ============================================
@@ -873,47 +900,47 @@
873
900
  ============================================ */
874
901
 
875
902
  .config-form__error {
876
- background-color: var(--color-ref-red-50, #fef2f2);
877
- border: 1px solid var(--color-ref-red-200, #fecaca);
878
- border-radius: 0.5rem;
903
+ background-color: var(--fd-error-muted);
904
+ border: 1px solid var(--fd-error);
905
+ border-radius: var(--fd-radius-lg);
879
906
  overflow: hidden;
880
907
  }
881
908
 
882
909
  .config-form__error-header {
883
910
  display: flex;
884
911
  align-items: center;
885
- gap: 0.5rem;
886
- padding: 0.75rem 1rem;
887
- background-color: var(--color-ref-red-100, #fee2e2);
888
- border-bottom: 1px solid var(--color-ref-red-200, #fecaca);
912
+ gap: var(--fd-space-2);
913
+ padding: var(--fd-space-3) var(--fd-space-4);
914
+ background-color: var(--fd-error-muted);
915
+ border-bottom: 1px solid var(--fd-error);
889
916
  font-size: 0.8125rem;
890
917
  font-weight: 600;
891
- color: var(--color-ref-red-800, #991b1b);
918
+ color: var(--fd-error-hover);
892
919
  }
893
920
 
894
921
  .config-form__error-header :global(svg) {
895
922
  width: 1rem;
896
923
  height: 1rem;
897
- color: var(--color-ref-red-600, #dc2626);
924
+ color: var(--fd-error);
898
925
  }
899
926
 
900
927
  .config-form__error-content {
901
- padding: 1rem;
928
+ padding: var(--fd-space-4);
902
929
  display: flex;
903
930
  flex-direction: column;
904
- gap: 0.75rem;
931
+ gap: var(--fd-space-3);
905
932
  }
906
933
 
907
934
  .config-form__error-message {
908
935
  margin: 0;
909
936
  font-size: 0.8125rem;
910
- color: var(--color-ref-red-700, #b91c1c);
937
+ color: var(--fd-error);
911
938
  line-height: 1.5;
912
939
  }
913
940
 
914
941
  .config-form__error-actions {
915
942
  display: flex;
916
- gap: 0.5rem;
943
+ gap: var(--fd-space-2);
917
944
  flex-wrap: wrap;
918
945
  }
919
946
 
@@ -923,37 +950,37 @@
923
950
 
924
951
  .config-form__schema-actions {
925
952
  display: flex;
926
- gap: 0.5rem;
927
- margin-bottom: 1rem;
928
- padding-bottom: 0.75rem;
929
- border-bottom: 1px solid var(--color-ref-gray-100, #f3f4f6);
953
+ gap: var(--fd-space-2);
954
+ margin-bottom: var(--fd-space-4);
955
+ padding-bottom: var(--fd-space-3);
956
+ border-bottom: 1px solid var(--fd-border-muted);
930
957
  }
931
958
 
932
959
  .config-form__schema-refresh,
933
960
  .config-form__schema-external {
934
961
  display: inline-flex;
935
962
  align-items: center;
936
- gap: 0.375rem;
937
- padding: 0.375rem 0.625rem;
938
- font-size: 0.75rem;
963
+ gap: var(--fd-space-1);
964
+ padding: var(--fd-space-1) var(--fd-space-2);
965
+ font-size: var(--fd-text-xs);
939
966
  font-weight: 500;
940
967
  font-family: inherit;
941
- border-radius: 0.375rem;
968
+ border-radius: var(--fd-radius-md);
942
969
  cursor: pointer;
943
- transition: all 0.15s ease;
970
+ transition: all var(--fd-transition-fast);
944
971
  border: 1px solid transparent;
945
972
  }
946
973
 
947
974
  .config-form__schema-refresh {
948
- background-color: var(--color-ref-gray-50, #f9fafb);
949
- border-color: var(--color-ref-gray-200, #e5e7eb);
950
- color: var(--color-ref-gray-600, #4b5563);
975
+ background-color: var(--fd-muted);
976
+ border-color: var(--fd-border);
977
+ color: var(--fd-muted-foreground);
951
978
  }
952
979
 
953
980
  .config-form__schema-refresh:hover {
954
- background-color: var(--color-ref-gray-100, #f3f4f6);
955
- border-color: var(--color-ref-gray-300, #d1d5db);
956
- color: var(--color-ref-gray-700, #374151);
981
+ background-color: var(--fd-subtle);
982
+ border-color: var(--fd-border-strong);
983
+ color: var(--fd-foreground);
957
984
  }
958
985
 
959
986
  .config-form__schema-refresh :global(svg),
@@ -963,15 +990,15 @@
963
990
  }
964
991
 
965
992
  .config-form__schema-external {
966
- background-color: var(--color-ref-blue-50, #eff6ff);
967
- border-color: var(--color-ref-blue-200, #bfdbfe);
968
- color: var(--color-ref-blue-700, #1d4ed8);
993
+ background-color: var(--fd-primary-muted);
994
+ border-color: var(--fd-primary);
995
+ color: var(--fd-primary-hover);
969
996
  }
970
997
 
971
998
  .config-form__schema-external:hover {
972
- background-color: var(--color-ref-blue-100, #dbeafe);
973
- border-color: var(--color-ref-blue-300, #93c5fd);
974
- color: var(--color-ref-blue-800, #1e40af);
999
+ background-color: var(--fd-primary-muted);
1000
+ border-color: var(--fd-primary-hover);
1001
+ color: var(--fd-primary-hover);
975
1002
  }
976
1003
 
977
1004
  /* ============================================
@@ -981,10 +1008,10 @@
981
1008
  .config-form__button--external {
982
1009
  background: linear-gradient(
983
1010
  135deg,
984
- var(--color-ref-indigo-500, #6366f1) 0%,
985
- var(--color-ref-blue-600, #2563eb) 100%
1011
+ var(--fd-accent) 0%,
1012
+ var(--fd-primary) 100%
986
1013
  );
987
- color: #ffffff;
1014
+ color: var(--fd-accent-foreground);
988
1015
  box-shadow:
989
1016
  0 1px 3px rgba(99, 102, 241, 0.3),
990
1017
  inset 0 1px 0 rgba(255, 255, 255, 0.1);
@@ -993,8 +1020,8 @@
993
1020
  .config-form__button--external:hover {
994
1021
  background: linear-gradient(
995
1022
  135deg,
996
- var(--color-ref-indigo-600, #4f46e5) 0%,
997
- var(--color-ref-blue-700, #1d4ed8) 100%
1023
+ var(--fd-accent-hover) 0%,
1024
+ var(--fd-primary-hover) 100%
998
1025
  );
999
1026
  box-shadow:
1000
1027
  0 4px 12px rgba(99, 102, 241, 0.35),
@@ -12,10 +12,12 @@ interface Props {
12
12
  workflowId?: string;
13
13
  /** Whether to also save the workflow when saving config */
14
14
  saveWorkflowWhenSavingConfig?: boolean;
15
+ /** Callback when any field value changes (fired on blur for immediate sync) */
16
+ onChange?: (config: Record<string, unknown>, uiExtensions?: NodeUIExtensions) => void;
15
17
  /** Callback when form is saved (includes both config and extensions if enabled) */
16
- onSave: (config: Record<string, unknown>, uiExtensions?: NodeUIExtensions) => void;
18
+ onSave?: (config: Record<string, unknown>, uiExtensions?: NodeUIExtensions) => void;
17
19
  /** Callback when form is cancelled */
18
- onCancel: () => void;
20
+ onCancel?: () => void;
19
21
  }
20
22
  declare const ConfigForm: import("svelte").Component<Props, {}, "">;
21
23
  type ConfigForm = ReturnType<typeof ConfigForm>;