@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.
- package/custom-elements.json +181 -1
- package/dist/browser/moni-ui.iife.min.js +289 -274
- package/dist/browser/moni-ui.iife.min.js.br +0 -0
- package/dist/browser/moni-ui.iife.min.js.gz +0 -0
- package/dist/browser/moni-ui.iife.min.js.map +1 -1
- package/dist/browser/moni-ui.min.js +1462 -1372
- package/dist/browser/moni-ui.min.js.br +0 -0
- package/dist/browser/moni-ui.min.js.gz +0 -0
- package/dist/browser/moni-ui.min.js.map +1 -1
- package/dist/cdn/components/moni-color-field.js +1 -0
- package/dist/cdn/components/moni-select.js +3 -3
- package/dist/cdn/components/moni-text-field.js +12 -2
- package/dist/cdn/components/moni-textarea.js +6 -2
- package/dist/cdn/importmap.json +98 -98
- package/dist/components/moni-color-field.d.ts.map +1 -1
- package/dist/components/moni-color-field.js +1 -0
- package/dist/components/moni-select.d.ts +28 -0
- package/dist/components/moni-select.d.ts.map +1 -1
- package/dist/components/moni-select.js +48 -0
- package/dist/components/moni-text-field.d.ts +45 -2
- package/dist/components/moni-text-field.d.ts.map +1 -1
- package/dist/components/moni-text-field.js +113 -1
- package/dist/components/moni-textarea.d.ts +27 -0
- package/dist/components/moni-textarea.d.ts.map +1 -1
- package/dist/components/moni-textarea.js +61 -0
- package/docs/api.json +178 -5
- package/docs/assets/moni-context-menu/placement--top.png +0 -0
- package/docs/assets/moni-select/required--false.png +0 -0
- package/docs/assets/moni-select/required--true.png +0 -0
- package/docs/assets/moni-text-field/autocomplete--default.png +0 -0
- package/docs/assets/moni-text-field/inputmode--default.png +0 -0
- package/docs/assets/moni-text-field/max--default.png +0 -0
- package/docs/assets/moni-text-field/maxlength--default.png +0 -0
- package/docs/assets/moni-text-field/min--default.png +0 -0
- package/docs/assets/moni-text-field/minlength--default.png +0 -0
- package/docs/assets/moni-text-field/pattern--default.png +0 -0
- package/docs/assets/moni-text-field/readonly--false.png +0 -0
- package/docs/assets/moni-text-field/readonly--true.png +0 -0
- package/docs/assets/moni-text-field/required--false.png +0 -0
- package/docs/assets/moni-text-field/required--true.png +0 -0
- package/docs/assets/moni-text-field/step--default.png +0 -0
- package/docs/assets/moni-text-field/type--color.png +0 -0
- package/docs/assets/moni-text-field/type--date.png +0 -0
- package/docs/assets/moni-text-field/type--datetime-local.png +0 -0
- package/docs/assets/moni-text-field/type--month.png +0 -0
- package/docs/assets/moni-text-field/type--time.png +0 -0
- package/docs/assets/moni-text-field/type--week.png +0 -0
- package/docs/assets/moni-textarea/autocomplete--default.png +0 -0
- package/docs/assets/moni-textarea/minlength--default.png +0 -0
- package/docs/assets/moni-textarea/readonly--false.png +0 -0
- package/docs/assets/moni-textarea/readonly--true.png +0 -0
- package/docs/assets/moni-textarea/required--false.png +0 -0
- package/docs/assets/moni-textarea/required--true.png +0 -0
- package/docs/components/select.md +15 -1
- package/docs/components/text-field.md +89 -1
- package/docs/components/textarea.md +34 -1
- package/package.json +1 -1
- package/src/components/moni-color-field.ts +1 -0
- package/src/components/moni-select.test.ts +34 -0
- package/src/components/moni-select.ts +54 -0
- package/src/components/moni-text-field.test.ts +78 -0
- package/src/components/moni-text-field.ts +109 -2
- 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;
|
|
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-
|
|
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": [
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
-
|
|
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
|

|
|
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
|
+

|
|
219
|
+
|
|
220
|
+

|
|
221
|
+
|
|
208
222
|
### `loading`
|
|
209
223
|
|
|
210
224
|
Si es verdadero, muestra un indicador de carga (progreso lineal).
|