@d34dman/flowdrop 0.0.44 → 0.0.46
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 +2 -2
- package/dist/components/ConfigForm.svelte +4 -20
- package/dist/components/Navbar.svelte +6 -7
- package/dist/components/NodeSidebar.svelte +6 -2
- package/dist/components/SchemaForm.svelte +2 -10
- package/dist/components/WorkflowEditor.svelte +143 -13
- package/dist/components/form/FormAutocomplete.svelte +5 -9
- package/dist/components/form/FormCheckboxGroup.svelte +11 -1
- package/dist/components/form/FormCheckboxGroup.svelte.d.ts +2 -0
- package/dist/components/form/FormCodeEditor.svelte +16 -7
- package/dist/components/form/FormCodeEditor.svelte.d.ts +2 -0
- package/dist/components/form/FormField.svelte +20 -1
- package/dist/components/form/FormMarkdownEditor.svelte +29 -19
- package/dist/components/form/FormMarkdownEditor.svelte.d.ts +2 -0
- package/dist/components/form/FormNumberField.svelte +4 -0
- package/dist/components/form/FormNumberField.svelte.d.ts +2 -0
- package/dist/components/form/FormRangeField.svelte +4 -0
- package/dist/components/form/FormRangeField.svelte.d.ts +2 -0
- package/dist/components/form/FormSelect.svelte +4 -0
- package/dist/components/form/FormSelect.svelte.d.ts +2 -0
- package/dist/components/form/FormTemplateEditor.svelte +16 -7
- package/dist/components/form/FormTemplateEditor.svelte.d.ts +2 -0
- package/dist/components/form/FormTextField.svelte +4 -0
- package/dist/components/form/FormTextField.svelte.d.ts +2 -0
- package/dist/components/form/FormTextarea.svelte +4 -0
- package/dist/components/form/FormTextarea.svelte.d.ts +2 -0
- package/dist/components/form/FormToggle.svelte +4 -0
- package/dist/components/form/FormToggle.svelte.d.ts +2 -0
- package/dist/components/form/types.d.ts +5 -0
- package/dist/components/form/types.js +1 -1
- package/dist/components/layouts/MainLayout.svelte +5 -2
- package/dist/components/nodes/GatewayNode.svelte +99 -86
- package/dist/components/nodes/IdeaNode.svelte +20 -35
- package/dist/components/nodes/NotesNode.svelte +6 -2
- package/dist/components/nodes/SimpleNode.svelte +32 -31
- package/dist/components/nodes/SquareNode.svelte +35 -45
- package/dist/components/nodes/TerminalNode.svelte +25 -61
- package/dist/components/nodes/ToolNode.svelte +36 -18
- package/dist/components/nodes/WorkflowNode.svelte +97 -73
- package/dist/components/playground/Playground.svelte +43 -38
- package/dist/editor/index.d.ts +3 -1
- package/dist/editor/index.js +5 -1
- package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
- package/dist/helpers/nodeLayoutHelper.js +19 -0
- package/dist/helpers/workflowEditorHelper.js +1 -2
- package/dist/services/autoSaveService.js +5 -5
- package/dist/services/historyService.d.ts +207 -0
- package/dist/services/historyService.js +317 -0
- package/dist/services/settingsService.d.ts +2 -2
- package/dist/services/settingsService.js +15 -21
- package/dist/services/toastService.d.ts +1 -1
- package/dist/services/toastService.js +10 -10
- package/dist/stores/historyStore.d.ts +133 -0
- package/dist/stores/historyStore.js +188 -0
- package/dist/stores/settingsStore.d.ts +1 -1
- package/dist/stores/settingsStore.js +40 -42
- package/dist/stores/themeStore.d.ts +2 -2
- package/dist/stores/themeStore.js +30 -32
- package/dist/stores/workflowStore.d.ts +52 -2
- package/dist/stores/workflowStore.js +102 -2
- package/dist/styles/base.css +67 -7
- package/dist/styles/toast.css +3 -1
- package/dist/styles/tokens.css +38 -2
- package/dist/types/settings.d.ts +3 -3
- package/dist/types/settings.js +13 -19
- package/dist/utils/colors.js +18 -18
- package/package.json +1 -1
|
@@ -61,6 +61,11 @@
|
|
|
61
61
|
|
|
62
62
|
let { fieldKey, schema, value, required = false, animationIndex = 0, onChange }: Props = $props();
|
|
63
63
|
|
|
64
|
+
/**
|
|
65
|
+
* When schema.readOnly is true, disable all inputs (no editing).
|
|
66
|
+
*/
|
|
67
|
+
const isReadOnly = $derived(schema.readOnly === true);
|
|
68
|
+
|
|
64
69
|
/**
|
|
65
70
|
* Computed description ID for ARIA association
|
|
66
71
|
*/
|
|
@@ -204,7 +209,7 @@
|
|
|
204
209
|
}
|
|
205
210
|
return value ? [String(value)] : [];
|
|
206
211
|
}
|
|
207
|
-
return String(value ??
|
|
212
|
+
return String(value ?? '');
|
|
208
213
|
});
|
|
209
214
|
</script>
|
|
210
215
|
|
|
@@ -222,6 +227,7 @@
|
|
|
222
227
|
value={arrayValue}
|
|
223
228
|
options={enumOptions}
|
|
224
229
|
ariaDescribedBy={descriptionId}
|
|
230
|
+
disabled={isReadOnly}
|
|
225
231
|
onChange={(val) => onChange(val)}
|
|
226
232
|
/>
|
|
227
233
|
{:else if fieldType === 'select-enum'}
|
|
@@ -231,6 +237,7 @@
|
|
|
231
237
|
options={enumOptions}
|
|
232
238
|
{required}
|
|
233
239
|
ariaDescribedBy={descriptionId}
|
|
240
|
+
disabled={isReadOnly}
|
|
234
241
|
onChange={(val) => onChange(val)}
|
|
235
242
|
/>
|
|
236
243
|
{:else if fieldType === 'textarea'}
|
|
@@ -240,6 +247,7 @@
|
|
|
240
247
|
placeholder={schema.placeholder ?? ''}
|
|
241
248
|
{required}
|
|
242
249
|
ariaDescribedBy={descriptionId}
|
|
250
|
+
disabled={isReadOnly}
|
|
243
251
|
onChange={(val) => onChange(val)}
|
|
244
252
|
/>
|
|
245
253
|
{:else if fieldType === 'text'}
|
|
@@ -249,6 +257,7 @@
|
|
|
249
257
|
placeholder={schema.placeholder ?? ''}
|
|
250
258
|
{required}
|
|
251
259
|
ariaDescribedBy={descriptionId}
|
|
260
|
+
disabled={isReadOnly}
|
|
252
261
|
onChange={(val) => onChange(val)}
|
|
253
262
|
/>
|
|
254
263
|
{:else if fieldType === 'number'}
|
|
@@ -261,6 +270,7 @@
|
|
|
261
270
|
step={schema.step}
|
|
262
271
|
{required}
|
|
263
272
|
ariaDescribedBy={descriptionId}
|
|
273
|
+
disabled={isReadOnly}
|
|
264
274
|
onChange={(val) => onChange(val)}
|
|
265
275
|
/>
|
|
266
276
|
{:else if fieldType === 'range'}
|
|
@@ -272,6 +282,7 @@
|
|
|
272
282
|
step={schema.step}
|
|
273
283
|
{required}
|
|
274
284
|
ariaDescribedBy={descriptionId}
|
|
285
|
+
disabled={isReadOnly}
|
|
275
286
|
onChange={(val) => onChange(val)}
|
|
276
287
|
/>
|
|
277
288
|
{:else if fieldType === 'toggle'}
|
|
@@ -279,6 +290,7 @@
|
|
|
279
290
|
id={fieldKey}
|
|
280
291
|
value={booleanValue}
|
|
281
292
|
ariaDescribedBy={descriptionId}
|
|
293
|
+
disabled={isReadOnly}
|
|
282
294
|
onChange={(val) => onChange(val)}
|
|
283
295
|
/>
|
|
284
296
|
{:else if fieldType === 'select-options'}
|
|
@@ -288,6 +300,7 @@
|
|
|
288
300
|
options={selectOptions}
|
|
289
301
|
{required}
|
|
290
302
|
ariaDescribedBy={descriptionId}
|
|
303
|
+
disabled={isReadOnly}
|
|
291
304
|
onChange={(val) => onChange(val)}
|
|
292
305
|
/>
|
|
293
306
|
{:else if fieldType === 'array' && schema.items}
|
|
@@ -298,6 +311,7 @@
|
|
|
298
311
|
minItems={schema.minItems}
|
|
299
312
|
maxItems={schema.maxItems}
|
|
300
313
|
addLabel={`Add ${schema.items.title ?? 'Item'}`}
|
|
314
|
+
disabled={isReadOnly}
|
|
301
315
|
onChange={(val) => onChange(val)}
|
|
302
316
|
/>
|
|
303
317
|
{:else if fieldType === 'code-editor'}
|
|
@@ -310,6 +324,7 @@
|
|
|
310
324
|
darkTheme={(schema.darkTheme as boolean | undefined) ?? false}
|
|
311
325
|
autoFormat={(schema.autoFormat as boolean | undefined) ?? true}
|
|
312
326
|
ariaDescribedBy={descriptionId}
|
|
327
|
+
disabled={isReadOnly}
|
|
313
328
|
onChange={(val) => onChange(val)}
|
|
314
329
|
/>
|
|
315
330
|
{:else if fieldType === 'markdown-editor'}
|
|
@@ -323,6 +338,7 @@
|
|
|
323
338
|
showStatusBar={(schema.showStatusBar as boolean | undefined) ?? true}
|
|
324
339
|
spellChecker={(schema.spellChecker as boolean | undefined) ?? false}
|
|
325
340
|
ariaDescribedBy={descriptionId}
|
|
341
|
+
disabled={isReadOnly}
|
|
326
342
|
onChange={(val) => onChange(val)}
|
|
327
343
|
/>
|
|
328
344
|
{:else if fieldType === 'template-editor'}
|
|
@@ -338,6 +354,7 @@
|
|
|
338
354
|
placeholderExample={(schema.placeholderExample as string | undefined) ??
|
|
339
355
|
'Hello {{ name }}, your order #{{ order_id }} is ready!'}
|
|
340
356
|
ariaDescribedBy={descriptionId}
|
|
357
|
+
disabled={isReadOnly}
|
|
341
358
|
onChange={(val) => onChange(val)}
|
|
342
359
|
/>
|
|
343
360
|
{:else if fieldType === 'autocomplete' && schema.autocomplete}
|
|
@@ -348,6 +365,7 @@
|
|
|
348
365
|
placeholder={schema.placeholder ?? ''}
|
|
349
366
|
{required}
|
|
350
367
|
ariaDescribedBy={descriptionId}
|
|
368
|
+
disabled={isReadOnly}
|
|
351
369
|
onChange={(val) => onChange(val)}
|
|
352
370
|
/>
|
|
353
371
|
{:else}
|
|
@@ -357,6 +375,7 @@
|
|
|
357
375
|
value={stringValue}
|
|
358
376
|
placeholder={schema.placeholder ?? ''}
|
|
359
377
|
ariaDescribedBy={descriptionId}
|
|
378
|
+
disabled={isReadOnly}
|
|
360
379
|
onChange={(val) => onChange(val)}
|
|
361
380
|
/>
|
|
362
381
|
{/if}
|
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
autosave?: boolean;
|
|
46
46
|
/** Autosave delay in milliseconds */
|
|
47
47
|
autosaveDelay?: number;
|
|
48
|
+
/** Whether the field is disabled (read-only) */
|
|
49
|
+
disabled?: boolean;
|
|
48
50
|
/** ARIA description ID */
|
|
49
51
|
ariaDescribedBy?: string;
|
|
50
52
|
/** Callback when value changes */
|
|
@@ -62,6 +64,7 @@
|
|
|
62
64
|
spellChecker = false,
|
|
63
65
|
autosave = false,
|
|
64
66
|
autosaveDelay = 10000,
|
|
67
|
+
disabled = false,
|
|
65
68
|
ariaDescribedBy,
|
|
66
69
|
onChange
|
|
67
70
|
}: Props = $props();
|
|
@@ -137,7 +140,7 @@
|
|
|
137
140
|
placeholder: placeholder,
|
|
138
141
|
spellChecker: spellChecker,
|
|
139
142
|
autosave: autosaveConfig,
|
|
140
|
-
toolbar: showToolbar ? [...toolbarConfig] : false,
|
|
143
|
+
toolbar: disabled ? false : showToolbar ? [...toolbarConfig] : false,
|
|
141
144
|
status: showStatusBar,
|
|
142
145
|
forceSync: true,
|
|
143
146
|
minHeight: height,
|
|
@@ -145,26 +148,33 @@
|
|
|
145
148
|
singleLineBreaks: false,
|
|
146
149
|
codeSyntaxHighlighting: true
|
|
147
150
|
},
|
|
148
|
-
shortcuts:
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
151
|
+
shortcuts: disabled
|
|
152
|
+
? {}
|
|
153
|
+
: {
|
|
154
|
+
toggleBold: 'Cmd-B',
|
|
155
|
+
toggleItalic: 'Cmd-I',
|
|
156
|
+
toggleStrikethrough: 'Cmd-Alt-S',
|
|
157
|
+
toggleHeadingSmaller: 'Cmd-H',
|
|
158
|
+
toggleHeadingBigger: 'Shift-Cmd-H',
|
|
159
|
+
toggleCodeBlock: 'Cmd-Alt-C',
|
|
160
|
+
toggleBlockquote: "Cmd-'",
|
|
161
|
+
toggleOrderedList: 'Cmd-Alt-L',
|
|
162
|
+
toggleUnorderedList: 'Cmd-L',
|
|
163
|
+
cleanBlock: 'Cmd-E',
|
|
164
|
+
drawLink: 'Cmd-K',
|
|
165
|
+
drawImage: 'Cmd-Alt-I',
|
|
166
|
+
drawTable: 'Cmd-Alt-T',
|
|
167
|
+
togglePreview: 'Cmd-P',
|
|
168
|
+
toggleSideBySide: 'F9',
|
|
169
|
+
toggleFullScreen: 'F11'
|
|
170
|
+
}
|
|
166
171
|
});
|
|
167
172
|
|
|
173
|
+
// When disabled, make the underlying CodeMirror read-only
|
|
174
|
+
if (disabled && easymde.codemirror) {
|
|
175
|
+
easymde.codemirror.setOption('readOnly', true);
|
|
176
|
+
}
|
|
177
|
+
|
|
168
178
|
// Listen for changes
|
|
169
179
|
easymde.codemirror.on('change', () => {
|
|
170
180
|
if (isInternalUpdate) {
|
|
@@ -19,6 +19,8 @@ interface Props {
|
|
|
19
19
|
autosave?: boolean;
|
|
20
20
|
/** Autosave delay in milliseconds */
|
|
21
21
|
autosaveDelay?: number;
|
|
22
|
+
/** Whether the field is disabled (read-only) */
|
|
23
|
+
disabled?: boolean;
|
|
22
24
|
/** ARIA description ID */
|
|
23
25
|
ariaDescribedBy?: string;
|
|
24
26
|
/** Callback when value changes */
|
|
@@ -24,6 +24,8 @@
|
|
|
24
24
|
step?: number;
|
|
25
25
|
/** Whether the field is required */
|
|
26
26
|
required?: boolean;
|
|
27
|
+
/** Whether the field is disabled (read-only) */
|
|
28
|
+
disabled?: boolean;
|
|
27
29
|
/** ARIA description ID */
|
|
28
30
|
ariaDescribedBy?: string;
|
|
29
31
|
/** Callback when value changes */
|
|
@@ -38,6 +40,7 @@
|
|
|
38
40
|
max,
|
|
39
41
|
step,
|
|
40
42
|
required = false,
|
|
43
|
+
disabled = false,
|
|
41
44
|
ariaDescribedBy,
|
|
42
45
|
onChange
|
|
43
46
|
}: Props = $props();
|
|
@@ -68,6 +71,7 @@
|
|
|
68
71
|
{min}
|
|
69
72
|
{max}
|
|
70
73
|
{step}
|
|
74
|
+
{disabled}
|
|
71
75
|
aria-describedby={ariaDescribedBy}
|
|
72
76
|
aria-required={required}
|
|
73
77
|
oninput={handleInput}
|
|
@@ -13,6 +13,8 @@ interface Props {
|
|
|
13
13
|
step?: number;
|
|
14
14
|
/** Whether the field is required */
|
|
15
15
|
required?: boolean;
|
|
16
|
+
/** Whether the field is disabled (read-only) */
|
|
17
|
+
disabled?: boolean;
|
|
16
18
|
/** ARIA description ID */
|
|
17
19
|
ariaDescribedBy?: string;
|
|
18
20
|
/** Callback when value changes */
|
|
@@ -24,6 +24,8 @@
|
|
|
24
24
|
step?: number;
|
|
25
25
|
/** Whether the field is required */
|
|
26
26
|
required?: boolean;
|
|
27
|
+
/** Whether the field is disabled (read-only) */
|
|
28
|
+
disabled?: boolean;
|
|
27
29
|
/** ARIA description ID */
|
|
28
30
|
ariaDescribedBy?: string;
|
|
29
31
|
/** Callback when value changes */
|
|
@@ -37,6 +39,7 @@
|
|
|
37
39
|
max = 100,
|
|
38
40
|
step = 1,
|
|
39
41
|
required = false,
|
|
42
|
+
disabled = false,
|
|
40
43
|
ariaDescribedBy,
|
|
41
44
|
onChange
|
|
42
45
|
}: Props = $props();
|
|
@@ -84,6 +87,7 @@
|
|
|
84
87
|
{min}
|
|
85
88
|
{max}
|
|
86
89
|
{step}
|
|
90
|
+
{disabled}
|
|
87
91
|
aria-describedby={ariaDescribedBy}
|
|
88
92
|
aria-valuemin={min}
|
|
89
93
|
aria-valuemax={max}
|
|
@@ -11,6 +11,8 @@ interface Props {
|
|
|
11
11
|
step?: number;
|
|
12
12
|
/** Whether the field is required */
|
|
13
13
|
required?: boolean;
|
|
14
|
+
/** Whether the field is disabled (read-only) */
|
|
15
|
+
disabled?: boolean;
|
|
14
16
|
/** ARIA description ID */
|
|
15
17
|
ariaDescribedBy?: string;
|
|
16
18
|
/** Callback when value changes */
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
options: FieldOption[] | string[];
|
|
22
22
|
/** Whether the field is required */
|
|
23
23
|
required?: boolean;
|
|
24
|
+
/** Whether the field is disabled (read-only) */
|
|
25
|
+
disabled?: boolean;
|
|
24
26
|
/** ARIA description ID */
|
|
25
27
|
ariaDescribedBy?: string;
|
|
26
28
|
/** Callback when value changes */
|
|
@@ -32,6 +34,7 @@
|
|
|
32
34
|
value = '',
|
|
33
35
|
options = [],
|
|
34
36
|
required = false,
|
|
37
|
+
disabled = false,
|
|
35
38
|
ariaDescribedBy,
|
|
36
39
|
onChange
|
|
37
40
|
}: Props = $props();
|
|
@@ -55,6 +58,7 @@
|
|
|
55
58
|
{id}
|
|
56
59
|
class="form-select"
|
|
57
60
|
value={value ?? ''}
|
|
61
|
+
{disabled}
|
|
58
62
|
aria-describedby={ariaDescribedBy}
|
|
59
63
|
aria-required={required}
|
|
60
64
|
onchange={handleChange}
|
|
@@ -8,6 +8,8 @@ interface Props {
|
|
|
8
8
|
options: FieldOption[] | string[];
|
|
9
9
|
/** Whether the field is required */
|
|
10
10
|
required?: boolean;
|
|
11
|
+
/** Whether the field is disabled (read-only) */
|
|
12
|
+
disabled?: boolean;
|
|
11
13
|
/** ARIA description ID */
|
|
12
14
|
ariaDescribedBy?: string;
|
|
13
15
|
/** Callback when value changes */
|
|
@@ -52,6 +52,8 @@
|
|
|
52
52
|
variableHints?: string[];
|
|
53
53
|
/** Placeholder variable example for the hint */
|
|
54
54
|
placeholderExample?: string;
|
|
55
|
+
/** Whether the field is disabled (read-only) */
|
|
56
|
+
disabled?: boolean;
|
|
55
57
|
/** ARIA description ID */
|
|
56
58
|
ariaDescribedBy?: string;
|
|
57
59
|
/** Callback when value changes */
|
|
@@ -67,6 +69,7 @@
|
|
|
67
69
|
height = '250px',
|
|
68
70
|
variableHints = [],
|
|
69
71
|
placeholderExample = 'Hello {{ name }}, your order #{{ order_id }} is ready!',
|
|
72
|
+
disabled = false,
|
|
70
73
|
ariaDescribedBy,
|
|
71
74
|
onChange
|
|
72
75
|
}: Props = $props();
|
|
@@ -123,6 +126,7 @@
|
|
|
123
126
|
/**
|
|
124
127
|
* Create editor extensions array for template editing
|
|
125
128
|
* Uses minimal setup for better performance (no auto-closing brackets, no autocompletion)
|
|
129
|
+
* When disabled is true, adds readOnly/editable so the editor cannot be modified
|
|
126
130
|
*/
|
|
127
131
|
function createExtensions() {
|
|
128
132
|
const extensions = [
|
|
@@ -133,20 +137,25 @@
|
|
|
133
137
|
highlightActiveLine(),
|
|
134
138
|
drawSelection(),
|
|
135
139
|
|
|
136
|
-
// Editing features
|
|
137
|
-
|
|
138
|
-
|
|
140
|
+
// Editing features (skip when read-only)
|
|
141
|
+
...(disabled
|
|
142
|
+
? []
|
|
143
|
+
: [
|
|
144
|
+
history(),
|
|
145
|
+
indentOnInput(),
|
|
146
|
+
keymap.of([...defaultKeymap, ...historyKeymap, indentWithTab])
|
|
147
|
+
]),
|
|
148
|
+
|
|
149
|
+
// Read-only: prevent document changes and mark content as non-editable
|
|
150
|
+
...(disabled ? [EditorState.readOnly.of(true), EditorView.editable.of(false)] : []),
|
|
139
151
|
|
|
140
152
|
// Syntax highlighting
|
|
141
153
|
syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
|
|
142
154
|
|
|
143
|
-
// Keymaps for basic editing
|
|
144
|
-
keymap.of([...defaultKeymap, ...historyKeymap, indentWithTab]),
|
|
145
|
-
|
|
146
155
|
// Template-specific variable highlighter
|
|
147
156
|
variableHighlighter,
|
|
148
157
|
|
|
149
|
-
// Update listener
|
|
158
|
+
// Update listener (only fires on user edit when not disabled)
|
|
150
159
|
EditorView.updateListener.of(handleUpdate),
|
|
151
160
|
|
|
152
161
|
// Custom theme
|
|
@@ -15,6 +15,8 @@ interface Props {
|
|
|
15
15
|
variableHints?: string[];
|
|
16
16
|
/** Placeholder variable example for the hint */
|
|
17
17
|
placeholderExample?: string;
|
|
18
|
+
/** Whether the field is disabled (read-only) */
|
|
19
|
+
disabled?: boolean;
|
|
18
20
|
/** ARIA description ID */
|
|
19
21
|
ariaDescribedBy?: string;
|
|
20
22
|
/** Callback when value changes */
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
placeholder?: string;
|
|
19
19
|
/** Whether the field is required */
|
|
20
20
|
required?: boolean;
|
|
21
|
+
/** Whether the field is disabled (read-only) */
|
|
22
|
+
disabled?: boolean;
|
|
21
23
|
/** ARIA description ID */
|
|
22
24
|
ariaDescribedBy?: string;
|
|
23
25
|
/** Callback when value changes */
|
|
@@ -29,6 +31,7 @@
|
|
|
29
31
|
value = '',
|
|
30
32
|
placeholder = '',
|
|
31
33
|
required = false,
|
|
34
|
+
disabled = false,
|
|
32
35
|
ariaDescribedBy,
|
|
33
36
|
onChange
|
|
34
37
|
}: Props = $props();
|
|
@@ -48,6 +51,7 @@
|
|
|
48
51
|
class="form-text-field"
|
|
49
52
|
value={value ?? ''}
|
|
50
53
|
{placeholder}
|
|
54
|
+
{disabled}
|
|
51
55
|
aria-describedby={ariaDescribedBy}
|
|
52
56
|
aria-required={required}
|
|
53
57
|
oninput={handleInput}
|
|
@@ -7,6 +7,8 @@ interface Props {
|
|
|
7
7
|
placeholder?: string;
|
|
8
8
|
/** Whether the field is required */
|
|
9
9
|
required?: boolean;
|
|
10
|
+
/** Whether the field is disabled (read-only) */
|
|
11
|
+
disabled?: boolean;
|
|
10
12
|
/** ARIA description ID */
|
|
11
13
|
ariaDescribedBy?: string;
|
|
12
14
|
/** Callback when value changes */
|
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
rows?: number;
|
|
21
21
|
/** Whether the field is required */
|
|
22
22
|
required?: boolean;
|
|
23
|
+
/** Whether the field is disabled (read-only) */
|
|
24
|
+
disabled?: boolean;
|
|
23
25
|
/** ARIA description ID */
|
|
24
26
|
ariaDescribedBy?: string;
|
|
25
27
|
/** Callback when value changes */
|
|
@@ -32,6 +34,7 @@
|
|
|
32
34
|
placeholder = '',
|
|
33
35
|
rows = 4,
|
|
34
36
|
required = false,
|
|
37
|
+
disabled = false,
|
|
35
38
|
ariaDescribedBy,
|
|
36
39
|
onChange
|
|
37
40
|
}: Props = $props();
|
|
@@ -51,6 +54,7 @@
|
|
|
51
54
|
value={value ?? ''}
|
|
52
55
|
{placeholder}
|
|
53
56
|
{rows}
|
|
57
|
+
{disabled}
|
|
54
58
|
aria-describedby={ariaDescribedBy}
|
|
55
59
|
aria-required={required}
|
|
56
60
|
oninput={handleInput}
|
|
@@ -9,6 +9,8 @@ interface Props {
|
|
|
9
9
|
rows?: number;
|
|
10
10
|
/** Whether the field is required */
|
|
11
11
|
required?: boolean;
|
|
12
|
+
/** Whether the field is disabled (read-only) */
|
|
13
|
+
disabled?: boolean;
|
|
12
14
|
/** ARIA description ID */
|
|
13
15
|
ariaDescribedBy?: string;
|
|
14
16
|
/** Callback when value changes */
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
onLabel?: string;
|
|
19
19
|
/** Label shown when toggle is off */
|
|
20
20
|
offLabel?: string;
|
|
21
|
+
/** Whether the field is disabled (read-only) */
|
|
22
|
+
disabled?: boolean;
|
|
21
23
|
/** ARIA description ID */
|
|
22
24
|
ariaDescribedBy?: string;
|
|
23
25
|
/** Callback when value changes */
|
|
@@ -29,6 +31,7 @@
|
|
|
29
31
|
value = false,
|
|
30
32
|
onLabel = 'Enabled',
|
|
31
33
|
offLabel = 'Disabled',
|
|
34
|
+
disabled = false,
|
|
32
35
|
ariaDescribedBy,
|
|
33
36
|
onChange
|
|
34
37
|
}: Props = $props();
|
|
@@ -48,6 +51,7 @@
|
|
|
48
51
|
type="checkbox"
|
|
49
52
|
class="form-toggle__input"
|
|
50
53
|
checked={value}
|
|
54
|
+
{disabled}
|
|
51
55
|
aria-describedby={ariaDescribedBy}
|
|
52
56
|
onchange={handleChange}
|
|
53
57
|
/>
|
|
@@ -7,6 +7,8 @@ interface Props {
|
|
|
7
7
|
onLabel?: string;
|
|
8
8
|
/** Label shown when toggle is off */
|
|
9
9
|
offLabel?: string;
|
|
10
|
+
/** Whether the field is disabled (read-only) */
|
|
11
|
+
disabled?: boolean;
|
|
10
12
|
/** ARIA description ID */
|
|
11
13
|
ariaDescribedBy?: string;
|
|
12
14
|
/** Callback when value changes */
|
|
@@ -318,6 +318,11 @@ export interface FieldSchema {
|
|
|
318
318
|
required?: string[];
|
|
319
319
|
/** Autocomplete configuration for fetching suggestions from callback URL */
|
|
320
320
|
autocomplete?: AutocompleteConfig;
|
|
321
|
+
/**
|
|
322
|
+
* Whether the field is read-only (JSON Schema readOnly keyword).
|
|
323
|
+
* When true, the field is displayed but cannot be edited.
|
|
324
|
+
*/
|
|
325
|
+
readOnly?: boolean;
|
|
321
326
|
/** Allow additional properties not defined by the schema */
|
|
322
327
|
[key: string]: unknown;
|
|
323
328
|
}
|
|
@@ -15,7 +15,7 @@ export function isFieldOptionArray(options) {
|
|
|
15
15
|
* Type guard to check if items are OneOfItem objects (JSON Schema oneOf pattern)
|
|
16
16
|
*/
|
|
17
17
|
export function isOneOfArray(items) {
|
|
18
|
-
return items.length > 0 && typeof items[0] === 'object' && items[0] !== null && 'const' in items[0];
|
|
18
|
+
return (items.length > 0 && typeof items[0] === 'object' && items[0] !== null && 'const' in items[0]);
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* Convert JSON Schema oneOf items to FieldOption format
|
|
@@ -377,7 +377,9 @@
|
|
|
377
377
|
aria-label="Resize bottom panel"
|
|
378
378
|
tabindex="0"
|
|
379
379
|
>
|
|
380
|
-
<div
|
|
380
|
+
<div
|
|
381
|
+
class="flowdrop-main-layout__divider-handle flowdrop-main-layout__divider-handle--horizontal"
|
|
382
|
+
></div>
|
|
381
383
|
</div>
|
|
382
384
|
{/if}
|
|
383
385
|
|
|
@@ -630,7 +632,8 @@
|
|
|
630
632
|
transform: scaleX(1.2);
|
|
631
633
|
}
|
|
632
634
|
|
|
633
|
-
.flowdrop-main-layout__divider--bottom.flowdrop-main-layout__divider--active
|
|
635
|
+
.flowdrop-main-layout__divider--bottom.flowdrop-main-layout__divider--active
|
|
636
|
+
.flowdrop-main-layout__divider-handle--horizontal {
|
|
634
637
|
transform: scaleX(1.4);
|
|
635
638
|
}
|
|
636
639
|
|