@moni-labs/moni-ui 0.4.6 → 0.4.7

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 (63) hide show
  1. package/custom-elements.json +181 -1
  2. package/dist/browser/moni-ui.iife.min.js +289 -274
  3. package/dist/browser/moni-ui.iife.min.js.br +0 -0
  4. package/dist/browser/moni-ui.iife.min.js.gz +0 -0
  5. package/dist/browser/moni-ui.iife.min.js.map +1 -1
  6. package/dist/browser/moni-ui.min.js +1462 -1372
  7. package/dist/browser/moni-ui.min.js.br +0 -0
  8. package/dist/browser/moni-ui.min.js.gz +0 -0
  9. package/dist/browser/moni-ui.min.js.map +1 -1
  10. package/dist/cdn/components/moni-color-field.js +1 -0
  11. package/dist/cdn/components/moni-select.js +3 -3
  12. package/dist/cdn/components/moni-text-field.js +12 -2
  13. package/dist/cdn/components/moni-textarea.js +6 -2
  14. package/dist/cdn/importmap.json +98 -98
  15. package/dist/components/moni-color-field.d.ts.map +1 -1
  16. package/dist/components/moni-color-field.js +1 -0
  17. package/dist/components/moni-select.d.ts +28 -0
  18. package/dist/components/moni-select.d.ts.map +1 -1
  19. package/dist/components/moni-select.js +48 -0
  20. package/dist/components/moni-text-field.d.ts +45 -2
  21. package/dist/components/moni-text-field.d.ts.map +1 -1
  22. package/dist/components/moni-text-field.js +113 -1
  23. package/dist/components/moni-textarea.d.ts +27 -0
  24. package/dist/components/moni-textarea.d.ts.map +1 -1
  25. package/dist/components/moni-textarea.js +61 -0
  26. package/docs/api.json +178 -5
  27. package/docs/assets/moni-context-menu/placement--top.png +0 -0
  28. package/docs/assets/moni-select/required--false.png +0 -0
  29. package/docs/assets/moni-select/required--true.png +0 -0
  30. package/docs/assets/moni-text-field/autocomplete--default.png +0 -0
  31. package/docs/assets/moni-text-field/inputmode--default.png +0 -0
  32. package/docs/assets/moni-text-field/max--default.png +0 -0
  33. package/docs/assets/moni-text-field/maxlength--default.png +0 -0
  34. package/docs/assets/moni-text-field/min--default.png +0 -0
  35. package/docs/assets/moni-text-field/minlength--default.png +0 -0
  36. package/docs/assets/moni-text-field/pattern--default.png +0 -0
  37. package/docs/assets/moni-text-field/readonly--false.png +0 -0
  38. package/docs/assets/moni-text-field/readonly--true.png +0 -0
  39. package/docs/assets/moni-text-field/required--false.png +0 -0
  40. package/docs/assets/moni-text-field/required--true.png +0 -0
  41. package/docs/assets/moni-text-field/step--default.png +0 -0
  42. package/docs/assets/moni-text-field/type--color.png +0 -0
  43. package/docs/assets/moni-text-field/type--date.png +0 -0
  44. package/docs/assets/moni-text-field/type--datetime-local.png +0 -0
  45. package/docs/assets/moni-text-field/type--month.png +0 -0
  46. package/docs/assets/moni-text-field/type--time.png +0 -0
  47. package/docs/assets/moni-text-field/type--week.png +0 -0
  48. package/docs/assets/moni-textarea/autocomplete--default.png +0 -0
  49. package/docs/assets/moni-textarea/minlength--default.png +0 -0
  50. package/docs/assets/moni-textarea/readonly--false.png +0 -0
  51. package/docs/assets/moni-textarea/readonly--true.png +0 -0
  52. package/docs/assets/moni-textarea/required--false.png +0 -0
  53. package/docs/assets/moni-textarea/required--true.png +0 -0
  54. package/docs/components/select.md +15 -1
  55. package/docs/components/text-field.md +89 -1
  56. package/docs/components/textarea.md +34 -1
  57. package/package.json +1 -1
  58. package/src/components/moni-color-field.ts +1 -0
  59. package/src/components/moni-select.test.ts +34 -0
  60. package/src/components/moni-select.ts +54 -0
  61. package/src/components/moni-text-field.test.ts +78 -0
  62. package/src/components/moni-text-field.ts +109 -2
  63. package/src/components/moni-textarea.ts +62 -0
