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.
- package/dist/cjs/card-fields-wrapper_11.cjs.entry.js +1 -1
- package/dist/cjs/{google-maps.service-CZcMzFBX.js → google-maps.service-DgIZjibV.js} +54 -14
- package/dist/cjs/google-maps.service-DgIZjibV.js.map +1 -0
- package/dist/cjs/index-C-VTnc0I.js.map +1 -1
- package/dist/cjs/rebill-change-card.cjs.entry.js +1 -1
- package/dist/cjs/rebill-checkout.cjs.entry.js +1 -1
- package/dist/cjs/rebill-renewal.cjs.entry.js +1 -1
- package/dist/collection/utils/google-maps.service.js +52 -12
- package/dist/collection/utils/google-maps.service.js.map +1 -1
- package/dist/components/p-8BpuJ_V5.js.map +1 -1
- package/dist/components/{p-8MtEW13e.js → p-Bt9U0G__.js} +54 -14
- package/dist/components/p-Bt9U0G__.js.map +1 -0
- package/dist/components/{p-C8zfxcyS.js → p-C2IqZfrd.js} +3 -3
- package/dist/components/{p-C8zfxcyS.js.map → p-C2IqZfrd.js.map} +1 -1
- package/dist/components/rebill-address-search.js +1 -1
- package/dist/components/rebill-address.js +1 -1
- package/dist/components/rebill-change-card.js +2 -2
- package/dist/components/rebill-checkout.js +2 -2
- package/dist/components/rebill-renewal.js +2 -2
- package/dist/esm/card-fields-wrapper_11.entry.js +1 -1
- package/dist/esm/{google-maps.service-C2nYpE_A.js → google-maps.service-Lr2NbC5i.js} +54 -14
- package/dist/esm/google-maps.service-Lr2NbC5i.js.map +1 -0
- package/dist/esm/index-D8cwEAmw.js.map +1 -1
- package/dist/esm/rebill-change-card.entry.js +1 -1
- package/dist/esm/rebill-checkout.entry.js +1 -1
- package/dist/esm/rebill-renewal.entry.js +1 -1
- package/dist/rebill-web-components-sdk/{p-bf15156a.entry.js → p-1c1cb576.entry.js} +2 -2
- package/dist/rebill-web-components-sdk/{p-c327a984.entry.js → p-247a086e.entry.js} +2 -2
- package/dist/rebill-web-components-sdk/{p-b9a3b27f.entry.js → p-43dc2877.entry.js} +2 -2
- package/dist/rebill-web-components-sdk/p-D8cwEAmw.js.map +1 -1
- package/dist/rebill-web-components-sdk/p-Lr2NbC5i.js +2 -0
- package/dist/rebill-web-components-sdk/p-Lr2NbC5i.js.map +1 -0
- package/dist/rebill-web-components-sdk/{p-f3859b65.entry.js → p-b72a46fd.entry.js} +2 -2
- package/dist/rebill-web-components-sdk/rebill-web-components-sdk.esm.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/google-maps.service-CZcMzFBX.js.map +0 -1
- package/dist/components/p-8MtEW13e.js.map +0 -1
- package/dist/esm/google-maps.service-C2nYpE_A.js.map +0 -1
- package/dist/rebill-web-components-sdk/p-C2nYpE_A.js +0 -2
- package/dist/rebill-web-components-sdk/p-C2nYpE_A.js.map +0 -1
- /package/dist/rebill-web-components-sdk/{p-bf15156a.entry.js.map → p-1c1cb576.entry.js.map} +0 -0
- /package/dist/rebill-web-components-sdk/{p-c327a984.entry.js.map → p-247a086e.entry.js.map} +0 -0
- /package/dist/rebill-web-components-sdk/{p-b9a3b27f.entry.js.map → p-43dc2877.entry.js.map} +0 -0
- /package/dist/rebill-web-components-sdk/{p-f3859b65.entry.js.map → p-b72a46fd.entry.js.map} +0 -0
|
@@ -7,7 +7,7 @@ var i18n_service = require('./i18n.service-CcOnATVl.js');
|
|
|
7
7
|
var renewal_store = require('./renewal.store-C-xUKkSJ.js');
|
|
8
8
|
var breakpoint = require('./breakpoint-CWd4pcNv.js');
|
|
9
9
|
var dateFormatter = require('./date-formatter-C0jF31xQ.js');
|
|
10
|
-
var googleMaps_service = require('./google-maps.service-
|
|
10
|
+
var googleMaps_service = require('./google-maps.service-DgIZjibV.js');
|
|
11
11
|
var requiredFieldsMappers = require('./required-fields-mappers-BJ5SWcXv.js');
|
|
12
12
|
var getRequiredFieldsRenewal = require('./getRequiredFieldsRenewal-DF09Fy7a.js');
|
|
13
13
|
require('./_commonjsHelpers-B83fTs8d.js');
|
|
@@ -7,7 +7,7 @@ var paymentErrorMapper = require('./payment-error-mapper-C_VcX_4u.js');
|
|
|
7
7
|
var i18n_service = require('./i18n.service-CcOnATVl.js');
|
|
8
8
|
var statusReqCheckoutApm_enum = require('./status-req-checkout-apm.enum-BcCXZY86.js');
|
|
9
9
|
var breakpoint = require('./breakpoint-CWd4pcNv.js');
|
|
10
|
-
var googleMaps_service = require('./google-maps.service-
|
|
10
|
+
var googleMaps_service = require('./google-maps.service-DgIZjibV.js');
|
|
11
11
|
var requiredFieldsMappers = require('./required-fields-mappers-BJ5SWcXv.js');
|
|
12
12
|
var paymentMethodMapper = require('./payment-method-mapper-B4R05M9E.js');
|
|
13
13
|
require('./_commonjsHelpers-B83fTs8d.js');
|
|
@@ -9,7 +9,7 @@ var statusReqCheckoutApm_enum = require('./status-req-checkout-apm.enum-BcCXZY86
|
|
|
9
9
|
var renewal_store = require('./renewal.store-C-xUKkSJ.js');
|
|
10
10
|
var breakpoint = require('./breakpoint-CWd4pcNv.js');
|
|
11
11
|
var colorClassMapper = require('./color-class-mapper-Cviu2q1o.js');
|
|
12
|
-
var googleMaps_service = require('./google-maps.service-
|
|
12
|
+
var googleMaps_service = require('./google-maps.service-DgIZjibV.js');
|
|
13
13
|
var requiredFieldsMappers = require('./required-fields-mappers-BJ5SWcXv.js');
|
|
14
14
|
var paymentMethodMapper = require('./payment-method-mapper-B4R05M9E.js');
|
|
15
15
|
var getRequiredFieldsRenewal = require('./getRequiredFieldsRenewal-DF09Fy7a.js');
|
|
@@ -19,17 +19,27 @@ export class GoogleMapsService {
|
|
|
19
19
|
}
|
|
20
20
|
return originalAttachShadow.call(this, init);
|
|
21
21
|
};
|
|
22
|
-
// Interceptar showModal() para evitar
|
|
23
|
-
//
|
|
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
|
-
//
|
|
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 @@ export 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 @@ export 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
|
|
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 @@ export class GoogleMapsService {
|
|
|
459
501
|
font-family: inherit !important;
|
|
460
502
|
}
|
|
461
503
|
|
|
462
|
-
/* FIX mobile:
|
|
463
|
-
|
|
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 @@ export class GoogleMapsService {
|
|
|
469
510
|
top: 0 !important;
|
|
470
511
|
left: 0 !important;
|
|
471
512
|
width: 100% !important;
|
|
472
|
-
height:
|
|
473
|
-
max-height:
|
|
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 @@ export 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
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-maps.service.js","sourceRoot":"","sources":["../../src/utils/google-maps.service.ts"],"names":[],"mappings":"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","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 que Google abra un dialog fullscreen\n // en mobile que cubre toda la pantalla (se promueve al #top-layer del navegador).\n // Usamos .show() en su lugar para que quede en el flujo normal del DOM\n // y podamos estilizarlo con CSS.\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 // Abrir como dialog no-modal → queda en flujo normal, no en #top-layer\n this.show();\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 // 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 font-size: 14px !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: Google abre un dialog fullscreen en viewports chicos.\n Con el patch de showModal→show, el dialog ya no va al #top-layer.\n Lo forzamos a ser inline dentro del contenedor. */\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: auto !important;\n max-height: none !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 /* El backdrop del dialog (si existiera) */\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"]}
|
|
1
|
+
{"version":3,"file":"google-maps.service.js","sourceRoot":"","sources":["../../src/utils/google-maps.service.ts"],"names":[],"mappings":"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","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"]}
|