rebill-web-components-sdk 1.13.21 → 1.13.22

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 (44) hide show
  1. package/dist/cjs/card-fields-wrapper_11.cjs.entry.js +1 -1
  2. package/dist/cjs/{google-maps.service-CZcMzFBX.js → google-maps.service-DgIZjibV.js} +54 -14
  3. package/dist/cjs/google-maps.service-DgIZjibV.js.map +1 -0
  4. package/dist/cjs/index-C-VTnc0I.js.map +1 -1
  5. package/dist/cjs/rebill-change-card.cjs.entry.js +1 -1
  6. package/dist/cjs/rebill-checkout.cjs.entry.js +1 -1
  7. package/dist/cjs/rebill-renewal.cjs.entry.js +1 -1
  8. package/dist/collection/utils/google-maps.service.js +52 -12
  9. package/dist/collection/utils/google-maps.service.js.map +1 -1
  10. package/dist/components/p-8BpuJ_V5.js.map +1 -1
  11. package/dist/components/{p-8MtEW13e.js → p-Bt9U0G__.js} +54 -14
  12. package/dist/components/p-Bt9U0G__.js.map +1 -0
  13. package/dist/components/{p-C8zfxcyS.js → p-C2IqZfrd.js} +3 -3
  14. package/dist/components/{p-C8zfxcyS.js.map → p-C2IqZfrd.js.map} +1 -1
  15. package/dist/components/rebill-address-search.js +1 -1
  16. package/dist/components/rebill-address.js +1 -1
  17. package/dist/components/rebill-change-card.js +2 -2
  18. package/dist/components/rebill-checkout.js +2 -2
  19. package/dist/components/rebill-renewal.js +2 -2
  20. package/dist/esm/card-fields-wrapper_11.entry.js +1 -1
  21. package/dist/esm/{google-maps.service-C2nYpE_A.js → google-maps.service-Lr2NbC5i.js} +54 -14
  22. package/dist/esm/google-maps.service-Lr2NbC5i.js.map +1 -0
  23. package/dist/esm/index-D8cwEAmw.js.map +1 -1
  24. package/dist/esm/rebill-change-card.entry.js +1 -1
  25. package/dist/esm/rebill-checkout.entry.js +1 -1
  26. package/dist/esm/rebill-renewal.entry.js +1 -1
  27. package/dist/rebill-web-components-sdk/{p-bf15156a.entry.js → p-1c1cb576.entry.js} +2 -2
  28. package/dist/rebill-web-components-sdk/{p-c327a984.entry.js → p-247a086e.entry.js} +2 -2
  29. package/dist/rebill-web-components-sdk/{p-b9a3b27f.entry.js → p-43dc2877.entry.js} +2 -2
  30. package/dist/rebill-web-components-sdk/p-D8cwEAmw.js.map +1 -1
  31. package/dist/rebill-web-components-sdk/p-Lr2NbC5i.js +2 -0
  32. package/dist/rebill-web-components-sdk/p-Lr2NbC5i.js.map +1 -0
  33. package/dist/rebill-web-components-sdk/{p-f3859b65.entry.js → p-b72a46fd.entry.js} +2 -2
  34. package/dist/rebill-web-components-sdk/rebill-web-components-sdk.esm.js +1 -1
  35. package/package.json +1 -1
  36. package/dist/cjs/google-maps.service-CZcMzFBX.js.map +0 -1
  37. package/dist/components/p-8MtEW13e.js.map +0 -1
  38. package/dist/esm/google-maps.service-C2nYpE_A.js.map +0 -1
  39. package/dist/rebill-web-components-sdk/p-C2nYpE_A.js +0 -2
  40. package/dist/rebill-web-components-sdk/p-C2nYpE_A.js.map +0 -1
  41. /package/dist/rebill-web-components-sdk/{p-bf15156a.entry.js.map → p-1c1cb576.entry.js.map} +0 -0
  42. /package/dist/rebill-web-components-sdk/{p-c327a984.entry.js.map → p-247a086e.entry.js.map} +0 -0
  43. /package/dist/rebill-web-components-sdk/{p-b9a3b27f.entry.js.map → p-43dc2877.entry.js.map} +0 -0
  44. /package/dist/rebill-web-components-sdk/{p-f3859b65.entry.js.map → p-b72a46fd.entry.js.map} +0 -0
@@ -27,17 +27,27 @@ class GoogleMapsService {
27
27
  }
28
28
  return originalAttachShadow.call(this, init);
29
29
  };
30
- // Interceptar showModal() para evitar que Google abra un dialog fullscreen
31
- // en mobile que cubre toda la pantalla (se promueve al #top-layer del navegador).
32
- // Usamos .show() en su lugar para que quede en el flujo normal del DOM
33
- // y podamos estilizarlo con CSS.
30
+ // Interceptar showModal() para evitar el dialog fullscreen de Google en mobile.
31
+ // Bloqueamos la apertura completamente. El input inline + listbox funcionan sin él.
34
32
  const originalShowModal = HTMLDialogElement.prototype.showModal;
