@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.
Files changed (67) hide show
  1. package/README.md +2 -2
  2. package/dist/components/ConfigForm.svelte +4 -20
  3. package/dist/components/Navbar.svelte +6 -7
  4. package/dist/components/NodeSidebar.svelte +6 -2
  5. package/dist/components/SchemaForm.svelte +2 -10
  6. package/dist/components/WorkflowEditor.svelte +143 -13
  7. package/dist/components/form/FormAutocomplete.svelte +5 -9
  8. package/dist/components/form/FormCheckboxGroup.svelte +11 -1
  9. package/dist/components/form/FormCheckboxGroup.svelte.d.ts +2 -0
  10. package/dist/components/form/FormCodeEditor.svelte +16 -7
  11. package/dist/components/form/FormCodeEditor.svelte.d.ts +2 -0
  12. package/dist/components/form/FormField.svelte +20 -1
  13. package/dist/components/form/FormMarkdownEditor.svelte +29 -19
  14. package/dist/components/form/FormMarkdownEditor.svelte.d.ts +2 -0
  15. package/dist/components/form/FormNumberField.svelte +4 -0
  16. package/dist/components/form/FormNumberField.svelte.d.ts +2 -0
  17. package/dist/components/form/FormRangeField.svelte +4 -0
  18. package/dist/components/form/FormRangeField.svelte.d.ts +2 -0
  19. package/dist/components/form/FormSelect.svelte +4 -0
  20. package/dist/components/form/FormSelect.svelte.d.ts +2 -0
  21. package/dist/components/form/FormTemplateEditor.svelte +16 -7
  22. package/dist/components/form/FormTemplateEditor.svelte.d.ts +2 -0
  23. package/dist/components/form/FormTextField.svelte +4 -0
  24. package/dist/components/form/FormTextField.svelte.d.ts +2 -0
  25. package/dist/components/form/FormTextarea.svelte +4 -0
  26. package/dist/components/form/FormTextarea.svelte.d.ts +2 -0
  27. package/dist/components/form/FormToggle.svelte +4 -0
  28. package/dist/components/form/FormToggle.svelte.d.ts +2 -0
  29. package/dist/components/form/types.d.ts +5 -0
  30. package/dist/components/form/types.js +1 -1
  31. package/dist/components/layouts/MainLayout.svelte +5 -2
  32. package/dist/components/nodes/GatewayNode.svelte +99 -86
  33. package/dist/components/nodes/IdeaNode.svelte +20 -35
  34. package/dist/components/nodes/NotesNode.svelte +6 -2
  35. package/dist/components/nodes/SimpleNode.svelte +32 -31
  36. package/dist/components/nodes/SquareNode.svelte +35 -45
  37. package/dist/components/nodes/TerminalNode.svelte +25 -61
  38. package/dist/components/nodes/ToolNode.svelte +36 -18
  39. package/dist/components/nodes/WorkflowNode.svelte +97 -73
  40. package/dist/components/playground/Playground.svelte +43 -38
  41. package/dist/editor/index.d.ts +3 -1
  42. package/dist/editor/index.js +5 -1
  43. package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
  44. package/dist/helpers/nodeLayoutHelper.js +19 -0
  45. package/dist/helpers/workflowEditorHelper.js +1 -2
  46. package/dist/services/autoSaveService.js +5 -5
  47. package/dist/services/historyService.d.ts +207 -0
  48. package/dist/services/historyService.js +317 -0
  49. package/dist/services/settingsService.d.ts +2 -2
  50. package/dist/services/settingsService.js +15 -21
  51. package/dist/services/toastService.d.ts +1 -1
  52. package/dist/services/toastService.js +10 -10
  53. package/dist/stores/historyStore.d.ts +133 -0
  54. package/dist/stores/historyStore.js +188 -0
  55. package/dist/stores/settingsStore.d.ts +1 -1
  56. package/dist/stores/settingsStore.js +40 -42
  57. package/dist/stores/themeStore.d.ts +2 -2
  58. package/dist/stores/themeStore.js +30 -32
  59. package/dist/stores/workflowStore.d.ts +52 -2
  60. package/dist/stores/workflowStore.js +102 -2
  61. package/dist/styles/base.css +67 -7
  62. package/dist/styles/toast.css +3 -1
  63. package/dist/styles/tokens.css +38 -2
  64. package/dist/types/settings.d.ts +3 -3
  65. package/dist/types/settings.js +13 -19
  66. package/dist/utils/colors.js +18 -18
  67. 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
- toggleBold: 'Cmd-B',
150
- toggleItalic: 'Cmd-I',
151
- toggleStrikethrough: 'Cmd-Alt-S',
152
- toggleHeadingSmaller: 'Cmd-H',
153
- toggleHeadingBigger: 'Shift-Cmd-H',
154
- toggleCodeBlock: 'Cmd-Alt-C',
155
- toggleBlockquote: "Cmd-'",
156
- toggleOrderedList: 'Cmd-Alt-L',
157
- toggleUnorderedList: 'Cmd-L',
158
- cleanBlock: 'Cmd-E',
159
- drawLink: 'Cmd-K',
160
- drawImage: 'Cmd-Alt-I',
161
- drawTable: 'Cmd-Alt-T',
162
- togglePreview: 'Cmd-P',
163
- toggleSideBySide: 'F9',
164
- toggleFullScreen: 'F11'
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
- history(),
138
- indentOnInput(),
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 class="flowdrop-main-layout__divider-handle flowdrop-main-layout__divider-handle--horizontal"></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 .flowdrop-main-layout__divider-handle--horizontal {
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