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.
@@ -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();