@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.
- package/README.md +8 -8
- package/dist/api/enhanced-client.d.ts +3 -1
- package/dist/api/enhanced-client.js +35 -5
- package/dist/components/App.svelte +68 -34
- package/dist/components/ConfigForm.svelte +169 -142
- package/dist/components/ConfigForm.svelte.d.ts +4 -2
- package/dist/components/ConfigPanel.svelte +42 -15
- package/dist/components/LogsSidebar.svelte +20 -19
- package/dist/components/Navbar.svelte +150 -80
- package/dist/components/Navbar.svelte.d.ts +8 -0
- package/dist/components/NodeSidebar.svelte +334 -217
- package/dist/components/PipelineStatus.svelte +6 -1
- package/dist/components/ReadOnlyDetails.svelte +14 -14
- package/dist/components/SchemaForm.svelte +49 -30
- package/dist/components/SchemaForm.svelte.d.ts +11 -1
- package/dist/components/SettingsModal.svelte +279 -0
- package/dist/components/SettingsModal.svelte.d.ts +23 -0
- package/dist/components/SettingsPanel.svelte +615 -0
- package/dist/components/SettingsPanel.svelte.d.ts +21 -0
- package/dist/components/ThemeToggle.svelte +186 -0
- package/dist/components/ThemeToggle.svelte.d.ts +14 -0
- package/dist/components/WorkflowEditor.svelte +114 -38
- package/dist/components/form/FormArray.svelte +81 -81
- package/dist/components/form/FormAutocomplete.svelte +1014 -0
- package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
- package/dist/components/form/FormCheckboxGroup.svelte +16 -16
- package/dist/components/form/FormCodeEditor.svelte +26 -26
- package/dist/components/form/FormField.svelte +52 -21
- package/dist/components/form/FormFieldLight.svelte +19 -19
- package/dist/components/form/FormFieldWrapper.svelte +4 -4
- package/dist/components/form/FormMarkdownEditor.svelte +124 -57
- package/dist/components/form/FormNumberField.svelte +13 -13
- package/dist/components/form/FormRangeField.svelte +16 -16
- package/dist/components/form/FormSelect.svelte +15 -15
- package/dist/components/form/FormTemplateEditor.svelte +34 -34
- package/dist/components/form/FormTextField.svelte +13 -13
- package/dist/components/form/FormTextarea.svelte +13 -13
- package/dist/components/form/FormToggle.svelte +8 -8
- package/dist/components/form/index.d.ts +1 -0
- package/dist/components/form/index.js +1 -0
- package/dist/components/form/types.d.ts +133 -8
- package/dist/components/form/types.js +50 -1
- package/dist/components/interrupt/ChoicePrompt.svelte +45 -38
- package/dist/components/interrupt/ConfirmationPrompt.svelte +35 -35
- package/dist/components/interrupt/FormPrompt.svelte +27 -20
- package/dist/components/interrupt/InterruptBubble.svelte +50 -50
- package/dist/components/interrupt/TextInputPrompt.svelte +39 -32
- package/dist/components/layouts/MainLayout.svelte +233 -34
- package/dist/components/layouts/MainLayout.svelte.d.ts +12 -0
- package/dist/components/nodes/GatewayNode.svelte +175 -125
- package/dist/components/nodes/IdeaNode.svelte +70 -84
- package/dist/components/nodes/NotesNode.svelte +124 -88
- package/dist/components/nodes/SimpleNode.svelte +91 -69
- package/dist/components/nodes/SquareNode.svelte +102 -75
- package/dist/components/nodes/TerminalNode.svelte +127 -113
- package/dist/components/nodes/ToolNode.svelte +125 -76
- package/dist/components/nodes/WorkflowNode.svelte +164 -108
- package/dist/components/playground/ChatPanel.svelte +76 -76
- package/dist/components/playground/ExecutionLogs.svelte +71 -69
- package/dist/components/playground/InputCollector.svelte +59 -59
- package/dist/components/playground/MessageBubble.svelte +111 -112
- package/dist/components/playground/Playground.svelte +184 -138
- package/dist/components/playground/PlaygroundModal.svelte +18 -19
- package/dist/components/playground/SessionManager.svelte +68 -67
- package/dist/config/defaultPortConfig.js +22 -22
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +1 -0
- package/dist/form/fieldRegistry.d.ts +17 -1
- package/dist/form/fieldRegistry.js +18 -2
- package/dist/form/index.d.ts +20 -2
- package/dist/form/index.js +19 -1
- package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
- package/dist/helpers/nodeLayoutHelper.js +19 -0
- package/dist/helpers/workflowEditorHelper.js +23 -11
- package/dist/index.d.ts +5 -0
- package/dist/index.js +13 -0
- package/dist/services/autoSaveService.d.ts +112 -0
- package/dist/services/autoSaveService.js +223 -0
- package/dist/services/settingsService.d.ts +92 -0
- package/dist/services/settingsService.js +202 -0
- package/dist/services/toastService.d.ts +9 -0
- package/dist/services/toastService.js +30 -1
- package/dist/stores/settingsStore.d.ts +128 -0
- package/dist/stores/settingsStore.js +488 -0
- package/dist/stores/themeStore.d.ts +68 -0
- package/dist/stores/themeStore.js +215 -0
- package/dist/styles/base.css +338 -621
- package/dist/styles/toast.css +33 -0
- package/dist/styles/tokens.css +402 -0
- package/dist/types/index.d.ts +78 -0
- package/dist/types/index.js +2 -0
- package/dist/types/playground.d.ts +12 -0
- package/dist/types/settings.d.ts +185 -0
- package/dist/types/settings.js +101 -0
- package/dist/utils/colors.d.ts +100 -7
- package/dist/utils/colors.js +228 -67
- package/package.json +2 -2
|
@@ -343,25 +343,25 @@
|
|
|
343
343
|
}
|
|
344
344
|
|
|
345
345
|
.form-template-editor__container {
|
|
346
|
-
border: 1px solid var(--
|
|
347
|
-
border-radius:
|
|
346
|
+
border: 1px solid var(--fd-border);
|
|
347
|
+
border-radius: var(--fd-radius-lg);
|
|
348
348
|
overflow: hidden;
|
|
349
|
-
background-color: var(--
|
|
350
|
-
transition: all
|
|
351
|
-
box-shadow:
|
|
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(--
|
|
356
|
-
background-color:
|
|
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(--
|
|
361
|
-
background-color:
|
|
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
|
-
|
|
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:
|
|
379
|
+
border-radius: var(--fd-radius-lg);
|
|
380
380
|
}
|
|
381
381
|
|
|
382
382
|
.form-template-editor__container :global(.cm-gutters) {
|
|
383
|
-
background-color: var(--
|
|
384
|
-
border-right: 1px solid var(--
|
|
385
|
-
border-radius:
|
|
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(--
|
|
398
|
-
border: 1px solid var(--
|
|
399
|
-
border-radius:
|
|
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(--
|
|
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(--
|
|
421
|
-
border: 1px solid var(--
|
|
422
|
-
border-radius:
|
|
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
|
|
424
|
+
transition: all var(--fd-transition-fast);
|
|
425
425
|
}
|
|
426
426
|
|
|
427
427
|
.form-template-editor__hint-btn:hover {
|
|
428
|
-
background-color: var(--
|
|
429
|
-
border-color: var(--
|
|
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(--
|
|
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(--
|
|
447
|
-
border: 1px dashed var(--
|
|
448
|
-
border-radius:
|
|
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(--
|
|
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:
|
|
465
|
-
color: var(--
|
|
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(--
|
|
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(--
|
|
489
|
-
border-radius:
|
|
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(--
|
|
61
|
-
border-radius:
|
|
62
|
-
font-size:
|
|
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(--
|
|
65
|
-
background-color: var(--
|
|
66
|
-
transition: all
|
|
67
|
-
box-shadow:
|
|
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(--
|
|
71
|
+
color: var(--fd-muted-foreground);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
.form-text-field:hover {
|
|
75
|
-
border-color: var(--
|
|
76
|
-
background-color:
|
|
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(--
|
|
82
|
-
background-color:
|
|
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
|
-
|
|
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(--
|
|
64
|
-
border-radius:
|
|
65
|
-
font-size:
|
|
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(--
|
|
68
|
-
background-color: var(--
|
|
69
|
-
transition: all
|
|
70
|
-
box-shadow:
|
|
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(--
|
|
77
|
+
color: var(--fd-muted-foreground);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
.form-textarea:hover {
|
|
81
|
-
border-color: var(--
|
|
82
|
-
background-color:
|
|
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(--
|
|
88
|
-
background-color:
|
|
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
|
-
|
|
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(--
|
|
82
|
+
background-color: var(--fd-border-strong);
|
|
83
83
|
border-radius: 0.75rem;
|
|
84
|
-
transition: background-color
|
|
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:
|
|
94
|
+
background-color: var(--fd-background);
|
|
95
95
|
border-radius: 50%;
|
|
96
|
-
box-shadow:
|
|
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(--
|
|
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:
|
|
114
|
-
color: var(--
|
|
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(--
|
|
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
|
-
*
|
|
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' | '
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
+
}
|