@@ -104,7 +104,7 @@ let MoniTextField = class MoniTextField extends MoniElement {
104
104
  this.shape = 'no-round';
105
105
  /**
106
106
  * El tipo de input HTML nativo.
107
- * @type {'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'search'}
107
+ * @type {'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'time' | 'datetime-local' | 'month' | 'week' | 'color'}
108
108
  * @default 'text'
109
109
  */
110
110
  this.type = 'text';
@@ -169,6 +169,39 @@ let MoniTextField = class MoniTextField extends MoniElement {
169
169
  * @type {string}
170
170
  */
171
171
  this.placeholder = '';
172
+ /*
173
+ * Restricciones nativas.
174
+ *
175
+ * Antes ninguna de estas llegaba al `<input>` interno: el componente sólo
176
+ * reenviaba `type`, `placeholder`, `disabled`, `value` y `name`. Eso dejaba
177
+ * fuera el autocompletado de contraseñas, el teclado correcto en móvil, el
178
+ * límite de caracteres y toda la validación de restricciones, así que cada
179
+ * consumidor que necesitaba una de ellas tenía que renunciar al componente y
180
+ * usar un input nativo.
181
+ *
182
+ * Se reflejan al host además de reenviarse para que `[required]` y compañía
183
+ * puedan usarse como selectores CSS desde fuera.
184
+ */
185
+ /** Marca el campo como obligatorio y lo integra en la validación del formulario. */
186
+ this.required = false;
187
+ /** Impide editar el valor sin sacarlo del envío ni atenuarlo como `disabled`. */
188
+ this.readonly = false;
189
+ /** Pista de autocompletado del navegador, por ejemplo `email` o `current-password`. */
190
+ this.autocomplete = '';
191
+ /** Teclado virtual a mostrar en móvil, por ejemplo `numeric` o `tel`. */
192
+ this.inputmode = '';
193
+ /** Máximo de caracteres aceptados. */
194
+ this.maxlength = null;
195
+ /** Mínimo de caracteres aceptados. */
196
+ this.minlength = null;
197
+ /** Valor mínimo para `number` y los tipos de fecha y hora. */
198
+ this.min = '';
199
+ /** Valor máximo para `number` y los tipos de fecha y hora. */
200
+ this.max = '';
201
+ /** Incremento para `number` y los tipos de fecha y hora. */
202
+ this.step = '';
203
+ /** Expresión regular que debe cumplir el valor. */
204
+ this.pattern = '';
172
205
  /**
173
206
  * Patrón Inputmask. Admite opcionales `[]`, grupos `()`, alternadores `|`,
174
207
  * cuantificadores `{n,m}` y los tokens `9`, `a`, `*` y `K` (RUT).
@@ -274,10 +307,49 @@ let MoniTextField = class MoniTextField extends MoniElement {
274
307
  if (changed.has('disabled'))
275
308
  this._input.disabled = this.disabled;
276
309
  }
310
+ this._syncValidity();
311
+ }
312
+ /**
313
+ * Copia la validez del `<input>` interno al host.
314
+ *
315
+ * Reenviar `required` o `pattern` no basta: el navegador valida el
316
+ * formulario mirando los controles asociados a él, y el que aquí participa
317
+ * es el host, no el input del Shadow DOM. Sin este puente el campo se
318
+ * pintaría como obligatorio pero el envío no se detendría.
319
+ *
320
+ * El tercer argumento ancla el globo de validación al input real, para que
321
+ * el navegador tenga dónde mostrarlo y a dónde mover el foco.
322
+ */
323
+ /**
324
+ * API de validación equivalente a la de un control nativo.
325
+ *
326
+ * Los elementos form-associated participan en la validación del formulario,
327
+ * pero no reciben estos miembros automáticamente: hay que exponerlos para que
328
+ * un `moni-text-field` se pueda interrogar igual que un `<input>`.
329
+ */
330
+ get validity() {
331
+ return this._internals.validity;
332
+ }
333
+ get validationMessage() {
334
+ return this._internals.validationMessage;
335
+ }
336
+ checkValidity() {
337
+ return this._internals.checkValidity();
338
+ }
339
+ reportValidity() {
340
+ return this._internals.reportValidity();
341
+ }
342
+ _syncValidity() {
343
+ if (!this._input || !this._internals?.setValidity)
344
+ return;
345
+ this._internals.setValidity(this._input.validity, this._input.validationMessage, this._input);
277
346
  }
278
347
  _handleInput(e) {
279
348
  const target = e.target;
280
349
  this.value = target.value;
350
+ // Al teclear, `value` no siempre cambia de referencia (máscaras), así que
351
+ // la validez se refresca aquí y no sólo desde `updated()`.
352
+ this._syncValidity();
281
353
  emitMoniEvent(this, 'moni-input', {
282
354
  detail: { value: this.value, unmaskedValue: this.unmaskedValue, originalEvent: e }
283
355
  });
@@ -429,6 +501,16 @@ let MoniTextField = class MoniTextField extends MoniElement {
429
501
  type=${this.type}
430
502
  placeholder=${placeholder}
431
503
  ?disabled=${this.disabled}
504
+ ?required=${this.required}
505
+ ?readonly=${this.readonly}
506
+ autocomplete=${ifDefined(this.autocomplete || undefined)}
507
+ inputmode=${ifDefined(this.inputmode || undefined)}
508
+ maxlength=${ifDefined(this.maxlength ?? undefined)}
509
+ minlength=${ifDefined(this.minlength ?? undefined)}
510
+ min=${ifDefined(this.min || undefined)}
511
+ max=${ifDefined(this.max || undefined)}
512
+ step=${ifDefined(this.step || undefined)}
513
+ pattern=${ifDefined(this.pattern || undefined)}
432
514
  .value=${this.value}
433
515
  name=${ifDefined(this.name || undefined)}
434
516
  class=${isActive ? 'active' : ''}
@@ -517,6 +599,36 @@ __decorate([
517
599
  __decorate([
518
600
  property({ reflect: true })
519
601
  ], MoniTextField.prototype, "placeholder", void 0);
602
+ __decorate([
603
+ property({ type: Boolean, reflect: true })
604
+ ], MoniTextField.prototype, "required", void 0);
605
+ __decorate([
606
+ property({ type: Boolean, reflect: true })
607
+ ], MoniTextField.prototype, "readonly", void 0);
608
+ __decorate([
609
+ property({ reflect: true })
610
+ ], MoniTextField.prototype, "autocomplete", void 0);
611
+ __decorate([
612
+ property({ reflect: true })
613
+ ], MoniTextField.prototype, "inputmode", void 0);
614
+ __decorate([
615
+ property({ type: Number, reflect: true })
616
+ ], MoniTextField.prototype, "maxlength", void 0);
617
+ __decorate([
618
+ property({ type: Number, reflect: true })
619
+ ], MoniTextField.prototype, "minlength", void 0);
620
+ __decorate([
621
+ property({ reflect: true })
622
+ ], MoniTextField.prototype, "min", void 0);
623
+ __decorate([
624
+ property({ reflect: true })
625
+ ], MoniTextField.prototype, "max", void 0);
626
+ __decorate([
627
+ property({ reflect: true })
628
+ ], MoniTextField.prototype, "step", void 0);
629
+ __decorate([
630
+ property({ reflect: true })
631
+ ], MoniTextField.prototype, "pattern", void 0);
520
632
  __decorate([
521
633
  property({ reflect: true })
522
634
  ], MoniTextField.prototype, "mask", void 0);
@@ -121,6 +121,14 @@ export declare class MoniTextarea extends MoniElement {
121
121
  * @type {number | null}
122
122
  */
123
123
  maxlength: number | null;
124
+ /** Marca el campo como obligatorio y lo integra en la validación del formulario. */
125
+ required: boolean;
126
+ /** Impide editar el valor sin sacarlo del envío ni atenuarlo como `disabled`. */
127
+ readonly: boolean;
128
+ /** Mínimo de caracteres aceptados. */
129
+ minlength: number | null;
130
+ /** Pista de autocompletado del navegador. */
131
+ autocomplete: string;
124
132
  /**
125
133
  * Oculta la visualización del contador de caracteres cuando se establece `maxlength`.
126
134
  * @type {boolean}
@@ -170,6 +178,25 @@ export declare class MoniTextarea extends MoniElement {
170
178
  private _handleInput;
171
179
  private _resizeTextarea;
172
180
  updated(changed: Map<string, unknown>): void;
181
+ /**
182
+ * Copia la validez del `<textarea>` interno al host.
183
+ *
184
+ * El navegador valida mirando los controles asociados al formulario, y el
185
+ * que participa es el host, no el control del Shadow DOM: sin este puente
186
+ * `required` se pintaría pero no detendría el envío.
187
+ */
188
+ /**
189
+ * API de validación equivalente a la de un control nativo.
190
+ *
191
+ * Los elementos form-associated participan en la validación del formulario,
192
+ * pero no reciben estos miembros automáticamente: hay que exponerlos para que
193
+ * un `moni-textarea` se pueda interrogar igual que un `<input>`.
194
+ */
195
+ get validity(): ValidityState;
196
+ get validationMessage(): string;
197
+ checkValidity(): boolean;
198
+ reportValidity(): boolean;
199
+ private _syncValidity;
173
200
  static styles: import("lit").CSSResult[];
174
201
  /**
175
202
  * Renderiza el campo del área de texto con etiqueta, iconos de prefijo/sufijo y contador de caracteres.
@@ -1 +1 @@
1
- {"version":3,"file":"moni-textarea.d.ts","sourceRoot":"","sources":["../../src/components/moni-textarea.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAA6B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,gBAAgB,CAAC;AACxB,OAAO,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,qBACa,YAAa,SAAQ,WAAW;IAC5C,MAAM,CAAC,cAAc,UAAQ;IAC7B,OAAO,CAAC,UAAU,CAAmB;;IAOrC;;;OAGG;IAC0B,IAAI,SAAM;IAEvC;;;OAGG;IAC0B,KAAK,SAAM;IAExC;;;;OAIG;IAC0B,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAY;IAEvE;;;;OAIG;IAEH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAY;IAExD;;;;OAIG;IAEH,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAc;IAEpD;;;OAGG;IAC0B,IAAI,SAAM;IAEvC;;;OAGG;IACsD,YAAY,SAAM;IAE3E;;;OAGG;IAC0B,MAAM,SAAM;IAEzC;;;OAGG;IAC0B,MAAM,SAAM;IAEzC;;;;OAIG;IACwC,IAAI,SAAK;IAEpD,mEAAmE;IACvB,QAAQ,UAAS;IAE7D,4FAA4F;IAC1B,OAAO,SAAK;IAE9E;;;;OAIG;IACwC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3E;;;OAGG;IAEH,SAAS,UAAS;IAElB;;;OAGG;IACyC,OAAO,UAAS;IAE5D;;;OAGG;IACyC,QAAQ,UAAS;IAE7D;;;OAGG;IAC0B,MAAM,SAAM;IAEzC;;;;OAIG;IACmD,SAAS,SAAM;IAErE;;;OAGG;IACyC,KAAK,UAAS;IAE1D;;;OAGG;IAC0B,KAAK,SAAM;IAExC;;;OAGG;IAC0B,WAAW,SAAM;IAE3B,OAAO,CAAC,MAAM,CAAuB;IACxD,OAAO,CAAC,eAAe,CAAC,CAAiB;IAEhC,iBAAiB;IAKjB,oBAAoB;IAMpB,YAAY;IAKrB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,eAAe;IAyBd,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAmB9C,OAAgB,MAAM,4BAEnB;IAEH;;;;;;;;;;;;OAYG;IACM,MAAM;CAqGf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,eAAe,EAAE,YAAY,CAAC;KAC9B;CACD;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"moni-textarea.d.ts","sourceRoot":"","sources":["../../src/components/moni-textarea.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAA6B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,gBAAgB,CAAC;AACxB,OAAO,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,qBACa,YAAa,SAAQ,WAAW;IAC5C,MAAM,CAAC,cAAc,UAAQ;IAC7B,OAAO,CAAC,UAAU,CAAmB;;IAOrC;;;OAGG;IAC0B,IAAI,SAAM;IAEvC;;;OAGG;IAC0B,KAAK,SAAM;IAExC;;;;OAIG;IAC0B,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAY;IAEvE;;;;OAIG;IAEH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAY;IAExD;;;;OAIG;IAEH,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAc;IAEpD;;;OAGG;IAC0B,IAAI,SAAM;IAEvC;;;OAGG;IACsD,YAAY,SAAM;IAE3E;;;OAGG;IAC0B,MAAM,SAAM;IAEzC;;;OAGG;IAC0B,MAAM,SAAM;IAEzC;;;;OAIG;IACwC,IAAI,SAAK;IAEpD,mEAAmE;IACvB,QAAQ,UAAS;IAE7D,4FAA4F;IAC1B,OAAO,SAAK;IAE9E;;;;OAIG;IACwC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAQ3E,oFAAoF;IACxC,QAAQ,UAAS;IAE7D,iFAAiF;IACrC,QAAQ,UAAS;IAE7D,sCAAsC;IACK,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3E,6CAA6C;IAChB,YAAY,SAAM;IAE/C;;;OAGG;IAEH,SAAS,UAAS;IAElB;;;OAGG;IACyC,OAAO,UAAS;IAE5D;;;OAGG;IACyC,QAAQ,UAAS;IAE7D;;;OAGG;IAC0B,MAAM,SAAM;IAEzC;;;;OAIG;IACmD,SAAS,SAAM;IAErE;;;OAGG;IACyC,KAAK,UAAS;IAE1D;;;OAGG;IAC0B,KAAK,SAAM;IAExC;;;OAGG;IAC0B,WAAW,SAAM;IAE3B,OAAO,CAAC,MAAM,CAAuB;IACxD,OAAO,CAAC,eAAe,CAAC,CAAiB;IAEhC,iBAAiB;IAKjB,oBAAoB;IAMpB,YAAY;IAKrB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,eAAe;IAyBd,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAoB9C;;;;;;OAMG;IACJ;;;;;;WAMI;IACH,IAAI,QAAQ,IAAI,aAAa,CAE5B;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,aAAa,IAAI,OAAO;IAIxB,cAAc,IAAI,OAAO;IAIzB,OAAO,CAAC,aAAa;IASrB,OAAgB,MAAM,4BAEnB;IAEH;;;;;;;;;;;;OAYG;IACM,MAAM;CAyGf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,eAAe,EAAE,YAAY,CAAC;KAC9B;CACD;AAED,eAAe,YAAY,CAAC"}
@@ -131,6 +131,19 @@ let MoniTextarea = class MoniTextarea extends MoniElement {
131
131
  * @type {number | null}
132
132
  */
133
133
  this.maxlength = null;
134
+ /*
135
+ * Restricciones nativas. Antes sólo `maxlength` llegaba al `<textarea>`
136
+ * interno, así que un campo obligatorio o de sólo lectura obligaba a
137
+ * abandonar el componente y usar un control nativo.
138
+ */
139
+ /** Marca el campo como obligatorio y lo integra en la validación del formulario. */
140
+ this.required = false;
141
+ /** Impide editar el valor sin sacarlo del envío ni atenuarlo como `disabled`. */
142
+ this.readonly = false;
143
+ /** Mínimo de caracteres aceptados. */
144
+ this.minlength = null;
145
+ /** Pista de autocompletado del navegador. */
146
+ this.autocomplete = '';
134
147
  /**
135
148
  * Oculta la visualización del contador de caracteres cuando se establece `maxlength`.
136
149
  * @type {boolean}
@@ -232,6 +245,38 @@ let MoniTextarea = class MoniTextarea extends MoniElement {
232
245
  changed.has('maxRows'))
233
246
  this._resizeTextarea();
234
247
  }
248
+ this._syncValidity();
249
+ }
250
+ /**
251
+ * Copia la validez del `<textarea>` interno al host.
252
+ *
253
+ * El navegador valida mirando los controles asociados al formulario, y el
254
+ * que participa es el host, no el control del Shadow DOM: sin este puente
255
+ * `required` se pintaría pero no detendría el envío.
256
+ */
257
+ /**
258
+ * API de validación equivalente a la de un control nativo.
259
+ *
260
+ * Los elementos form-associated participan en la validación del formulario,
261
+ * pero no reciben estos miembros automáticamente: hay que exponerlos para que
262
+ * un `moni-textarea` se pueda interrogar igual que un `<input>`.
263
+ */
264
+ get validity() {
265
+ return this._internals.validity;
266
+ }
267
+ get validationMessage() {
268
+ return this._internals.validationMessage;
269
+ }
270
+ checkValidity() {
271
+ return this._internals.checkValidity();
272
+ }
273
+ reportValidity() {
274
+ return this._internals.reportValidity();
275
+ }
276
+ _syncValidity() {
277
+ if (!this._input || !this._internals?.setValidity)
278
+ return;
279
+ this._internals.setValidity(this._input.validity, this._input.validationMessage, this._input);
235
280
  }
236
281
  static { this.styles = [sharedStyles, fieldStyles, css `
237
282
  :host([autosize]) textarea { resize: none; }
@@ -319,8 +364,12 @@ let MoniTextarea = class MoniTextarea extends MoniElement {
319
364
  part="input"
320
365
  rows=${this.rows}
321
366
  maxlength=${ifDefined(this.maxlength ?? undefined)}
367
+ minlength=${ifDefined(this.minlength ?? undefined)}
322
368
  placeholder=${placeholder}
323
369
  ?disabled=${this.disabled}
370
+ ?required=${this.required}
371
+ ?readonly=${this.readonly}
372
+ autocomplete=${ifDefined(this.autocomplete || undefined)}
324
373
  .value=${this.value}
325
374
  name=${ifDefined(this.name || undefined)}
326
375
  class=${isActive ? 'active' : ''}
@@ -384,6 +433,18 @@ __decorate([
384
433
  __decorate([
385
434
  property({ type: Number, reflect: true })
386
435
  ], MoniTextarea.prototype, "maxlength", void 0);
436
+ __decorate([
437
+ property({ type: Boolean, reflect: true })
438
+ ], MoniTextarea.prototype, "required", void 0);
439
+ __decorate([
440
+ property({ type: Boolean, reflect: true })
441
+ ], MoniTextarea.prototype, "readonly", void 0);
442
+ __decorate([
443
+ property({ type: Number, reflect: true })
444
+ ], MoniTextarea.prototype, "minlength", void 0);
445
+ __decorate([
446
+ property({ reflect: true })
447
+ ], MoniTextarea.prototype, "autocomplete", void 0);
387
448
  __decorate([
388
449
  property({ type: Boolean, reflect: true, attribute: 'no-counter' })
389
450
  ], MoniTextarea.prototype, "noCounter", void 0);
package/docs/api.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@moni-labs/moni-ui",
3
- "generatedAt": "2026-08-21T19:54:17.603Z",
3
+ "generatedAt": "2026-08-21T21:03:00.175Z",
4
4
  "componentCount": 49,
5
5
  "components": [
6
6
  {
@@ -3826,6 +3826,15 @@
3826
3826
  "options": [],
3827
3827
  "reflect": true
3828
3828
  },
3829
+ {
3830
+ "name": "required",
3831
+ "attribute": "required",
3832
+ "type": "boolean",
3833
+ "default": "false",
3834
+ "description": "Obliga a elegir una opción antes de enviar el formulario.\n\nEl `<input>` visible es de sólo lectura, así que la validación nativa no\nse aplica sobre él: la restricción se declara en el host con\n`ElementInternals.setValidity`, que es lo que mira el formulario.",
3835
+ "options": [],
3836
+ "reflect": true
3837
+ },
3829
3838
  {
3830
3839
  "name": "loading",
3831
3840
  "attribute": "loading",
@@ -3972,7 +3981,18 @@
3972
3981
  "reflect": true
3973
3982
  }
3974
3983
  ],
3975
- "methods": [],
3984
+ "methods": [
3985
+ {
3986
+ "name": "checkValidity",
3987
+ "signature": "checkValidity(): boolean",
3988
+ "description": "Método público checkValidity."
3989
+ },
3990
+ {
3991
+ "name": "reportValidity",
3992
+ "signature": "reportValidity(): boolean",
3993
+ "description": "Método público reportValidity."
3994
+ }
3995
+ ],
3976
3996
  "events": [],
3977
3997
  "slots": [
3978
3998
  {
@@ -5264,7 +5284,7 @@
5264
5284
  {
5265
5285
  "name": "type",
5266
5286
  "attribute": "type",
5267
- "type": "'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'search'",
5287
+ "type": "'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'time' | 'datetime-local' | 'month' | 'week' | 'color'",
5268
5288
  "default": "'text'",
5269
5289
  "description": "El tipo de input HTML nativo.",
5270
5290
  "options": [
@@ -5274,7 +5294,13 @@
5274
5294
  "number",
5275
5295
  "tel",
5276
5296
  "url",
5277
- "search"
5297
+ "search",
5298
+ "date",
5299
+ "time",
5300
+ "datetime-local",
5301
+ "month",
5302
+ "week",
5303
+ "color"
5278
5304
  ],
5279
5305
  "reflect": true
5280
5306
  },
@@ -5395,6 +5421,96 @@
5395
5421
  "options": [],
5396
5422
  "reflect": true
5397
5423
  },
5424
+ {
5425
+ "name": "required",
5426
+ "attribute": "required",
5427
+ "type": "boolean",
5428
+ "default": "false",
5429
+ "description": "Marca el campo como obligatorio y lo integra en la validación del formulario.",
5430
+ "options": [],
5431
+ "reflect": true
5432
+ },
5433
+ {
5434
+ "name": "readonly",
5435
+ "attribute": "readonly",
5436
+ "type": "boolean",
5437
+ "default": "false",
5438
+ "description": "Impide editar el valor sin sacarlo del envío ni atenuarlo como `disabled`.",
5439
+ "options": [],
5440
+ "reflect": true
5441
+ },
5442
+ {
5443
+ "name": "autocomplete",
5444
+ "attribute": "autocomplete",
5445
+ "type": "string",
5446
+ "default": "''",
5447
+ "description": "Pista de autocompletado del navegador, por ejemplo `email` o `current-password`.",
5448
+ "options": [],
5449
+ "reflect": true
5450
+ },
5451
+ {
5452
+ "name": "inputmode",
5453
+ "attribute": "inputmode",
5454
+ "type": "string",
5455
+ "default": "''",
5456
+ "description": "Teclado virtual a mostrar en móvil, por ejemplo `numeric` o `tel`.",
5457
+ "options": [],
5458
+ "reflect": true
5459
+ },
5460
+ {
5461
+ "name": "maxlength",
5462
+ "attribute": "maxlength",
5463
+ "type": "number | null",
5464
+ "default": "null",
5465
+ "description": "Máximo de caracteres aceptados.",
5466
+ "options": [],
5467
+ "reflect": true
5468
+ },
5469
+ {
5470
+ "name": "minlength",
5471
+ "attribute": "minlength",
5472
+ "type": "number | null",
5473
+ "default": "null",
5474
+ "description": "Mínimo de caracteres aceptados.",
5475
+ "options": [],
5476
+ "reflect": true
5477
+ },
5478
+ {
5479
+ "name": "min",
5480
+ "attribute": "min",
5481
+ "type": "string",
5482
+ "default": "''",
5483
+ "description": "Valor mínimo para `number` y los tipos de fecha y hora.",
5484
+ "options": [],
5485
+ "reflect": true
5486
+ },
5487
+ {
5488
+ "name": "max",
5489
+ "attribute": "max",
5490
+ "type": "string",
5491
+ "default": "''",
5492
+ "description": "Valor máximo para `number` y los tipos de fecha y hora.",
5493
+ "options": [],
5494
+ "reflect": true
5495
+ },
5496
+ {
5497
+ "name": "step",
5498
+ "attribute": "step",
5499
+ "type": "string",
5500
+ "default": "''",
5501
+ "description": "Incremento para `number` y los tipos de fecha y hora.",
5502
+ "options": [],
5503
+ "reflect": true
5504
+ },
5505
+ {
5506
+ "name": "pattern",
5507
+ "attribute": "pattern",
5508
+ "type": "string",
5509
+ "default": "''",
5510
+ "description": "Expresión regular que debe cumplir el valor.",
5511
+ "options": [],
5512
+ "reflect": true
5513
+ },
5398
5514
  {
5399
5515
  "name": "mask",
5400
5516
  "attribute": "mask",
@@ -5478,6 +5594,16 @@
5478
5594
  "name": "removeMask",
5479
5595
  "signature": "removeMask(): void",
5480
5596
  "description": "Método público removeMask."
5597
+ },
5598
+ {
5599
+ "name": "checkValidity",
5600
+ "signature": "checkValidity(): boolean",
5601
+ "description": "Método público checkValidity."
5602
+ },
5603
+ {
5604
+ "name": "reportValidity",
5605
+ "signature": "reportValidity(): boolean",
5606
+ "description": "Método público reportValidity."
5481
5607
  }
5482
5608
  ],
5483
5609
  "events": [
@@ -5676,6 +5802,42 @@
5676
5802
  "options": [],
5677
5803
  "reflect": true
5678
5804
  },
5805
+ {
5806
+ "name": "required",
5807
+ "attribute": "required",
5808
+ "type": "boolean",
5809
+ "default": "false",
5810
+ "description": "Marca el campo como obligatorio y lo integra en la validación del formulario.",
5811
+ "options": [],
5812
+ "reflect": true
5813
+ },
5814
+ {
5815
+ "name": "readonly",
5816
+ "attribute": "readonly",
5817
+ "type": "boolean",
5818
+ "default": "false",
5819
+ "description": "Impide editar el valor sin sacarlo del envío ni atenuarlo como `disabled`.",
5820
+ "options": [],
5821
+ "reflect": true
5822
+ },
5823
+ {
5824
+ "name": "minlength",
5825
+ "attribute": "minlength",
5826
+ "type": "number | null",
5827
+ "default": "null",
5828
+ "description": "Mínimo de caracteres aceptados.",
5829
+ "options": [],
5830
+ "reflect": true
5831
+ },
5832
+ {
5833
+ "name": "autocomplete",
5834
+ "attribute": "autocomplete",
5835
+ "type": "string",
5836
+ "default": "''",
5837
+ "description": "Pista de autocompletado del navegador.",
5838
+ "options": [],
5839
+ "reflect": true
5840
+ },
5679
5841
  {
5680
5842
  "name": "noCounter",
5681
5843
  "attribute": "no-counter",
@@ -5749,7 +5911,18 @@
5749
5911
  "reflect": true
5750
5912
  }
5751
5913
  ],
5752
- "methods": [],
5914
+ "methods": [
5915
+ {
5916
+ "name": "checkValidity",
5917
+ "signature": "checkValidity(): boolean",
5918
+ "description": "Método público checkValidity."
5919
+ },
5920
+ {
5921
+ "name": "reportValidity",
5922
+ "signature": "reportValidity(): boolean",
5923
+ "description": "Método público reportValidity."
5924
+ }
5925
+ ],
5753
5926
  "events": [],
5754
5927
  "slots": [],
5755
5928
  "cssParts": [
@@ -96,6 +96,7 @@ Las utilities aplicadas directamente al tag afectan su caja anfitriona. No uses
96
96
  | `size` | `size` | `'small' \| 'medium' \| 'large' \| 'extra'` | `'medium'` | Define las dimensiones del campo select. |
97
97
  | `shape` | `shape` | `'round' \| 'square' \| 'no-round'` | `'no-round'` | Forma (radio de borde) del campo. |
98
98
  | `disabled` | `disabled` | `boolean` | `false` | Deshabilita el campo select. |
99
+ | `required` | `required` | `boolean` | `false` | Obliga a elegir una opción antes de enviar el formulario. El `<input>` visible es de sólo lectura, así que la validación nativa no se aplica sobre él: la restricción se declara en el host con `ElementInternals.setValidity`, que es lo que mira el formulario. |
99
100
  | `loading` | `loading` | `boolean` | `false` | Si es verdadero, muestra un indicador de carga (progreso lineal). |
100
101
  | `helper` | `helper` | `string` | `''` | Texto de ayuda mostrado debajo del campo. |
101
102
  | `error-text` | `errorText` | `string` | `''` | Texto de error mostrado debajo del campo cuando `error` es true. Reemplaza al texto de ayuda. |
@@ -122,7 +123,8 @@ No declara eventos propios.
122
123
 
123
124
  ## Métodos públicos
124
125
 
125
- No expone métodos públicos adicionales.
126
+ - `checkValidity(): boolean` Método público checkValidity.
127
+ - `reportValidity(): boolean` — Método público reportValidity.
126
128
 
127
129
  ## CSS Parts
128
130
 
@@ -205,6 +207,18 @@ Deshabilita el campo select.
205
207
 
206
208
  ![moni-select — disabled=true](../assets/moni-select/disabled--true.png)
207
209
 
210
+ ### `required`
211
+
212
+ Obliga a elegir una opción antes de enviar el formulario.
213
+
214
+ El `<input>` visible es de sólo lectura, así que la validación nativa no
215
+ se aplica sobre él: la restricción se declara en el host con
216
+ `ElementInternals.setValidity`, que es lo que mira el formulario.
217
+
218
+ ![moni-select — required=false](../assets/moni-select/required--false.png)
219
+
220
+ ![moni-select — required=true](../assets/moni-select/required--true.png)
221
+
208
222
  ### `loading`
209
223
 
210
224
  Si es verdadero, muestra un indicador de carga (progreso lineal).