35
33
  HTMLDialogElement.prototype.showModal = function () {
36
34
  const isGoogleDialog = this.classList.contains('full-window-autocomplete-dialog') ||
37
35
  this.closest('gmp-place-autocomplete') !== null;
38
36
  if (isGoogleDialog) {
39
- // Abrir como dialog no-modal queda en flujo normal, no en #top-layer
37
+ // Guardar foco y scroll ANTES de abrir
38
+ const prev = document.activeElement;
39
+ const scrollX = window.scrollX;
40
+ const scrollY = window.scrollY;
40
41
  this.show();
42
+ // Quitar foco del input del dialog sin causar scroll
43
+ const input = this.querySelector('input');
44
+ if (input)
45
+ input.blur();
46
+ if (prev && prev !== document.body) {
47
+ prev.focus({ preventScroll: true });
48
+ }
49
+ // Restaurar scroll
50
+ window.scrollTo(scrollX, scrollY);
41
51
  return;
42
52
  }
43
53
  return originalShowModal.call(this);
@@ -114,6 +124,37 @@ class GoogleMapsService {
114
124
  // Insertar en el container; el CSS del padre lo posiciona como overlay
115
125
  containerElement.appendChild(placeAutocomplete);
116
126
  await new Promise(resolve => setTimeout(resolve, 300));
127
+ // Asegurar que el input inline del shadow DOM esté habilitado en mobile
128
+ // y bloquear el .focus() automático que Google hace sobre él
129
+ const patchGoogleInput = () => {
130
+ const googleInput = placeAutocomplete.shadowRoot?.querySelector('input');
131
+ if (!googleInput || googleInput.__rebillPatched)
132
+ return;
133
+ googleInput.disabled = false;
134
+ googleInput.style.display = 'block';
135
+ googleInput.style.pointerEvents = 'auto';
136
+ googleInput.style.visibility = 'visible';
137
+ googleInput.style.opacity = '1';
138
+ // Reemplazar .focus() en este input específico:
139
+ // Solo permitir focus si el usuario hizo click/tap en el container del address
140
+ const originalInputFocus = googleInput.focus.bind(googleInput);
141
+ let userClickedAddress = false;
142
+ containerElement.addEventListener('pointerdown', () => {
143
+ userClickedAddress = true;
144
+ setTimeout(() => { userClickedAddress = false; }, 300);
145
+ });
146
+ googleInput.focus = (opts) => {
147
+ if (userClickedAddress) {
148
+ originalInputFocus(opts);
149
+ }
150
+ // Si no fue click del usuario, ignorar (evita robo de foco)
151
+ };
152
+ googleInput.__rebillPatched = true;
153
+ };
154
+ patchGoogleInput();
155
+ setTimeout(patchGoogleInput, 500);
156
+ setTimeout(patchGoogleInput, 1000);
157
+ setTimeout(patchGoogleInput, 2000);
117
158
  // Inyectar estilos Rebill en el shadow DOM (modo open vía setupShadowDOMPatch)
118
159
  this.injectRebillStyles(placeAutocomplete);
119
160
  // Ocultar elementos de branding de Google que se renderizan fuera del Shadow DOM
@@ -304,7 +345,8 @@ class GoogleMapsService {
304
345
  border: 1.5px solid #E5E7EB !important;
305
346
  padding: 10px 14px !important;
306
347
  padding-right: 40px !important;
307
- font-size: 14px !important;
348
+ /* 16px evita auto-zoom en mobile (iOS/Android hacen zoom si font-size < 16px) */
349
+ font-size: 16px !important;
308
350
  line-height: 20px !important;
309
351
  font-weight: 400 !important;
310
352
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
@@ -467,9 +509,8 @@ class GoogleMapsService {
467
509
  font-family: inherit !important;
468
510
  }
469
511
 
470
- /* FIX mobile: Google abre un dialog fullscreen en viewports chicos.
471
- Con el patch de showModal→show, el dialog ya no va al #top-layer.
472
- Lo forzamos a ser inline dentro del contenedor. */
512
+ /* FIX mobile: El dialog se abre con .show() (no showModal) para evitar
513
+ el #top-layer. Lo contenemos inline dentro del componente. */
473
514
  dialog,
474
515
  .full-window-autocomplete-dialog,
475
516
  [class*="full-window"] {
@@ -477,8 +518,8 @@ class GoogleMapsService {
477
518
  top: 0 !important;
478
519
  left: 0 !important;
479
520
  width: 100% !important;
480
- height: auto !important;
481
- max-height: none !important;
521
+ height: 38.33px !important;
522
+ max-height: 38.33px !important;
482
523
  margin: 0 !important;
483
524
  padding: 0 !important;
484
525
  border: none !important;
@@ -487,7 +528,6 @@ class GoogleMapsService {
487
528
  z-index: 10 !important;
488
529
  }
489
530
 
490
- /* El backdrop del dialog (si existiera) */
491
531
  dialog::backdrop {
492
532
  display: none !important;
493
533
  }
@@ -848,6 +888,6 @@ function defineCustomElement() {
848
888
  defineCustomElement();
849
889
 
850
890
  export { AddressSearch as A, GoogleMapsService as G, defineCustomElement as d };
851
- //# sourceMappingURL=p-8MtEW13e.js.map
891
+ //# sourceMappingURL=p-Bt9U0G__.js.map
852
892
 
853
- //# sourceMappingURL=p-8MtEW13e.js.map
893
+ //# sourceMappingURL=p-Bt9U0G__.js.map
@@ -0,0 +1 @@
1
+ {"file":"p-Bt9U0G__.js","mappings":";;;;;;;;MAUa,iBAAiB,CAAA;IACpB,OAAO,QAAQ;IACf,QAAQ,GAAY,KAAK;IACzB,WAAW,GAA4B,IAAI;AAEnD,IAAA,OAAO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AAC/B,YAAA,iBAAiB,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE;YACpD,iBAAiB,CAAC,mBAAmB,EAAE;;QAEzC,OAAO,iBAAiB,CAAC,QAAQ;;AAG3B,IAAA,OAAO,mBAAmB,GAAA;QAChC,IAAK,MAAc,CAAC,gBAAgB;YAAE;AAEtC,QAAA,MAAM,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY;AAE3D,QAAA,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,IAAoB,EAAA;AAC7D,YAAA,IAAI,IAAI,CAAC,SAAS,KAAK,wBAAwB,EAAE;AAC/C,gBAAA,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;YAEnE,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAC9C,SAAC;;;AAID,QAAA,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,SAAS,CAAC,SAAS;AAC/D,QAAA,iBAAiB,CAAC,SAAS,CAAC,SAAS,GAAG,YAAA;YACtC,MAAM,cAAc,GAClB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,iCAAiC,CAAC;AAC1D,gBAAA,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,KAAK,IAAI;YAEjD,IAAI,cAAc,EAAE;;AAElB,gBAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAmC;AACzD,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;AAC9B,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;gBAE9B,IAAI,CAAC,IAAI,EAAE;;gBAGX,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AACzC,gBAAA,IAAI,KAAK;oBAAE,KAAK,CAAC,IAAI,EAAE;gBACvB,IAAI,IAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE;oBAClC,IAAI,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;;;AAIrC,gBAAA,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBACjC;;AAEF,YAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,SAAC;AAEA,QAAA,MAAc,CAAC,gBAAgB,GAAG,IAAI;;AAGzC,IAAA,MAAM,UAAU,GAAA;QACd,IAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;AAClC,YAAA,OAAO,IAAI;;AAGb,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO,IAAI,CAAC,WAAW;;QAGzB,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,OAAO,IAAG;YACvC,IAAI,QAAQ,GAAG,CAAC;AAChB,YAAA,MAAM,WAAW,GAAG,GAAG,CAAC;YAExB,MAAM,QAAQ,GAAG,MAAK;AACpB,gBAAA,QAAQ,EAAE;AAEV,gBAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,oBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;oBACpB,OAAO,CAAC,IAAI,CAAC;;AACR,qBAAA,IAAI,QAAQ,IAAI,WAAW,EAAE;AAClC,oBAAA,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC;oBAC9D,OAAO,CAAC,KAAK,CAAC;;qBACT;AACL,oBAAA,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;;AAE7B,aAAC;AACD,YAAA,QAAQ,EAAE;AACZ,SAAC,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW;;AAGzB;;;;;AAKG;IACH,MAAM,kBAAkB,CACtB,gBAA6B,EAC7B,YAA8B,EAC9B,eAAqD,EACrD,OAKC,EAAA;AAQD,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;QACvC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC;AAC9C,YAAA,OAAO,IAAI;;AAGb,QAAA,IAAI;;YAEF,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AAEzC,YAAA,MAAM,cAAc,GAAuD;gBACzE,KAAK,EAAE,CAAC,SAAS,CAAC;aACnB;AAED,YAAA,IAAI,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE;gBAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO;AACnE,sBAAE,OAAO,CAAC,qBAAqB,CAAC;sBAC9B,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC;gBAC3C,cAAc,CAAC,qBAAqB,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE;;AAG/D,YAAA,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,cAAc,CAAC;AAEzF,YAAA,IAAI,OAAO,EAAE,WAAW,EAAE;gBACxB,iBAAiB,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC;;;AAIpE,YAAA,IAAI,OAAO,EAAE,KAAK,EAAE;AAClB,gBAAA,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;;;AAI1C,YAAA,IAAI,OAAO,EAAE,QAAQ,EAAE;AACrB,gBAAA,iBAAiB,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC;gBAClD,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;AACxE,gBAAA,IAAI,WAAW;AAAE,oBAAA,WAAW,CAAC,QAAQ,GAAG,IAAI;;;AAI9C,YAAA,gBAAgB,CAAC,WAAW,CAAC,iBAAiB,CAAC;AAC/C,YAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;;;YAItD,MAAM,gBAAgB,GAAG,MAAK;gBAC5B,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;AACxE,gBAAA,IAAI,CAAC,WAAW,IAAK,WAAmB,CAAC,eAAe;oBAAE;AAE1D,gBAAA,WAAW,CAAC,QAAQ,GAAG,KAAK;AAC5B,gBAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;AACnC,gBAAA,WAAW,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AACxC,gBAAA,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS;AACxC,gBAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;;;gBAI/B,MAAM,kBAAkB,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9D,IAAI,kBAAkB,GAAG,KAAK;AAE9B,gBAAA,gBAAgB,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAK;oBACpD,kBAAkB,GAAG,IAAI;AACzB,oBAAA,UAAU,CAAC,MAAK,EAAG,kBAAkB,GAAG,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;AACxD,iBAAC,CAAC;AAEF,gBAAA,WAAW,CAAC,KAAK,GAAG,CAAC,IAAmB,KAAI;oBAC1C,IAAI,kBAAkB,EAAE;wBACtB,kBAAkB,CAAC,IAAI,CAAC;;;AAG5B,iBAAC;AAEA,gBAAA,WAAmB,CAAC,eAAe,GAAG,IAAI;AAC7C,aAAC;AAED,YAAA,gBAAgB,EAAE;AAClB,YAAA,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC;AACjC,YAAA,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC;AAClC,YAAA,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC;;AAGlC,YAAA,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC;;YAG1C,IAAI,CAAC,kBAAkB,EAAE;;YAGzB,IAAI,SAAS,GAAG,KAAK;AACrB,YAAA,MAAM,YAAY,GAAG,CAAC,KAAc,KAAI;AACtC,gBAAA,IAAI,SAAS;oBAAE;gBACf,SAAS,GAAG,IAAI;AAEhB,gBAAA,MAAM,GAAG,GAAG,KAAK,IAAI,YAAY,CAAC,KAAK;gBACvC,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;gBACxE,IAAI,WAAW,EAAE;AACf,oBAAA,WAAW,CAAC,KAAK,GAAG,GAAG;;AAEvB,oBAAA,WAAW,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,oBAAA,WAAW,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;;gBAGnE,UAAU,CAAC,MAAK;oBACd,SAAS,GAAG,KAAK;iBAClB,EAAE,EAAE,CAAC;AACR,aAAC;YAED,MAAM,YAAY,GAAG,MAAK;gBACxB,IAAI,CAAC,SAAS,EAAE;AACd,oBAAA,YAAY,EAAE;;AAElB,aAAC;AACD,YAAA,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC;;YAGpD,UAAU,CAAC,MAAM,YAAY,EAAE,EAAE,GAAG,CAAC;;AAGrC,YAAA,MAAM,aAAa,GAAG,OAAO,EAAS,KAAI;gBACxC,MAAM,GAAG,GAAG,EAEX;gBACD,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,IAAK,GAAG,CAAC,MAAc,EAAE,eAAe;AACnF,gBAAA,IAAI,CAAC,eAAe;oBAAE;AACtB,gBAAA,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE;gBAC7C,MAAM,KAAK,CAAC,WAAW,CAAC;AACtB,oBAAA,MAAM,EAAE,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;AAClD,iBAAA,CAAC;AAEF,gBAAA,IAAI,KAAK,CAAC,iBAAiB,EAAE;AAC3B,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAC5C,KAAK,CAAC,iBAA0B,EAChC,KAAK,CAAC,gBAAgB,IAAI,SAAS,CACpC;oBAED,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,IAAI,SAAS;;;oBAI9D,UAAU,CAAC,MAAK;wBACd,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;AACxE,wBAAA,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE;AAClC,4BAAA,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO;;qBAEtC,EAAE,EAAE,CAAC;oBAEN,eAAe,CAAC,OAAO,CAAC;;AAE5B,aAAC;AAED,YAAA,iBAAiB,CAAC,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC;AAE/D,YAAA,MAAM,QAAQ,GAAG,CAAC,KAAc,KAAI;gBAClC,IAAI,KAAK,EAAE;AACT,oBAAA,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;;qBACnC;AACL,oBAAA,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;;AAE/C,aAAC;AAED,YAAA,MAAM,WAAW,GAAG,CAAC,QAAiB,KAAI;gBACxC,IAAI,QAAQ,EAAE;AACZ,oBAAA,iBAAiB,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC;;qBAC7C;AACL,oBAAA,iBAAiB,CAAC,eAAe,CAAC,UAAU,CAAC;;gBAE/C,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;gBACxE,IAAI,WAAW,EAAE;AACf,oBAAA,WAAW,CAAC,QAAQ,GAAG,QAAQ;;AAEnC,aAAC;YAED,MAAM,OAAO,GAAG,MAAK;AACnB,gBAAA,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC;AACvD,gBAAA,iBAAiB,CAAC,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC;gBAClE,iBAAiB,CAAC,MAAM,EAAE;AAC1B,gBAAA,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC;AAC1D,aAAC;AAED,YAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE;;QACnF,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wDAAwD,EAAE,KAAK,CAAC;AAC9E,YAAA,OAAO,IAAI;;;IAIP,kBAAkB,GAAA;;QAExB,MAAM,aAAa,GAAG,6BAA6B;AACnD,QAAA,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC;YAAE;QAE5C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,KAAK,CAAC,EAAE,GAAG,aAAa;QACxB,KAAK,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;KAqBnB;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;QAGhC,MAAM,oBAAoB,GAAG,MAAK;;YAEhC,QAAQ,CAAC,gBAAgB,CAAC,+CAA+C,CAAC,CAAC,OAAO,CAAC,EAAE,IAAG;gBACtF,EAAE,CAAC,MAAM,EAAE;AACb,aAAC,CAAC;;YAGF;iBACG,gBAAgB,CAAC,qDAAqD;iBACtE,OAAO,CAAC,EAAE,IAAG;gBACZ,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBAChC,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE;AACzD,oBAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;;gBAE/B,EAAE,CAAC,MAAM,EAAE;AACb,aAAC,CAAC;;YAGJ,QAAQ,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAG;gBACvE,EAAE,CAAC,MAAM,EAAE;AACb,aAAC,CAAC;AACJ,SAAC;;AAGD,QAAA,oBAAoB,EAAE;AACtB,QAAA,WAAW,CAAC,oBAAoB,EAAE,GAAG,CAAC;;AAGtC,QAAA,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAK;AACzC,YAAA,oBAAoB,EAAE;AACxB,SAAC,CAAC;AACF,QAAA,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;AAG7D,IAAA,kBAAkB,CAAC,iBAA8B,EAAA;AACvD,QAAA,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU;QAC3C,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC;YACpE;;QAGF,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6NnB;AACD,QAAA,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;;IAGnB,yBAAyB,CAC/B,UAAiB,EACjB,gBAAyB,EAAA;QAEzB,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,YAAY,GAAG,KAAK,KAAI;YAC1D,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrE,OAAO,SAAS,IAAI,YAAY,GAAG,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ,IAAI,EAAE;AACnF,SAAC;AAED,QAAA,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC;AAClD,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC;AACnC,QAAA,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC;AACrC,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,6BAA6B,CAAC;QACzD,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;AAC7C,QAAA,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC;QAEvC,IAAI,WAAW,GAAG,EAAE;;AAGpB,QAAA,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACjE,MAAM,aAAa,GAAG,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC;;AAG5D,QAAA,IAAI,YAAY,IAAI,KAAK,EAAE;;AAEzB,YAAA,WAAW,GAAG;kBACV,CAAG,EAAA,YAAY,CAAI,CAAA,EAAA,KAAK,EAAE,CAAC,IAAI,EAAE;kBACjC,CAAG,EAAA,KAAK,CAAI,CAAA,EAAA,YAAY,CAAE,CAAA,CAAC,IAAI,EAAE,CAAC;;aACjC,IAAI,KAAK,EAAE;;YAEhB,WAAW,GAAG,KAAK;;aACd,IAAI,YAAY,EAAE;;YAEvB,WAAW,GAAG,YAAY;;;AAI5B,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,OAAO;AACL,gBAAA,OAAO,EAAE,WAAW;gBACpB,IAAI;gBACJ,KAAK;gBACL,OAAO;gBACP,GAAG;aACJ;;;QAIH,IAAI,gBAAgB,EAAE;;YAEpB,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;;;AAIhC,YAAA,MAAM,YAAY,GAAG,IAAI,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACjF,YAAA,MAAM,aAAa,GAAG,KAAK,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAEpF,YAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBAC5F,WAAW,GAAG,SAAS;;;QAI3B,OAAO;AACL,YAAA,OAAO,EAAE,WAAW;YACpB,IAAI;YACJ,KAAK;YACL,OAAO;YACP,GAAG;SACJ;;IAGH,OAAO,oBAAoB,CAAC,gBAAyB,EAAA;;AAEnD,QAAA,MAAM,MAAM,GAAG,gBAAgB,IAAI,yCAAyC;QAE5E,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,CAAC,IAAI,CAAC,+EAA+E,CAAC;YAC7F;;;AAIF,QAAA,IAAI,QAAQ,CAAC,aAAa,CAAC,oCAAoC,CAAC,EAAE;YAChE;;QAGF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;;AAE/C,QAAA,MAAM,CAAC,GAAG,GAAG,CAA+C,4CAAA,EAAA,MAAM,wCAAwC;AAC1G,QAAA,MAAM,CAAC,KAAK,GAAG,IAAI;AACnB,QAAA,MAAM,CAAC,KAAK,GAAG,IAAI;;AAGlB,QAAA,MAAc,CAAC,cAAc,GAAG,MAAK;AACpC,YAAA,OAAQ,MAAc,CAAC,cAAc,CAAC;AACxC,SAAC;AAED,QAAA,MAAM,CAAC,OAAO,GAAG,MAAK;AACpB,YAAA,OAAO,CAAC,KAAK,CACX,sFAAsF,CACvF;AACH,SAAC;AAED,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;;AAEpC;;ACxsBD,MAAM,gBAAgB,GAAG,uzBAAuzB;;MCWn0B,aAAa,iBAAAA,kBAAA,CAAA,MAAA,aAAA,SAAAC,CAAA,CAAA;;;;;;;;;;;;IAEf,aAAa,GAAG,KAAK;AACrB,IAAA,aAAa,GAAWC,KAAY,CAAC,aAAa;;IAElD,YAAY,GAAkB,IAAI;;IAElC,iBAAiB,GAAY,KAAK;;IAEnC,kBAAkB,GAAW,CAAC;IAC9B,WAAW,GAAW,CAAC;IAEvB,WAAW,GAA2B,SAAS;AAC/C,IAAA,WAAW;AACX,IAAA,KAAK;IACL,QAAQ,GAAY,KAAK;;IAEzB,KAAK,GAAW,EAAE;;IAElB,mBAAmB,GAAY,IAAI;AACnC,IAAA,oBAAoB;AAEnB,IAAA,eAAe;AACf,IAAA,oBAAoB;;AAEpB,IAAA,eAAe;;AAEf,IAAA,eAAe;AAChB,IAAA,iBAAiB,GAAG,iBAAiB,CAAC,WAAW,EAAE;IACnD,mBAAmB,GAAwB,IAAI;IAC/C,gBAAgB,GAAsC,IAAI;AAC1D,IAAA,uBAAuB;AACvB,IAAA,6BAA6B;IAC7B,OAAO,GAA4B,IAAI;AACvC,IAAA,SAAS;IACT,iBAAiB,GAAyC,IAAI;AAEtE,IAAA,MAAM,gBAAgB,GAAA;AACpB,QAAA,MAAM,IAAI,CAAC,sBAAsB,EAAE;;QAGnC,IAAI,CAAC,6BAA6B,GAAG,YAAY,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAK;AAC/E,YAAA,IAAI,CAAC,aAAa,GAAGA,KAAY,CAAC,aAAa;AACjD,SAAC,CAAC;;IAGJ,oBAAoB,GAAA;QAClB,IAAI,CAAC,OAAO,EAAE;AAEd,QAAA,IAAI,IAAI,CAAC,6BAA6B,EAAE;YACtC,IAAI,CAAC,6BAA6B,EAAE;;;AAIhC,IAAA,MAAM,sBAAsB,GAAA;QAClC,IAAI,IAAI,CAAC,aAAa;YAAE;AAExB,QAAA,IAAI;AACF,YAAA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;AACjD,YAAA,IAAI,CAAC,YAAY;gBAAE;AACnB,YAAA,IAAI,CAAC,OAAO,GAAG,YAAY;YAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,yBAAyB,CAAgB;AAClF,YAAA,IAAI,CAAC,SAAS;gBAAE;AAEhB,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,KAAK,UAAU,GAAG,iBAAiB,GAAG,gBAAgB;AAC7F,YAAA,MAAM,WAAW,GACf,IAAI,CAAC,WAAW;gBAChB,WAAW,CAAC,SAAS,CAAC,CAAA,EAAG,cAAc,CAAoB,kBAAA,CAAA,EAAE,0BAA0B,CAAC;AAE1F,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAC5D,SAAS,EACT,YAAY,EACZ,CAAC,OAA0B,KAAK,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EACnE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5D;YACD,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,OAAO;AACzC,gBAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,YAAY;AAC3C,gBAAA,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,QAAQ;AAC3C,gBAAA,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,WAAW;AACjD,gBAAA,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC;;;;;AAKhD,YAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAgB,KAAI;AACpC,gBAAA,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;oBAAE;gBACvB,IAAI,IAAI,CAAC,QAAQ;oBAAE;AAEnB,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE;;gBAE7B,MAAM,WAAW,GAAG;qBACjB,aAAa,CAAC,wBAAwB;AACvC,sBAAE,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;AACtC,gBAAA,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE;gBAEtE,IAAI,IAAI,CAAC,iBAAiB;AAAE,oBAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAChE,gBAAA,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,MAAK;AACvC,oBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,oBAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,WAAW;wBAAE;AAEjD,oBAAA,IAAI,KAAK;AAAE,wBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3C,oBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;AAC3B,oBAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,oBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;iBAC1B,EAAE,GAAG,CAAC;AACT,aAAC;YACD,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;AACrD,YAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;;QAE3B,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,CAAwB,qBAAA,EAAA,IAAI,CAAC,WAAW,CAAgB,cAAA,CAAA,EAAE,KAAK,CAAC;;;AAI1E,IAAA,MAAM,eAAe,GAAA;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,mBAAmB,CAAQ;QACzE,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,IAAI,CAAC,WAAW,CAAS,OAAA,CAAA,CAAC;AACzE,YAAA,OAAO,IAAI;;AAGb,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,cAAc,CAAC,eAAe,EAAE;;QAC7C,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACpD,YAAA,OAAO,IAAI;;;IAKf,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,iBAAiB;YAAE;AAC5B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC;;IAI5C,YAAY,GAAA;QACV,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC;;IAIzC,eAAe,GAAA;QACb,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,QAAQ,CAAC;;IAGvC,MAAM,qBAAqB,CAAC,OAA0B,EAAA;AAC5D,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;;AAE/B,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;;AAE7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC9D,QAAA,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE;;AAElD,QAAA,IAAI,CAAC,YAAY,GAAG,WAAW;AAC/B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,KAAK,GAAG,WAAW;;YAE3B,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,OAAO;AAAE,oBAAA,OAAO,CAAC,KAAK,GAAG,WAAW;aACzC,EAAE,EAAE,CAAC;;;AAIF,IAAA,kBAAkB,GAAG,CAAC,EAA8C,KAAI;QAC9E,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC5C,KAAC;AAEO,IAAA,sBAAsB,GAAG,CAAC,EAA8C,KAAI;AAClF,QAAA,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC3B,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;;AAElC,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AAC1B,KAAC;IAEO,iBAAiB,GAAG,MAAK;AAC/B,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE;AAClC,KAAC;AAED,IAAA,IAAY,YAAY,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK;;IAE5D,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;;QAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,yBAAyB,CAAC;AACnE,QAAA,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;YAC/B,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;;AAE1D,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,mBAAmB,IAAI;AAC5B,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;IAG5B,MAAM,GAAA;AACJ,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,KAAK,UAAU,GAAG,iBAAiB,GAAG,gBAAgB;AAC7F,QAAA,MAAM,kBAAkB,GAAG,WAAW,CAAC,SAAS,CAC9C,CAAG,EAAA,cAAc,CAAoB,kBAAA,CAAA,EACrC,0BAA0B,CAC3B;AAED,QAAA,QACE,CAAA,CAAA,0BAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,iBAAA,EACkB,yBAAyB,EACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,kBAAkB,EAAE,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,EACrE,sBAAsB,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAA,EAEtD,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,0BAA0B,EAAA,EACnC,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,wBAAwB,EAAA,EACjC,CAAA,CAAA,mBAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,EAAE,EAAE,CAAG,EAAA,IAAI,CAAC,WAAW,CAAA,OAAA,CAAS,EAChC,KAAK,EAAE,IAAI,CAAC,YAAY,EACxB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,kBAAkB,EACnD,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAgB,CAAC,EACvD,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAgB,CAAC,GAC1D,CACE,EACL,IAAI,CAAC,KAAK,KACT,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,EAAA,EACnC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,KAAK,EAAC,eAAe,EACrB,KAAK,EAAE;AACL,gBAAA,KAAK,EAAE,2BAA2B;AAClC,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,UAAU,EAAE,MAAM;aACnB,EAAA,EAEA,IAAI,CAAC,KAAK,CACN,CACH,CACP,EACA,IAAI,CAAC,mBAAmB,KACvB,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,2BAA2B,EAAA,EACpC,CAAA,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAQ,KAAK,EAAC,mBAAmB,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAA,EAC7E,CAAA,CAAA,mBAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,OAAO,EAAC,WAAW,EACnB,KAAK,EAAE,WAAW,CAAC,SAAS,EAC5B,KAAK,EAAC,aAAa,EAElB,EAAA,WAAW,CAAC,SAAS,CAAC,GAAG,cAAc,CAAA,YAAA,CAAc,EAAE,wBAAwB,CAAC,CAC/D,CACb,CACL,CACP,CACG,CACmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["__stencil_proxyCustomElement","HTMLElement","sessionState"],"sources":["src/utils/google-maps.service.ts","src/components/checkout/address/address-search/address-search.css?tag=rebill-address-search","src/components/checkout/address/address-search/address-search.tsx"],"sourcesContent":["export interface AddressComponents {\n address: string;\n city: string;\n state: string;\n country: string;\n zip: string;\n addInformation?: string;\n formattedAddress?: string; // Dirección completa de Google para usar como fallback\n}\n\nexport class GoogleMapsService {\n private static instance: GoogleMapsService;\n private isLoaded: boolean = false;\n private loadPromise: Promise<boolean> | null = null;\n\n static getInstance(): GoogleMapsService {\n if (!GoogleMapsService.instance) {\n GoogleMapsService.instance = new GoogleMapsService();\n GoogleMapsService.setupShadowDOMPatch();\n }\n return GoogleMapsService.instance;\n }\n\n private static setupShadowDOMPatch() {\n if ((window as any).gmpShadowPatched) return;\n\n const originalAttachShadow = Element.prototype.attachShadow;\n\n Element.prototype.attachShadow = function (init: ShadowRootInit) {\n if (this.localName === 'gmp-place-autocomplete') {\n return originalAttachShadow.call(this, { ...init, mode: 'open' });\n }\n return originalAttachShadow.call(this, init);\n };\n\n // Interceptar showModal() para evitar el dialog fullscreen de Google en mobile.\n // Bloqueamos la apertura completamente. El input inline + listbox funcionan sin él.\n const originalShowModal = HTMLDialogElement.prototype.showModal;\n HTMLDialogElement.prototype.showModal = function () {\n const isGoogleDialog =\n this.classList.contains('full-window-autocomplete-dialog') ||\n this.closest('gmp-place-autocomplete') !== null;\n\n if (isGoogleDialog) {\n // Guardar foco y scroll ANTES de abrir\n const prev = document.activeElement as HTMLElement | null;\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n\n this.show();\n\n // Quitar foco del input del dialog sin causar scroll\n const input = this.querySelector('input');\n if (input) input.blur();\n if (prev && prev !== document.body) {\n prev.focus({ preventScroll: true });\n }\n\n // Restaurar scroll\n window.scrollTo(scrollX, scrollY);\n return;\n }\n return originalShowModal.call(this);\n };\n\n (window as any).gmpShadowPatched = true;\n }\n\n async waitForAPI(): Promise<boolean> {\n if (this.isLoaded && window.google) {\n return true;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = new Promise(resolve => {\n let attempts = 0;\n const maxAttempts = 100; // 10 seconds max wait\n\n const checkAPI = () => {\n attempts++;\n\n if (window.google) {\n this.isLoaded = true;\n resolve(true);\n } else if (attempts >= maxAttempts) {\n console.error('Google Maps API failed to load within timeout');\n resolve(false);\n } else {\n setTimeout(checkAPI, 100);\n }\n };\n checkAPI();\n });\n\n return this.loadPromise;\n }\n\n /**\n * Crea autocomplete usando la nueva API de Google Places (PlaceAutocompleteElement).\n * containerElement: donde se inserta (ej. search-input-container). Debe tener position: relative.\n * inputElement: input para sincronizar valor al seleccionar y para focus/blur.\n * Retorna el elemento y una función destroy para limpiar al desmontar.\n */\n async createAutocomplete(\n containerElement: HTMLElement,\n inputElement: HTMLInputElement,\n onPlaceSelected: (address: AddressComponents) => void,\n options?: {\n placeholder?: string;\n componentRestrictions?: { country: string | string[] };\n error?: string;\n disabled?: boolean;\n },\n ): Promise<{\n element: HTMLElement;\n destroy: () => void;\n syncToGoogle: (value?: string) => void;\n setError: (error?: string) => void;\n setDisabled: (disabled: boolean) => void;\n } | null> {\n const isReady = await this.waitForAPI();\n if (!isReady) {\n console.error('Google Maps API not available');\n return null;\n }\n\n try {\n // Nueva API: importLibrary carga Places (New)\n await google.maps.importLibrary('places');\n\n const elementOptions: google.maps.places.PlaceAutocompleteElementOptions = {\n types: ['address'],\n };\n\n if (options?.componentRestrictions?.country) {\n const countries = Array.isArray(options.componentRestrictions.country)\n ? options.componentRestrictions.country\n : [options.componentRestrictions.country];\n elementOptions.componentRestrictions = { country: countries };\n }\n\n const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(elementOptions);\n\n if (options?.placeholder) {\n placeAutocomplete.setAttribute('placeholder', options.placeholder);\n }\n\n // Agregar clase error si existe\n if (options?.error) {\n placeAutocomplete.classList.add('error');\n }\n\n // Deshabilitar si corresponde\n if (options?.disabled) {\n placeAutocomplete.setAttribute('disabled', 'true');\n const googleInput = placeAutocomplete.shadowRoot?.querySelector('input');\n if (googleInput) googleInput.disabled = true;\n }\n\n // Insertar en el container; el CSS del padre lo posiciona como overlay\n containerElement.appendChild(placeAutocomplete);\n await new Promise(resolve => setTimeout(resolve, 300));\n\n // Asegurar que el input inline del shadow DOM esté habilitado en mobile\n // y bloquear el .focus() automático que Google hace sobre él\n const patchGoogleInput = () => {\n const googleInput = placeAutocomplete.shadowRoot?.querySelector('input');\n if (!googleInput || (googleInput as any).__rebillPatched) return;\n\n googleInput.disabled = false;\n googleInput.style.display = 'block';\n googleInput.style.pointerEvents = 'auto';\n googleInput.style.visibility = 'visible';\n googleInput.style.opacity = '1';\n\n // Reemplazar .focus() en este input específico:\n // Solo permitir focus si el usuario hizo click/tap en el container del address\n const originalInputFocus = googleInput.focus.bind(googleInput);\n let userClickedAddress = false;\n\n containerElement.addEventListener('pointerdown', () => {\n userClickedAddress = true;\n setTimeout(() => { userClickedAddress = false; }, 300);\n });\n\n googleInput.focus = (opts?: FocusOptions) => {\n if (userClickedAddress) {\n originalInputFocus(opts);\n }\n // Si no fue click del usuario, ignorar (evita robo de foco)\n };\n\n (googleInput as any).__rebillPatched = true;\n };\n\n patchGoogleInput();\n setTimeout(patchGoogleInput, 500);\n setTimeout(patchGoogleInput, 1000);\n setTimeout(patchGoogleInput, 2000);\n\n // Inyectar estilos Rebill en el shadow DOM (modo open vía setupShadowDOMPatch)\n this.injectRebillStyles(placeAutocomplete);\n\n // Ocultar elementos de branding de Google que se renderizan fuera del Shadow DOM\n this.hideGoogleBranding();\n\n // Sincronizar valor del input → Google (SOLO una dirección)\n let isSyncing = false;\n const syncToGoogle = (value?: string) => {\n if (isSyncing) return;\n isSyncing = true;\n\n const val = value ?? inputElement.value;\n const googleInput = placeAutocomplete.shadowRoot?.querySelector('input');\n if (googleInput) {\n googleInput.value = val;\n // Disparar eventos para que Google detecte el cambio\n googleInput.dispatchEvent(new Event('input', { bubbles: true }));\n googleInput.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n setTimeout(() => {\n isSyncing = false;\n }, 50);\n };\n\n const inputHandler = () => {\n if (!isSyncing) {\n syncToGoogle();\n }\n };\n inputElement.addEventListener('input', inputHandler);\n\n // Sincronizar valor inicial\n setTimeout(() => syncToGoogle(), 100);\n\n // Evento correcto: gmp-select (no gmp-placeselect)\n const selectHandler = async (ev: Event) => {\n const evt = ev as CustomEvent & {\n placePrediction?: { toPlace: () => Promise<google.maps.places.Place> };\n };\n const placePrediction = evt.placePrediction ?? (evt.detail as any)?.placePrediction;\n if (!placePrediction) return;\n const place = await placePrediction.toPlace();\n await place.fetchFields({\n fields: ['addressComponents', 'formattedAddress'],\n });\n\n if (place.addressComponents) {\n const address = this.parseAddressComponentsNew(\n place.addressComponents as any[],\n place.formattedAddress ?? undefined,\n );\n\n address.formattedAddress = place.formattedAddress ?? undefined;\n\n // Forzar actualización del input de Google con solo calle + número\n // Esto sobrescribe el texto completo que Google pone automáticamente\n setTimeout(() => {\n const googleInput = placeAutocomplete.shadowRoot?.querySelector('input');\n if (googleInput && address.address) {\n googleInput.value = address.address;\n }\n }, 10);\n\n onPlaceSelected(address);\n }\n };\n\n placeAutocomplete.addEventListener('gmp-select', selectHandler);\n\n const setError = (error?: string) => {\n if (error) {\n placeAutocomplete.classList.add('error');\n } else {\n placeAutocomplete.classList.remove('error');\n }\n };\n\n const setDisabled = (disabled: boolean) => {\n if (disabled) {\n placeAutocomplete.setAttribute('disabled', 'true');\n } else {\n placeAutocomplete.removeAttribute('disabled');\n }\n const googleInput = placeAutocomplete.shadowRoot?.querySelector('input');\n if (googleInput) {\n googleInput.disabled = disabled;\n }\n };\n\n const destroy = () => {\n inputElement.removeEventListener('input', inputHandler);\n placeAutocomplete.removeEventListener('gmp-select', selectHandler);\n placeAutocomplete.remove();\n containerElement.classList.remove('autocomplete-active');\n };\n\n return { element: placeAutocomplete, destroy, syncToGoogle, setError, setDisabled };\n } catch (error) {\n console.error('Failed to create Google Maps PlaceAutocompleteElement:', error);\n return null;\n }\n }\n\n private hideGoogleBranding() {\n // Inyectar CSS global para ocultar branding de Google\n const globalStyleId = 'rebill-hide-google-branding';\n if (document.getElementById(globalStyleId)) return;\n\n const style = document.createElement('style');\n style.id = globalStyleId;\n style.textContent = `\n /* Ocultar TODOS los elementos de branding de Google Maps */\n gmp-internal-attribution,\n gmp-internal-dialog,\n gmp-place-autocomplete::part(attribution),\n gmp-place-autocomplete + *,\n gmp-place-autocomplete ~ *,\n a[href*=\"maps.google.com\"],\n a[title*=\"Google Maps\"],\n [aria-label*=\"Google Maps\"],\n div:has(> a[href*=\"google.com\"]),\n .dismissButton {\n display: none !important;\n visibility: hidden !important;\n opacity: 0 !important;\n height: 0 !important;\n max-height: 0 !important;\n overflow: hidden !important;\n position: absolute !important;\n left: -9999px !important;\n }\n `;\n document.head.appendChild(style);\n\n // Remover elementos de branding continuamente (Google los puede agregar dinámicamente)\n const removeGoogleBranding = () => {\n // Remover Web Components de Google\n document.querySelectorAll('gmp-internal-attribution, gmp-internal-dialog').forEach(el => {\n el.remove();\n });\n\n // Remover links y elementos con \"Google Maps\"\n document\n .querySelectorAll('a[href*=\"maps.google.com\"], a[title*=\"Google Maps\"]')\n .forEach(el => {\n const parent = el.closest('div');\n if (parent && parent.textContent?.includes('Google Maps')) {\n parent.style.display = 'none';\n }\n el.remove();\n });\n\n // Remover cualquier SVG con aria-label=\"Google Maps\"\n document.querySelectorAll('svg[aria-label*=\"Google Maps\"]').forEach(el => {\n el.remove();\n });\n };\n\n // Ejecutar inmediatamente y periódicamente\n removeGoogleBranding();\n setInterval(removeGoogleBranding, 500);\n\n // Observer para elementos que se agregan dinámicamente\n const observer = new MutationObserver(() => {\n removeGoogleBranding();\n });\n observer.observe(document.body, { childList: true, subtree: true });\n }\n\n private injectRebillStyles(placeAutocomplete: HTMLElement) {\n const shadow = placeAutocomplete.shadowRoot;\n if (!shadow) {\n console.warn('Shadow DOM not available - styles cannot be injected');\n return;\n }\n\n const style = document.createElement('style');\n style.textContent = `\n /* Resetear TODO */\n * {\n box-sizing: border-box !important;\n }\n\n :host {\n display: block !important;\n width: 100% !important;\n height: 38.33px !important;\n max-height: 38.33px !important;\n font-family: inherit !important;\n border: none !important;\n outline: none !important;\n box-shadow: none !important;\n background: transparent !important;\n overflow: visible !important;\n }\n\n /* Contenedores - resetear */\n div, span, ul, li {\n all: revert !important;\n }\n\n /* INPUT PRINCIPAL - Copiar estilos exactos de rebill-input-text */\n input {\n display: block !important;\n width: 100% !important;\n height: 38.33px !important;\n min-height: 38.33px !important;\n box-sizing: border-box !important;\n border-radius: 8px !important;\n border: 1.5px solid #E5E7EB !important;\n padding: 10px 14px !important;\n padding-right: 40px !important;\n /* 16px evita auto-zoom en mobile (iOS/Android hacen zoom si font-size < 16px) */\n font-size: 16px !important;\n line-height: 20px !important;\n font-weight: 400 !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n color: #111827 !important;\n background-color: #FFFFFF !important;\n outline: none !important;\n transition: all 0.2s ease !important;\n -webkit-appearance: none !important;\n appearance: none !important;\n }\n\n input::placeholder {\n color: #9CA3AF !important;\n opacity: 1 !important;\n }\n\n input:focus {\n border-color: var(--rebill-color-primary) !important;\n box-shadow: none !important;\n }\n\n input:disabled {\n background-color: var(--rebill-color-background) !important;\n border-color: var(--rebill-color-disabled) !important;\n color: var(--rebill-color-text-secondary) !important;\n cursor: not-allowed !important;\n opacity: 0.7 !important;\n }\n\n input:disabled:focus {\n border-color: var(--rebill-color-disabled) !important;\n box-shadow: none !important;\n }\n\n /* Estado de error - border rojo igual que inputs de Rebill */\n :host(.error) input,\n :host([error]) input {\n border-color: var(--rebill-color-error, #EF4444) !important;\n }\n\n :host(.error) input:focus,\n :host([error]) input:focus {\n border-color: var(--rebill-color-error, #EF4444) !important;\n box-shadow: 0 0 0 2px var(--rebill-color-error-light, rgba(239, 68, 68, 0.1)) !important;\n }\n\n /* Ocultar elementos decorativos de Google */\n [class*=\"icon\"],\n [class*=\"suffix\"],\n [class*=\"prefix\"],\n [class*=\"logo\"],\n [class*=\"powered\"],\n [class*=\"google\"],\n [class*=\"branding\"],\n [class*=\"divider\"],\n [class*=\"separator\"],\n [aria-label*=\"Google\"],\n [aria-label*=\"clear\"],\n [aria-label*=\"Clear\"],\n button,\n svg,\n a[href*=\"google.com\"] {\n display: none !important;\n visibility: hidden !important;\n opacity: 0 !important;\n height: 0 !important;\n width: 0 !important;\n overflow: hidden !important;\n }\n\n /* Ocultar elementos hermanos del input EXCEPTO error-message */\n input + *:not(.error-message),\n input ~ *:not(.error-message) {\n display: none !important;\n }\n\n /* Dropdown - Estilo Rebill */\n [role=\"listbox\"] {\n position: absolute !important;\n z-index: 9999 !important;\n margin-top: 4px !important;\n width: 100% !important;\n max-height: 300px !important;\n overflow-y: auto !important;\n background: #FFFFFF !important;\n border: 1px solid #E5E7EB !important;\n border-radius: 8px !important;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important;\n padding: 0 !important;\n }\n\n ul {\n list-style: none !important;\n padding: 0 !important;\n margin: 0 !important;\n }\n\n /* Ocultar contenedor de atribuciones */\n .attributions,\n [role=\"presentation\"],\n div:has(> gmp-internal-attribution) {\n display: none !important;\n height: 0 !important;\n margin: 0 !important;\n padding: 0 !important;\n border: none !important;\n }\n\n /* Ocultar UL vacío cuando no hay sugerencias */\n ul:empty {\n display: none !important;\n }\n\n [role=\"option\"] {\n padding: 0.75rem !important;\n cursor: pointer !important;\n color: var(--rebill-color-text-primary) !important;\n font-size: 0.875rem !important;\n font-weight: 400 !important;\n border-bottom: 1px solid var(--rebill-color-border) !important;\n list-style: none !important;\n list-style-type: none !important;\n transition: background-color 0.15s ease !important;\n background-color: transparent !important;\n }\n\n [role=\"option\"]::before,\n [role=\"option\"]::marker {\n display: none !important;\n content: none !important;\n }\n\n [role=\"option\"]:last-child {\n border-bottom: none !important;\n }\n\n [role=\"option\"]:hover,\n [role=\"option\"][aria-selected=\"true\"] {\n background-color: #f0f9ff !important;\n }\n\n /* Texto dentro - mismo color que la opción */\n [role=\"option\"] * {\n color: var(--rebill-color-text-primary) !important;\n font-family: inherit !important;\n font-weight: inherit !important;\n }\n\n /* Ocultar botón de cerrar (X) */\n button[aria-label*=\"dismiss\"],\n button[aria-label*=\"close\"],\n .dismiss,\n .close-button {\n display: none !important;\n }\n\n /* Texto dentro de las sugerencias */\n [role=\"option\"] * {\n color: inherit !important;\n font-family: inherit !important;\n }\n\n /* FIX mobile: El dialog se abre con .show() (no showModal) para evitar\n el #top-layer. Lo contenemos inline dentro del componente. */\n dialog,\n .full-window-autocomplete-dialog,\n [class*=\"full-window\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 38.33px !important;\n max-height: 38.33px !important;\n margin: 0 !important;\n padding: 0 !important;\n border: none !important;\n background: transparent !important;\n overflow: visible !important;\n z-index: 10 !important;\n }\n\n dialog::backdrop {\n display: none !important;\n }\n `;\n shadow.appendChild(style);\n }\n\n private parseAddressComponentsNew(\n components: any[],\n formattedAddress?: string,\n ): AddressComponents {\n const getComponent = (type: string, useShortName = false) => {\n const component = components.find((c: any) => c.types.includes(type));\n return component ? (useShortName ? component.shortText : component.longText) : '';\n };\n\n const streetNumber = getComponent('street_number');\n const route = getComponent('route');\n const city = getComponent('locality');\n const state = getComponent('administrative_area_level_1');\n const country = getComponent('country', true);\n const zip = getComponent('postal_code');\n\n let addressLine = '';\n\n // Países donde el número va ANTES de la calle (ej: \"600 Fifth Avenue\")\n const numberFirstCountries = ['US', 'CA', 'GB', 'AU', 'NZ', 'IE'];\n const isNumberFirst = numberFirstCountries.includes(country);\n\n // Prioridad 1: Usar street_number + route si ambos existen\n if (streetNumber && route) {\n // Formato según el país\n addressLine = isNumberFirst\n ? `${streetNumber} ${route}`.trim() // USA: \"600 Fifth Avenue\"\n : `${route} ${streetNumber}`.trim(); // LATAM: \"Avenida Carlos Tejedor 600\"\n } else if (route) {\n // Si solo hay route, usarlo\n addressLine = route;\n } else if (streetNumber) {\n // Si solo hay número, usarlo\n addressLine = streetNumber;\n }\n\n // Si ya tenemos una dirección de los componentes, usarla\n if (addressLine.length > 0) {\n return {\n address: addressLine,\n city,\n state,\n country,\n zip,\n };\n }\n\n // Prioridad 2: Extraer de formattedAddress\n if (formattedAddress) {\n // Separar por coma y tomar solo la primera parte (calle + número)\n const parts = formattedAddress.split(',').map(p => p.trim());\n const firstPart = parts[0] ?? '';\n\n // Verificar si la primera parte no contiene el nombre de la ciudad\n // Esto previene que se incluya ciudad en la dirección\n const containsCity = city && firstPart.toLowerCase().includes(city.toLowerCase());\n const containsState = state && firstPart.toLowerCase().includes(state.toLowerCase());\n\n if (firstPart.length > 0 && !containsCity && !containsState && /[0-9A-Za-z]/.test(firstPart)) {\n addressLine = firstPart;\n }\n }\n\n return {\n address: addressLine,\n city,\n state,\n country,\n zip,\n };\n }\n\n static loadGoogleMapsScript(googleMapsApiKey?: string) {\n // Use new API key\n const apiKey = googleMapsApiKey || 'AIzaSyB9pS5LHbPKjnmMQ89BQHD0SVZXVsi95pk';\n\n if (!apiKey) {\n console.warn('Google Maps API key not provided. Address autocomplete will not be available.');\n return;\n }\n\n // Check if script is already loaded\n if (document.querySelector('script[src*=\"maps.googleapis.com\"]')) {\n return;\n }\n\n const script = document.createElement('script');\n // Nueva API: loading=async, Places se carga vía importLibrary en createAutocomplete\n script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&loading=async&callback=initGoogleMaps`;\n script.async = true;\n script.defer = true;\n\n // Add global callback for when Google Maps is ready\n (window as any).initGoogleMaps = () => {\n delete (window as any).initGoogleMaps; // Clean up\n };\n\n script.onerror = () => {\n console.error(\n 'Failed to load Google Maps script. Please check your API key and network connection.',\n );\n };\n\n document.head.appendChild(script);\n }\n}\n",":host {\n display: block;\n}\n\n.address-search-container {\n width: 100%;\n margin-bottom: 24px;\n}\n\n.search-input-container {\n position: relative;\n margin-bottom: 8px;\n overflow: visible;\n height: 38.33px;\n min-height: 38.33px;\n}\n\n/* PlaceAutocompleteElement de Google se superpone; el dropdown debe ser visible */\n.search-input-container gmp-place-autocomplete {\n position: absolute !important;\n top: 0;\n left: 0;\n width: 100% !important;\n height: 38.33px !important;\n min-height: 38.33px !important;\n max-height: 38.33px !important;\n opacity: 1 !important;\n pointer-events: auto !important;\n z-index: 10;\n /* Estilos del host para consistencia visual */\n color-scheme: light;\n}\n\n/* Ocultar input nativo cuando Google overlay está activo (evita doble input) */\n.search-input-container.autocomplete-active rebill-input-text {\n visibility: hidden;\n}\n\n.manual-entry-link-wrapper {\n display: flex;\n justify-content: flex-start;\n}\n\n.manual-entry-link {\n background: none;\n border: none;\n color: var(--rebill-color-primary);\n cursor: pointer;\n font-size: 14px;\n padding: 4px 0;\n text-decoration: underline;\n text-decoration-color: var(--rebill-color-text-secondary);\n}\n","import { Component, Element, Event, EventEmitter, h, Prop, State, Watch } from '@stencil/core';\nimport { I18nService } from '../../../../i18n/i18n.service';\nimport { sessionState, SessionStore } from '../../../../store/session.store';\nimport { COLORS_ENUM } from '../../../../utils/color-class-mapper';\nimport { AddressComponents, GoogleMapsService } from '../../../../utils/google-maps.service';\n\n@Component({\n tag: 'rebill-address-search',\n styleUrl: 'address-search.css',\n shadow: false,\n})\nexport class AddressSearch {\n @Element() el: HTMLElement;\n @State() isInitialized = false;\n @State() currentLocale: string = sessionState.currentLocale;\n /** Valor mientras el usuario edita (null = mostrar value prop) */\n @State() editingValue: string | null = null;\n /** True justo después de seleccionar un lugar para no emitir freeText en el siguiente blur */\n @State() justSelectedPlace: boolean = false;\n /** Para distinguir Enter con y sin selección de Google */\n private lastPlaceChangedAt: number = 0;\n private lastEnterAt: number = 0;\n\n @Prop() addressType: 'billing' | 'shipping' = 'billing';\n @Prop() placeholder?: string;\n @Prop() error?: string;\n @Prop() disabled: boolean = false;\n /** Valor mostrado en el input (ej. calle + número tras seleccionar o texto libre) */\n @Prop() value: string = '';\n /** Si false, no se muestra el enlace \"Ingresar dirección manualmente\" (vista unificada) */\n @Prop() showManualEntryLink: boolean = true;\n private autocompleteSetError?: (error?: string) => void;\n\n @Event() addressSelected: EventEmitter<AddressComponents>;\n @Event() manualEntryRequested: EventEmitter<void>;\n /** Se emite al salir del input con el texto actual cuando el usuario no eligió una sugerencia */\n @Event() freeTextAddress: EventEmitter<string>;\n /** Se emite al pulsar Enter sin seleccionar (para mostrar el resto de campos) */\n @Event() commitRequested: EventEmitter<void>;\n private googleMapsService = GoogleMapsService.getInstance();\n private autocompleteDestroy: (() => void) | null = null;\n private autocompleteSync: ((value?: string) => void) | null = null;\n private autocompleteSetDisabled?: (disabled: boolean) => void;\n private unsubscribeCurrentLocaleStore?: () => void;\n private inputEl: HTMLInputElement | null = null;\n private onKeyDown?: (e: KeyboardEvent) => void;\n private pendingEnterTimer: ReturnType<typeof setTimeout> | null = null;\n\n async componentDidLoad() {\n await this.initializeAutocomplete();\n\n // Listen for language changes\n this.unsubscribeCurrentLocaleStore = SessionStore.onChange('currentLocale', () => {\n this.currentLocale = sessionState.currentLocale;\n });\n }\n\n disconnectedCallback() {\n this.cleanup();\n\n if (this.unsubscribeCurrentLocaleStore) {\n this.unsubscribeCurrentLocaleStore();\n }\n }\n\n private async initializeAutocomplete() {\n if (this.isInitialized) return;\n\n try {\n const inputElement = await this.getInputElement();\n if (!inputElement) return;\n this.inputEl = inputElement;\n\n const container = this.el?.querySelector('.search-input-container') as HTMLElement;\n if (!container) return;\n\n const translationKey = this.addressType === 'shipping' ? 'shippingAddress' : 'billingAddress';\n const placeholder =\n this.placeholder ||\n I18nService.translate(`${translationKey}.searchPlaceholder`, 'Search for an address...');\n\n const result = await this.googleMapsService.createAutocomplete(\n container,\n inputElement,\n (address: AddressComponents) => this.handleAddressSelected(address),\n { placeholder, error: this.error, disabled: this.disabled },\n );\n if (result) {\n this.autocompleteDestroy = result.destroy;\n this.autocompleteSync = result.syncToGoogle;\n this.autocompleteSetError = result.setError;\n this.autocompleteSetDisabled = result.setDisabled;\n container.classList.add('autocomplete-active');\n }\n // Enter:\n // - Si selecciona sugerencia con Enter, Google dispara place_changed.\n // - Si NO hay selección, place_changed no sucede: tratamos Enter como texto libre y abrimos campos.\n this.onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n if (this.disabled) return;\n\n this.lastEnterAt = Date.now();\n // Valor puede venir del input nativo o del PlaceAutocompleteElement\n const googleInput = container\n .querySelector('gmp-place-autocomplete')\n ?.shadowRoot?.querySelector('input');\n const value = (googleInput?.value ?? this.inputEl?.value ?? '').trim();\n\n if (this.pendingEnterTimer) clearTimeout(this.pendingEnterTimer);\n this.pendingEnterTimer = setTimeout(() => {\n this.pendingEnterTimer = null;\n if (this.lastPlaceChangedAt >= this.lastEnterAt) return;\n\n if (value) this.freeTextAddress.emit(value);\n this.commitRequested.emit();\n this.justSelectedPlace = false;\n this.editingValue = value;\n }, 250);\n };\n container.addEventListener('keydown', this.onKeyDown);\n if (this.autocompleteDestroy) {\n this.isInitialized = true;\n }\n } catch (error) {\n console.error(`Failed to initialize ${this.addressType} autocomplete:`, error);\n }\n }\n\n private async getInputElement(): Promise<HTMLInputElement | null> {\n const inputComponent = this.el?.querySelector('rebill-input-text') as any;\n if (!inputComponent) {\n console.error(`Input component not found for ${this.addressType}-search`);\n return null;\n }\n\n try {\n return await inputComponent.getInputElement();\n } catch (error) {\n console.error(`Failed to get input element:`, error);\n return null;\n }\n }\n\n @Watch('value')\n valueWatcher() {\n if (this.justSelectedPlace) return;\n this.editingValue = null;\n this.autocompleteSync?.(this.displayValue);\n }\n\n @Watch('error')\n errorWatcher() {\n this.autocompleteSetError?.(this.error);\n }\n\n @Watch('disabled')\n disabledWatcher() {\n this.autocompleteSetDisabled?.(this.disabled);\n }\n\n private async handleAddressSelected(address: AddressComponents) {\n this.lastPlaceChangedAt = Date.now();\n if (this.pendingEnterTimer) {\n clearTimeout(this.pendingEnterTimer);\n this.pendingEnterTimer = null;\n }\n this.justSelectedPlace = true;\n // Evitar re-consultar el DOM: preferir la referencia ya inicializada\n const inputEl = this.inputEl ?? (await this.getInputElement());\n const addressLine = (address.address ?? '').trim();\n // En el search solo debe quedar \"número + calle\" (sin ciudad)\n this.editingValue = addressLine;\n this.addressSelected.emit(address);\n if (inputEl) {\n inputEl.value = addressLine;\n // Forzar actualización después de un pequeño delay para sobrescribir el valor de Google\n setTimeout(() => {\n if (inputEl) inputEl.value = addressLine;\n }, 50);\n }\n }\n\n private handleAddressInput = (ev: CustomEvent<{ id: string; value: string }>) => {\n this.editingValue = ev.detail?.value ?? '';\n };\n\n private handleAddressInputBlur = (ev: CustomEvent<{ id: string; value: string }>) => {\n const value = (ev.detail?.value ?? '').trim();\n if (!this.justSelectedPlace) {\n this.freeTextAddress.emit(value);\n }\n this.justSelectedPlace = false;\n this.editingValue = null;\n };\n\n private handleManualEntry = () => {\n this.manualEntryRequested.emit();\n };\n\n private get displayValue(): string {\n return this.editingValue !== null ? this.editingValue : this.value;\n }\n private cleanup() {\n if (this.pendingEnterTimer) {\n clearTimeout(this.pendingEnterTimer);\n this.pendingEnterTimer = null;\n }\n const container = this.el?.querySelector('.search-input-container');\n if (container && this.onKeyDown) {\n container.removeEventListener('keydown', this.onKeyDown);\n }\n this.onKeyDown = undefined;\n this.inputEl = null;\n this.autocompleteDestroy?.();\n this.autocompleteDestroy = null;\n this.autocompleteSync = null;\n this.isInitialized = false;\n }\n\n render() {\n const translationKey = this.addressType === 'shipping' ? 'shippingAddress' : 'billingAddress';\n const defaultPlaceholder = I18nService.translate(\n `${translationKey}.searchPlaceholder`,\n 'Search for an address...',\n );\n\n return (\n <rebill-autofill-detector\n target-selector=\"rebill-input-text input\"\n disabled={this.disabled}\n onAutofillDetected={event => this.handleAddressSelected(event.detail)}\n onManualEntryRequested={() => this.handleManualEntry()}\n >\n <div class=\"address-search-container\">\n <div class=\"search-input-container\">\n <rebill-input-text\n id={`${this.addressType}-search`}\n value={this.displayValue}\n placeholder={this.placeholder || defaultPlaceholder}\n rightIcon=\"search\"\n error={this.error}\n disabled={this.disabled}\n onInput={e => this.handleAddressInput(e as CustomEvent)}\n onBlur={e => this.handleAddressInputBlur(e as CustomEvent)}\n />\n </div>\n {this.error && (\n <div style={{ marginTop: '0.375rem' }}>\n <span\n class=\"error-message\"\n style={{\n color: 'var(--rebill-color-error)',\n fontSize: '0.75rem',\n display: 'block',\n lineHeight: '1rem',\n }}\n >\n {this.error}\n </span>\n </div>\n )}\n {this.showManualEntryLink && (\n <div class=\"manual-entry-link-wrapper\">\n <button class=\"manual-entry-link\" type=\"button\" onClick={this.handleManualEntry}>\n <rebill-typography\n variant=\"subtitle2\"\n color={COLORS_ENUM.SECONDARY}\n class=\"footer-link\"\n >\n {I18nService.translate(`${translationKey}.manualEntry`, 'Enter address manually')}\n </rebill-typography>\n </button>\n </div>\n )}\n </div>\n </rebill-autofill-detector>\n );\n }\n}\n"],"version":3}
@@ -2,7 +2,7 @@ import { proxyCustomElement, H, createEvent, h } from './p-8BpuJ_V5.js';
2
2
  import { a as api } from './p-D0zT4zMi.js';
3
3
  import { I as I18nService, s as state, o as onChange, S as SessionStore } from './p-DWn7p2EM.js';
4
4
  import { d as defineCustomElement$7 } from './p-iW7xLE4t.js';
5
- import { d as defineCustomElement$6 } from './p-8MtEW13e.js';
5
+ import { d as defineCustomElement$6 } from './p-Bt9U0G__.js';
6
6
  import { d as defineCustomElement$5 } from './p-C_5EcO0h.js';
7
7
  import { d as defineCustomElement$4 } from './p-CEObp3Ol.js';
8
8
  import { d as defineCustomElement$3 } from './p-BSseyChF.js';
@@ -294,6 +294,6 @@ function defineCustomElement() {
294
294
  defineCustomElement();
295
295
 
296
296
  export { Address as A, defineCustomElement as d };
297
- //# sourceMappingURL=p-C8zfxcyS.js.map
297
+ //# sourceMappingURL=p-C2IqZfrd.js.map
298
298
 
299
- //# sourceMappingURL=p-C8zfxcyS.js.map
299
+ //# sourceMappingURL=p-C2IqZfrd.js.map
@@ -1 +1 @@
1
- {"file":"p-C8zfxcyS.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement","sessionState"],"sources":["src/components/checkout/address/address.css?tag=rebill-address","src/components/checkout/address/address.tsx"],"sourcesContent":["@import '../../../styles/variables.css';\n\n:host {\n display: block;\n}\n\n.billing-header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.address-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n}\n\n.state-zip-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n.search-link {\n background: none;\n border: none;\n text-decoration: underline;\n font-size: 14px;\n cursor: pointer;\n padding: 4px 0;\n text-decoration-color: var(--rebill-color-primary);\n}\n\n.state-zip-row rebill-input-select,\n.state-zip-row rebill-input-text {\n flex: 1;\n}\n\n.search-input-container {\n margin-top: 8px;\n}\n\n.manual-entry-link-wrapper {\n margin-top: 8px;\n text-align: left;\n}\n\n.same-as-shipping-section {\n margin: 24px 0;\n padding: 16px 0;\n}\n\n.shipping-address-section {\n margin-top: 24px;\n padding-top: 24px;\n}\n","import { Component, Element, Event, EventEmitter, h, Prop, State } from '@stencil/core';\nimport { api } from '../../../api';\nimport { I18nService } from '../../../i18n/i18n.service';\nimport { onChange, sessionState, SessionStore } from '../../../store/session.store';\nimport { AddressComponents } from '../../../utils';\n\n@Component({\n tag: 'rebill-address',\n styleUrl: 'address.css',\n shadow: false,\n})\nexport class Address {\n @Element() el: HTMLElement;\n /** @deprecated Vista unificada: siempre se muestra search + formulario. Se mantiene por compatibilidad. */\n @Prop({ mutable: true, reflect: true }) billingView: 'search' | 'form' = 'search';\n @State() currentBillingStateOptions: { label: string; value: string }[] = [];\n @State() isLoadingAddress: boolean = false;\n /** Dirección \"calle + número\" (valor que se persiste en store) */\n @State() addressLine: string = '';\n /** false = solo search; true = search + formulario (ciudad, estado, etc.) */\n @State() addressCommitted: boolean = false;\n @Prop() disabled: boolean = false;\n @Event() searchRequested: EventEmitter<void>;\n @Prop() countryOptions: { label: string; value: string }[] = [];\n\n @Prop() errors?: {\n 'billing-country': string;\n 'billing-state': string;\n 'billing-address': string;\n 'billing-city': string;\n 'billing-zip': string;\n } | null = null;\n\n private unsubscribeAddressStore?: () => void;\n\n private translateError(errorKey: string | undefined): string {\n if (!errorKey) return '';\n if (errorKey.includes('validation.') || errorKey.includes('paymentErrors.')) {\n return I18nService.translate(errorKey);\n }\n return errorKey;\n }\n\n @Event() addressUpdated: EventEmitter<{\n country: string;\n state: string;\n address: string;\n city: string;\n zip: string;\n addInformation: string;\n }>;\n\n async componentDidLoad() {\n this.syncAddressLineFromStore();\n // Si ya hay dirección en store (prefilled o vuelve al checkout), mostrar formulario completo\n const billing = sessionState.data?.userInformation?.address?.billingAddress;\n if (billing?.address || billing?.city) {\n this.addressCommitted = true;\n }\n this.unsubscribeAddressStore = onChange('data', () => {\n const billingAddress = sessionState.data.userInformation.address?.billingAddress;\n\n if (billingAddress) {\n this.addressLine = billingAddress.address ?? '';\n const addressData: AddressComponents = {\n country: billingAddress.country || '',\n state: billingAddress.state || '',\n address: billingAddress.address || '',\n city: billingAddress.city || '',\n zip: billingAddress.zip || '',\n addInformation: billingAddress.addInformation || '',\n };\n\n this.emitInputEventsForAddress(addressData);\n }\n });\n }\n\n private syncAddressLineFromStore() {\n const billingAddress = sessionState.data?.userInformation?.address?.billingAddress;\n this.addressLine = billingAddress?.address ?? '';\n }\n\n disconnectedCallback() {\n if (this.unsubscribeAddressStore) {\n this.unsubscribeAddressStore();\n }\n }\n\n private async handleAddressSelected(address: AddressComponents) {\n this.isLoadingAddress = true;\n\n // Normalize text function for handling accents and special characters\n const normalizeText = (text: string) => {\n return text\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // Remove accents\n .replace(/\\./g, '') // Remove dots\n .replace(/\\s+/g, ' ') // Normalize spaces\n .trim();\n };\n // Persistimos en store solo calle + número, y eso mismo se muestra en el search\n this.addressLine = address.address ?? '';\n this.addressCommitted = true;\n\n if (address.country) {\n await this.loadStatesForCountry(address.country);\n\n // Compare Google state with API states\n if (address.state && this.currentBillingStateOptions.length > 0) {\n const exactMatch = this.currentBillingStateOptions.find(\n option => option.value.toLowerCase() === address.state.toLowerCase(),\n );\n\n const partialMatch = this.currentBillingStateOptions.find(\n option =>\n option.value.toLowerCase().includes(address.state.toLowerCase()) ||\n address.state.toLowerCase().includes(option.value.toLowerCase()),\n );\n\n // Try to find matches with common variations\n const normalizedGoogleState = normalizeText(address.state)\n .replace('ciudad de ', '')\n .replace('estado de ', '')\n .replace('provincia de ', '');\n\n const normalizedMatch = this.currentBillingStateOptions.find(option => {\n const normalizedOption = normalizeText(option.value)\n .replace('ciudad de ', '')\n .replace('estado de ', '')\n .replace('provincia de ', '');\n\n // Chile: API puede devolver \"Santiago Region Metropolitana\" y Google \"Región Metropolitana\"\n const optionWithoutSantiagoPrefix = normalizedOption.replace(/^santiago\\s+/, '');\n\n const matches =\n normalizedOption === normalizedGoogleState ||\n normalizedOption.startsWith(normalizedGoogleState + ' ') ||\n normalizedGoogleState.startsWith(normalizedOption + ' ') ||\n optionWithoutSantiagoPrefix === normalizedGoogleState ||\n normalizedGoogleState.startsWith(optionWithoutSantiagoPrefix + ' ');\n return matches;\n });\n\n if (exactMatch) {\n address.state = exactMatch.value;\n } else if (normalizedMatch) {\n address.state = normalizedMatch.value;\n } else if (partialMatch) {\n address.state = partialMatch.value;\n } else {\n address.state = undefined;\n }\n }\n }\n SessionStore.setBillingAddress(address);\n\n this.addressUpdated.emit({\n country: address.country || '',\n address: address.address || '',\n city: address.city || '',\n state: address.state || undefined,\n zip: address.zip || '',\n addInformation: address.addInformation || '',\n });\n\n // Use requestAnimationFrame to ensure the form is rendered with the new state options\n // before emitting events. This ensures the state field can be properly populated.\n requestAnimationFrame(() => {\n this.emitInputEventsForAddress(address);\n setTimeout(() => {\n this.isLoadingAddress = false;\n }, 500);\n });\n }\n\n private emitInputEventsForAddress(address: AddressComponents) {\n // Emit input events for each address field that has a value\n // This mimics user input to properly clear validation errors\n const fields = [\n { id: `billing-country`, value: address.country },\n { id: `billing-address`, value: address.address },\n { id: `billing-city`, value: address.city },\n { id: `billing-state`, value: address.state },\n { id: `billing-zip`, value: address.zip },\n { id: `billing-addInformation`, value: address.addInformation },\n ];\n\n fields.forEach(field => {\n if (field.value) {\n this.emitInputEvent(field.id, field.value);\n }\n });\n }\n\n private emitInputEvent(id: string, value: string) {\n if (value) {\n // Create and dispatch a custom input event that the form component can listen to\n const inputEvent = new CustomEvent('input', {\n detail: { id, value },\n bubbles: true,\n composed: true,\n });\n this.el.dispatchEvent(inputEvent);\n }\n }\n private handleFreeTextAddress = (value: string) => {\n // No activar modo manual en blur - solo guardar el valor\n // El modo manual se activa con Enter (commitRequested) o click en \"Ingresar manualmente\"\n SessionStore.setBillingAddress({ address: value });\n this.addressLine = value;\n this.emitInputEvent('billing-address', value);\n this.addressUpdated.emit({\n country: sessionState.data?.userInformation?.address?.billingAddress?.country ?? '',\n address: value,\n city: sessionState.data?.userInformation?.address?.billingAddress?.city ?? '',\n state: sessionState.data?.userInformation?.address?.billingAddress?.state ?? '',\n zip: sessionState.data?.userInformation?.address?.billingAddress?.zip ?? '',\n addInformation:\n sessionState.data?.userInformation?.address?.billingAddress?.addInformation ?? '',\n });\n };\n\n private async loadStatesForCountry(countryCode: string) {\n try {\n const response = await api.data.getStates(countryCode);\n const statesResponse = response.data;\n const stateOptions =\n statesResponse && statesResponse.states\n ? statesResponse.states.map(state => ({ label: state, value: state }))\n : [];\n\n this.currentBillingStateOptions = stateOptions;\n } catch (error) {\n this.currentBillingStateOptions = [];\n }\n }\n\n private handleManualEntry = () => {\n this.addressCommitted = true;\n };\n\n private async handleInput(field: string, value: string) {\n if (value === undefined) return;\n SessionStore.setBillingAddress({ [field]: value } as any);\n // Emit input event to form to sync with form data\n this.emitInputEvent(`billing-${field}`, value);\n\n // If country changes, load states for the new country\n if (field === 'country') {\n await this.loadStatesForCountry(value);\n // Clear the current state selection since the country changed\n SessionStore.setBillingAddress({ state: '' } as any);\n }\n }\n\n private renderAddressHeader() {\n return (\n <div class=\"billing-header-row\">\n <rebill-typography variant=\"body2\">\n {I18nService.translate('billingAddress.title')}\n </rebill-typography>\n </div>\n );\n }\n\n private renderAddressForm() {\n // Solo mostrar en el search el error del campo dirección; ciudad/estado/zip tienen su error en su propio campo\n const addressSearchError = this.translateError(this.errors?.['billing-address']) || '';\n const errorsToShow = this.isLoadingAddress ? null : this.errors;\n\n return (\n <div>\n {this.renderAddressHeader()}\n <rebill-address-search\n value={this.addressLine}\n onAddressSelected={e => this.handleAddressSelected(e.detail)}\n onFreeTextAddress={e => this.handleFreeTextAddress(e.detail)}\n onCommitRequested={() => (this.addressCommitted = true)}\n onManualEntryRequested={() => this.handleManualEntry()}\n error={addressSearchError}\n disabled={this.disabled}\n showManualEntryLink={!this.addressCommitted}\n />\n {this.addressCommitted && (\n <rebill-address-form\n countryOptions={this.countryOptions}\n stateOptions={this.currentBillingStateOptions}\n errors={errorsToShow}\n disabled={this.disabled}\n onFieldChanged={e => this.handleInput(e.detail.field, e.detail.value)}\n />\n )}\n </div>\n );\n }\n\n render() {\n return (\n <div>\n {/* Billing Address */}\n {this.renderAddressForm()}\n </div>\n );\n }\n}\n"],"version":3}
1
+ {"file":"p-C2IqZfrd.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement","sessionState"],"sources":["src/components/checkout/address/address.css?tag=rebill-address","src/components/checkout/address/address.tsx"],"sourcesContent":["@import '../../../styles/variables.css';\n\n:host {\n display: block;\n}\n\n.billing-header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.address-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n}\n\n.state-zip-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n.search-link {\n background: none;\n border: none;\n text-decoration: underline;\n font-size: 14px;\n cursor: pointer;\n padding: 4px 0;\n text-decoration-color: var(--rebill-color-primary);\n}\n\n.state-zip-row rebill-input-select,\n.state-zip-row rebill-input-text {\n flex: 1;\n}\n\n.search-input-container {\n margin-top: 8px;\n}\n\n.manual-entry-link-wrapper {\n margin-top: 8px;\n text-align: left;\n}\n\n.same-as-shipping-section {\n margin: 24px 0;\n padding: 16px 0;\n}\n\n.shipping-address-section {\n margin-top: 24px;\n padding-top: 24px;\n}\n","import { Component, Element, Event, EventEmitter, h, Prop, State } from '@stencil/core';\nimport { api } from '../../../api';\nimport { I18nService } from '../../../i18n/i18n.service';\nimport { onChange, sessionState, SessionStore } from '../../../store/session.store';\nimport { AddressComponents } from '../../../utils';\n\n@Component({\n tag: 'rebill-address',\n styleUrl: 'address.css',\n shadow: false,\n})\nexport class Address {\n @Element() el: HTMLElement;\n /** @deprecated Vista unificada: siempre se muestra search + formulario. Se mantiene por compatibilidad. */\n @Prop({ mutable: true, reflect: true }) billingView: 'search' | 'form' = 'search';\n @State() currentBillingStateOptions: { label: string; value: string }[] = [];\n @State() isLoadingAddress: boolean = false;\n /** Dirección \"calle + número\" (valor que se persiste en store) */\n @State() addressLine: string = '';\n /** false = solo search; true = search + formulario (ciudad, estado, etc.) */\n @State() addressCommitted: boolean = false;\n @Prop() disabled: boolean = false;\n @Event() searchRequested: EventEmitter<void>;\n @Prop() countryOptions: { label: string; value: string }[] = [];\n\n @Prop() errors?: {\n 'billing-country': string;\n 'billing-state': string;\n 'billing-address': string;\n 'billing-city': string;\n 'billing-zip': string;\n } | null = null;\n\n private unsubscribeAddressStore?: () => void;\n\n private translateError(errorKey: string | undefined): string {\n if (!errorKey) return '';\n if (errorKey.includes('validation.') || errorKey.includes('paymentErrors.')) {\n return I18nService.translate(errorKey);\n }\n return errorKey;\n }\n\n @Event() addressUpdated: EventEmitter<{\n country: string;\n state: string;\n address: string;\n city: string;\n zip: string;\n addInformation: string;\n }>;\n\n async componentDidLoad() {\n this.syncAddressLineFromStore();\n // Si ya hay dirección en store (prefilled o vuelve al checkout), mostrar formulario completo\n const billing = sessionState.data?.userInformation?.address?.billingAddress;\n if (billing?.address || billing?.city) {\n this.addressCommitted = true;\n }\n this.unsubscribeAddressStore = onChange('data', () => {\n const billingAddress = sessionState.data.userInformation.address?.billingAddress;\n\n if (billingAddress) {\n this.addressLine = billingAddress.address ?? '';\n const addressData: AddressComponents = {\n country: billingAddress.country || '',\n state: billingAddress.state || '',\n address: billingAddress.address || '',\n city: billingAddress.city || '',\n zip: billingAddress.zip || '',\n addInformation: billingAddress.addInformation || '',\n };\n\n this.emitInputEventsForAddress(addressData);\n }\n });\n }\n\n private syncAddressLineFromStore() {\n const billingAddress = sessionState.data?.userInformation?.address?.billingAddress;\n this.addressLine = billingAddress?.address ?? '';\n }\n\n disconnectedCallback() {\n if (this.unsubscribeAddressStore) {\n this.unsubscribeAddressStore();\n }\n }\n\n private async handleAddressSelected(address: AddressComponents) {\n this.isLoadingAddress = true;\n\n // Normalize text function for handling accents and special characters\n const normalizeText = (text: string) => {\n return text\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // Remove accents\n .replace(/\\./g, '') // Remove dots\n .replace(/\\s+/g, ' ') // Normalize spaces\n .trim();\n };\n // Persistimos en store solo calle + número, y eso mismo se muestra en el search\n this.addressLine = address.address ?? '';\n this.addressCommitted = true;\n\n if (address.country) {\n await this.loadStatesForCountry(address.country);\n\n // Compare Google state with API states\n if (address.state && this.currentBillingStateOptions.length > 0) {\n const exactMatch = this.currentBillingStateOptions.find(\n option => option.value.toLowerCase() === address.state.toLowerCase(),\n );\n\n const partialMatch = this.currentBillingStateOptions.find(\n option =>\n option.value.toLowerCase().includes(address.state.toLowerCase()) ||\n address.state.toLowerCase().includes(option.value.toLowerCase()),\n );\n\n // Try to find matches with common variations\n const normalizedGoogleState = normalizeText(address.state)\n .replace('ciudad de ', '')\n .replace('estado de ', '')\n .replace('provincia de ', '');\n\n const normalizedMatch = this.currentBillingStateOptions.find(option => {\n const normalizedOption = normalizeText(option.value)\n .replace('ciudad de ', '')\n .replace('estado de ', '')\n .replace('provincia de ', '');\n\n // Chile: API puede devolver \"Santiago Region Metropolitana\" y Google \"Región Metropolitana\"\n const optionWithoutSantiagoPrefix = normalizedOption.replace(/^santiago\\s+/, '');\n\n const matches =\n normalizedOption === normalizedGoogleState ||\n normalizedOption.startsWith(normalizedGoogleState + ' ') ||\n normalizedGoogleState.startsWith(normalizedOption + ' ') ||\n optionWithoutSantiagoPrefix === normalizedGoogleState ||\n normalizedGoogleState.startsWith(optionWithoutSantiagoPrefix + ' ');\n return matches;\n });\n\n if (exactMatch) {\n address.state = exactMatch.value;\n } else if (normalizedMatch) {\n address.state = normalizedMatch.value;\n } else if (partialMatch) {\n address.state = partialMatch.value;\n } else {\n address.state = undefined;\n }\n }\n }\n SessionStore.setBillingAddress(address);\n\n this.addressUpdated.emit({\n country: address.country || '',\n address: address.address || '',\n city: address.city || '',\n state: address.state || undefined,\n zip: address.zip || '',\n addInformation: address.addInformation || '',\n });\n\n // Use requestAnimationFrame to ensure the form is rendered with the new state options\n // before emitting events. This ensures the state field can be properly populated.\n requestAnimationFrame(() => {\n this.emitInputEventsForAddress(address);\n setTimeout(() => {\n this.isLoadingAddress = false;\n }, 500);\n });\n }\n\n private emitInputEventsForAddress(address: AddressComponents) {\n // Emit input events for each address field that has a value\n // This mimics user input to properly clear validation errors\n const fields = [\n { id: `billing-country`, value: address.country },\n { id: `billing-address`, value: address.address },\n { id: `billing-city`, value: address.city },\n { id: `billing-state`, value: address.state },\n { id: `billing-zip`, value: address.zip },\n { id: `billing-addInformation`, value: address.addInformation },\n ];\n\n fields.forEach(field => {\n if (field.value) {\n this.emitInputEvent(field.id, field.value);\n }\n });\n }\n\n private emitInputEvent(id: string, value: string) {\n if (value) {\n // Create and dispatch a custom input event that the form component can listen to\n const inputEvent = new CustomEvent('input', {\n detail: { id, value },\n bubbles: true,\n composed: true,\n });\n this.el.dispatchEvent(inputEvent);\n }\n }\n private handleFreeTextAddress = (value: string) => {\n // No activar modo manual en blur - solo guardar el valor\n // El modo manual se activa con Enter (commitRequested) o click en \"Ingresar manualmente\"\n SessionStore.setBillingAddress({ address: value });\n this.addressLine = value;\n this.emitInputEvent('billing-address', value);\n this.addressUpdated.emit({\n country: sessionState.data?.userInformation?.address?.billingAddress?.country ?? '',\n address: value,\n city: sessionState.data?.userInformation?.address?.billingAddress?.city ?? '',\n state: sessionState.data?.userInformation?.address?.billingAddress?.state ?? '',\n zip: sessionState.data?.userInformation?.address?.billingAddress?.zip ?? '',\n addInformation:\n sessionState.data?.userInformation?.address?.billingAddress?.addInformation ?? '',\n });\n };\n\n private async loadStatesForCountry(countryCode: string) {\n try {\n const response = await api.data.getStates(countryCode);\n const statesResponse = response.data;\n const stateOptions =\n statesResponse && statesResponse.states\n ? statesResponse.states.map(state => ({ label: state, value: state }))\n : [];\n\n this.currentBillingStateOptions = stateOptions;\n } catch (error) {\n this.currentBillingStateOptions = [];\n }\n }\n\n private handleManualEntry = () => {\n this.addressCommitted = true;\n };\n\n private async handleInput(field: string, value: string) {\n if (value === undefined) return;\n SessionStore.setBillingAddress({ [field]: value } as any);\n // Emit input event to form to sync with form data\n this.emitInputEvent(`billing-${field}`, value);\n\n // If country changes, load states for the new country\n if (field === 'country') {\n await this.loadStatesForCountry(value);\n // Clear the current state selection since the country changed\n SessionStore.setBillingAddress({ state: '' } as any);\n }\n }\n\n private renderAddressHeader() {\n return (\n <div class=\"billing-header-row\">\n <rebill-typography variant=\"body2\">\n {I18nService.translate('billingAddress.title')}\n </rebill-typography>\n </div>\n );\n }\n\n private renderAddressForm() {\n // Solo mostrar en el search el error del campo dirección; ciudad/estado/zip tienen su error en su propio campo\n const addressSearchError = this.translateError(this.errors?.['billing-address']) || '';\n const errorsToShow = this.isLoadingAddress ? null : this.errors;\n\n return (\n <div>\n {this.renderAddressHeader()}\n <rebill-address-search\n value={this.addressLine}\n onAddressSelected={e => this.handleAddressSelected(e.detail)}\n onFreeTextAddress={e => this.handleFreeTextAddress(e.detail)}\n onCommitRequested={() => (this.addressCommitted = true)}\n onManualEntryRequested={() => this.handleManualEntry()}\n error={addressSearchError}\n disabled={this.disabled}\n showManualEntryLink={!this.addressCommitted}\n />\n {this.addressCommitted && (\n <rebill-address-form\n countryOptions={this.countryOptions}\n stateOptions={this.currentBillingStateOptions}\n errors={errorsToShow}\n disabled={this.disabled}\n onFieldChanged={e => this.handleInput(e.detail.field, e.detail.value)}\n />\n )}\n </div>\n );\n }\n\n render() {\n return (\n <div>\n {/* Billing Address */}\n {this.renderAddressForm()}\n </div>\n );\n }\n}\n"],"version":3}
@@ -1,4 +1,4 @@
1
- import { A as AddressSearch, d as defineCustomElement$1 } from './p-8MtEW13e.js';
1
+ import { A as AddressSearch, d as defineCustomElement$1 } from './p-Bt9U0G__.js';
2
2
 
3
3
  const RebillAddressSearch = AddressSearch;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { A as Address, d as defineCustomElement$1 } from './p-C8zfxcyS.js';
1
+ import { A as Address, d as defineCustomElement$1 } from './p-C2IqZfrd.js';
2
2
 
3
3
  const RebillAddress = Address;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -8,7 +8,7 @@ import { P as PAYMENT_METHOD_ENUM, S as SessionStore, I as I18nService } from '.
8
8
  import { r as renewalState, R as RenewalStore, o as onChange } from './p-C4EyL9pU.js';
9
9
  import { B as BREAKPOINT_ENUM, g as getBreakpoint, i as isBreakpointBelow } from './p-Do_vNuMa.js';
10
10
  import { f as formatDateTime } from './p-Lq1iQbjq.js';
11
- import { G as GoogleMapsService, d as defineCustomElement$q } from './p-8MtEW13e.js';
11
+ import { G as GoogleMapsService, d as defineCustomElement$q } from './p-Bt9U0G__.js';
12
12
  import { s as shouldAskIdentification, i as isFieldRequired, b as buildIdentification } from './p-o2MEAJIp.js';
13
13
  import { d as defineCustomElement$6 } from './p-C4akJvrI.js';
14
14
  import { g as getAllRequiredFieldsRenewal, a as getRequiredFieldsForMethod } from './p-542cdzdq.js';
@@ -21,7 +21,7 @@ import { d as defineCustomElement$z } from './p-C819kccG.js';
21
21
  import { d as defineCustomElement$x } from './p-BGKegj9g.js';
22
22
  import { d as defineCustomElement$w } from './p-DeSbytQS.js';
23
23
  import { d as defineCustomElement$v } from './p-C_SGjDIF.js';
24
- import { d as defineCustomElement$s } from './p-C8zfxcyS.js';
24
+ import { d as defineCustomElement$s } from './p-C2IqZfrd.js';
25
25
  import { d as defineCustomElement$r } from './p-iW7xLE4t.js';
26
26
  import { d as defineCustomElement$p } from './p-MO5_tN5S.js';
27
27
  import { d as defineCustomElement$o } from './p-C_5EcO0h.js';
@@ -11,7 +11,7 @@ import { d as defineCustomElement$2 } from './p-C7MrBj9n.js';
11
11
  import { d as defineCustomElement$H } from './p-C_SGjDIF.js';
12
12
  import { s as state, a as SESSION_TYPE_ENUM, I as I18nService, S as SessionStore, i as initializeI18nWithSessionLanguage, P as PAYMENT_METHOD_ENUM, o as onChange, b as SESSION_ITEM_TYPE_ENUM } from './p-DWn7p2EM.js';
13
13
  import { B as BREAKPOINT_ENUM, g as getBreakpoint, i as isBreakpointBelow } from './p-Do_vNuMa.js';
14
- import { G as GoogleMapsService, d as defineCustomElement$A } from './p-8MtEW13e.js';
14
+ import { G as GoogleMapsService, d as defineCustomElement$A } from './p-Bt9U0G__.js';
15
15
  import { m as mapRequiredFields, b as buildIdentification, s as shouldAskIdentification, i as isFieldRequired, g as getFieldValues } from './p-o2MEAJIp.js';
16
16
  import { P as PaymentMethodMapper } from './p-BB8-tqRT.js';
17
17
  import { d as defineCustomElement$g } from './p-CK7WWMQD.js';
@@ -27,7 +27,7 @@ import { d as defineCustomElement$I } from './p-DfgaqHel.js';
27
27
  import { d as defineCustomElement$G } from './p-BDJ6hGgd.js';
28
28
  import { d as defineCustomElement$E } from './p-CHZx_ErJ.js';
29
29
  import { d as defineCustomElement$D } from './p-DwOrAE9w.js';
30
- import { d as defineCustomElement$C } from './p-C8zfxcyS.js';
30
+ import { d as defineCustomElement$C } from './p-C2IqZfrd.js';
31
31
  import { d as defineCustomElement$B } from './p-iW7xLE4t.js';
32
32
  import { d as defineCustomElement$z } from './p-MO5_tN5S.js';
33
33
  import { d as defineCustomElement$y } from './p-C_5EcO0h.js';
@@ -8,7 +8,7 @@ import { P as PAYMENT_METHOD_ENUM, I as I18nService } from './p-DWn7p2EM.js';
8
8
  import { r as renewalState, R as RenewalStore, o as onChange } from './p-C4EyL9pU.js';
9
9
  import { B as BREAKPOINT_ENUM, g as getBreakpoint, i as isBreakpointBelow } from './p-Do_vNuMa.js';
10
10
  import { C as COLORS_ENUM } from './p-C5Pu-n-i.js';
11
- import { G as GoogleMapsService, d as defineCustomElement$r } from './p-8MtEW13e.js';
11
+ import { G as GoogleMapsService, d as defineCustomElement$r } from './p-Bt9U0G__.js';
12
12
  import { s as shouldAskIdentification, i as isFieldRequired, b as buildIdentification, g as getFieldValues } from './p-o2MEAJIp.js';
13
13
  import { P as PaymentMethodMapper } from './p-BB8-tqRT.js';
14
14
  import { g as getAllRequiredFieldsRenewal, a as getRequiredFieldsForMethod } from './p-542cdzdq.js';
@@ -25,7 +25,7 @@ import { d as defineCustomElement$x } from './p-C_SGjDIF.js';
25
25
  import { d as defineCustomElement$w } from './p-GAYqdzRD.js';
26
26
  import { d as defineCustomElement$v } from './p-CHZx_ErJ.js';
27
27
  import { d as defineCustomElement$u } from './p-DwOrAE9w.js';
28
- import { d as defineCustomElement$t } from './p-C8zfxcyS.js';
28
+ import { d as defineCustomElement$t } from './p-C2IqZfrd.js';
29
29
  import { d as defineCustomElement$s } from './p-iW7xLE4t.js';
30
30
  import { d as defineCustomElement$q } from './p-MO5_tN5S.js';
31
31
  import { d as defineCustomElement$p } from './p-C_5EcO0h.js';
@@ -5,7 +5,7 @@ import { a as api } from './index-Ck5Bx4fO.js';
5
5
  import { g as getAPIConfig } from './config-f7nCusI1.js';
6
6
  import { g as getAssetURL } from './assets-BKF_7Jfj.js';
7
7
  import { C as COLORS_ENUM } from './color-class-mapper-C5Pu-n-i.js';
8
- import { G as GoogleMapsService } from './google-maps.service-C2nYpE_A.js';
8
+ import { G as GoogleMapsService } from './google-maps.service-Lr2NbC5i.js';
9
9
  import { c as create$6, V as ValidationError } from './index.esm-CRUbzQx9.js';
10
10
  import { c as getInstallmentDisabledPlaceholderByCurrency, d as getInstallmentPlaceholderByCurrency, E as ENUM_INSTALLMENT_MODEL, e as getInstallmentLabel, b as getRecalculatedInstallmentAmount } from './installment-utils-wMHKZANV.js';
11
11
  import { a as getPaymentMethodDisplayName } from './get-payment-method-display-name-B5ehKHVz.js';
@@ -19,17 +19,27 @@ class GoogleMapsService {
19
19
  }
20
20
  return originalAttachShadow.call(this, init);
21
21
  };
22
- // Interceptar showModal() para evitar que Google abra un dialog fullscreen
23
- // en mobile que cubre toda la pantalla (se promueve al #top-layer del navegador).
24
- // Usamos .show() en su lugar para que quede en el flujo normal del DOM
25
- // y podamos estilizarlo con CSS.
22
+ // Interceptar showModal() para evitar el dialog fullscreen de Google en mobile.
23
+ // Bloqueamos la apertura completamente. El input inline + listbox funcionan sin él.
26
24
  const originalShowModal = HTMLDialogElement.prototype.showModal;
27
25
  HTMLDialogElement.prototype.showModal = function () {
28
26
  const isGoogleDialog = this.classList.contains('full-window-autocomplete-dialog') ||
29
27
  this.closest('gmp-place-autocomplete') !== null;
30
28
  if (isGoogleDialog) {
31
- // Abrir como dialog no-modal queda en flujo normal, no en #top-layer
29
+ // Guardar foco y scroll ANTES de abrir
30
+ const prev = document.activeElement;
31
+ const scrollX = window.scrollX;
32
+ const scrollY = window.scrollY;
32
33
  this.show();
34
+ // Quitar foco del input del dialog sin causar scroll
35
+ const input = this.querySelector('input');
36
+ if (input)
37
+ input.blur();
38
+ if (prev && prev !== document.body) {
39
+ prev.focus({ preventScroll: true });
40
+ }
41
+ // Restaurar scroll
42
+ window.scrollTo(scrollX, scrollY);
33
43
  return;
34
44
  }
35
45
  return originalShowModal.call(this);
@@ -106,6 +116,37 @@ class GoogleMapsService {
106
116
  // Insertar en el container; el CSS del padre lo posiciona como overlay
107
117
  containerElement.appendChild(placeAutocomplete);
108
118
  await new Promise(resolve => setTimeout(resolve, 300));
119
+ // Asegurar que el input inline del shadow DOM esté habilitado en mobile
120
+ // y bloquear el .focus() automático que Google hace sobre él
121
+ const patchGoogleInput = () => {
122
+ const googleInput = placeAutocomplete.shadowRoot?.querySelector('input');
123
+ if (!googleInput || googleInput.__rebillPatched)
124
+ return;
125
+ googleInput.disabled = false;
126
+ googleInput.style.display = 'block';
127
+ googleInput.style.pointerEvents = 'auto';
128
+ googleInput.style.visibility = 'visible';
129
+ googleInput.style.opacity = '1';
130
+ // Reemplazar .focus() en este input específico:
131
+ // Solo permitir focus si el usuario hizo click/tap en el container del address
132
+ const originalInputFocus = googleInput.focus.bind(googleInput);
133
+ let userClickedAddress = false;
134
+ containerElement.addEventListener('pointerdown', () => {
135
+ userClickedAddress = true;
136
+ setTimeout(() => { userClickedAddress = false; }, 300);
137
+ });
138
+ googleInput.focus = (opts) => {
139
+ if (userClickedAddress) {
140
+ originalInputFocus(opts);
141
+ }
142
+ // Si no fue click del usuario, ignorar (evita robo de foco)
143
+ };
144
+ googleInput.__rebillPatched = true;
145
+ };
146
+ patchGoogleInput();
147
+ setTimeout(patchGoogleInput, 500);
148
+ setTimeout(patchGoogleInput, 1000);
149
+ setTimeout(patchGoogleInput, 2000);
109
150
  // Inyectar estilos Rebill en el shadow DOM (modo open vía setupShadowDOMPatch)
110
151
  this.injectRebillStyles(placeAutocomplete);
111
152
  // Ocultar elementos de branding de Google que se renderizan fuera del Shadow DOM
@@ -296,7 +337,8 @@ class GoogleMapsService {
296
337
  border: 1.5px solid #E5E7EB !important;
297
338
  padding: 10px 14px !important;
298
339
  padding-right: 40px !important;
299
- font-size: 14px !important;
340
+ /* 16px evita auto-zoom en mobile (iOS/Android hacen zoom si font-size < 16px) */
341
+ font-size: 16px !important;
300
342
  line-height: 20px !important;
301
343
  font-weight: 400 !important;
302
344
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
@@ -459,9 +501,8 @@ class GoogleMapsService {
459
501
  font-family: inherit !important;
460
502
  }
461
503
 
462
- /* FIX mobile: Google abre un dialog fullscreen en viewports chicos.
463
- Con el patch de showModal→show, el dialog ya no va al #top-layer.
464
- Lo forzamos a ser inline dentro del contenedor. */
504
+ /* FIX mobile: El dialog se abre con .show() (no showModal) para evitar
505
+ el #top-layer. Lo contenemos inline dentro del componente. */
465
506
  dialog,
466
507
  .full-window-autocomplete-dialog,
467
508
  [class*="full-window"] {
@@ -469,8 +510,8 @@ class GoogleMapsService {
469
510
  top: 0 !important;
470
511
  left: 0 !important;
471
512
  width: 100% !important;
472
- height: auto !important;
473
- max-height: none !important;
513
+ height: 38.33px !important;
514
+ max-height: 38.33px !important;
474
515
  margin: 0 !important;
475
516
  padding: 0 !important;
476
517
  border: none !important;
@@ -479,7 +520,6 @@ class GoogleMapsService {
479
520
  z-index: 10 !important;
480
521
  }
481
522
 
482
- /* El backdrop del dialog (si existiera) */
483
523
  dialog::backdrop {
484
524
  display: none !important;
485
525
  }
@@ -575,6 +615,6 @@ class GoogleMapsService {
575
615
  }
576
616
 
577
617
  export { GoogleMapsService as G };
578
- //# sourceMappingURL=google-maps.service-C2nYpE_A.js.map
618
+ //# sourceMappingURL=google-maps.service-Lr2NbC5i.js.map
579
619
 
580
- //# sourceMappingURL=google-maps.service-C2nYpE_A.js.map
620
+ //# sourceMappingURL=google-maps.service-Lr2NbC5i.js.map