@ajuarezso/sui-design-system 0.15.1 → 0.15.3
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.
|
@@ -9777,6 +9777,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
9777
9777
|
* selector de país es una feature nueva (selector de país); SUI tiene
|
|
9778
9778
|
* [prefix] como string estático.
|
|
9779
9779
|
*/
|
|
9780
|
+
/**
|
|
9781
|
+
* ¿El tap va a parar a algo que abre el teclado?
|
|
9782
|
+
*
|
|
9783
|
+
* Se mira hacia arriba desde el target y no solo el target: en un `sui-input`
|
|
9784
|
+
* el toque suele caer en el wrapper, el label o el ícono, y ninguno de esos es
|
|
9785
|
+
* el `<input>`. Sin subir por los ancestros, tocar el borde de otro campo se
|
|
9786
|
+
* leía como tocar el vacío.
|
|
9787
|
+
*
|
|
9788
|
+
* `readonly` no cuenta —no abre teclado— y un `disabled` ni siquiera recibe el
|
|
9789
|
+
* evento. Los desplegables (`<select>`, `sui-select`) tampoco entran: ahí bajar
|
|
9790
|
+
* el teclado es lo correcto, porque si no tapa la lista que se acaba de abrir.
|
|
9791
|
+
*/
|
|
9792
|
+
function recibeTexto(target) {
|
|
9793
|
+
let el = target instanceof HTMLElement
|
|
9794
|
+
? target
|
|
9795
|
+
: target.parentElement;
|
|
9796
|
+
while (el) {
|
|
9797
|
+
const tag = el.tagName;
|
|
9798
|
+
if (tag === 'TEXTAREA')
|
|
9799
|
+
return true;
|
|
9800
|
+
if (tag === 'INPUT' && !el.readOnly)
|
|
9801
|
+
return true;
|
|
9802
|
+
if (el.isContentEditable)
|
|
9803
|
+
return true;
|
|
9804
|
+
/* El host del componente: alcanza con reconocerlo aunque el `<input>` de
|
|
9805
|
+
adentro todavía no exista (los `type` con control propio lo montan
|
|
9806
|
+
condicionalmente). */
|
|
9807
|
+
if (tag === 'SUI-INPUT' || tag === 'SUI-TEXTAREA')
|
|
9808
|
+
return true;
|
|
9809
|
+
el = el.parentElement;
|
|
9810
|
+
}
|
|
9811
|
+
return false;
|
|
9812
|
+
}
|
|
9780
9813
|
class SuiInput {
|
|
9781
9814
|
// ── Core inputs (existing API — DO NOT BREAK) ────────────────────────────
|
|
9782
9815
|
size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
@@ -9872,15 +9905,22 @@ class SuiInput {
|
|
|
9872
9905
|
* hay teclado abierto, por eso escuchamos también `touchstart` (nativo iOS)
|
|
9873
9906
|
* y `mousedown` (web fallback). Cualquiera de los tres dispara el blur.
|
|
9874
9907
|
*
|
|
9875
|
-
*
|
|
9876
|
-
*
|
|
9877
|
-
* que
|
|
9878
|
-
* cada instancia de la página recibe todos los taps:
|
|
9879
|
-
*
|
|
9880
|
-
* sui-input
|
|
9881
|
-
* teclado abierto lo cierra aunque el elemento no tenga el foco.
|
|
9882
|
-
*
|
|
9883
|
-
*
|
|
9908
|
+
* Dos condiciones lo apagan, y cada una salió de un bug real en iOS:
|
|
9909
|
+
*
|
|
9910
|
+
* 1. El foco tiene que vivir DENTRO de este host. El listener es a nivel
|
|
9911
|
+
* `document`, así que cada instancia de la página recibe todos los taps:
|
|
9912
|
+
* con un blur incondicional, tocar el texto de un input cerraba el teclado
|
|
9913
|
+
* porque los OTROS sui-input hacían blur de los suyos —y en iOS un blur con
|
|
9914
|
+
* el teclado abierto lo cierra aunque el elemento no tenga el foco.
|
|
9915
|
+
*
|
|
9916
|
+
* 2. El tap NO puede ir a otro campo de texto. Ahí el navegador mueve el foco
|
|
9917
|
+
* solo, y adelantarle un blur en `pointerdown` cierra el teclado un
|
|
9918
|
+
* instante antes de que el campo nuevo lo vuelva a abrir. Ese parpadeo se
|
|
9919
|
+
* come el segundo toque de un doble tap: estando en un campo, no se podía
|
|
9920
|
+
* seleccionar una palabra de otro.
|
|
9921
|
+
*
|
|
9922
|
+
* Lo que queda es lo único que este listener tenía que hacer: tocar espacio
|
|
9923
|
+
* muerto de la pantalla baja el teclado.
|
|
9884
9924
|
*/
|
|
9885
9925
|
onDocumentTap(event) {
|
|
9886
9926
|
if (!this.closeOnOutsideClick())
|
|
@@ -9889,6 +9929,8 @@ class SuiInput {
|
|
|
9889
9929
|
const target = event.target;
|
|
9890
9930
|
if (!target || host.contains(target))
|
|
9891
9931
|
return;
|
|
9932
|
+
if (recibeTexto(target))
|
|
9933
|
+
return;
|
|
9892
9934
|
const active = document.activeElement;
|
|
9893
9935
|
if (active && host.contains(active))
|
|
9894
9936
|
active.blur();
|