@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
@@ -343,25 +343,25 @@
343
343
  }
344
344
 
345
345
  .form-template-editor__container {
346
- border: 1px solid var(--color-ref-gray-200, #e5e7eb);
347
- border-radius: 0.5rem;
346
+ border: 1px solid var(--fd-border);
347
+ border-radius: var(--fd-radius-lg);
348
348
  overflow: hidden;
349
- background-color: var(--color-ref-gray-50, #f9fafb);
350
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
351
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
349
+ background-color: var(--fd-muted);
350
+ transition: all var(--fd-transition-normal);
351
+ box-shadow: var(--fd-shadow-sm);
352
352
  }
353
353
 
354
354
  .form-template-editor__container:hover {
355
- border-color: var(--color-ref-gray-300, #d1d5db);
356
- background-color: #ffffff;
355
+ border-color: var(--fd-border-strong);
356
+ background-color: var(--fd-background);
357
357
  }
358
358
 
359
359
  .form-template-editor__container:focus-within {
360
- border-color: var(--color-ref-purple-500, #a855f7);
361
- background-color: #ffffff;
360
+ border-color: var(--fd-accent);
361
+ background-color: var(--fd-background);
362
362
  box-shadow:
363
363
  0 0 0 3px rgba(168, 85, 247, 0.12),
364
- 0 1px 2px rgba(0, 0, 0, 0.04);
364
+ var(--fd-shadow-sm);
365
365
  }
366
366
 
367
367
  /* Dark theme overrides */
@@ -376,13 +376,13 @@
376
376
 
377
377
  /* CodeMirror styling overrides */
378
378
  .form-template-editor__container :global(.cm-editor) {
379
- border-radius: 0.5rem;
379
+ border-radius: var(--fd-radius-lg);
380
380
  }
381
381
 
382
382
  .form-template-editor__container :global(.cm-gutters) {
383
- background-color: var(--color-ref-gray-100, #f3f4f6);
384
- border-right: 1px solid var(--color-ref-gray-200, #e5e7eb);
385
- border-radius: 0.5rem 0 0 0.5rem;
383
+ background-color: var(--fd-subtle);
384
+ border-right: 1px solid var(--fd-border);
385
+ border-radius: var(--fd-radius-lg) 0 0 var(--fd-radius-lg);
386
386
  }
387
387
 
388
388
  .form-template-editor__container--dark :global(.cm-gutters) {
@@ -394,16 +394,16 @@
394
394
  .form-template-editor__hints {
395
395
  margin-top: 0.625rem;
396
396
  padding: 0.625rem;
397
- background-color: var(--color-ref-purple-50, #faf5ff);
398
- border: 1px solid var(--color-ref-purple-200, #e9d5ff);
399
- border-radius: 0.375rem;
397
+ background-color: var(--fd-accent-muted);
398
+ border: 1px solid var(--fd-accent);
399
+ border-radius: var(--fd-radius-md);
400
400
  }
401
401
 
402
402
  .form-template-editor__hints-label {
403
403
  display: block;
404
404
  font-size: 0.6875rem;
405
405
  font-weight: 500;
406
- color: var(--color-ref-purple-700, #7e22ce);
406
+ color: var(--fd-accent-hover);
407
407
  text-transform: uppercase;
408
408
  letter-spacing: 0.05em;
409
409
  margin-bottom: 0.375rem;
@@ -417,16 +417,16 @@
417
417
 
418
418
  .form-template-editor__hint-btn {
419
419
  padding: 0.25rem 0.5rem;
420
- background-color: var(--color-ref-purple-100, #f3e8ff);
421
- border: 1px solid var(--color-ref-purple-300, #d8b4fe);
422
- border-radius: 0.25rem;
420
+ background-color: var(--fd-accent-muted);
421
+ border: 1px solid var(--fd-accent);
422
+ border-radius: var(--fd-radius-sm);
423
423
  cursor: pointer;
424
- transition: all 0.15s ease;
424
+ transition: all var(--fd-transition-fast);
425
425
  }
426
426
 
427
427
  .form-template-editor__hint-btn:hover {
428
- background-color: var(--color-ref-purple-200, #e9d5ff);
429
- border-color: var(--color-ref-purple-400, #c084fc);
428
+ background-color: var(--fd-accent);
429
+ border-color: var(--fd-accent-hover);
430
430
  }
431
431
 
432
432
  .form-template-editor__hint-btn:active {
@@ -436,23 +436,23 @@
436
436
  .form-template-editor__hint-btn code {
437
437
  font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', 'Menlo', monospace;
438
438
  font-size: 0.6875rem;
439
- color: var(--color-ref-purple-800, #6b21a8);
439
+ color: var(--fd-accent-hover);
440
440
  }
441
441
 
442
442
  /* Placeholder hint */
443
443
  .form-template-editor__placeholder {
444
444
  margin-top: 0.5rem;
445
445
  padding: 0.5rem 0.75rem;
446
- background-color: var(--color-ref-gray-50, #f9fafb);
447
- border: 1px dashed var(--color-ref-gray-300, #d1d5db);
448
- border-radius: 0.375rem;
446
+ background-color: var(--fd-muted);
447
+ border: 1px dashed var(--fd-border-strong);
448
+ border-radius: var(--fd-radius-md);
449
449
  }
450
450
 
451
451
  .form-template-editor__placeholder-label {
452
452
  display: block;
453
453
  font-size: 0.6875rem;
454
454
  font-weight: 500;
455
- color: var(--color-ref-gray-500, #6b7280);
455
+ color: var(--fd-muted-foreground);
456
456
  text-transform: uppercase;
457
457
  letter-spacing: 0.05em;
458
458
  margin-bottom: 0.25rem;
@@ -461,8 +461,8 @@
461
461
  .form-template-editor__placeholder-example {
462
462
  display: block;
463
463
  font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', 'Menlo', monospace;
464
- font-size: 0.75rem;
465
- color: var(--color-ref-gray-700, #374151);
464
+ font-size: var(--fd-text-xs);
465
+ color: var(--fd-foreground);
466
466
  word-break: break-all;
467
467
  }
468
468
 
@@ -473,7 +473,7 @@
473
473
  gap: 0.375rem;
474
474
  margin-top: 0.5rem;
475
475
  font-size: 0.6875rem;
476
- color: var(--color-ref-gray-500, #6b7280);
476
+ color: var(--fd-muted-foreground);
477
477
  }
478
478
 
479
479
  .form-template-editor__help-icon {
@@ -485,8 +485,8 @@
485
485
 
486
486
  .form-template-editor__help code {
487
487
  padding: 0.0625rem 0.25rem;
488
- background-color: var(--color-ref-gray-100, #f3f4f6);
489
- border-radius: 0.1875rem;
488
+ background-color: var(--fd-subtle);
489
+ border-radius: var(--fd-radius-sm);
490
490
  font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', 'Menlo', monospace;
491
491
  font-size: 0.625rem;
492
492
  }
@@ -57,31 +57,31 @@
57
57
  .form-text-field {
58
58
  width: 100%;
59
59
  padding: 0.625rem 0.875rem;
60
- border: 1px solid var(--color-ref-gray-200, #e5e7eb);
61
- border-radius: 0.5rem;
62
- font-size: 0.875rem;
60
+ border: 1px solid var(--fd-border);
61
+ border-radius: var(--fd-radius-lg);
62
+ font-size: var(--fd-text-sm);
63
63
  font-family: inherit;
64
- color: var(--color-ref-gray-900, #111827);
65
- background-color: var(--color-ref-gray-50, #f9fafb);
66
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
67
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
64
+ color: var(--fd-foreground);
65
+ background-color: var(--fd-muted);
66
+ transition: all var(--fd-transition-normal);
67
+ box-shadow: var(--fd-shadow-sm);
68
68
  }
69
69
 
70
70
  .form-text-field::placeholder {
71
- color: var(--color-ref-gray-400, #9ca3af);
71
+ color: var(--fd-muted-foreground);
72
72
  }
73
73
 
74
74
  .form-text-field:hover {
75
- border-color: var(--color-ref-gray-300, #d1d5db);
76
- background-color: #ffffff;
75
+ border-color: var(--fd-border-strong);
76
+ background-color: var(--fd-background);
77
77
  }
78
78
 
79
79
  .form-text-field:focus {
80
80
  outline: none;
81
- border-color: var(--color-ref-blue-500, #3b82f6);
82
- background-color: #ffffff;
81
+ border-color: var(--fd-primary);
82
+ background-color: var(--fd-background);
83
83
  box-shadow:
84
84
  0 0 0 3px rgba(59, 130, 246, 0.12),
85
- 0 1px 2px rgba(0, 0, 0, 0.04);
85
+ var(--fd-shadow-sm);
86
86
  }
87
87
  </style>
@@ -60,34 +60,34 @@
60
60
  .form-textarea {
61
61
  width: 100%;
62
62
  padding: 0.625rem 0.875rem;
63
- border: 1px solid var(--color-ref-gray-200, #e5e7eb);
64
- border-radius: 0.5rem;
65
- font-size: 0.875rem;
63
+ border: 1px solid var(--fd-border);
64
+ border-radius: var(--fd-radius-lg);
65
+ font-size: var(--fd-text-sm);
66
66
  font-family: inherit;
67
- color: var(--color-ref-gray-900, #111827);
68
- background-color: var(--color-ref-gray-50, #f9fafb);
69
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
70
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
67
+ color: var(--fd-foreground);
68
+ background-color: var(--fd-muted);
69
+ transition: all var(--fd-transition-normal);
70
+ box-shadow: var(--fd-shadow-sm);
71
71
  resize: vertical;
72
72
  min-height: 5rem;
73
73
  line-height: 1.5;
74
74
  }
75
75
 
76
76
  .form-textarea::placeholder {
77
- color: var(--color-ref-gray-400, #9ca3af);
77
+ color: var(--fd-muted-foreground);
78
78
  }
79
79
 
80
80
  .form-textarea:hover {
81
- border-color: var(--color-ref-gray-300, #d1d5db);
82
- background-color: #ffffff;
81
+ border-color: var(--fd-border-strong);
82
+ background-color: var(--fd-background);
83
83
  }
84
84
 
85
85
  .form-textarea:focus {
86
86
  outline: none;
87
- border-color: var(--color-ref-blue-500, #3b82f6);
88
- background-color: #ffffff;
87
+ border-color: var(--fd-primary);
88
+ background-color: var(--fd-background);
89
89
  box-shadow:
90
90
  0 0 0 3px rgba(59, 130, 246, 0.12),
91
- 0 1px 2px rgba(0, 0, 0, 0.04);
91
+ var(--fd-shadow-sm);
92
92
  }
93
93
  </style>
@@ -79,9 +79,9 @@
79
79
  position: relative;
80
80
  width: 2.75rem;
81
81
  height: 1.5rem;
82
- background-color: var(--color-ref-gray-300, #d1d5db);
82
+ background-color: var(--fd-border-strong);
83
83
  border-radius: 0.75rem;
84
- transition: background-color 0.2s;
84
+ transition: background-color var(--fd-transition-normal);
85
85
  flex-shrink: 0;
86
86
  }
87
87
 
@@ -91,14 +91,14 @@
91
91
  left: 0.125rem;
92
92
  width: 1.25rem;
93
93
  height: 1.25rem;
94
- background-color: #ffffff;
94
+ background-color: var(--fd-background);
95
95
  border-radius: 50%;
96
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
96
+ box-shadow: var(--fd-shadow-sm);
97
97
  transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
98
98
  }
99
99
 
100
100
  .form-toggle__input:checked + .form-toggle__track {
101
- background-color: var(--color-ref-blue-500, #3b82f6);
101
+ background-color: var(--fd-primary);
102
102
  }
103
103
 
104
104
  .form-toggle__input:checked + .form-toggle__track .form-toggle__thumb {
@@ -110,13 +110,13 @@
110
110
  }
111
111
 
112
112
  .form-toggle__label {
113
- font-size: 0.875rem;
114
- color: var(--color-ref-gray-600, #4b5563);
113
+ font-size: var(--fd-text-sm);
114
+ color: var(--fd-muted-foreground);
115
115
  font-weight: 500;
116
116
  min-width: 4.5rem;
117
117
  }
118
118
 
119
119
  .form-toggle__input:checked ~ .form-toggle__label {
120
- color: var(--color-ref-blue-600, #2563eb);
120
+ color: var(--fd-primary-hover);
121
121
  }
122
122
  </style>
@@ -43,3 +43,4 @@ export { default as FormArray } from './FormArray.svelte';
43
43
  export { default as FormCodeEditor } from './FormCodeEditor.svelte';
44
44
  export { default as FormMarkdownEditor } from './FormMarkdownEditor.svelte';
45
45
  export { default as FormTemplateEditor } from './FormTemplateEditor.svelte';
46
+ export { default as FormAutocomplete } from './FormAutocomplete.svelte';
@@ -47,3 +47,4 @@ export { default as FormArray } from './FormArray.svelte';
47
47
  export { default as FormCodeEditor } from './FormCodeEditor.svelte';
48
48
  export { default as FormMarkdownEditor } from './FormMarkdownEditor.svelte';
49
49
  export { default as FormTemplateEditor } from './FormTemplateEditor.svelte';
50
+ export { default as FormAutocomplete } from './FormAutocomplete.svelte';
@@ -5,11 +5,16 @@
5
5
  * These types provide a foundation for dynamic form rendering based on JSON Schema
6
6
  * and support extensibility for complex field types like arrays and objects.
7
7
  */
8
+ import type { AutocompleteConfig } from '../../types/index.js';
8
9
  /**
9
10
  * Supported field types for form rendering
10
- * Can be extended to support complex types like 'array' and 'object'
11
+ * Aligned with JSON Schema specification (draft-07)
12
+ *
13
+ * Note: 'select' type was removed in favor of using standard JSON Schema patterns:
14
+ * - Use `enum` for simple value lists
15
+ * - Use `oneOf` with `const`/`title` for labeled options
11
16
  */
12
- export type FieldType = 'string' | 'number' | 'integer' | 'boolean' | 'select' | 'array' | 'object';
17
+ export type FieldType = 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object';
13
18
  /**
14
19
  * Field format for specialized rendering
15
20
  * - multiline: Renders as textarea
@@ -19,10 +24,25 @@ export type FieldType = 'string' | 'number' | 'integer' | 'boolean' | 'select' |
19
24
  * - code: Alias for json, renders as CodeMirror editor
20
25
  * - markdown: Renders as SimpleMDE Markdown editor
21
26
  * - template: Renders as CodeMirror editor with Twig/Liquid syntax highlighting
27
+ * - autocomplete: Renders as text input with autocomplete suggestions from callback URL
22
28
  */
23
- export type FieldFormat = 'multiline' | 'hidden' | 'range' | 'json' | 'code' | 'markdown' | 'template' | string;
29
+ export type FieldFormat = 'multiline' | 'hidden' | 'range' | 'json' | 'code' | 'markdown' | 'template' | 'autocomplete' | string;
24
30
  /**
25
31
  * Option type for select and checkbox group fields
32
+ *
33
+ * @deprecated Use JSON Schema `oneOf` with `const`/`title` instead for labeled options.
34
+ * This type is kept for backwards compatibility but will be removed in a future version.
35
+ *
36
+ * @example Standard JSON Schema approach:
37
+ * ```json
38
+ * {
39
+ * "type": "string",
40
+ * "oneOf": [
41
+ * { "const": "draft", "title": "Draft" },
42
+ * { "const": "published", "title": "Published" }
43
+ * ]
44
+ * }
45
+ * ```
26
46
  */
27
47
  export interface FieldOption {
28
48
  /** The value stored when this option is selected */
@@ -30,6 +50,29 @@ export interface FieldOption {
30
50
  /** The display label for this option */
31
51
  label: string;
32
52
  }
53
+ /**
54
+ * JSON Schema oneOf item for labeled options
55
+ * This is the standard JSON Schema way to define labeled select options
56
+ *
57
+ * @example
58
+ * ```json
59
+ * {
60
+ * "type": "string",
61
+ * "oneOf": [
62
+ * { "const": "draft", "title": "Draft" },
63
+ * { "const": "published", "title": "Published" }
64
+ * ]
65
+ * }
66
+ * ```
67
+ */
68
+ export interface OneOfItem {
69
+ /** The constant value for this option (JSON Schema `const` keyword) */
70
+ const: string | number | boolean;
71
+ /** Human-readable label for this option (JSON Schema `title` keyword) */
72
+ title?: string;
73
+ /** Optional description for this option */
74
+ description?: string;
75
+ }
33
76
  /**
34
77
  * Base properties shared by all form fields
35
78
  */
@@ -184,9 +227,33 @@ export interface TemplateEditorFieldProps extends BaseFieldProps {
184
227
  /** Callback when value changes */
185
228
  onChange: (value: string) => void;
186
229
  }
230
+ /**
231
+ * Properties for autocomplete fields
232
+ * Fetches suggestions from a callback URL with support for debouncing and keyboard navigation
233
+ */
234
+ export interface AutocompleteFieldProps extends BaseFieldProps {
235
+ /** Current value (single string or array of strings for multiple selection) */
236
+ value: string | string[];
237
+ /** Autocomplete configuration from schema */
238
+ autocomplete: AutocompleteConfig;
239
+ /** Base URL for resolving relative callback URLs */
240
+ baseUrl?: string;
241
+ /** Callback when value changes */
242
+ onChange: (value: string | string[]) => void;
243
+ }
244
+ /**
245
+ * Autocomplete configuration imported from main types
246
+ * Re-exported here for convenience
247
+ */
248
+ export type { AutocompleteConfig } from '../../types/index.js';
187
249
  /**
188
250
  * Field schema definition derived from JSON Schema property
189
251
  * Used to determine which field component to render
252
+ *
253
+ * FlowDrop follows JSON Schema draft-07 specification for field definitions.
254
+ * For select/dropdown fields, use standard JSON Schema patterns:
255
+ * - `enum` for simple value lists (no labels)
256
+ * - `oneOf` with `const`/`title` for labeled options
190
257
  */
191
258
  export interface FieldSchema {
192
259
  /** The field type from JSON Schema */
@@ -197,13 +264,33 @@ export interface FieldSchema {
197
264
  description?: string;
198
265
  /** Default value for the field */
199
266
  default?: unknown;
200
- /** Enum values for select/checkbox fields */
267
+ /** Enum values for select/checkbox fields (simple values without labels) */
201
268
  enum?: unknown[];
202
- /** Whether multiple values can be selected */
269
+ /**
270
+ * JSON Schema oneOf for labeled options (standard approach)
271
+ * Use this instead of the deprecated `options` property
272
+ *
273
+ * @example
274
+ * ```json
275
+ * {
276
+ * "type": "string",
277
+ * "oneOf": [
278
+ * { "const": "draft", "title": "Draft" },
279
+ * { "const": "published", "title": "Published" }
280
+ * ]
281
+ * }
282
+ * ```
283
+ */
284
+ oneOf?: OneOfItem[];
285
+ /** Whether multiple values can be selected (for enum/oneOf) */
203
286
  multiple?: boolean;
204
287
  /** Format hint for specialized rendering */
205
288
  format?: FieldFormat;
206
- /** Options for select type fields (alternative to enum) */
289
+ /**
290
+ * Options for select type fields
291
+ * @deprecated Use JSON Schema `oneOf` with `const`/`title` instead.
292
+ * This property is kept for backwards compatibility but will be removed in a future version.
293
+ */
207
294
  options?: FieldOption[];
208
295
  /** Placeholder text */
209
296
  placeholder?: string;
@@ -229,6 +316,8 @@ export interface FieldSchema {
229
316
  properties?: Record<string, FieldSchema>;
230
317
  /** Required properties for object fields (future use) */
231
318
  required?: string[];
319
+ /** Autocomplete configuration for fetching suggestions from callback URL */
320
+ autocomplete?: AutocompleteConfig;
232
321
  /** Allow additional properties not defined by the schema */
233
322
  [key: string]: unknown;
234
323
  }
@@ -270,11 +359,37 @@ export interface FormFieldWrapperProps {
270
359
  * Type guard to check if options are FieldOption objects
271
360
  */
272
361
  export declare function isFieldOptionArray(options: FieldOption[] | string[]): options is FieldOption[];
362
+ /**
363
+ * Type guard to check if items are OneOfItem objects (JSON Schema oneOf pattern)
364
+ */
365
+ export declare function isOneOfArray(items: unknown[]): items is OneOfItem[];
366
+ /**
367
+ * Convert JSON Schema oneOf items to FieldOption format
368
+ * This bridges the standard oneOf pattern to the internal FieldOption structure
369
+ *
370
+ * @param oneOfItems - Array of JSON Schema oneOf items with const/title
371
+ * @returns Array of FieldOption objects
372
+ */
373
+ export declare function oneOfToOptions(oneOfItems: OneOfItem[]): FieldOption[];
273
374
  /**
274
375
  * Normalize options to FieldOption format
275
- * Converts string arrays to FieldOption arrays for consistent handling
376
+ * Handles multiple input formats for consistent internal handling:
377
+ * - JSON Schema oneOf items (standard) -> converted to FieldOption
378
+ * - FieldOption array (legacy) -> passed through
379
+ * - String array -> converted to FieldOption
380
+ *
381
+ * @param options - Options in various formats
382
+ * @returns Normalized FieldOption array
383
+ */
384
+ export declare function normalizeOptions(options: FieldOption[] | string[] | OneOfItem[] | unknown[]): FieldOption[];
385
+ /**
386
+ * Get options from a schema, handling both oneOf (standard) and options (legacy) patterns
387
+ * Prefers oneOf if both are present
388
+ *
389
+ * @param schema - Field schema that may contain oneOf or options
390
+ * @returns Normalized FieldOption array
276
391
  */
277
- export declare function normalizeOptions(options: FieldOption[] | string[] | unknown[]): FieldOption[];
392
+ export declare function getSchemaOptions(schema: FieldSchema): FieldOption[];
278
393
  /**
279
394
  * Props interface for the SchemaForm component
280
395
  *
@@ -370,4 +485,14 @@ export interface SchemaFormProps {
370
485
  * Use for additional styling customization.
371
486
  */
372
487
  class?: string;
488
+ /**
489
+ * Authentication provider for autocomplete fields.
490
+ * Used to add authentication headers when fetching suggestions from callback URLs.
491
+ */
492
+ authProvider?: import('../../types/index.js').AuthProvider;
493
+ /**
494
+ * Base URL for resolving relative autocomplete callback URLs.
495
+ * @default ""
496
+ */
497
+ baseUrl?: string;
373
498
  }
@@ -11,19 +11,68 @@
11
11
  export function isFieldOptionArray(options) {
12
12
  return options.length > 0 && typeof options[0] === 'object' && 'value' in options[0];
13
13
  }
14
+ /**
15
+ * Type guard to check if items are OneOfItem objects (JSON Schema oneOf pattern)
16
+ */
17
+ export function isOneOfArray(items) {
18
+ return items.length > 0 && typeof items[0] === 'object' && items[0] !== null && 'const' in items[0];
19
+ }
20
+ /**
21
+ * Convert JSON Schema oneOf items to FieldOption format
22
+ * This bridges the standard oneOf pattern to the internal FieldOption structure
23
+ *
24
+ * @param oneOfItems - Array of JSON Schema oneOf items with const/title
25
+ * @returns Array of FieldOption objects
26
+ */
27
+ export function oneOfToOptions(oneOfItems) {
28
+ return oneOfItems.map((item) => ({
29
+ value: String(item.const),
30
+ label: item.title ?? String(item.const)
31
+ }));
32
+ }
14
33
  /**
15
34
  * Normalize options to FieldOption format
16
- * Converts string arrays to FieldOption arrays for consistent handling
35
+ * Handles multiple input formats for consistent internal handling:
36
+ * - JSON Schema oneOf items (standard) -> converted to FieldOption
37
+ * - FieldOption array (legacy) -> passed through
38
+ * - String array -> converted to FieldOption
39
+ *
40
+ * @param options - Options in various formats
41
+ * @returns Normalized FieldOption array
17
42
  */
18
43
  export function normalizeOptions(options) {
19
44
  if (!options || options.length === 0) {
20
45
  return [];
21
46
  }
47
+ // Handle JSON Schema oneOf pattern (standard)
48
+ if (isOneOfArray(options)) {
49
+ return oneOfToOptions(options);
50
+ }
51
+ // Handle FieldOption array (legacy, deprecated)
22
52
  if (isFieldOptionArray(options)) {
23
53
  return options;
24
54
  }
55
+ // Handle string array (simple enum values)
25
56
  return options.map((opt) => ({
26
57
  value: String(opt),
27
58
  label: String(opt)
28
59
  }));
29
60
  }
61
+ /**
62
+ * Get options from a schema, handling both oneOf (standard) and options (legacy) patterns
63
+ * Prefers oneOf if both are present
64
+ *
65
+ * @param schema - Field schema that may contain oneOf or options
66
+ * @returns Normalized FieldOption array
67
+ */
68
+ export function getSchemaOptions(schema) {
69
+ // Prefer standard oneOf pattern
70
+ if (schema.oneOf && schema.oneOf.length > 0) {
71
+ return oneOfToOptions(schema.oneOf);
72
+ }
73
+ // Fall back to deprecated options property
74
+ if (schema.options && schema.options.length > 0) {
75
+ return schema.options;
76
+ }
77
+ return [];
78
+ }