easy-forms-core 1.1.10 → 1.1.12
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/easy-form.d.ts +10 -2
- package/dist/easy-form.js +131 -2
- package/dist/easy-form.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.js +131 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/easy-form.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tipos de campos soportados
|
|
3
3
|
*/
|
|
4
|
-
type FieldType = 'text' | 'email' | 'number' | 'password' | 'textarea' | 'select' | 'checkbox' | 'radio' | 'switch' | 'date' | 'file' | 'array' | 'group' | 'row' | 'custom' | 'quantity' | 'accordion-select' | 'image-grid-select' | 'otp' | 'file-drop' | 'map' | 'rating' | 'slider';
|
|
4
|
+
type FieldType = 'text' | 'email' | 'number' | 'password' | 'textarea' | 'select' | 'checkbox' | 'radio' | 'switch' | 'date' | 'file' | 'array' | 'group' | 'row' | 'custom' | 'quantity' | 'accordion-select' | 'image-grid-select' | 'otp' | 'file-drop' | 'map' | 'rating' | 'slider' | 'colorpicker';
|
|
5
5
|
/**
|
|
6
6
|
* Tipos de validaciones soportadas
|
|
7
7
|
*/
|
|
@@ -248,6 +248,14 @@ interface SliderField extends BaseField {
|
|
|
248
248
|
step?: number;
|
|
249
249
|
showValue?: boolean;
|
|
250
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* Campo colorpicker (selección de color hex)
|
|
253
|
+
*/
|
|
254
|
+
interface ColorpickerField extends BaseField {
|
|
255
|
+
type: 'colorpicker';
|
|
256
|
+
/** Valor por defecto en hex (ej. #6366f1). Default: #000000 */
|
|
257
|
+
defaultValue?: string;
|
|
258
|
+
}
|
|
251
259
|
/**
|
|
252
260
|
* Campo array
|
|
253
261
|
*/
|
|
@@ -332,7 +340,7 @@ interface OTPField extends BaseField {
|
|
|
332
340
|
/**
|
|
333
341
|
* Unión de todos los tipos de campos
|
|
334
342
|
*/
|
|
335
|
-
type Field = TextField | PasswordField | NumberField | TextareaField | SelectField | CheckboxField | RadioField | SwitchField | DateField | FileField | FileDropField | MapField | RatingField | SliderField | ArrayField | GroupField | RowField | CustomField | QuantityField | AccordionSelectField | ImageGridSelectField | OTPField;
|
|
343
|
+
type Field = TextField | PasswordField | NumberField | TextareaField | SelectField | CheckboxField | RadioField | SwitchField | DateField | FileField | FileDropField | MapField | RatingField | SliderField | ColorpickerField | ArrayField | GroupField | RowField | CustomField | QuantityField | AccordionSelectField | ImageGridSelectField | OTPField;
|
|
336
344
|
/**
|
|
337
345
|
* Step para formularios wizard
|
|
338
346
|
*/
|
package/dist/easy-form.js
CHANGED
|
@@ -63,6 +63,7 @@ var SchemaParser = class {
|
|
|
63
63
|
"map",
|
|
64
64
|
"rating",
|
|
65
65
|
"slider",
|
|
66
|
+
"colorpicker",
|
|
66
67
|
"array",
|
|
67
68
|
"group",
|
|
68
69
|
"row",
|
|
@@ -109,6 +110,16 @@ var SchemaParser = class {
|
|
|
109
110
|
);
|
|
110
111
|
}
|
|
111
112
|
break;
|
|
113
|
+
case "colorpicker":
|
|
114
|
+
if ("defaultValue" in field && field.defaultValue != null) {
|
|
115
|
+
const hex = /^#[0-9A-Fa-f]{6}$/;
|
|
116
|
+
if (!hex.test(String(field.defaultValue))) {
|
|
117
|
+
throw new Error(
|
|
118
|
+
`Field "${field.name}" de tipo colorpicker debe tener defaultValue en formato hex (#RRGGBB)`
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
112
123
|
}
|
|
113
124
|
}
|
|
114
125
|
/**
|
|
@@ -178,6 +189,11 @@ var SchemaParser = class {
|
|
|
178
189
|
defaults.max = 5;
|
|
179
190
|
}
|
|
180
191
|
break;
|
|
192
|
+
case "colorpicker":
|
|
193
|
+
if (!("defaultValue" in field) || field.defaultValue == null) {
|
|
194
|
+
defaults.defaultValue = "#000000";
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
181
197
|
}
|
|
182
198
|
return { ...defaults, ...field };
|
|
183
199
|
}
|
|
@@ -263,12 +279,17 @@ function getBaseStyles(colors) {
|
|
|
263
279
|
flex-direction: row;
|
|
264
280
|
align-items: center;
|
|
265
281
|
gap: 0.75rem;
|
|
266
|
-
flex-wrap: wrap;
|
|
267
282
|
}
|
|
268
283
|
.easy-form-field-inner-horizontal .easy-form-label {
|
|
284
|
+
display: inline-block;
|
|
269
285
|
margin-bottom: 0;
|
|
270
286
|
margin-top: 0;
|
|
271
287
|
flex-shrink: 0;
|
|
288
|
+
white-space: nowrap;
|
|
289
|
+
}
|
|
290
|
+
.easy-form-field-inner-horizontal > *:not(.easy-form-label) {
|
|
291
|
+
flex: 1;
|
|
292
|
+
min-width: 0;
|
|
272
293
|
}
|
|
273
294
|
.easy-form-direction-vertical {
|
|
274
295
|
display: block;
|
|
@@ -306,6 +327,46 @@ function getBaseStyles(colors) {
|
|
|
306
327
|
min-width: 2rem;
|
|
307
328
|
font-weight: 500;
|
|
308
329
|
}
|
|
330
|
+
.easy-form-color-wrapper {
|
|
331
|
+
display: flex;
|
|
332
|
+
align-items: center;
|
|
333
|
+
gap: 0.75rem;
|
|
334
|
+
}
|
|
335
|
+
.easy-form-color-wrapper input[type="color"] {
|
|
336
|
+
width: 2.2rem;
|
|
337
|
+
height: 2.2rem;
|
|
338
|
+
min-width: 2.2rem;
|
|
339
|
+
min-height: 2.2rem;
|
|
340
|
+
padding: 0 !important;
|
|
341
|
+
margin: 0;
|
|
342
|
+
cursor: pointer;
|
|
343
|
+
border: 1px solid var(--easy-form-border);
|
|
344
|
+
border-radius: 2px;
|
|
345
|
+
background: transparent;
|
|
346
|
+
flex-shrink: 0;
|
|
347
|
+
}
|
|
348
|
+
.easy-form-color-wrapper input[type="color"]::-webkit-color-swatch-wrapper {
|
|
349
|
+
padding: 0;
|
|
350
|
+
}
|
|
351
|
+
.easy-form-color-wrapper input[type="color"]::-webkit-color-swatch {
|
|
352
|
+
border: none;
|
|
353
|
+
border-radius: 1px;
|
|
354
|
+
}
|
|
355
|
+
.easy-form-color-wrapper input[type="color"]::-moz-color-swatch {
|
|
356
|
+
border: none;
|
|
357
|
+
border-radius: 1px;
|
|
358
|
+
}
|
|
359
|
+
.easy-form-color-text {
|
|
360
|
+
flex: 1;
|
|
361
|
+
min-width: 0;
|
|
362
|
+
color: var(--easy-form-text);
|
|
363
|
+
background: var(--easy-form-background);
|
|
364
|
+
border: 1px solid var(--easy-form-border);
|
|
365
|
+
border-radius: 4px;
|
|
366
|
+
padding: 0.5rem 0.75rem;
|
|
367
|
+
font-family: ui-monospace, 'Cascadia Code', 'Fira Code', 'Courier New', monospace;
|
|
368
|
+
font-size: 0.875rem;
|
|
369
|
+
}
|
|
309
370
|
.easy-form-rating {
|
|
310
371
|
display: inline-flex;
|
|
311
372
|
gap: 0.25rem;
|
|
@@ -426,7 +487,7 @@ function getBaseStyles(colors) {
|
|
|
426
487
|
.easy-form-submit-wrapper .easy-form-submit {
|
|
427
488
|
min-width: 100px;
|
|
428
489
|
}
|
|
429
|
-
input:not([type="checkbox"]):not([type="radio"]), textarea, select {
|
|
490
|
+
input:not([type="checkbox"]):not([type="radio"]):not([type="color"]), textarea, select {
|
|
430
491
|
width: 100%;
|
|
431
492
|
padding: 0.5rem;
|
|
432
493
|
font-size: 1rem;
|
|
@@ -2691,6 +2752,9 @@ var StateManager = class {
|
|
|
2691
2752
|
}
|
|
2692
2753
|
}
|
|
2693
2754
|
break;
|
|
2755
|
+
case "colorpicker":
|
|
2756
|
+
values[field.name] = field.defaultValue ?? "#000000";
|
|
2757
|
+
break;
|
|
2694
2758
|
default:
|
|
2695
2759
|
values[field.name] = null;
|
|
2696
2760
|
}
|
|
@@ -4929,6 +4993,66 @@ var SliderInput = class extends BaseInput {
|
|
|
4929
4993
|
}
|
|
4930
4994
|
};
|
|
4931
4995
|
|
|
4996
|
+
// src/components/inputs/color-input.ts
|
|
4997
|
+
var HEX_REGEX = /^#?([0-9A-Fa-f]{6})$/;
|
|
4998
|
+
function toHex(value) {
|
|
4999
|
+
const m = value.match(HEX_REGEX);
|
|
5000
|
+
if (m) return `#${m[1].toLowerCase()}`;
|
|
5001
|
+
if (/^[0-9A-Fa-f]{6}$/.test(value)) return `#${value.toLowerCase()}`;
|
|
5002
|
+
return "#000000";
|
|
5003
|
+
}
|
|
5004
|
+
var ColorInput = class extends BaseInput {
|
|
5005
|
+
render() {
|
|
5006
|
+
const colorField = this.field;
|
|
5007
|
+
const defaultValue = colorField.defaultValue ?? "#000000";
|
|
5008
|
+
const currentValue = this.value != null && typeof this.value === "string" ? toHex(this.value) : defaultValue;
|
|
5009
|
+
const wrapper = document.createElement("div");
|
|
5010
|
+
wrapper.className = "easy-form-color-wrapper";
|
|
5011
|
+
const colorPicker = document.createElement("input");
|
|
5012
|
+
colorPicker.type = "color";
|
|
5013
|
+
colorPicker.value = currentValue;
|
|
5014
|
+
colorPicker.setAttribute("value", currentValue);
|
|
5015
|
+
colorPicker.setAttribute("aria-label", this.field.label || "Color");
|
|
5016
|
+
colorPicker.id = `${this.getFieldId()}-picker`;
|
|
5017
|
+
if (this.field.disabled) colorPicker.setAttribute("disabled", "true");
|
|
5018
|
+
const textInput = document.createElement("input");
|
|
5019
|
+
textInput.type = "text";
|
|
5020
|
+
textInput.value = currentValue;
|
|
5021
|
+
textInput.setAttribute("aria-label", `${this.field.label || "Color"} (hex)`);
|
|
5022
|
+
textInput.placeholder = "#000000";
|
|
5023
|
+
textInput.className = "easy-form-color-text";
|
|
5024
|
+
this.applyCommonProps(textInput);
|
|
5025
|
+
const syncFromPicker = () => {
|
|
5026
|
+
const value = colorPicker.value || "#000000";
|
|
5027
|
+
const hex = toHex(value);
|
|
5028
|
+
textInput.value = hex;
|
|
5029
|
+
this.onChange(hex);
|
|
5030
|
+
};
|
|
5031
|
+
const syncFromText = () => {
|
|
5032
|
+
const raw = textInput.value.trim();
|
|
5033
|
+
const value = raw.startsWith("#") ? raw : `#${raw}`;
|
|
5034
|
+
if (/^#[0-9A-Fa-f]{6}$/.test(value)) {
|
|
5035
|
+
const hex = toHex(value);
|
|
5036
|
+
colorPicker.value = hex;
|
|
5037
|
+
this.onChange(hex);
|
|
5038
|
+
}
|
|
5039
|
+
};
|
|
5040
|
+
colorPicker.addEventListener("input", syncFromPicker);
|
|
5041
|
+
colorPicker.addEventListener("change", () => {
|
|
5042
|
+
syncFromPicker();
|
|
5043
|
+
this.onBlur();
|
|
5044
|
+
});
|
|
5045
|
+
textInput.addEventListener("input", syncFromText);
|
|
5046
|
+
textInput.addEventListener("blur", () => {
|
|
5047
|
+
syncFromText();
|
|
5048
|
+
this.onBlur();
|
|
5049
|
+
});
|
|
5050
|
+
wrapper.appendChild(colorPicker);
|
|
5051
|
+
wrapper.appendChild(textInput);
|
|
5052
|
+
return this.createFieldContainer(wrapper);
|
|
5053
|
+
}
|
|
5054
|
+
};
|
|
5055
|
+
|
|
4932
5056
|
// src/components/inputs/index.ts
|
|
4933
5057
|
function createInput(field, value, error, onChange, onBlur) {
|
|
4934
5058
|
switch (field.type) {
|
|
@@ -4961,6 +5085,8 @@ function createInput(field, value, error, onChange, onBlur) {
|
|
|
4961
5085
|
return new RatingInput(field, value, error, onChange, onBlur).render();
|
|
4962
5086
|
case "slider":
|
|
4963
5087
|
return new SliderInput(field, value, error, onChange, onBlur).render();
|
|
5088
|
+
case "colorpicker":
|
|
5089
|
+
return new ColorInput(field, value, error, onChange, onBlur).render();
|
|
4964
5090
|
case "quantity":
|
|
4965
5091
|
return new QuantityInput(field, value, error, onChange, onBlur).render();
|
|
4966
5092
|
case "accordion-select":
|
|
@@ -5742,6 +5868,9 @@ var EasyForm = class extends BrowserHTMLElement {
|
|
|
5742
5868
|
if (name === "disabled" && newValue !== oldValue) {
|
|
5743
5869
|
this.render();
|
|
5744
5870
|
}
|
|
5871
|
+
if ((name === "label-position" || name === "form-direction" || name === "show-completed-indicator") && newValue !== oldValue) {
|
|
5872
|
+
this.render();
|
|
5873
|
+
}
|
|
5745
5874
|
if ((name === "max-attempts" || name === "block-duration-minutes" || name === "attempts-storage-key") && newValue !== oldValue) {
|
|
5746
5875
|
this.setupAttemptsLock();
|
|
5747
5876
|
this.updateLockOverlay();
|