@d34dman/flowdrop 0.0.23 → 0.0.25
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/dist/components/ConfigForm.svelte +1 -1
- package/dist/components/form/FormCodeEditor.svelte +415 -0
- package/dist/components/form/FormCodeEditor.svelte.d.ts +23 -0
- package/dist/components/form/FormField.svelte +137 -68
- package/dist/components/form/FormField.svelte.d.ts +1 -1
- package/dist/components/form/FormMarkdownEditor.svelte +553 -0
- package/dist/components/form/FormMarkdownEditor.svelte.d.ts +29 -0
- package/dist/components/form/FormRangeField.svelte +252 -0
- package/dist/components/form/FormRangeField.svelte.d.ts +21 -0
- package/dist/components/form/FormTemplateEditor.svelte +463 -0
- package/dist/components/form/FormTemplateEditor.svelte.d.ts +25 -0
- package/dist/components/form/index.d.ts +4 -0
- package/dist/components/form/index.js +4 -0
- package/dist/components/form/types.d.ts +70 -1
- package/dist/components/nodes/GatewayNode.svelte +1 -13
- package/dist/index.d.ts +1 -1
- package/dist/types/index.d.ts +99 -1
- package/package.json +9 -3
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
FormRangeField Component
|
|
3
|
+
Range slider input field for numeric values
|
|
4
|
+
|
|
5
|
+
Features:
|
|
6
|
+
- Modern styled range slider with custom track and thumb
|
|
7
|
+
- Min/max/step support for value constraints
|
|
8
|
+
- Real-time value display with tabular numeric font
|
|
9
|
+
- Proper ARIA attributes for accessibility
|
|
10
|
+
- Visual feedback for current value position
|
|
11
|
+
-->
|
|
12
|
+
|
|
13
|
+
<script lang="ts">
|
|
14
|
+
interface Props {
|
|
15
|
+
/** Field identifier */
|
|
16
|
+
id: string;
|
|
17
|
+
/** Current value */
|
|
18
|
+
value: number | string;
|
|
19
|
+
/** Minimum allowed value */
|
|
20
|
+
min?: number;
|
|
21
|
+
/** Maximum allowed value */
|
|
22
|
+
max?: number;
|
|
23
|
+
/** Step increment */
|
|
24
|
+
step?: number;
|
|
25
|
+
/** Whether the field is required */
|
|
26
|
+
required?: boolean;
|
|
27
|
+
/** ARIA description ID */
|
|
28
|
+
ariaDescribedBy?: string;
|
|
29
|
+
/** Callback when value changes */
|
|
30
|
+
onChange: (value: number) => void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let {
|
|
34
|
+
id,
|
|
35
|
+
value = 0,
|
|
36
|
+
min = 0,
|
|
37
|
+
max = 100,
|
|
38
|
+
step = 1,
|
|
39
|
+
required = false,
|
|
40
|
+
ariaDescribedBy,
|
|
41
|
+
onChange
|
|
42
|
+
}: Props = $props();
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Compute the current numeric value
|
|
46
|
+
* Handles string values and defaults
|
|
47
|
+
*/
|
|
48
|
+
const numericValue = $derived.by((): number => {
|
|
49
|
+
if (typeof value === "number") {
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
const parsed = Number(value);
|
|
53
|
+
return isNaN(parsed) ? min : parsed;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Compute the percentage position for the filled track
|
|
58
|
+
* Used to show visual progress of the slider
|
|
59
|
+
*/
|
|
60
|
+
const progressPercentage = $derived.by((): number => {
|
|
61
|
+
const range = max - min;
|
|
62
|
+
if (range === 0) return 0;
|
|
63
|
+
return ((numericValue - min) / range) * 100;
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Handle input changes
|
|
68
|
+
* Converts the value to a number and triggers onChange
|
|
69
|
+
*/
|
|
70
|
+
function handleInput(event: Event): void {
|
|
71
|
+
const target = event.currentTarget as HTMLInputElement;
|
|
72
|
+
const numValue = Number(target.value);
|
|
73
|
+
onChange(numValue);
|
|
74
|
+
}
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
<div class="form-range-container">
|
|
78
|
+
<div class="form-range-slider">
|
|
79
|
+
<input
|
|
80
|
+
{id}
|
|
81
|
+
type="range"
|
|
82
|
+
class="form-range-field"
|
|
83
|
+
value={numericValue}
|
|
84
|
+
{min}
|
|
85
|
+
{max}
|
|
86
|
+
{step}
|
|
87
|
+
aria-describedby={ariaDescribedBy}
|
|
88
|
+
aria-required={required}
|
|
89
|
+
aria-valuemin={min}
|
|
90
|
+
aria-valuemax={max}
|
|
91
|
+
aria-valuenow={numericValue}
|
|
92
|
+
oninput={handleInput}
|
|
93
|
+
style="--progress: {progressPercentage}%"
|
|
94
|
+
/>
|
|
95
|
+
</div>
|
|
96
|
+
<div class="form-range-values">
|
|
97
|
+
<span class="form-range-min">{min}</span>
|
|
98
|
+
<span class="form-range-current">{numericValue}</span>
|
|
99
|
+
<span class="form-range-max">{max}</span>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
<style>
|
|
104
|
+
.form-range-container {
|
|
105
|
+
display: flex;
|
|
106
|
+
flex-direction: column;
|
|
107
|
+
gap: 0.5rem;
|
|
108
|
+
width: 100%;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.form-range-slider {
|
|
112
|
+
position: relative;
|
|
113
|
+
width: 100%;
|
|
114
|
+
padding: 0.25rem 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.form-range-field {
|
|
118
|
+
width: 100%;
|
|
119
|
+
height: 6px;
|
|
120
|
+
border-radius: 3px;
|
|
121
|
+
appearance: none;
|
|
122
|
+
-webkit-appearance: none;
|
|
123
|
+
background: linear-gradient(
|
|
124
|
+
to right,
|
|
125
|
+
var(--color-ref-blue-500, #3b82f6) 0%,
|
|
126
|
+
var(--color-ref-blue-500, #3b82f6) var(--progress, 0%),
|
|
127
|
+
var(--color-ref-gray-200, #e5e7eb) var(--progress, 0%),
|
|
128
|
+
var(--color-ref-gray-200, #e5e7eb) 100%
|
|
129
|
+
);
|
|
130
|
+
cursor: pointer;
|
|
131
|
+
transition: background 0.15s ease;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* Webkit (Chrome, Safari, Edge) - Track */
|
|
135
|
+
.form-range-field::-webkit-slider-runnable-track {
|
|
136
|
+
height: 6px;
|
|
137
|
+
border-radius: 3px;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* Webkit - Thumb */
|
|
141
|
+
.form-range-field::-webkit-slider-thumb {
|
|
142
|
+
-webkit-appearance: none;
|
|
143
|
+
appearance: none;
|
|
144
|
+
width: 18px;
|
|
145
|
+
height: 18px;
|
|
146
|
+
border-radius: 50%;
|
|
147
|
+
background: linear-gradient(
|
|
148
|
+
135deg,
|
|
149
|
+
#ffffff 0%,
|
|
150
|
+
var(--color-ref-gray-50, #f9fafb) 100%
|
|
151
|
+
);
|
|
152
|
+
border: 2px solid var(--color-ref-blue-500, #3b82f6);
|
|
153
|
+
box-shadow:
|
|
154
|
+
0 2px 6px rgba(59, 130, 246, 0.25),
|
|
155
|
+
0 1px 2px rgba(0, 0, 0, 0.1);
|
|
156
|
+
cursor: pointer;
|
|
157
|
+
margin-top: -6px;
|
|
158
|
+
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.form-range-field::-webkit-slider-thumb:hover {
|
|
162
|
+
transform: scale(1.1);
|
|
163
|
+
box-shadow:
|
|
164
|
+
0 4px 12px rgba(59, 130, 246, 0.35),
|
|
165
|
+
0 2px 4px rgba(0, 0, 0, 0.1);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.form-range-field:focus::-webkit-slider-thumb {
|
|
169
|
+
box-shadow:
|
|
170
|
+
0 0 0 3px rgba(59, 130, 246, 0.2),
|
|
171
|
+
0 4px 12px rgba(59, 130, 246, 0.35);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* Firefox - Track */
|
|
175
|
+
.form-range-field::-moz-range-track {
|
|
176
|
+
height: 6px;
|
|
177
|
+
border-radius: 3px;
|
|
178
|
+
background: var(--color-ref-gray-200, #e5e7eb);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.form-range-field::-moz-range-progress {
|
|
182
|
+
height: 6px;
|
|
183
|
+
border-radius: 3px;
|
|
184
|
+
background: var(--color-ref-blue-500, #3b82f6);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Firefox - Thumb */
|
|
188
|
+
.form-range-field::-moz-range-thumb {
|
|
189
|
+
width: 18px;
|
|
190
|
+
height: 18px;
|
|
191
|
+
border-radius: 50%;
|
|
192
|
+
background: linear-gradient(
|
|
193
|
+
135deg,
|
|
194
|
+
#ffffff 0%,
|
|
195
|
+
var(--color-ref-gray-50, #f9fafb) 100%
|
|
196
|
+
);
|
|
197
|
+
border: 2px solid var(--color-ref-blue-500, #3b82f6);
|
|
198
|
+
box-shadow:
|
|
199
|
+
0 2px 6px rgba(59, 130, 246, 0.25),
|
|
200
|
+
0 1px 2px rgba(0, 0, 0, 0.1);
|
|
201
|
+
cursor: pointer;
|
|
202
|
+
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.form-range-field::-moz-range-thumb:hover {
|
|
206
|
+
transform: scale(1.1);
|
|
207
|
+
box-shadow:
|
|
208
|
+
0 4px 12px rgba(59, 130, 246, 0.35),
|
|
209
|
+
0 2px 4px rgba(0, 0, 0, 0.1);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.form-range-field:focus::-moz-range-thumb {
|
|
213
|
+
box-shadow:
|
|
214
|
+
0 0 0 3px rgba(59, 130, 246, 0.2),
|
|
215
|
+
0 4px 12px rgba(59, 130, 246, 0.35);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* Focus styles */
|
|
219
|
+
.form-range-field:focus {
|
|
220
|
+
outline: none;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.form-range-field:focus-visible {
|
|
224
|
+
outline: none;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* Value display row */
|
|
228
|
+
.form-range-values {
|
|
229
|
+
display: flex;
|
|
230
|
+
justify-content: space-between;
|
|
231
|
+
align-items: center;
|
|
232
|
+
font-size: 0.75rem;
|
|
233
|
+
font-variant-numeric: tabular-nums;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.form-range-min,
|
|
237
|
+
.form-range-max {
|
|
238
|
+
color: var(--color-ref-gray-400, #9ca3af);
|
|
239
|
+
font-weight: 400;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.form-range-current {
|
|
243
|
+
font-weight: 600;
|
|
244
|
+
color: var(--color-ref-blue-600, #2563eb);
|
|
245
|
+
background-color: var(--color-ref-blue-50, #eff6ff);
|
|
246
|
+
padding: 0.125rem 0.5rem;
|
|
247
|
+
border-radius: 0.25rem;
|
|
248
|
+
min-width: 2.5rem;
|
|
249
|
+
text-align: center;
|
|
250
|
+
}
|
|
251
|
+
</style>
|
|
252
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/** Field identifier */
|
|
3
|
+
id: string;
|
|
4
|
+
/** Current value */
|
|
5
|
+
value: number | string;
|
|
6
|
+
/** Minimum allowed value */
|
|
7
|
+
min?: number;
|
|
8
|
+
/** Maximum allowed value */
|
|
9
|
+
max?: number;
|
|
10
|
+
/** Step increment */
|
|
11
|
+
step?: number;
|
|
12
|
+
/** Whether the field is required */
|
|
13
|
+
required?: boolean;
|
|
14
|
+
/** ARIA description ID */
|
|
15
|
+
ariaDescribedBy?: string;
|
|
16
|
+
/** Callback when value changes */
|
|
17
|
+
onChange: (value: number) => void;
|
|
18
|
+
}
|
|
19
|
+
declare const FormRangeField: import("svelte").Component<Props, {}, "">;
|
|
20
|
+
type FormRangeField = ReturnType<typeof FormRangeField>;
|
|
21
|
+
export default FormRangeField;
|