@hotosm/hanko-auth 0.4.3 → 0.4.5
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/hanko-auth.esm.js +15 -5
- package/dist/hanko-auth.iife.js +9 -9
- package/dist/hanko-auth.umd.js +1 -1
- package/package.json +2 -1
- package/src/hanko-auth.ts +23 -0
- package/src/hanko-i18n-es.ts +2 -0
- package/src/hanko-i18n-fr.ts +2 -0
- package/src/hanko-i18n-pt.ts +2 -0
package/dist/hanko-auth.umd.js
CHANGED
|
@@ -469,7 +469,7 @@
|
|
|
469
469
|
width: 20px;
|
|
470
470
|
height: 20px;
|
|
471
471
|
}
|
|
472
|
-
`;var bo={d:(o,e)=>{for(var t in e)bo.o(e,t)&&!bo.o(o,t)&&Object.defineProperty(o,t,{enumerable:!0,get:e[t]})},o:(o,e)=>Object.prototype.hasOwnProperty.call(o,e)},Li={};bo.d(Li,{en:()=>ms});const ms={headlines:{error:"An error has occurred",loginEmail:"Sign in or create account",loginEmailNoSignup:"Sign in",loginFinished:"Login successful",loginPasscode:"Enter passcode",loginPassword:"Enter password",registerAuthenticator:"Create a passkey",registerConfirm:"Create account?",registerPassword:"Set new password",otpSetUp:"Set up authenticator app",profileEmails:"Emails",profilePassword:"Password",profilePasskeys:"Passkeys",isPrimaryEmail:"Primary email address",setPrimaryEmail:"Set primary email address",createEmail:"Enter a new email",createUsername:"Enter a new username",emailVerified:"Verified",emailUnverified:"Unverified",emailDelete:"Delete",renamePasskey:"Rename passkey",deletePasskey:"Delete passkey",lastUsedAt:"Last used at",createdAt:"Created at",connectedAccounts:"Connected accounts",deleteAccount:"Delete account",accountNotFound:"Account not found",signIn:"Sign in",signUp:"Create account",selectLoginMethod:"Select login method",setupLoginMethod:"Set up login method",lastUsed:"Last seen",ipAddress:"IP address",revokeSession:"Revoke session",profileSessions:"Sessions",mfaSetUp:"Set up MFA",securityKeySetUp:"Add security key",securityKeyLogin:"Security key",otpLogin:"Authentication code",renameSecurityKey:"Rename security key",deleteSecurityKey:"Delete security key",securityKeys:"Security keys",authenticatorApp:"Authenticator app",authenticatorAppAlreadySetUp:"Authenticator app is set up",authenticatorAppNotSetUp:"Set up authenticator app",trustDevice:"Trust this browser?"},texts:{enterPasscode:'Enter the passcode that was sent to "{emailAddress}".',enterPasscodeNoEmail:"Enter the passcode that was sent to your primary email address.",setupPasskey:"Sign in to your account easily and securely with a passkey. Note: Your biometric data is only stored on your devices and will never be shared with anyone.",createAccount:'No account exists for "{emailAddress}". Do you want to create a new account?',otpEnterVerificationCode:"Enter the one-time password (OTP) obtained from your authenticator app below:",otpScanQRCode:"Scan the QR code using your authenticator app (such as Google Authenticator or any other TOTP app). Alternatively, you can manually enter the OTP secret key into the app.",otpSecretKey:"OTP secret key",passwordFormatHint:"Must be between {minLength} and {maxLength} characters long.",securityKeySetUp:"Use a dedicated security key via USB, Bluetooth, or NFC, or your mobile phone. Connect or activate your security key, then click the button below and follow the prompts to complete the registration.",setPrimaryEmail:"Set this email address to be used for contacting you.",isPrimaryEmail:"This email address will be used to contact you if necessary.",emailVerified:"This email address has been verified.",emailUnverified:"This email address has not been verified.",emailDelete:"If you delete this email address, it can no longer be used to sign in.",renamePasskey:"Set a name for the passkey.",deletePasskey:"Delete this passkey from your account.",deleteAccount:"Are you sure you want to delete this account? All data will be deleted immediately and cannot be recovered.",noAccountExists:'No account exists for "{emailAddress}".',selectLoginMethodForFutureLogins:"Select one of the following login methods to use for future logins.",howDoYouWantToLogin:"How do you want to login?",mfaSetUp:"Protect your account with Multi-Factor Authentication (MFA). MFA adds an additional step to your login process, ensuring that even if your password or email account is compromised, your account stays secure.",securityKeyLogin:"Connect or activate your security key, then click the button below. Once ready, use it via USB, NFC, your mobile phone. Follow the prompts to complete the login process.",otpLogin:"Open your authenticator app to obtain the one-time password (OTP). Enter the code in the field below to complete your login.",renameSecurityKey:"Set a name for the security key.",deleteSecurityKey:"Delete this security key from your account.",authenticatorAppAlreadySetUp:"Your account is secured with an authenticator app that generates time-based one-time passwords (TOTP) for multi-factor authentication.",authenticatorAppNotSetUp:"Secure your account with an authenticator app that generates time-based one-time passwords (TOTP) for multi-factor authentication.",trustDevice:"If you trust this browser, you won’t need to enter your OTP (One-Time-Password) or use your security key for multi-factor authentication (MFA) the next time you log in."},labels:{or:"or",no:"no",yes:"yes",email:"Email",continue:"Continue",copied:"copied",skip:"Skip",save:"Save",password:"Password",passkey:"Passkey",passcode:"Passcode",signInPassword:"Sign in with a password",signInPasscode:"Sign in with a passcode",forgotYourPassword:"Forgot your password?",back:"Back",signInPasskey:"Sign in with a passkey",registerAuthenticator:"Create a passkey",signIn:"Sign in",signUp:"Create account",sendNewPasscode:"Send new code",passwordRetryAfter:"Retry in {passwordRetryAfter}",passcodeResendAfter:"Request a new code in {passcodeResendAfter}",unverifiedEmail:"unverified",primaryEmail:"primary",setAsPrimaryEmail:"Set as primary",verify:"Verify",delete:"Delete",newEmailAddress:"New email address",newPassword:"New password",rename:"Rename",newPasskeyName:"New passkey name",addEmail:"Add email",createPasskey:"Create a passkey",webauthnUnsupported:"Passkeys are not supported by your browser",signInWith:"Sign in with {provider}",deleteAccount:"Yes, delete this account.",emailOrUsername:"Email or username",username:"Username",optional:"optional",dontHaveAnAccount:"Don't have an account?",alreadyHaveAnAccount:"Already have an account?",changeUsername:"Change username",setUsername:"Set username",changePassword:"Change password",setPassword:"Set password",revoke:"Revoke",currentSession:"Current session",authenticatorApp:"Authenticator app",securityKey:"Security key",securityKeyUse:"Use security key",newSecurityKeyName:"New security key name",createSecurityKey:"Add a security key",authenticatorAppManage:"Manage authenticator app",authenticatorAppAdd:"Set up",configured:"configured",useAnotherMethod:"Use another method",lastUsed:"Last used",trustDevice:"Trust this browser",staySignedIn:"Stay signed in"},errors:{somethingWentWrong:"A technical error has occurred. Please try again later.",requestTimeout:"The request timed out.",invalidPassword:"Wrong email or password.",invalidPasscode:"The passcode provided was not correct.",passcodeAttemptsReached:"The passcode was entered incorrectly too many times. Please request a new code.",tooManyRequests:"Too many requests have been made. Please wait to repeat the requested operation.",unauthorized:"Your session has expired. Please log in again.",invalidWebauthnCredential:"This passkey cannot be used anymore.",passcodeExpired:"The passcode has expired. Please request a new one.",userVerification:"User verification required. Please ensure your authenticator device is protected with a PIN or biometric.",emailAddressAlreadyExistsError:"The email address already exists.",maxNumOfEmailAddressesReached:"No further email addresses can be added.",thirdPartyAccessDenied:"Access denied. The request was cancelled by the user or the provider has denied access for other reasons.",thirdPartyMultipleAccounts:"Cannot identify account. The email address is used by multiple accounts.",thirdPartyUnverifiedEmail:"Email verification required. Please verify the used email address with your provider.",signupDisabled:"Account registration is disabled.",handlerNotFoundError:"The current step in your process is not supported by this application version. Please try again later or contact support if the issue persists."},flowErrors:{technical_error:"A technical error has occurred. Please try again later.",flow_expired_error:"The session has expired, please click the button to restart.",value_invalid_error:"The entered value is invalid.",passcode_invalid:"The passcode provided was not correct.",passkey_invalid:"This passkey cannot be used anymore",passcode_max_attempts_reached:"The passcode was entered incorrectly too many times. Please request a new code.",rate_limit_exceeded:"Too many requests have been made. Please wait to repeat the requested operation.",unknown_username_error:"The username is unknown.",unknown_email_error:"The email address is unknown.",username_already_exists:"The username is already taken.",invalid_username_error:"The username must contain only letters, numbers, and underscores.",email_already_exists:"The email is already taken.",not_found:"The requested resource was not found.",operation_not_permitted_error:"The operation is not permitted.",flow_discontinuity_error:"The process cannot be continued due to user settings or the provider's configuration.",form_data_invalid_error:"The submitted form data contains errors.",unauthorized:"Your session has expired. Please log in again.",value_missing_error:"The value is missing.",value_too_long_error:"Value is too long.",value_too_short_error:"The value is too short.",webauthn_credential_invalid_mfa_only:"This credential can be used as a second factor security key only.",webauthn_credential_already_exists:"The request either timed out, was canceled or the device is already registered. Please try again or try using another device.",platform_authenticator_required:"Your account is configured to use platform authenticators, but your current device or browser does not support this feature. Please try again with a compatible device or browser."}};var Ti=Li.en;const $i={headlines:{error:"Ha ocurrido un error",loginEmail:"Iniciar sesión o crear cuenta",loginEmailNoSignup:"Iniciar sesión",loginFinished:"Inicio de sesión exitoso",loginPasscode:"Ingrese el código de acceso",loginPassword:"Ingrese la contraseña",registerAuthenticator:"Crear una llave de acceso",registerConfirm:"¿Crear cuenta?",registerPassword:"Establecer nueva contraseña",otpSetUp:"Configurar aplicación de autenticación",profileEmails:"Correos electrónicos",profilePassword:"Contraseña",profilePasskeys:"Llaves de acceso",isPrimaryEmail:"Dirección de correo principal",setPrimaryEmail:"Establecer correo principal",createEmail:"Ingrese un nuevo correo",createUsername:"Ingrese un nuevo nombre de usuario",emailVerified:"Verificado",emailUnverified:"No verificado",emailDelete:"Eliminar",renamePasskey:"Renombrar llave de acceso",deletePasskey:"Eliminar llave de acceso",lastUsedAt:"Último uso",createdAt:"Creado",connectedAccounts:"Cuentas conectadas",deleteAccount:"Eliminar cuenta",accountNotFound:"Cuenta no encontrada",signIn:"Iniciar sesión",signUp:"Crear cuenta",selectLoginMethod:"Seleccionar método de inicio de sesión",setupLoginMethod:"Configurar método de inicio de sesión",lastUsed:"Visto por última vez",ipAddress:"Dirección IP",revokeSession:"Revocar sesión",profileSessions:"Sesiones",mfaSetUp:"Configurar MFA",securityKeySetUp:"Agregar clave de seguridad",securityKeyLogin:"Clave de seguridad",otpLogin:"Código de autenticación",renameSecurityKey:"Renombrar clave de seguridad",deleteSecurityKey:"Eliminar clave de seguridad",securityKeys:"Claves de seguridad",authenticatorApp:"Aplicación de autenticación",authenticatorAppAlreadySetUp:"La aplicación de autenticación está configurada",authenticatorAppNotSetUp:"Configurar aplicación de autenticación",trustDevice:"¿Confiar en este navegador?"},texts:{enterPasscode:'Ingrese el código que se envió a "{emailAddress}".',enterPasscodeNoEmail:"Ingrese el código que se envió a su dirección de correo principal.",setupPasskey:"Inicie sesión en su cuenta fácil y seguramente con una llave de acceso. Nota: Sus datos biométricos solo se almacenan en sus dispositivos y nunca se compartirán con nadie.",createAccount:'No existe una cuenta para "{emailAddress}". ¿Desea crear una nueva cuenta?',otpEnterVerificationCode:"Ingrese la contraseña de un solo uso (OTP) obtenida de su aplicación de autenticación a continuación:",otpScanQRCode:"Escanee el código QR usando su aplicación de autenticación (como Google Authenticator o cualquier otra aplicación TOTP). Alternativamente, puede ingresar manualmente la clave secreta OTP en la aplicación.",otpSecretKey:"Clave secreta OTP",passwordFormatHint:"Debe tener entre {minLength} y {maxLength} caracteres.",securityKeySetUp:"Use una clave de seguridad dedicada a través de USB, Bluetooth o NFC, o su teléfono móvil. Conecte o active su clave de seguridad, luego haga clic en el botón a continuación y siga las indicaciones para completar el registro.",setPrimaryEmail:"Establezca esta dirección de correo para ser usada para contactarlo.",isPrimaryEmail:"Esta dirección de correo se utilizará para contactarlo si es necesario.",emailVerified:"Esta dirección de correo ha sido verificada.",emailUnverified:"Esta dirección de correo no ha sido verificada.",emailDelete:"Si elimina esta dirección de correo, ya no podrá usarla para iniciar sesión.",renamePasskey:"Establecer un nombre para la llave de acceso.",deletePasskey:"Eliminar esta llave de acceso de su cuenta.",deleteAccount:"¿Está seguro de que desea eliminar esta cuenta? Todos los datos se eliminarán inmediatamente y no se podrán recuperar.",noAccountExists:'No existe una cuenta para "{emailAddress}".',selectLoginMethodForFutureLogins:"Seleccione uno de los siguientes métodos de inicio de sesión para usar en futuros inicios de sesión.",howDoYouWantToLogin:"¿Cómo desea iniciar sesión?",mfaSetUp:"Proteja su cuenta con autenticación multifactor (MFA). MFA agrega un paso adicional a su proceso de inicio de sesión, asegurando que incluso si su contraseña o cuenta de correo está comprometida, su cuenta permanezca segura.",securityKeyLogin:"Conecte o active su clave de seguridad, luego haga clic en el botón a continuación. Una vez listo, úselo a través de USB, NFC o su teléfono móvil. Siga las indicaciones para completar el proceso de inicio de sesión.",otpLogin:"Abra su aplicación de autenticación para obtener la contraseña de un solo uso (OTP). Ingrese el código en el campo a continuación para completar su inicio de sesión.",renameSecurityKey:"Establecer un nombre para la clave de seguridad.",deleteSecurityKey:"Eliminar esta clave de seguridad de su cuenta.",authenticatorAppAlreadySetUp:"Su cuenta está protegida con una aplicación de autenticación que genera contraseñas de un solo uso basadas en tiempo (TOTP) para autenticación multifactor.",authenticatorAppNotSetUp:"Proteja su cuenta con una aplicación de autenticación que genera contraseñas de un solo uso basadas en tiempo (TOTP) para autenticación multifactor.",trustDevice:"Si confía en este navegador, no necesitará ingresar su OTP (contraseña de un solo uso) o usar su clave de seguridad para la autenticación multifactor (MFA) la próxima vez que inicie sesión."},labels:{or:"o",no:"no",yes:"sí",email:"Correo electrónico",continue:"Continuar",copied:"copiado",skip:"Omitir",save:"Guardar",password:"Contraseña",passkey:"Llave de acceso",passcode:"Código de acceso",signInPassword:"Iniciar sesión con contraseña",signInPasscode:"Iniciar sesión con código",forgotYourPassword:"¿Olvidó su contraseña?",back:"Atrás",signInPasskey:"Iniciar sesión con llave de acceso",registerAuthenticator:"Crear una llave de acceso",signIn:"Iniciar sesión",signUp:"Crear cuenta",sendNewPasscode:"Enviar nuevo código",passwordRetryAfter:"Reintentar en {passwordRetryAfter}",passcodeResendAfter:"Solicitar nuevo código en {passcodeResendAfter}",unverifiedEmail:"no verificado",primaryEmail:"principal",setAsPrimaryEmail:"Establecer como principal",verify:"Verificar",delete:"Eliminar",newEmailAddress:"Nueva dirección de correo",newPassword:"Nueva contraseña",rename:"Renombrar",newPasskeyName:"Nuevo nombre de llave de acceso",addEmail:"Agregar correo",createPasskey:"Crear una llave de acceso",webauthnUnsupported:"Las llaves de acceso no son compatibles con su navegador",signInWith:"Iniciar sesión con {provider}",deleteAccount:"Sí, eliminar esta cuenta.",emailOrUsername:"Correo o nombre de usuario",username:"Nombre de usuario",optional:"opcional",dontHaveAnAccount:"¿No tiene una cuenta?",alreadyHaveAnAccount:"¿Ya tiene una cuenta?",changeUsername:"Cambiar nombre de usuario",setUsername:"Establecer nombre de usuario",changePassword:"Cambiar contraseña",setPassword:"Establecer contraseña",revoke:"Revocar",currentSession:"Sesión actual",authenticatorApp:"Aplicación de autenticación",securityKey:"Clave de seguridad",securityKeyUse:"Usar clave de seguridad",newSecurityKeyName:"Nuevo nombre de clave de seguridad",createSecurityKey:"Agregar una clave de seguridad",authenticatorAppManage:"Administrar aplicación de autenticación",authenticatorAppAdd:"Configurar",configured:"configurado",useAnotherMethod:"Usar otro método",lastUsed:"Último uso",trustDevice:"Confiar en este navegador",staySignedIn:"Mantener sesión iniciada"},errors:{somethingWentWrong:"Ha ocurrido un error técnico. Por favor, inténtelo de nuevo más tarde.",requestTimeout:"La solicitud ha expirado.",invalidPassword:"Correo o contraseña incorrectos.",invalidPasscode:"El código proporcionado no es correcto.",passcodeAttemptsReached:"El código se ha ingresado incorrectamente demasiadas veces. Por favor, solicite un nuevo código.",tooManyRequests:"Se han realizado demasiadas solicitudes. Por favor, espere para repetir la operación solicitada.",unauthorized:"Su sesión ha expirado. Por favor, inicie sesión nuevamente.",invalidWebauthnCredential:"Esta llave de acceso ya no se puede usar.",passcodeExpired:"El código ha expirado. Por favor, solicite uno nuevo.",userVerification:"Se requiere verificación de usuario. Asegúrese de que su dispositivo de autenticación esté protegido con un PIN o biometría.",emailAddressAlreadyExistsError:"La dirección de correo ya existe.",maxNumOfEmailAddressesReached:"No se pueden agregar más direcciones de correo.",thirdPartyAccessDenied:"Acceso denegado. La solicitud fue cancelada por el usuario o el proveedor ha denegado el acceso por otras razones.",thirdPartyMultipleAccounts:"No se puede identificar la cuenta. La dirección de correo es usada por múltiples cuentas.",thirdPartyUnverifiedEmail:"Se requiere verificación de correo. Por favor, verifique la dirección de correo usada con su proveedor.",signupDisabled:"El registro de cuentas está deshabilitado.",handlerNotFoundError:"El paso actual en su proceso no es compatible con esta versión de la aplicación. Inténtelo de nuevo más tarde o contacte al soporte si el problema persiste."},flowErrors:{technical_error:"Ha ocurrido un error técnico. Por favor, inténtelo de nuevo más tarde.",flow_expired_error:"La sesión ha expirado, haga clic en el botón para reiniciar.",value_invalid_error:"El valor ingresado no es válido.",passcode_invalid:"El código proporcionado no es correcto.",passkey_invalid:"Esta llave de acceso ya no se puede usar.",passcode_max_attempts_reached:"El código se ha ingresado incorrectamente demasiadas veces. Por favor, solicite un nuevo código.",rate_limit_exceeded:"Se han realizado demasiadas solicitudes. Por favor, espere para repetir la operación solicitada.",unknown_username_error:"El nombre de usuario es desconocido.",unknown_email_error:"La dirección de correo es desconocida.",username_already_exists:"El nombre de usuario ya está en uso.",invalid_username_error:"El nombre de usuario solo debe contener letras, números y guiones bajos.",email_already_exists:"El correo ya está en uso.",not_found:"No se encontró el recurso solicitado.",operation_not_permitted_error:"La operación no está permitida.",flow_discontinuity_error:"El proceso no se puede continuar debido a la configuración del usuario o del proveedor.",form_data_invalid_error:"Los datos del formulario enviados contienen errores.",unauthorized:"Su sesión ha expirado. Por favor, inicie sesión nuevamente.",value_missing_error:"Falta el valor.",value_too_long_error:"El valor es demasiado largo.",value_too_short_error:"El valor es demasiado corto.",webauthn_credential_invalid_mfa_only:"Esta credencial solo se puede usar como clave de seguridad de segundo factor.",webauthn_credential_already_exists:"La solicitud expiró, se canceló o el dispositivo ya está registrado. Inténtelo de nuevo o intente usar otro dispositivo.",platform_authenticator_required:"Su cuenta está configurada para usar autenticadores de plataforma, pero su dispositivo o navegador actual no admite esta función. Inténtelo de nuevo con un dispositivo o navegador compatible."}},Ui={headlines:{error:"Une erreur s'est produite",loginEmail:"Se connecter ou créer un compte",loginEmailNoSignup:"Se connecter",loginFinished:"Connexion réussie",loginPasscode:"Entrez le code d'accès",loginPassword:"Entrez le mot de passe",registerAuthenticator:"Créer une clé d'accès",registerConfirm:"Créer un compte ?",registerPassword:"Définir un nouveau mot de passe",otpSetUp:"Configurer l'application d'authentification",profileEmails:"Adresses e-mail",profilePassword:"Mot de passe",profilePasskeys:"Clés d'accès",isPrimaryEmail:"Adresse e-mail principale",setPrimaryEmail:"Définir comme e-mail principal",createEmail:"Entrez un nouvel e-mail",createUsername:"Entrez un nouveau nom d'utilisateur",emailVerified:"Vérifié",emailUnverified:"Non vérifié",emailDelete:"Supprimer",renamePasskey:"Renommer la clé d'accès",deletePasskey:"Supprimer la clé d'accès",lastUsedAt:"Dernière utilisation",createdAt:"Créé",connectedAccounts:"Comptes connectés",deleteAccount:"Supprimer le compte",accountNotFound:"Compte introuvable",signIn:"Se connecter",signUp:"Créer un compte",selectLoginMethod:"Sélectionner la méthode de connexion",setupLoginMethod:"Configurer la méthode de connexion",lastUsed:"Vu pour la dernière fois",ipAddress:"Adresse IP",revokeSession:"Révoquer la session",profileSessions:"Sessions",mfaSetUp:"Configurer MFA",securityKeySetUp:"Ajouter une clé de sécurité",securityKeyLogin:"Clé de sécurité",otpLogin:"Code d'authentification",renameSecurityKey:"Renommer la clé de sécurité",deleteSecurityKey:"Supprimer la clé de sécurité",securityKeys:"Clés de sécurité",authenticatorApp:"Application d'authentification",authenticatorAppAlreadySetUp:"L'application d'authentification est configurée",authenticatorAppNotSetUp:"Configurer l'application d'authentification",trustDevice:"Faire confiance à ce navigateur ?"},texts:{enterPasscode:'Entrez le code envoyé à "{emailAddress}".',enterPasscodeNoEmail:"Entrez le code envoyé à votre adresse e-mail principale.",setupPasskey:"Connectez-vous à votre compte facilement et en toute sécurité avec une clé d'accès. Remarque : Vos données biométriques ne sont stockées que sur vos appareils et ne seront jamais partagées avec personne.",createAccount:`Aucun compte n'existe pour "{emailAddress}". Souhaitez-vous créer un nouveau compte ?`,otpEnterVerificationCode:"Entrez le mot de passe à usage unique (OTP) obtenu depuis votre application d'authentification ci-dessous :",otpScanQRCode:"Scannez le code QR avec votre application d'authentification (comme Google Authenticator ou toute autre application TOTP). Vous pouvez également saisir manuellement la clé secrète OTP dans l'application.",otpSecretKey:"Clé secrète OTP",passwordFormatHint:"Doit contenir entre {minLength} et {maxLength} caractères.",securityKeySetUp:"Utilisez une clé de sécurité dédiée via USB, Bluetooth ou NFC, ou votre téléphone mobile. Connectez ou activez votre clé de sécurité, puis cliquez sur le bouton ci-dessous et suivez les instructions pour terminer l'inscription.",setPrimaryEmail:"Définir cette adresse e-mail pour être utilisée pour vous contacter.",isPrimaryEmail:"Cette adresse e-mail sera utilisée pour vous contacter si nécessaire.",emailVerified:"Cette adresse e-mail a été vérifiée.",emailUnverified:"Cette adresse e-mail n'a pas été vérifiée.",emailDelete:"Si vous supprimez cette adresse e-mail, vous ne pourrez plus l'utiliser pour vous connecter.",renamePasskey:"Définir un nom pour la clé d'accès.",deletePasskey:"Supprimer cette clé d'accès de votre compte.",deleteAccount:"Êtes-vous sûr de vouloir supprimer ce compte ? Toutes les données seront supprimées immédiatement et ne pourront pas être récupérées.",noAccountExists:`Aucun compte n'existe pour "{emailAddress}".`,selectLoginMethodForFutureLogins:"Sélectionnez l'une des méthodes de connexion suivantes à utiliser pour les futures connexions.",howDoYouWantToLogin:"Comment souhaitez-vous vous connecter ?",mfaSetUp:"Protégez votre compte avec l'authentification multifacteur (MFA). MFA ajoute une étape supplémentaire à votre processus de connexion, garantissant que même si votre mot de passe ou compte e-mail est compromis, votre compte reste sécurisé.",securityKeyLogin:"Connectez ou activez votre clé de sécurité, puis cliquez sur le bouton ci-dessous. Une fois prêt, utilisez-la via USB, NFC ou votre téléphone mobile. Suivez les instructions pour terminer le processus de connexion.",otpLogin:"Ouvrez votre application d'authentification pour obtenir le mot de passe à usage unique (OTP). Entrez le code dans le champ ci-dessous pour terminer votre connexion.",renameSecurityKey:"Définir un nom pour la clé de sécurité.",deleteSecurityKey:"Supprimer cette clé de sécurité de votre compte.",authenticatorAppAlreadySetUp:"Votre compte est protégé par une application d'authentification qui génère des mots de passe à usage unique basés sur le temps (TOTP) pour l'authentification multifacteur.",authenticatorAppNotSetUp:"Protégez votre compte avec une application d'authentification qui génère des mots de passe à usage unique basés sur le temps (TOTP) pour l'authentification multifacteur.",trustDevice:"Si vous faites confiance à ce navigateur, vous n'aurez pas besoin de saisir votre OTP (mot de passe à usage unique) ou d'utiliser votre clé de sécurité pour l'authentification multifacteur (MFA) la prochaine fois que vous vous connecterez."},labels:{or:"ou",no:"non",yes:"oui",email:"E-mail",continue:"Continuer",copied:"copié",skip:"Ignorer",save:"Enregistrer",password:"Mot de passe",passkey:"Clé d'accès",passcode:"Code d'accès",signInPassword:"Se connecter avec mot de passe",signInPasscode:"Se connecter avec code",forgotYourPassword:"Mot de passe oublié ?",back:"Retour",signInPasskey:"Se connecter avec clé d'accès",registerAuthenticator:"Créer une clé d'accès",signIn:"Se connecter",signUp:"Créer un compte",sendNewPasscode:"Envoyer un nouveau code",passwordRetryAfter:"Réessayer dans {passwordRetryAfter}",passcodeResendAfter:"Demander un nouveau code dans {passcodeResendAfter}",unverifiedEmail:"non vérifié",primaryEmail:"principal",setAsPrimaryEmail:"Définir comme principal",verify:"Vérifier",delete:"Supprimer",newEmailAddress:"Nouvelle adresse e-mail",newPassword:"Nouveau mot de passe",rename:"Renommer",newPasskeyName:"Nouveau nom de clé d'accès",addEmail:"Ajouter un e-mail",createPasskey:"Créer une clé d'accès",webauthnUnsupported:"Les clés d'accès ne sont pas compatibles avec votre navigateur",signInWith:"Se connecter avec {provider}",deleteAccount:"Oui, supprimer ce compte.",emailOrUsername:"E-mail ou nom d'utilisateur",username:"Nom d'utilisateur",optional:"optionnel",dontHaveAnAccount:"Vous n'avez pas de compte ?",alreadyHaveAnAccount:"Vous avez déjà un compte ?",changeUsername:"Changer le nom d'utilisateur",setUsername:"Définir le nom d'utilisateur",changePassword:"Changer le mot de passe",setPassword:"Définir le mot de passe",revoke:"Révoquer",currentSession:"Session actuelle",authenticatorApp:"Application d'authentification",securityKey:"Clé de sécurité",securityKeyUse:"Utiliser la clé de sécurité",newSecurityKeyName:"Nouveau nom de clé de sécurité",createSecurityKey:"Ajouter une clé de sécurité",authenticatorAppManage:"Gérer l'application d'authentification",authenticatorAppAdd:"Configurer",configured:"configuré",useAnotherMethod:"Utiliser une autre méthode",lastUsed:"Dernière utilisation",trustDevice:"Faire confiance à ce navigateur",staySignedIn:"Rester connecté"},errors:{somethingWentWrong:"Une erreur technique s'est produite. Veuillez réessayer plus tard.",requestTimeout:"La demande a expiré.",invalidPassword:"E-mail ou mot de passe incorrect.",invalidPasscode:"Le code fourni n'est pas correct.",passcodeAttemptsReached:"Le code a été saisi incorrectement trop de fois. Veuillez demander un nouveau code.",tooManyRequests:"Trop de demandes ont été effectuées. Veuillez attendre avant de répéter l'opération demandée.",unauthorized:"Votre session a expiré. Veuillez vous reconnecter.",invalidWebauthnCredential:"Cette clé d'accès ne peut plus être utilisée.",passcodeExpired:"Le code a expiré. Veuillez en demander un nouveau.",userVerification:"Une vérification de l'utilisateur est requise. Assurez-vous que votre dispositif d'authentification est protégé par un code PIN ou une biométrie.",emailAddressAlreadyExistsError:"L'adresse e-mail existe déjà.",maxNumOfEmailAddressesReached:"Impossible d'ajouter plus d'adresses e-mail.",thirdPartyAccessDenied:"Accès refusé. La demande a été annulée par l'utilisateur ou le fournisseur a refusé l'accès pour d'autres raisons.",thirdPartyMultipleAccounts:"Impossible d'identifier le compte. L'adresse e-mail est utilisée par plusieurs comptes.",thirdPartyUnverifiedEmail:"Une vérification de l'e-mail est requise. Veuillez vérifier l'adresse e-mail utilisée avec votre fournisseur.",signupDisabled:"L'inscription de comptes est désactivée.",handlerNotFoundError:"L'étape actuelle de votre processus n'est pas compatible avec cette version de l'application. Réessayez plus tard ou contactez le support si le problème persiste."},flowErrors:{technical_error:"Une erreur technique s'est produite. Veuillez réessayer plus tard.",flow_expired_error:"La session a expiré, cliquez sur le bouton pour redémarrer.",value_invalid_error:"La valeur saisie n'est pas valide.",passcode_invalid:"Le code fourni n'est pas correct.",passkey_invalid:"Cette clé d'accès ne peut plus être utilisée.",passcode_max_attempts_reached:"Le code a été saisi incorrectement trop de fois. Veuillez demander un nouveau code.",rate_limit_exceeded:"Trop de demandes ont été effectuées. Veuillez attendre avant de répéter l'opération demandée.",unknown_username_error:"Le nom d'utilisateur est inconnu.",unknown_email_error:"L'adresse e-mail est inconnue.",username_already_exists:"Le nom d'utilisateur est déjà utilisé.",invalid_username_error:"Le nom d'utilisateur ne doit contenir que des lettres, des chiffres et des traits de soulignement.",email_already_exists:"L'e-mail est déjà utilisé.",not_found:"La ressource demandée n'a pas été trouvée.",operation_not_permitted_error:"L'opération n'est pas autorisée.",flow_discontinuity_error:"Le processus ne peut pas continuer en raison de la configuration de l'utilisateur ou du fournisseur.",form_data_invalid_error:"Les données du formulaire soumises contiennent des erreurs.",unauthorized:"Votre session a expiré. Veuillez vous reconnecter.",value_missing_error:"La valeur est manquante.",value_too_long_error:"La valeur est trop longue.",value_too_short_error:"La valeur est trop courte.",webauthn_credential_invalid_mfa_only:"Cette credential ne peut être utilisée que comme clé de sécurité de second facteur.",webauthn_credential_already_exists:"La demande a expiré, a été annulée ou l'appareil est déjà enregistré. Réessayez ou essayez d'utiliser un autre appareil.",platform_authenticator_required:"Votre compte est configuré pour utiliser des authentificateurs de plateforme, mais votre appareil ou navigateur actuel ne prend pas en charge cette fonctionnalité. Réessayez avec un appareil ou navigateur compatible."}},Ni={headlines:{error:"Ocorreu um erro",loginEmail:"Entrar ou criar conta",loginEmailNoSignup:"Entrar",loginFinished:"Login bem-sucedido",loginPasscode:"Digite o código de acesso",loginPassword:"Digite a senha",registerAuthenticator:"Criar uma chave de acesso",registerConfirm:"Criar conta?",registerPassword:"Definir nova senha",otpSetUp:"Configurar aplicativo de autenticação",profileEmails:"Endereços de e-mail",profilePassword:"Senha",profilePasskeys:"Chaves de acesso",isPrimaryEmail:"Endereço de e-mail principal",setPrimaryEmail:"Definir e-mail principal",createEmail:"Digite um novo e-mail",createUsername:"Digite um novo nome de usuário",emailVerified:"Verificado",emailUnverified:"Não verificado",emailDelete:"Excluir",renamePasskey:"Renomear chave de acesso",deletePasskey:"Excluir chave de acesso",lastUsedAt:"Último uso",createdAt:"Criado",connectedAccounts:"Contas conectadas",deleteAccount:"Excluir conta",accountNotFound:"Conta não encontrada",signIn:"Entrar",signUp:"Criar conta",selectLoginMethod:"Selecionar método de login",setupLoginMethod:"Configurar método de login",lastUsed:"Visto pela última vez",ipAddress:"Endereço IP",revokeSession:"Revogar sessão",profileSessions:"Sessões",mfaSetUp:"Configurar MFA",securityKeySetUp:"Adicionar chave de segurança",securityKeyLogin:"Chave de segurança",otpLogin:"Código de autenticação",renameSecurityKey:"Renomear chave de segurança",deleteSecurityKey:"Excluir chave de segurança",securityKeys:"Chaves de segurança",authenticatorApp:"Aplicativo de autenticação",authenticatorAppAlreadySetUp:"O aplicativo de autenticação está configurado",authenticatorAppNotSetUp:"Configurar aplicativo de autenticação",trustDevice:"Confiar neste navegador?"},texts:{enterPasscode:'Digite o código enviado para "{emailAddress}".',enterPasscodeNoEmail:"Digite o código enviado para seu endereço de e-mail principal.",setupPasskey:"Faça login na sua conta de forma fácil e segura com uma chave de acesso. Nota: Seus dados biométricos são armazenados apenas em seus dispositivos e nunca serão compartilhados com ninguém.",createAccount:'Não existe uma conta para "{emailAddress}". Deseja criar uma nova conta?',otpEnterVerificationCode:"Digite a senha de uso único (OTP) obtida do seu aplicativo de autenticação abaixo:",otpScanQRCode:"Digitalize o código QR usando seu aplicativo de autenticação (como Google Authenticator ou qualquer outro aplicativo TOTP). Alternativamente, você pode inserir manualmente a chave secreta OTP no aplicativo.",otpSecretKey:"Chave secreta OTP",passwordFormatHint:"Deve ter entre {minLength} e {maxLength} caracteres.",securityKeySetUp:"Use uma chave de segurança dedicada via USB, Bluetooth ou NFC, ou seu telefone celular. Conecte ou ative sua chave de segurança, depois clique no botão abaixo e siga as instruções para concluir o registro.",setPrimaryEmail:"Defina este endereço de e-mail para ser usado para entrar em contato com você.",isPrimaryEmail:"Este endereço de e-mail será usado para entrar em contato com você, se necessário.",emailVerified:"Este endereço de e-mail foi verificado.",emailUnverified:"Este endereço de e-mail não foi verificado.",emailDelete:"Se você excluir este endereço de e-mail, não poderá mais usá-lo para fazer login.",renamePasskey:"Definir um nome para a chave de acesso.",deletePasskey:"Excluir esta chave de acesso da sua conta.",deleteAccount:"Tem certeza de que deseja excluir esta conta? Todos os dados serão excluídos imediatamente e não poderão ser recuperados.",noAccountExists:'Não existe uma conta para "{emailAddress}".',selectLoginMethodForFutureLogins:"Selecione um dos seguintes métodos de login para usar em futuros logins.",howDoYouWantToLogin:"Como você deseja fazer login?",mfaSetUp:"Proteja sua conta com autenticação multifator (MFA). MFA adiciona uma etapa extra ao seu processo de login, garantindo que, mesmo se sua senha ou conta de e-mail for comprometida, sua conta permaneça segura.",securityKeyLogin:"Conecte ou ative sua chave de segurança, depois clique no botão abaixo. Uma vez pronto, use-a via USB, NFC ou seu telefone celular. Siga as instruções para concluir o processo de login.",otpLogin:"Abra seu aplicativo de autenticação para obter a senha de uso único (OTP). Digite o código no campo abaixo para concluir seu login.",renameSecurityKey:"Definir um nome para a chave de segurança.",deleteSecurityKey:"Excluir esta chave de segurança da sua conta.",authenticatorAppAlreadySetUp:"Sua conta está protegida com um aplicativo de autenticação que gera senhas de uso único baseadas em tempo (TOTP) para autenticação multifator.",authenticatorAppNotSetUp:"Proteja sua conta com um aplicativo de autenticação que gera senhas de uso único baseadas em tempo (TOTP) para autenticação multifator.",trustDevice:"Se você confiar neste navegador, não precisará inserir seu OTP (senha de uso único) ou usar sua chave de segurança para autenticação multifator (MFA) na próxima vez que fizer login."},labels:{or:"ou",no:"não",yes:"sim",email:"E-mail",continue:"Continuar",copied:"copiado",skip:"Pular",save:"Salvar",password:"Senha",passkey:"Chave de acesso",passcode:"Código de acesso",signInPassword:"Entrar com senha",signInPasscode:"Entrar com código",forgotYourPassword:"Esqueceu sua senha?",back:"Voltar",signInPasskey:"Entrar com chave de acesso",registerAuthenticator:"Criar uma chave de acesso",signIn:"Entrar",signUp:"Criar conta",sendNewPasscode:"Enviar novo código",passwordRetryAfter:"Tentar novamente em {passwordRetryAfter}",passcodeResendAfter:"Solicitar novo código em {passcodeResendAfter}",unverifiedEmail:"não verificado",primaryEmail:"principal",setAsPrimaryEmail:"Definir como principal",verify:"Verificar",delete:"Excluir",newEmailAddress:"Novo endereço de e-mail",newPassword:"Nova senha",rename:"Renomear",newPasskeyName:"Novo nome de chave de acesso",addEmail:"Adicionar e-mail",createPasskey:"Criar uma chave de acesso",webauthnUnsupported:"As chaves de acesso não são compatíveis com seu navegador",signInWith:"Entrar com {provider}",deleteAccount:"Sim, excluir esta conta.",emailOrUsername:"E-mail ou nome de usuário",username:"Nome de usuário",optional:"opcional",dontHaveAnAccount:"Não tem uma conta?",alreadyHaveAnAccount:"Já tem uma conta?",changeUsername:"Alterar nome de usuário",setUsername:"Definir nome de usuário",changePassword:"Alterar senha",setPassword:"Definir senha",revoke:"Revogar",currentSession:"Sessão atual",authenticatorApp:"Aplicativo de autenticação",securityKey:"Chave de segurança",securityKeyUse:"Usar chave de segurança",newSecurityKeyName:"Novo nome de chave de segurança",createSecurityKey:"Adicionar uma chave de segurança",authenticatorAppManage:"Gerenciar aplicativo de autenticação",authenticatorAppAdd:"Configurar",configured:"configurado",useAnotherMethod:"Usar outro método",lastUsed:"Último uso",trustDevice:"Confiar neste navegador",staySignedIn:"Permanecer conectado"},errors:{somethingWentWrong:"Ocorreu um erro técnico. Por favor, tente novamente mais tarde.",requestTimeout:"A solicitação expirou.",invalidPassword:"E-mail ou senha incorretos.",invalidPasscode:"O código fornecido não está correto.",passcodeAttemptsReached:"O código foi inserido incorretamente muitas vezes. Por favor, solicite um novo código.",tooManyRequests:"Muitas solicitações foram feitas. Por favor, aguarde antes de repetir a operação solicitada.",unauthorized:"Sua sessão expirou. Por favor, faça login novamente.",invalidWebauthnCredential:"Esta chave de acesso não pode mais ser usada.",passcodeExpired:"O código expirou. Por favor, solicite um novo.",userVerification:"É necessária verificação do usuário. Certifique-se de que seu dispositivo de autenticação esteja protegido com um PIN ou biometria.",emailAddressAlreadyExistsError:"O endereço de e-mail já existe.",maxNumOfEmailAddressesReached:"Não é possível adicionar mais endereços de e-mail.",thirdPartyAccessDenied:"Acesso negado. A solicitação foi cancelada pelo usuário ou o provedor negou o acesso por outros motivos.",thirdPartyMultipleAccounts:"Não é possível identificar a conta. O endereço de e-mail é usado por várias contas.",thirdPartyUnverifiedEmail:"É necessária verificação de e-mail. Por favor, verifique o endereço de e-mail usado com seu provedor.",signupDisabled:"O registro de contas está desativado.",handlerNotFoundError:"A etapa atual em seu processo não é compatível com esta versão do aplicativo. Tente novamente mais tarde ou entre em contato com o suporte se o problema persistir."},flowErrors:{technical_error:"Ocorreu um erro técnico. Por favor, tente novamente mais tarde.",flow_expired_error:"A sessão expirou, clique no botão para reiniciar.",value_invalid_error:"O valor inserido não é válido.",passcode_invalid:"O código fornecido não está correto.",passkey_invalid:"Esta chave de acesso não pode mais ser usada.",passcode_max_attempts_reached:"O código foi inserido incorretamente muitas vezes. Por favor, solicite um novo código.",rate_limit_exceeded:"Muitas solicitações foram feitas. Por favor, aguarde antes de repetir a operação solicitada.",unknown_username_error:"O nome de usuário é desconhecido.",unknown_email_error:"O endereço de e-mail é desconhecido.",username_already_exists:"O nome de usuário já está em uso.",invalid_username_error:"O nome de usuário deve conter apenas letras, números e sublinhados.",email_already_exists:"O e-mail já está em uso.",not_found:"O recurso solicitado não foi encontrado.",operation_not_permitted_error:"A operação não é permitida.",flow_discontinuity_error:"O processo não pode continuar devido à configuração do usuário ou do provedor.",form_data_invalid_error:"Os dados do formulário enviados contêm erros.",unauthorized:"Sua sessão expirou. Por favor, faça login novamente.",value_missing_error:"O valor está faltando.",value_too_long_error:"O valor é muito longo.",value_too_short_error:"O valor é muito curto.",webauthn_credential_invalid_mfa_only:"Esta credencial só pode ser usada como chave de segurança de segundo fator.",webauthn_credential_already_exists:"A solicitação expirou, foi cancelada ou o dispositivo já está registrado. Tente novamente ou tente usar outro dispositivo.",platform_authenticator_required:"Sua conta está configurada para usar autenticadores de plataforma, mas seu dispositivo ou navegador atual não suporta esse recurso. Tente novamente com um dispositivo ou navegador compatível."}},ko={en:{logIn:"Log in",logOut:"Log Out",myHotAccount:"My HOT Account",connectToOsm:"Connect to OSM",connectedToOsm:"Connected to OSM",connectedToOpenStreetMap:"Connected to OpenStreetMap",connectingToOpenStreetMap:"Connecting to OpenStreetMap...",checkingOsmConnection:"Checking OSM connection...",osmRequired:"OSM Required",osmRequiredText:"This endpoint requires OSM connection.",connectOsmAccount:"Connect OSM Account",openAccountMenu:"Open account menu",connectedToOsmAs:"Connected to OSM as",osmConnectionRequired:"OSM connection required"},es:{logIn:"Iniciar sesión",logOut:"Cerrar sesión",myHotAccount:"Mi cuenta HOT",connectToOsm:"Conectar a OSM",connectedToOsm:"Conectado a OSM",connectedToOpenStreetMap:"Conectado a OpenStreetMap",connectingToOpenStreetMap:"Conectando a OpenStreetMap...",checkingOsmConnection:"Verificando conexión OSM...",osmRequired:"OSM Requerido",osmRequiredText:"Este endpoint requiere conexión OSM.",connectOsmAccount:"Conectar cuenta OSM",openAccountMenu:"Abrir menú de cuenta",connectedToOsmAs:"Conectado a OSM como",osmConnectionRequired:"Se requiere conexión OSM"},fr:{logIn:"Se connecter",logOut:"Se déconnecter",myHotAccount:"Mon compte HOT",connectToOsm:"Connecter à OSM",connectedToOsm:"Connecté à OSM",connectedToOpenStreetMap:"Connecté à OpenStreetMap",connectingToOpenStreetMap:"Connexion à OpenStreetMap...",checkingOsmConnection:"Vérification de la connexion OSM...",osmRequired:"OSM requis",osmRequiredText:"Ce point de terminaison nécessite une connexion OSM.",connectOsmAccount:"Connecter le compte OSM",openAccountMenu:"Ouvrir le menu du compte",connectedToOsmAs:"Connecté à OSM en tant que",osmConnectionRequired:"Connexion OSM requise"},pt:{logIn:"Entrar",logOut:"Sair",myHotAccount:"Minha conta HOT",connectToOsm:"Conectar ao OSM",connectedToOsm:"Conectado ao OSM",connectedToOpenStreetMap:"Conectado ao OpenStreetMap",connectingToOpenStreetMap:"Conectando ao OpenStreetMap...",checkingOsmConnection:"Verificando conexão OSM...",osmRequired:"OSM Necessário",osmRequiredText:"Este endpoint requer conexão OSM.",connectOsmAccount:"Conectar conta OSM",openAccountMenu:"Abrir menu da conta",connectedToOsmAs:"Conectado ao OSM como",osmConnectionRequired:"Conexão OSM necessária"}},fs="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20fill='currentColor'%20class='bi%20bi-person-vcard'%20viewBox='0%200%2016%2016'%3e%3cpath%20d='M5%208a2%202%200%201%200%200-4%202%202%200%200%200%200%204m4-2.5a.5.5%200%200%201%20.5-.5h4a.5.5%200%200%201%200%201h-4a.5.5%200%200%201-.5-.5M9%208a.5.5%200%200%201%20.5-.5h4a.5.5%200%200%201%200%201h-4A.5.5%200%200%201%209%208m1%202.5a.5.5%200%200%201%20.5-.5h3a.5.5%200%200%201%200%201h-3a.5.5%200%200%201-.5-.5'/%3e%3cpath%20d='M2%202a2%202%200%200%200-2%202v8a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2V4a2%202%200%200%200-2-2zM1%204a1%201%200%200%201%201-1h12a1%201%200%200%201%201%201v8a1%201%200%200%201-1%201H8.96q.04-.245.04-.5C9%2010.567%207.21%209%205%209c-2.086%200-3.8%201.398-3.984%203.181A1%201%200%200%201%201%2012z'/%3e%3c/svg%3e",gs="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20fill='currentColor'%20class='bi%20bi-box-arrow-right'%20viewBox='0%200%2016%2016'%3e%3cpath%20fill-rule='evenodd'%20d='M10%2012.5a.5.5%200%200%201-.5.5h-8a.5.5%200%200%201-.5-.5v-9a.5.5%200%200%201%20.5-.5h8a.5.5%200%200%201%20.5.5v2a.5.5%200%200%200%201%200v-2A1.5%201.5%200%200%200%209.5%202h-8A1.5%201.5%200%200%200%200%203.5v9A1.5%201.5%200%200%200%201.5%2014h8a1.5%201.5%200%200%200%201.5-1.5v-2a.5.5%200%200%200-1%200z'/%3e%3cpath%20fill-rule='evenodd'%20d='M15.854%208.354a.5.5%200%200%200%200-.708l-3-3a.5.5%200%200%200-.708.708L14.293%207.5H5.5a.5.5%200%200%200%200%201h8.793l-2.147%202.146a.5.5%200%200%200%20.708.708z'/%3e%3c/svg%3e",vs="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20fill='currentColor'%20class='bi%20bi-map'%20viewBox='0%200%2016%2016'%3e%3cpath%20fill-rule='evenodd'%20d='M15.817.113A.5.5%200%200%201%2016%20.5v14a.5.5%200%200%201-.402.49l-5%201a.5.5%200%200%201-.196%200L5.5%2015.01l-4.902.98A.5.5%200%200%201%200%2015.5v-14a.5.5%200%200%201%20.402-.49l5-1a.5.5%200%200%201%20.196%200L10.5.99l4.902-.98a.5.5%200%200%201%20.415.103M10%201.91l-4-.8v12.98l4%20.8zm1%2012.98%204-.8V1.11l-4%20.8zm-6-.8V1.11l-4%20.8v12.98z'/%3e%3c/svg%3e",_s="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20fill='currentColor'%20class='bi%20bi-person-check'%20viewBox='0%200%2016%2016'%3e%3cpath%20d='M12.5%2016a3.5%203.5%200%201%200%200-7%203.5%203.5%200%200%200%200%207m1.679-4.493-1.335%202.226a.75.75%200%200%201-1.174.144l-.774-.773a.5.5%200%200%201%20.708-.708l.547.548%201.17-1.951a.5.5%200%201%201%20.858.514M11%205a3%203%200%201%201-6%200%203%203%200%200%201%206%200M8%207a2%202%200%201%200%200-4%202%202%200%200%200%200%204'/%3e%3cpath%20d='M8.256%2014a4.5%204.5%200%200%201-.229-1.004H3c.001-.246.154-.986.832-1.664C4.484%2010.68%205.711%2010%208%2010q.39%200%20.74.025c.226-.341.496-.65.804-.918Q8.844%209.002%208%209c-5%200-6%203-6%204s1%201%201%201z'/%3e%3c/svg%3e";var ys=Object.defineProperty,bs=Object.getOwnPropertyDescriptor,ue=(o,e,t,n)=>{for(var i=n>1?void 0:n?bs(e,t):e,a=o.length-1,s;a>=0;a--)(s=o[a])&&(i=(n?s(e,t,i):s(i))||i);return n&&i&&ys(e,t,i),i};let Mi=!1,Vt=null;async function ks(o){if(!Mi)return Vt||(Vt=(async()=>{console.log("[hanko-auth] Pre-registering Hanko translations...");try{await ji(o,{enablePasskeys:!1,hidePasskeyButtonOnLogin:!0,translations:{en:Ti,es:$i,fr:Ui,pt:Ni},fallbackLanguage:"en"}),Mi=!0,console.log("[hanko-auth] Hanko registration complete")}catch(e){throw console.error("[hanko-auth] Hanko registration failed:",e),Vt=null,e}})(),Vt)}const ne={primary:null,user:null,osmConnected:!1,osmData:null,loading:!0,hanko:null,initialized:!1,instances:new Set,profileDisplayName:"",hankoReady:!1},Ri=o=>`hanko-verified-${o}`,Hi=o=>`hanko-onboarding-${o}`;K.HankoAuth=class extends xt{constructor(){super(...arguments),this.hankoUrlAttr="",this.basePath="",this.authPath="/api/auth/osm",this.osmRequired=!1,this.osmScopes="read_prefs",this.showProfile=!1,this.redirectAfterLogin="",this.autoConnect=!1,this.verifySession=!1,this.redirectAfterLogout="",this.displayNameAttr="",this.mappingCheckUrl="",this.appId="",this.loginUrl="",this.lang="en",this.buttonVariant="plain",this.buttonColor="primary",this.user=null,this.osmConnected=!1,this.osmData=null,this.osmLoading=!1,this.loading=!0,this.error=null,this.hankoReady=!1,this.profileDisplayName="",this.hasAppMapping=!1,this.userProfileLanguage=null,this.isOpen=!1,this.handleOutsideClick=e=>{this.contains(e.target)||this.closeDropdown()},this._trailingSlashCache={},this._debugMode=!1,this._lastSessionId=null,this._hanko=null,this._isPrimary=!1,this._handleVisibilityChange=()=>{this._isPrimary&&!document.hidden&&!this.showProfile&&!this.user&&(this.log("👁️ Page visible, re-checking session..."),this.checkSession())},this._handleWindowFocus=()=>{this._isPrimary&&!this.showProfile&&!this.user&&(this.log("🎯 Window focused, re-checking session..."),this.checkSession())},this._handleExternalLogin=e=>{var n;if(!this._isPrimary)return;const t=e;!this.showProfile&&!this.user&&((n=t.detail)!=null&&n.user)&&(this.log("🔔 External login detected, updating user state..."),this.user=t.detail.user,this._broadcastState(),this.osmRequired&&this.checkOSMConnection())}}toggleDropdown(){this.isOpen=!this.isOpen,this.isOpen?setTimeout(()=>{document.addEventListener("click",this.handleOutsideClick)},0):document.removeEventListener("click",this.handleOutsideClick)}closeDropdown(){this.isOpen=!1,document.removeEventListener("click",this.handleOutsideClick)}get hankoUrl(){if(this.hankoUrlAttr)return this.hankoUrlAttr;const e=document.querySelector('meta[name="hanko-url"]');if(e){const n=e.getAttribute("content");if(n)return this.log("🔍 hanko-url auto-detected from <meta> tag:",n),n}if(window.HANKO_URL)return this.log("🔍 hanko-url auto-detected from window.HANKO_URL:",window.HANKO_URL),window.HANKO_URL;const t=window.location.origin;return this.log("🔍 hanko-url auto-detected from window.location.origin:",t),t}connectedCallback(){super.connectedCallback(),this._debugMode=this._checkDebugMode(),this.log("🔌 hanko-auth connectedCallback called"),this.injectHotStyles(),ne.instances.add(this),document.addEventListener("visibilitychange",this._handleVisibilityChange),window.addEventListener("focus",this._handleWindowFocus),document.addEventListener("hanko-login",this._handleExternalLogin)}firstUpdated(){this.log("🔌 hanko-auth firstUpdated called"),this.log(" hankoUrl:",this.hankoUrl),this.log(" basePath:",this.basePath),ne.initialized||ne.primary?(this.log("🔄 Using shared state from primary instance"),this._syncFromShared(),this._isPrimary=!1):(this.log("👑 This is the primary instance"),this._isPrimary=!0,ne.primary=this,ne.initialized=!0,this.init())}disconnectedCallback(){if(super.disconnectedCallback(),document.removeEventListener("visibilitychange",this._handleVisibilityChange),window.removeEventListener("focus",this._handleWindowFocus),document.removeEventListener("hanko-login",this._handleExternalLogin),document.removeEventListener("click",this.handleOutsideClick),ne.instances.delete(this),this._isPrimary&&ne.instances.size>0){const e=ne.instances.values().next().value;e&&(this.log("👑 Promoting new primary instance"),e._isPrimary=!0,ne.primary=e)}ne.instances.size===0&&(ne.initialized=!1,ne.primary=null)}_syncFromShared(){this.user!==ne.user&&(this.user=ne.user),this.osmConnected!==ne.osmConnected&&(this.osmConnected=ne.osmConnected),this.osmData!==ne.osmData&&(this.osmData=ne.osmData),this.loading!==ne.loading&&(this.loading=ne.loading),this._hanko!==ne.hanko&&(this._hanko=ne.hanko),this.profileDisplayName!==ne.profileDisplayName&&(this.profileDisplayName=ne.profileDisplayName),this.hankoReady!==ne.hankoReady&&(this.hankoReady=ne.hankoReady)}_broadcastState(){ne.user=this.user,ne.osmConnected=this.osmConnected,ne.osmData=this.osmData,ne.loading=this.loading,ne.profileDisplayName=this.profileDisplayName,ne.hankoReady=this.hankoReady,ne.instances.forEach(e=>{e!==this&&e._syncFromShared()})}_checkDebugMode(){if(new URLSearchParams(window.location.search).get("debug")==="true")return!0;try{return localStorage.getItem("hanko-auth-debug")==="true"}catch{return!1}}log(...e){this._debugMode&&console.log(...e)}t(e){const t=this.user&&this.userProfileLanguage?this.userProfileLanguage:this.lang;return(ko[t]||ko.en)[e]||ko.en[e]||e}warn(...e){console.warn(...e)}logError(...e){console.error(...e)}getBasePath(){return this.basePath?(this.log("🔍 getBasePath() using basePath:",this.basePath),this.basePath):(this.log("🔍 getBasePath() using default: empty string"),"")}addTrailingSlash(e,t){const n=this._trailingSlashCache[t];return n!==void 0&&n&&!e.endsWith("/")?e+"/":e}injectHotStyles(){[{id:"hot-design-system",href:"https://cdn.jsdelivr.net/npm/@hotosm/ui-design@latest/dist/hot.css"},{id:"google-font-archivo",href:"https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700&display=swap"}].forEach(({id:t,href:n})=>{if(!document.getElementById(t)){const i=document.createElement("link");i.rel="stylesheet",i.href=n,i.id=t,document.head.appendChild(i)}})}async init(){if(!this._isPrimary){this.log("⏭️ Not primary, skipping init...");return}try{this.log("Ensuring Hanko is registered with translations for: en, es, fr, pt"),this.log("Current lang prop:",this.lang),await ks(this.hankoUrl),this.hankoReady=!0,this._broadcastState();const{Hanko:e}=await Promise.resolve().then(()=>hs),t=window.location.hostname,n=t==="localhost"||t==="127.0.0.1",i=t.split("."),a=i.length>=2?`.${i.slice(-2).join(".")}`:t,s=n?{}:{cookieDomain:a,cookieName:"hanko",cookieSameSite:"lax"};this._hanko=new e(this.hankoUrl,s),ne.hanko=this._hanko,this._hanko.onSessionExpired(()=>{this.log("🕒 Hanko session expired event received"),this.handleSessionExpired()}),this._hanko.onUserLoggedOut(()=>{this.log("🚪 Hanko user logged out event received"),this.handleUserLoggedOut()}),await this.checkSession(),this.user&&(this.osmRequired&&await this.checkOSMConnection(),await this.fetchProfileDisplayName()),this.loading=!1,this._broadcastState(),this.setupEventListeners()}catch(e){this.logError("Failed to initialize hanko-auth:",e),this.error=e.message,this.loading=!1,this._broadcastState()}}async checkSession(){if(this.log("🔍 Checking for existing Hanko session..."),!this._hanko){this.log("⚠️ Hanko instance not initialized yet");return}try{this.log("📡 Checking session validity via cookie...");try{const e=await fetch(`${this.hankoUrl}/sessions/validate`,{method:"GET",credentials:"include",headers:{"Content-Type":"application/json"}});if(e.ok){const t=await e.json();if(t.is_valid===!1){this.log("ℹ️ Session validation returned is_valid:false - no valid session");return}this.log("✅ Valid Hanko session found via cookie"),this.log("📋 Session data:",t);try{const n=await fetch(`${this.hankoUrl}/me`,{method:"GET",credentials:"include",headers:{"Content-Type":"application/json"}});let i=!0;if(n.ok){const a=await n.json();this.log("👤 User data retrieved from /me:",a),a.email?(this.user={id:a.user_id||a.id,email:a.email,username:a.username||null,emailVerified:a.email_verified||a.verified||!1},i=!1):this.log("⚠️ /me has no email, will use SDK fallback")}if(i){this.log("🔄 Using SDK to get user with email");const a=await this._hanko.user.getCurrent();this.user={id:a.id,email:a.email,username:a.username,emailVerified:a.email_verified||!1}}}catch(n){this.log("⚠️ Failed to get user data:",n),t.user_id&&(this.user={id:t.user_id,email:t.email||null,username:null,emailVerified:!1})}if(this.user){const n=Ri(window.location.hostname),i=sessionStorage.getItem(n);if(this.verifySession&&this.redirectAfterLogin&&!i){this.log("🔄 verify-session enabled, redirecting to callback for app verification..."),sessionStorage.setItem(n,"true"),window.location.href=this.redirectAfterLogin;return}if(!await this.checkAppMapping())return;this.dispatchEvent(new CustomEvent("hanko-login",{detail:{user:this.user},bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent("auth-complete",{bubbles:!0,composed:!0})),this.osmRequired&&await this.checkOSMConnection(),await this.fetchProfileDisplayName(),this.osmRequired&&this.autoConnect&&!this.osmConnected&&(this.log("🔄 Auto-connecting to OSM (from existing session)..."),this.handleOSMConnect())}}else this.log("ℹ️ No valid session cookie found - user needs to login")}catch(e){this.log("⚠️ Session validation failed:",e),this.log("ℹ️ No valid session - user needs to login")}}catch(e){this.log("⚠️ Session check error:",e),this.log("ℹ️ No existing session - user needs to login")}finally{this._isPrimary&&this._broadcastState()}}async checkOSMConnection(){if(!this.osmRequired){this.log("⏭️ OSM not required, skipping connection check");return}if(this.osmConnected){this.log("⏭️ Already connected to OSM, skipping check");return}const e=this.loading;e||(this.osmLoading=!0);try{const t=this.getBasePath(),n=this.authPath,a=`${`${t}${n}/status`}`;this.log("🔍 Checking OSM connection at:",a),this.log(" basePath:",t),this.log(" authPath:",n),this.log("🍪 Current cookies:",document.cookie);const s=await fetch(a,{credentials:"include",redirect:"follow"});if(this.log("📡 OSM status response:",s.status),this.log("📡 Final URL after redirects:",s.url),this.log("📡 Response headers:",[...s.headers.entries()]),s.ok){const d=await s.text();this.log("📡 OSM raw response:",d.substring(0,200));let c;try{c=JSON.parse(d)}catch{throw this.logError("Failed to parse OSM response as JSON:",d.substring(0,500)),new Error("Invalid JSON response from OSM status endpoint")}this.log("📡 OSM status data:",c),c.connected?(this.log("✅ OSM is connected:",c.osm_username),this.osmConnected=!0,this.osmData=c,this.dispatchEvent(new CustomEvent("osm-connected",{detail:{osmData:c},bubbles:!0,composed:!0}))):(this.log("❌ OSM is NOT connected"),this.osmConnected=!1,this.osmData=null)}}catch(t){this.logError("OSM connection check failed:",t)}finally{e||(this.osmLoading=!1),this._isPrimary&&this._broadcastState()}}async checkAppMapping(){if(!this.mappingCheckUrl||!this.user)return!0;const e=Hi(window.location.hostname);if(sessionStorage.getItem(e))return this.log("✅ Onboarding already completed this session, skipping check"),this.hasAppMapping=!0,!0;this.log("🔍 Checking app mapping at:",this.mappingCheckUrl);try{const n=await fetch(this.mappingCheckUrl,{credentials:"include"});if(n.ok){const i=await n.json();if(this.log("📡 Mapping check response:",i),i.needs_onboarding){this.log("⚠️ User needs onboarding, redirecting...");const a=encodeURIComponent(window.location.origin),s=this.appId?`onboarding=${this.appId}`:"";return window.location.href=`${this.hankoUrl}/app?${s}&return_to=${a}`,!1}return sessionStorage.setItem(e,"true"),this.hasAppMapping=!0,this.log("✅ User has app mapping, onboarding marked complete"),!0}else if(n.status===401||n.status===403){this.log("⚠️ 401/403 - User needs onboarding, redirecting...");const i=encodeURIComponent(window.location.origin),a=this.appId?`onboarding=${this.appId}`:"";return window.location.href=`${this.hankoUrl}/app?${a}&return_to=${i}`,!1}return this.log("⚠️ Unexpected status from mapping check:",n.status),!0}catch(n){return this.log("⚠️ App mapping check failed:",n),!0}}async fetchProfileDisplayName(){try{const e=`${this.hankoUrl}/api/profile/me`;this.log("👤 Fetching profile from:",e);const t=await fetch(e,{credentials:"include"});if(t.ok){const n=await t.json();this.log("👤 Profile data:",n),(n.first_name||n.last_name)&&(this.profileDisplayName=`${n.first_name||""} ${n.last_name||""}`.trim(),this.log("👤 Display name set to:",this.profileDisplayName)),n.language&&(this.userProfileLanguage=n.language,this.log("🌐 Language set from profile:",this.userProfileLanguage))}}catch(e){this.log("⚠️ Could not fetch profile:",e)}}setupEventListeners(){this.updateComplete.then(()=>{var t;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("hanko-auth");e&&(e.addEventListener("onSessionCreated",n=>{var a,s;this.log("🎯 Hanko event: onSessionCreated",n.detail);const i=(s=(a=n.detail)==null?void 0:a.claims)==null?void 0:s.session_id;if(i&&this._lastSessionId===i){this.log("⏭️ Skipping duplicate session event");return}this._lastSessionId=i,this.handleHankoSuccess(n)}),e.addEventListener("hankoAuthLogout",()=>this.handleLogout()))})}async handleHankoSuccess(e){var i;if(this.log("Hanko auth success:",e.detail),!this._hanko){this.logError("Hanko instance not initialized");return}let t=!1;try{const a=new AbortController,s=setTimeout(()=>a.abort(),5e3),d=await fetch(`${this.hankoUrl}/me`,{method:"GET",credentials:"include",headers:{"Content-Type":"application/json"},signal:a.signal});if(clearTimeout(s),d.ok){const c=await d.json();this.log("👤 User data retrieved from /me:",c),c.email?(this.user={id:c.user_id||c.id,email:c.email,username:c.username||null,emailVerified:c.email_verified||c.verified||!1},t=!0):this.log("⚠️ /me has no email, will try SDK fallback")}else this.log("⚠️ /me endpoint returned non-OK status, will try SDK fallback")}catch(a){this.log("⚠️ /me endpoint fetch failed (timeout or cross-origin TLS issue):",a)}if(!t)try{this.log("🔄 Trying SDK fallback for user info...");const a=new Promise((d,c)=>setTimeout(()=>c(new Error("SDK timeout")),5e3)),s=await Promise.race([this._hanko.user.getCurrent(),a]);this.user={id:s.id,email:s.email,username:s.username,emailVerified:s.email_verified||!1},t=!0,this.log("✅ User info retrieved via SDK fallback")}catch(a){this.log("⚠️ SDK fallback failed, trying JWT claims:",a);try{const s=(i=e.detail)==null?void 0:i.claims;if(s!=null&&s.sub)this.user={id:s.sub,email:s.email||null,username:null,emailVerified:s.email_verified||!1},t=!0,this.log("✅ User info extracted from JWT claims");else{this.logError("No user claims available in event"),this.user=null;return}}catch(s){this.logError("Failed to extract user info from claims:",s),this.user=null;return}}if(this.log("✅ User state updated:",this.user),this._isPrimary&&this._broadcastState(),this.dispatchEvent(new CustomEvent("hanko-login",{detail:{user:this.user},bubbles:!0,composed:!0})),this.osmRequired&&await this.checkOSMConnection(),await this.fetchProfileDisplayName(),this.osmRequired&&this.autoConnect&&!this.osmConnected){this.log("🔄 Auto-connecting to OSM..."),this.handleOSMConnect();return}const n=!this.osmRequired||this.osmConnected;this.log("🔄 Checking redirect-after-login:",this.redirectAfterLogin,"showProfile:",this.showProfile,"canRedirect:",n),n?(this.dispatchEvent(new CustomEvent("auth-complete",{bubbles:!0,composed:!0})),this.redirectAfterLogin?(this.log("✅ Redirecting to:",this.redirectAfterLogin),window.location.href=this.redirectAfterLogin):this.log("❌ No redirect (redirectAfterLogin not set)")):this.log("⏸️ Waiting for OSM connection before redirect")}async handleOSMConnect(){const e=this.osmScopes.split(" ").join("+"),t=this.getBasePath(),n=this.authPath,a=`${`${t}${n}/login`}?scopes=${e}`;this.log("🔗 OSM Connect clicked!"),this.log(" basePath:",t),this.log(" authPath:",n),this.log(" Login path:",a),this.log(" Fetching redirect URL from backend...");try{const s=await fetch(a,{method:"GET",credentials:"include",redirect:"manual"});if(this.log(" Response status:",s.status),this.log(" Response type:",s.type),s.status===0||s.type==="opaqueredirect"){const d=s.headers.get("Location")||s.url;this.log(" ✅ Got redirect URL:",d),window.location.href=d}else if(s.status>=300&&s.status<400){const d=s.headers.get("Location");this.log(" ✅ Got redirect URL from header:",d),d&&(window.location.href=d)}else{this.logError(" ❌ Unexpected response:",s.status);const d=await s.text();this.logError(" Response body:",d.substring(0,200))}}catch(s){this.logError(" ❌ Failed to fetch redirect URL:",s)}}async handleLogout(){this.log("🚪 Logout initiated"),this.log("📊 Current state before logout:",{user:this.user,osmConnected:this.osmConnected,osmData:this.osmData}),this.log("🍪 Cookies before logout:",document.cookie);try{const e=this.getBasePath(),t=this.authPath,n=`${e}${t}/disconnect`,i=n.startsWith("http")?n:`${window.location.origin}${n}`;this.log("🔌 Calling OSM disconnect:",i);const a=await fetch(i,{method:"POST",credentials:"include"});this.log("📡 Disconnect response status:",a.status);const s=await a.json();this.log("📡 Disconnect response data:",s),this.log("✅ OSM disconnected")}catch(e){this.logError("❌ OSM disconnect failed:",e)}if(this._hanko)try{await this._hanko.user.logout(),this.log("✅ Hanko logout successful")}catch(e){this.logError("Hanko logout failed:",e)}if(this._clearAuthState(),this.log("✅ Logout complete - component will re-render with updated state"),this.redirectAfterLogout){const e=window.location.href.replace(/\/$/,""),t=this.redirectAfterLogout.replace(/\/$/,"");e!==t&&!e.startsWith(t+"#")?(this.log("🔄 Redirecting after logout to:",this.redirectAfterLogout),window.location.href=this.redirectAfterLogout):this.log("⏭️ Already on logout target, skipping redirect")}}_clearAuthState(){const e=window.location.hostname;document.cookie=`hanko=; path=/; domain=${e}; max-age=0`,document.cookie="hanko=; path=/; max-age=0",document.cookie=`osm_connection=; path=/; domain=${e}; max-age=0`,document.cookie="osm_connection=; path=/; max-age=0",this.log("🍪 Cookies cleared");const t=Ri(e),n=Hi(e);sessionStorage.removeItem(t),sessionStorage.removeItem(n),this.log("🔄 Session flags cleared"),this.user=null,this.osmConnected=!1,this.osmData=null,this.hasAppMapping=!1,this.userProfileLanguage=null,this._isPrimary&&this._broadcastState(),this.dispatchEvent(new CustomEvent("logout",{bubbles:!0,composed:!0}))}async handleSessionExpired(){if(this.log("🕒 Session expired event received"),this.log("📊 Current state:",{user:this.user,osmConnected:this.osmConnected,loading:this.loading}),this.loading){this.log("⏳ Still loading, ignoring session expired event during init");return}if(this.user){this.log("✅ User is logged in, ignoring stale session expired event");return}this.log("🧹 No active user - cleaning up state");try{const e=this.getBasePath(),t=this.authPath,n=`${e}${t}/disconnect`,i=n.startsWith("http")?n:`${window.location.origin}${n}`;this.log("🔌 Calling OSM disconnect (session expired):",i);const a=await fetch(i,{method:"POST",credentials:"include"});this.log("📡 Disconnect response status:",a.status);const s=await a.json();this.log("📡 Disconnect response data:",s),this.log("✅ OSM disconnected")}catch(e){this.logError("❌ OSM disconnect failed:",e)}if(this._clearAuthState(),this.log("✅ Session cleanup complete"),this.redirectAfterLogout){const e=window.location.href.replace(/\/$/,""),t=this.redirectAfterLogout.replace(/\/$/,"");e!==t&&!e.startsWith(t+"#")?(this.log("🔄 Redirecting after session expired to:",this.redirectAfterLogout),window.location.href=this.redirectAfterLogout):this.log("⏭️ Already on logout target, skipping redirect")}}handleUserLoggedOut(){this.log("🚪 User logged out in another window/tab"),this.handleSessionExpired()}handleDropdownSelect(e){const n=e.currentTarget.dataset.action;if(this.log("🎯 Dropdown item selected:",n),n==="profile"){const i=this.hankoUrl,a=this.redirectAfterLogin||window.location.origin;window.location.href=`${i}/app/profile?return_to=${encodeURIComponent(a)}`}else if(n==="connect-osm"){const s=window.location.pathname.includes("/app")?window.location.origin:window.location.href,d=this.hankoUrl;window.location.href=`${d}/app?return_to=${encodeURIComponent(s)}&osm_required=true`}else n==="logout"&&this.handleLogout();this.closeDropdown()}oldHandleDropdownSelect(e){const t=e.detail.item.value;if(this.log("🎯 Dropdown item selected:",t),t==="profile"){const n=this.redirectAfterLogin||window.location.origin,i=this.loginUrl?`${this.loginUrl}/profile`:`${this.hankoUrl}/app/profile`;window.location.href=`${i}?return_to=${encodeURIComponent(n)}`}else if(t==="connect-osm"){const a=window.location.pathname.includes("/app")?window.location.origin:window.location.href,s=this.hankoUrl;window.location.href=`${s}/app?return_to=${encodeURIComponent(a)}&osm_required=true`}else t==="logout"&&this.handleLogout()}handleSkipOSM(){this.dispatchEvent(new CustomEvent("osm-skipped")),this.dispatchEvent(new CustomEvent("auth-complete")),this.redirectAfterLogin&&(window.location.href=this.redirectAfterLogin)}render(){var e,t,n;if(this.log("🎨 RENDER - showProfile:",this.showProfile,"user:",!!this.user,"loading:",this.loading,"lang:",this.lang),this.loading)return Te`<span class="loading-placeholder"
|
|
472
|
+
`;var bo={d:(o,e)=>{for(var t in e)bo.o(e,t)&&!bo.o(o,t)&&Object.defineProperty(o,t,{enumerable:!0,get:e[t]})},o:(o,e)=>Object.prototype.hasOwnProperty.call(o,e)},Li={};bo.d(Li,{en:()=>ms});const ms={headlines:{error:"An error has occurred",loginEmail:"Sign in or create account",loginEmailNoSignup:"Sign in",loginFinished:"Login successful",loginPasscode:"Enter passcode",loginPassword:"Enter password",registerAuthenticator:"Create a passkey",registerConfirm:"Create account?",registerPassword:"Set new password",otpSetUp:"Set up authenticator app",profileEmails:"Emails",profilePassword:"Password",profilePasskeys:"Passkeys",isPrimaryEmail:"Primary email address",setPrimaryEmail:"Set primary email address",createEmail:"Enter a new email",createUsername:"Enter a new username",emailVerified:"Verified",emailUnverified:"Unverified",emailDelete:"Delete",renamePasskey:"Rename passkey",deletePasskey:"Delete passkey",lastUsedAt:"Last used at",createdAt:"Created at",connectedAccounts:"Connected accounts",deleteAccount:"Delete account",accountNotFound:"Account not found",signIn:"Sign in",signUp:"Create account",selectLoginMethod:"Select login method",setupLoginMethod:"Set up login method",lastUsed:"Last seen",ipAddress:"IP address",revokeSession:"Revoke session",profileSessions:"Sessions",mfaSetUp:"Set up MFA",securityKeySetUp:"Add security key",securityKeyLogin:"Security key",otpLogin:"Authentication code",renameSecurityKey:"Rename security key",deleteSecurityKey:"Delete security key",securityKeys:"Security keys",authenticatorApp:"Authenticator app",authenticatorAppAlreadySetUp:"Authenticator app is set up",authenticatorAppNotSetUp:"Set up authenticator app",trustDevice:"Trust this browser?"},texts:{enterPasscode:'Enter the passcode that was sent to "{emailAddress}".',enterPasscodeNoEmail:"Enter the passcode that was sent to your primary email address.",setupPasskey:"Sign in to your account easily and securely with a passkey. Note: Your biometric data is only stored on your devices and will never be shared with anyone.",createAccount:'No account exists for "{emailAddress}". Do you want to create a new account?',otpEnterVerificationCode:"Enter the one-time password (OTP) obtained from your authenticator app below:",otpScanQRCode:"Scan the QR code using your authenticator app (such as Google Authenticator or any other TOTP app). Alternatively, you can manually enter the OTP secret key into the app.",otpSecretKey:"OTP secret key",passwordFormatHint:"Must be between {minLength} and {maxLength} characters long.",securityKeySetUp:"Use a dedicated security key via USB, Bluetooth, or NFC, or your mobile phone. Connect or activate your security key, then click the button below and follow the prompts to complete the registration.",setPrimaryEmail:"Set this email address to be used for contacting you.",isPrimaryEmail:"This email address will be used to contact you if necessary.",emailVerified:"This email address has been verified.",emailUnverified:"This email address has not been verified.",emailDelete:"If you delete this email address, it can no longer be used to sign in.",renamePasskey:"Set a name for the passkey.",deletePasskey:"Delete this passkey from your account.",deleteAccount:"Are you sure you want to delete this account? All data will be deleted immediately and cannot be recovered.",noAccountExists:'No account exists for "{emailAddress}".',selectLoginMethodForFutureLogins:"Select one of the following login methods to use for future logins.",howDoYouWantToLogin:"How do you want to login?",mfaSetUp:"Protect your account with Multi-Factor Authentication (MFA). MFA adds an additional step to your login process, ensuring that even if your password or email account is compromised, your account stays secure.",securityKeyLogin:"Connect or activate your security key, then click the button below. Once ready, use it via USB, NFC, your mobile phone. Follow the prompts to complete the login process.",otpLogin:"Open your authenticator app to obtain the one-time password (OTP). Enter the code in the field below to complete your login.",renameSecurityKey:"Set a name for the security key.",deleteSecurityKey:"Delete this security key from your account.",authenticatorAppAlreadySetUp:"Your account is secured with an authenticator app that generates time-based one-time passwords (TOTP) for multi-factor authentication.",authenticatorAppNotSetUp:"Secure your account with an authenticator app that generates time-based one-time passwords (TOTP) for multi-factor authentication.",trustDevice:"If you trust this browser, you won’t need to enter your OTP (One-Time-Password) or use your security key for multi-factor authentication (MFA) the next time you log in."},labels:{or:"or",no:"no",yes:"yes",email:"Email",continue:"Continue",copied:"copied",skip:"Skip",save:"Save",password:"Password",passkey:"Passkey",passcode:"Passcode",signInPassword:"Sign in with a password",signInPasscode:"Sign in with a passcode",forgotYourPassword:"Forgot your password?",back:"Back",signInPasskey:"Sign in with a passkey",registerAuthenticator:"Create a passkey",signIn:"Sign in",signUp:"Create account",sendNewPasscode:"Send new code",passwordRetryAfter:"Retry in {passwordRetryAfter}",passcodeResendAfter:"Request a new code in {passcodeResendAfter}",unverifiedEmail:"unverified",primaryEmail:"primary",setAsPrimaryEmail:"Set as primary",verify:"Verify",delete:"Delete",newEmailAddress:"New email address",newPassword:"New password",rename:"Rename",newPasskeyName:"New passkey name",addEmail:"Add email",createPasskey:"Create a passkey",webauthnUnsupported:"Passkeys are not supported by your browser",signInWith:"Sign in with {provider}",deleteAccount:"Yes, delete this account.",emailOrUsername:"Email or username",username:"Username",optional:"optional",dontHaveAnAccount:"Don't have an account?",alreadyHaveAnAccount:"Already have an account?",changeUsername:"Change username",setUsername:"Set username",changePassword:"Change password",setPassword:"Set password",revoke:"Revoke",currentSession:"Current session",authenticatorApp:"Authenticator app",securityKey:"Security key",securityKeyUse:"Use security key",newSecurityKeyName:"New security key name",createSecurityKey:"Add a security key",authenticatorAppManage:"Manage authenticator app",authenticatorAppAdd:"Set up",configured:"configured",useAnotherMethod:"Use another method",lastUsed:"Last used",trustDevice:"Trust this browser",staySignedIn:"Stay signed in"},errors:{somethingWentWrong:"A technical error has occurred. Please try again later.",requestTimeout:"The request timed out.",invalidPassword:"Wrong email or password.",invalidPasscode:"The passcode provided was not correct.",passcodeAttemptsReached:"The passcode was entered incorrectly too many times. Please request a new code.",tooManyRequests:"Too many requests have been made. Please wait to repeat the requested operation.",unauthorized:"Your session has expired. Please log in again.",invalidWebauthnCredential:"This passkey cannot be used anymore.",passcodeExpired:"The passcode has expired. Please request a new one.",userVerification:"User verification required. Please ensure your authenticator device is protected with a PIN or biometric.",emailAddressAlreadyExistsError:"The email address already exists.",maxNumOfEmailAddressesReached:"No further email addresses can be added.",thirdPartyAccessDenied:"Access denied. The request was cancelled by the user or the provider has denied access for other reasons.",thirdPartyMultipleAccounts:"Cannot identify account. The email address is used by multiple accounts.",thirdPartyUnverifiedEmail:"Email verification required. Please verify the used email address with your provider.",signupDisabled:"Account registration is disabled.",handlerNotFoundError:"The current step in your process is not supported by this application version. Please try again later or contact support if the issue persists."},flowErrors:{technical_error:"A technical error has occurred. Please try again later.",flow_expired_error:"The session has expired, please click the button to restart.",value_invalid_error:"The entered value is invalid.",passcode_invalid:"The passcode provided was not correct.",passkey_invalid:"This passkey cannot be used anymore",passcode_max_attempts_reached:"The passcode was entered incorrectly too many times. Please request a new code.",rate_limit_exceeded:"Too many requests have been made. Please wait to repeat the requested operation.",unknown_username_error:"The username is unknown.",unknown_email_error:"The email address is unknown.",username_already_exists:"The username is already taken.",invalid_username_error:"The username must contain only letters, numbers, and underscores.",email_already_exists:"The email is already taken.",not_found:"The requested resource was not found.",operation_not_permitted_error:"The operation is not permitted.",flow_discontinuity_error:"The process cannot be continued due to user settings or the provider's configuration.",form_data_invalid_error:"The submitted form data contains errors.",unauthorized:"Your session has expired. Please log in again.",value_missing_error:"The value is missing.",value_too_long_error:"Value is too long.",value_too_short_error:"The value is too short.",webauthn_credential_invalid_mfa_only:"This credential can be used as a second factor security key only.",webauthn_credential_already_exists:"The request either timed out, was canceled or the device is already registered. Please try again or try using another device.",platform_authenticator_required:"Your account is configured to use platform authenticators, but your current device or browser does not support this feature. Please try again with a compatible device or browser."}};var Ti=Li.en;const $i={headlines:{error:"Ha ocurrido un error",loginEmail:"Iniciar sesión o crear cuenta",loginEmailNoSignup:"Iniciar sesión",loginFinished:"Inicio de sesión exitoso",loginPasscode:"Ingrese el código de acceso",loginPassword:"Ingrese la contraseña",registerAuthenticator:"Crear una llave de acceso",registerConfirm:"¿Crear cuenta?",registerPassword:"Establecer nueva contraseña",otpSetUp:"Configurar aplicación de autenticación",profileEmails:"Correos electrónicos",profilePassword:"Contraseña",profilePasskeys:"Llaves de acceso",isPrimaryEmail:"Dirección de correo principal",setPrimaryEmail:"Establecer correo principal",createEmail:"Ingrese un nuevo correo",createUsername:"Ingrese un nuevo nombre de usuario",emailVerified:"Verificado",emailUnverified:"No verificado",emailDelete:"Eliminar",renamePasskey:"Renombrar llave de acceso",deletePasskey:"Eliminar llave de acceso",lastUsedAt:"Último uso",createdAt:"Creado",connectedAccounts:"Cuentas conectadas",deleteAccount:"Eliminar cuenta",accountNotFound:"Cuenta no encontrada",signIn:"Iniciar sesión",signUp:"Crear cuenta",selectLoginMethod:"Seleccionar método de inicio de sesión",setupLoginMethod:"Configurar método de inicio de sesión",lastUsed:"Visto por última vez",ipAddress:"Dirección IP",revokeSession:"Revocar sesión",profileSessions:"Sesiones",mfaSetUp:"Configurar MFA",securityKeySetUp:"Agregar clave de seguridad",securityKeyLogin:"Clave de seguridad",otpLogin:"Código de autenticación",renameSecurityKey:"Renombrar clave de seguridad",deleteSecurityKey:"Eliminar clave de seguridad",securityKeys:"Claves de seguridad",authenticatorApp:"Aplicación de autenticación",authenticatorAppAlreadySetUp:"La aplicación de autenticación está configurada",authenticatorAppNotSetUp:"Configurar aplicación de autenticación",trustDevice:"¿Confiar en este navegador?"},texts:{enterPasscode:'Ingrese el código que se envió a "{emailAddress}".',enterPasscodeNoEmail:"Ingrese el código que se envió a su dirección de correo principal.",setupPasskey:"Inicie sesión en su cuenta fácil y seguramente con una llave de acceso. Nota: Sus datos biométricos solo se almacenan en sus dispositivos y nunca se compartirán con nadie.",createAccount:'No existe una cuenta para "{emailAddress}". ¿Desea crear una nueva cuenta?',otpEnterVerificationCode:"Ingrese la contraseña de un solo uso (OTP) obtenida de su aplicación de autenticación a continuación:",otpScanQRCode:"Escanee el código QR usando su aplicación de autenticación (como Google Authenticator o cualquier otra aplicación TOTP). Alternativamente, puede ingresar manualmente la clave secreta OTP en la aplicación.",otpSecretKey:"Clave secreta OTP",passwordFormatHint:"Debe tener entre {minLength} y {maxLength} caracteres.",securityKeySetUp:"Use una clave de seguridad dedicada a través de USB, Bluetooth o NFC, o su teléfono móvil. Conecte o active su clave de seguridad, luego haga clic en el botón a continuación y siga las indicaciones para completar el registro.",setPrimaryEmail:"Establezca esta dirección de correo para ser usada para contactarlo.",isPrimaryEmail:"Esta dirección de correo se utilizará para contactarlo si es necesario.",emailVerified:"Esta dirección de correo ha sido verificada.",emailUnverified:"Esta dirección de correo no ha sido verificada.",emailDelete:"Si elimina esta dirección de correo, ya no podrá usarla para iniciar sesión.",renamePasskey:"Establecer un nombre para la llave de acceso.",deletePasskey:"Eliminar esta llave de acceso de su cuenta.",deleteAccount:"¿Está seguro de que desea eliminar esta cuenta? Todos los datos se eliminarán inmediatamente y no se podrán recuperar.",noAccountExists:'No existe una cuenta para "{emailAddress}".',selectLoginMethodForFutureLogins:"Seleccione uno de los siguientes métodos de inicio de sesión para usar en futuros inicios de sesión.",howDoYouWantToLogin:"¿Cómo desea iniciar sesión?",mfaSetUp:"Proteja su cuenta con autenticación multifactor (MFA). MFA agrega un paso adicional a su proceso de inicio de sesión, asegurando que incluso si su contraseña o cuenta de correo está comprometida, su cuenta permanezca segura.",securityKeyLogin:"Conecte o active su clave de seguridad, luego haga clic en el botón a continuación. Una vez listo, úselo a través de USB, NFC o su teléfono móvil. Siga las indicaciones para completar el proceso de inicio de sesión.",otpLogin:"Abra su aplicación de autenticación para obtener la contraseña de un solo uso (OTP). Ingrese el código en el campo a continuación para completar su inicio de sesión.",renameSecurityKey:"Establecer un nombre para la clave de seguridad.",deleteSecurityKey:"Eliminar esta clave de seguridad de su cuenta.",authenticatorAppAlreadySetUp:"Su cuenta está protegida con una aplicación de autenticación que genera contraseñas de un solo uso basadas en tiempo (TOTP) para autenticación multifactor.",authenticatorAppNotSetUp:"Proteja su cuenta con una aplicación de autenticación que genera contraseñas de un solo uso basadas en tiempo (TOTP) para autenticación multifactor.",trustDevice:"Si confía en este navegador, no necesitará ingresar su OTP (contraseña de un solo uso) o usar su clave de seguridad para la autenticación multifactor (MFA) la próxima vez que inicie sesión."},labels:{or:"o",no:"no",yes:"sí",email:"Correo electrónico",continue:"Continuar",copied:"copiado",skip:"Omitir",save:"Guardar",password:"Contraseña",passkey:"Llave de acceso",passcode:"Código de acceso",signInPassword:"Iniciar sesión con contraseña",signInPasscode:"Iniciar sesión con código",forgotYourPassword:"¿Olvidó su contraseña?",back:"Atrás",signInPasskey:"Iniciar sesión con llave de acceso",registerAuthenticator:"Crear una llave de acceso",signIn:"Iniciar sesión",signUp:"Crear cuenta",sendNewPasscode:"Enviar nuevo código",passwordRetryAfter:"Reintentar en {passwordRetryAfter}",passcodeResendAfter:"Solicitar nuevo código en {passcodeResendAfter}",unverifiedEmail:"no verificado",primaryEmail:"principal",setAsPrimaryEmail:"Establecer como principal",verify:"Verificar",delete:"Eliminar",newEmailAddress:"Nueva dirección de correo",newPassword:"Nueva contraseña",rename:"Renombrar",newPasskeyName:"Nuevo nombre de llave de acceso",addEmail:"Agregar correo",createPasskey:"Crear una llave de acceso",webauthnUnsupported:"Las llaves de acceso no son compatibles con su navegador",signInWith:"Iniciar sesión con {provider}",deleteAccount:"Sí, eliminar esta cuenta.",emailOrUsername:"Correo o nombre de usuario",username:"Nombre de usuario",optional:"opcional",dontHaveAnAccount:"¿No tiene una cuenta?",alreadyHaveAnAccount:"¿Ya tiene una cuenta?",changeUsername:"Cambiar nombre de usuario",setUsername:"Establecer nombre de usuario",changePassword:"Cambiar contraseña",setPassword:"Establecer contraseña",revoke:"Revocar",currentSession:"Sesión actual",authenticatorApp:"Aplicación de autenticación",securityKey:"Clave de seguridad",securityKeyUse:"Usar clave de seguridad",newSecurityKeyName:"Nuevo nombre de clave de seguridad",createSecurityKey:"Agregar una clave de seguridad",authenticatorAppManage:"Administrar aplicación de autenticación",authenticatorAppAdd:"Configurar",configured:"configurado",useAnotherMethod:"Usar otro método",lastUsed:"Último uso",trustDevice:"Confiar en este navegador",staySignedIn:"Mantener sesión iniciada"},errors:{somethingWentWrong:"Ha ocurrido un error técnico. Por favor, inténtelo de nuevo más tarde.",requestTimeout:"La solicitud ha expirado.",invalidPassword:"Correo o contraseña incorrectos.",invalidPasscode:"El código proporcionado no es correcto.",passcodeAttemptsReached:"El código se ha ingresado incorrectamente demasiadas veces. Por favor, solicite un nuevo código.",tooManyRequests:"Se han realizado demasiadas solicitudes. Por favor, espere para repetir la operación solicitada.",unauthorized:"Su sesión ha expirado. Por favor, inicie sesión nuevamente.",invalidWebauthnCredential:"Esta llave de acceso ya no se puede usar.",passcodeExpired:"El código ha expirado. Por favor, solicite uno nuevo.",userVerification:"Se requiere verificación de usuario. Asegúrese de que su dispositivo de autenticación esté protegido con un PIN o biometría.",emailAddressAlreadyExistsError:"La dirección de correo ya existe.",maxNumOfEmailAddressesReached:"No se pueden agregar más direcciones de correo.",thirdPartyAccessDenied:"Acceso denegado. La solicitud fue cancelada por el usuario o el proveedor ha denegado el acceso por otras razones.",thirdPartyMultipleAccounts:"No se puede identificar la cuenta. La dirección de correo es usada por múltiples cuentas.",thirdPartyUnverifiedEmail:"Se requiere verificación de correo. Por favor, verifique la dirección de correo usada con su proveedor.",signupDisabled:"El registro de cuentas está deshabilitado.",handlerNotFoundError:"El paso actual en su proceso no es compatible con esta versión de la aplicación. Inténtelo de nuevo más tarde o contacte al soporte si el problema persiste."},flowErrors:{technical_error:"Ha ocurrido un error técnico. Por favor, inténtelo de nuevo más tarde.",flow_expired_error:"La sesión ha expirado, haga clic en el botón para reiniciar.",value_invalid_error:"El valor ingresado no es válido.",passcode_invalid:"El código proporcionado no es correcto.",passkey_invalid:"Esta llave de acceso ya no se puede usar.",passcode_max_attempts_reached:"El código se ha ingresado incorrectamente demasiadas veces. Por favor, solicite un nuevo código.",rate_limit_exceeded:"Se han realizado demasiadas solicitudes. Por favor, espere para repetir la operación solicitada.",unknown_username_error:"El nombre de usuario es desconocido.",unknown_email_error:"La dirección de correo es desconocida.",username_already_exists:"El nombre de usuario ya está en uso.",invalid_username_error:"El nombre de usuario solo debe contener letras, números y guiones bajos.",email_already_exists:"El correo ya está en uso.",not_found:"No se encontró el recurso solicitado.",operation_not_permitted_error:"La operación no está permitida.",flow_discontinuity_error:"El proceso no se puede continuar debido a la configuración del usuario o del proveedor.",form_data_invalid_error:"Los datos del formulario enviados contienen errores.",unauthorized:"Su sesión ha expirado. Por favor, inicie sesión nuevamente.",value_missing_error:"Falta el valor.",value_too_long_error:"El valor es demasiado largo.",value_too_short_error:"El valor es demasiado corto.",webauthn_credential_invalid_mfa_only:"Esta credencial solo se puede usar como clave de seguridad de segundo factor.",webauthn_credential_already_exists:"La solicitud expiró, se canceló o el dispositivo ya está registrado. Inténtelo de nuevo o intente usar otro dispositivo.",platform_authenticator_required:"Su cuenta está configurada para usar autenticadores de plataforma, pero su dispositivo o navegador actual no admite esta función. Inténtelo de nuevo con un dispositivo o navegador compatible.",third_party_access_denied:"Acceso denegado por el proveedor de terceros. Por favor, inténtelo de nuevo."}},Ui={headlines:{error:"Une erreur s'est produite",loginEmail:"Se connecter ou créer un compte",loginEmailNoSignup:"Se connecter",loginFinished:"Connexion réussie",loginPasscode:"Entrez le code d'accès",loginPassword:"Entrez le mot de passe",registerAuthenticator:"Créer une clé d'accès",registerConfirm:"Créer un compte ?",registerPassword:"Définir un nouveau mot de passe",otpSetUp:"Configurer l'application d'authentification",profileEmails:"Adresses e-mail",profilePassword:"Mot de passe",profilePasskeys:"Clés d'accès",isPrimaryEmail:"Adresse e-mail principale",setPrimaryEmail:"Définir comme e-mail principal",createEmail:"Entrez un nouvel e-mail",createUsername:"Entrez un nouveau nom d'utilisateur",emailVerified:"Vérifié",emailUnverified:"Non vérifié",emailDelete:"Supprimer",renamePasskey:"Renommer la clé d'accès",deletePasskey:"Supprimer la clé d'accès",lastUsedAt:"Dernière utilisation",createdAt:"Créé",connectedAccounts:"Comptes connectés",deleteAccount:"Supprimer le compte",accountNotFound:"Compte introuvable",signIn:"Se connecter",signUp:"Créer un compte",selectLoginMethod:"Sélectionner la méthode de connexion",setupLoginMethod:"Configurer la méthode de connexion",lastUsed:"Vu pour la dernière fois",ipAddress:"Adresse IP",revokeSession:"Révoquer la session",profileSessions:"Sessions",mfaSetUp:"Configurer MFA",securityKeySetUp:"Ajouter une clé de sécurité",securityKeyLogin:"Clé de sécurité",otpLogin:"Code d'authentification",renameSecurityKey:"Renommer la clé de sécurité",deleteSecurityKey:"Supprimer la clé de sécurité",securityKeys:"Clés de sécurité",authenticatorApp:"Application d'authentification",authenticatorAppAlreadySetUp:"L'application d'authentification est configurée",authenticatorAppNotSetUp:"Configurer l'application d'authentification",trustDevice:"Faire confiance à ce navigateur ?"},texts:{enterPasscode:'Entrez le code envoyé à "{emailAddress}".',enterPasscodeNoEmail:"Entrez le code envoyé à votre adresse e-mail principale.",setupPasskey:"Connectez-vous à votre compte facilement et en toute sécurité avec une clé d'accès. Remarque : Vos données biométriques ne sont stockées que sur vos appareils et ne seront jamais partagées avec personne.",createAccount:`Aucun compte n'existe pour "{emailAddress}". Souhaitez-vous créer un nouveau compte ?`,otpEnterVerificationCode:"Entrez le mot de passe à usage unique (OTP) obtenu depuis votre application d'authentification ci-dessous :",otpScanQRCode:"Scannez le code QR avec votre application d'authentification (comme Google Authenticator ou toute autre application TOTP). Vous pouvez également saisir manuellement la clé secrète OTP dans l'application.",otpSecretKey:"Clé secrète OTP",passwordFormatHint:"Doit contenir entre {minLength} et {maxLength} caractères.",securityKeySetUp:"Utilisez une clé de sécurité dédiée via USB, Bluetooth ou NFC, ou votre téléphone mobile. Connectez ou activez votre clé de sécurité, puis cliquez sur le bouton ci-dessous et suivez les instructions pour terminer l'inscription.",setPrimaryEmail:"Définir cette adresse e-mail pour être utilisée pour vous contacter.",isPrimaryEmail:"Cette adresse e-mail sera utilisée pour vous contacter si nécessaire.",emailVerified:"Cette adresse e-mail a été vérifiée.",emailUnverified:"Cette adresse e-mail n'a pas été vérifiée.",emailDelete:"Si vous supprimez cette adresse e-mail, vous ne pourrez plus l'utiliser pour vous connecter.",renamePasskey:"Définir un nom pour la clé d'accès.",deletePasskey:"Supprimer cette clé d'accès de votre compte.",deleteAccount:"Êtes-vous sûr de vouloir supprimer ce compte ? Toutes les données seront supprimées immédiatement et ne pourront pas être récupérées.",noAccountExists:`Aucun compte n'existe pour "{emailAddress}".`,selectLoginMethodForFutureLogins:"Sélectionnez l'une des méthodes de connexion suivantes à utiliser pour les futures connexions.",howDoYouWantToLogin:"Comment souhaitez-vous vous connecter ?",mfaSetUp:"Protégez votre compte avec l'authentification multifacteur (MFA). MFA ajoute une étape supplémentaire à votre processus de connexion, garantissant que même si votre mot de passe ou compte e-mail est compromis, votre compte reste sécurisé.",securityKeyLogin:"Connectez ou activez votre clé de sécurité, puis cliquez sur le bouton ci-dessous. Une fois prêt, utilisez-la via USB, NFC ou votre téléphone mobile. Suivez les instructions pour terminer le processus de connexion.",otpLogin:"Ouvrez votre application d'authentification pour obtenir le mot de passe à usage unique (OTP). Entrez le code dans le champ ci-dessous pour terminer votre connexion.",renameSecurityKey:"Définir un nom pour la clé de sécurité.",deleteSecurityKey:"Supprimer cette clé de sécurité de votre compte.",authenticatorAppAlreadySetUp:"Votre compte est protégé par une application d'authentification qui génère des mots de passe à usage unique basés sur le temps (TOTP) pour l'authentification multifacteur.",authenticatorAppNotSetUp:"Protégez votre compte avec une application d'authentification qui génère des mots de passe à usage unique basés sur le temps (TOTP) pour l'authentification multifacteur.",trustDevice:"Si vous faites confiance à ce navigateur, vous n'aurez pas besoin de saisir votre OTP (mot de passe à usage unique) ou d'utiliser votre clé de sécurité pour l'authentification multifacteur (MFA) la prochaine fois que vous vous connecterez."},labels:{or:"ou",no:"non",yes:"oui",email:"E-mail",continue:"Continuer",copied:"copié",skip:"Ignorer",save:"Enregistrer",password:"Mot de passe",passkey:"Clé d'accès",passcode:"Code d'accès",signInPassword:"Se connecter avec mot de passe",signInPasscode:"Se connecter avec code",forgotYourPassword:"Mot de passe oublié ?",back:"Retour",signInPasskey:"Se connecter avec clé d'accès",registerAuthenticator:"Créer une clé d'accès",signIn:"Se connecter",signUp:"Créer un compte",sendNewPasscode:"Envoyer un nouveau code",passwordRetryAfter:"Réessayer dans {passwordRetryAfter}",passcodeResendAfter:"Demander un nouveau code dans {passcodeResendAfter}",unverifiedEmail:"non vérifié",primaryEmail:"principal",setAsPrimaryEmail:"Définir comme principal",verify:"Vérifier",delete:"Supprimer",newEmailAddress:"Nouvelle adresse e-mail",newPassword:"Nouveau mot de passe",rename:"Renommer",newPasskeyName:"Nouveau nom de clé d'accès",addEmail:"Ajouter un e-mail",createPasskey:"Créer une clé d'accès",webauthnUnsupported:"Les clés d'accès ne sont pas compatibles avec votre navigateur",signInWith:"Se connecter avec {provider}",deleteAccount:"Oui, supprimer ce compte.",emailOrUsername:"E-mail ou nom d'utilisateur",username:"Nom d'utilisateur",optional:"optionnel",dontHaveAnAccount:"Vous n'avez pas de compte ?",alreadyHaveAnAccount:"Vous avez déjà un compte ?",changeUsername:"Changer le nom d'utilisateur",setUsername:"Définir le nom d'utilisateur",changePassword:"Changer le mot de passe",setPassword:"Définir le mot de passe",revoke:"Révoquer",currentSession:"Session actuelle",authenticatorApp:"Application d'authentification",securityKey:"Clé de sécurité",securityKeyUse:"Utiliser la clé de sécurité",newSecurityKeyName:"Nouveau nom de clé de sécurité",createSecurityKey:"Ajouter une clé de sécurité",authenticatorAppManage:"Gérer l'application d'authentification",authenticatorAppAdd:"Configurer",configured:"configuré",useAnotherMethod:"Utiliser une autre méthode",lastUsed:"Dernière utilisation",trustDevice:"Faire confiance à ce navigateur",staySignedIn:"Rester connecté"},errors:{somethingWentWrong:"Une erreur technique s'est produite. Veuillez réessayer plus tard.",requestTimeout:"La demande a expiré.",invalidPassword:"E-mail ou mot de passe incorrect.",invalidPasscode:"Le code fourni n'est pas correct.",passcodeAttemptsReached:"Le code a été saisi incorrectement trop de fois. Veuillez demander un nouveau code.",tooManyRequests:"Trop de demandes ont été effectuées. Veuillez attendre avant de répéter l'opération demandée.",unauthorized:"Votre session a expiré. Veuillez vous reconnecter.",invalidWebauthnCredential:"Cette clé d'accès ne peut plus être utilisée.",passcodeExpired:"Le code a expiré. Veuillez en demander un nouveau.",userVerification:"Une vérification de l'utilisateur est requise. Assurez-vous que votre dispositif d'authentification est protégé par un code PIN ou une biométrie.",emailAddressAlreadyExistsError:"L'adresse e-mail existe déjà.",maxNumOfEmailAddressesReached:"Impossible d'ajouter plus d'adresses e-mail.",thirdPartyAccessDenied:"Accès refusé. La demande a été annulée par l'utilisateur ou le fournisseur a refusé l'accès pour d'autres raisons.",thirdPartyMultipleAccounts:"Impossible d'identifier le compte. L'adresse e-mail est utilisée par plusieurs comptes.",thirdPartyUnverifiedEmail:"Une vérification de l'e-mail est requise. Veuillez vérifier l'adresse e-mail utilisée avec votre fournisseur.",signupDisabled:"L'inscription de comptes est désactivée.",handlerNotFoundError:"L'étape actuelle de votre processus n'est pas compatible avec cette version de l'application. Réessayez plus tard ou contactez le support si le problème persiste."},flowErrors:{technical_error:"Une erreur technique s'est produite. Veuillez réessayer plus tard.",flow_expired_error:"La session a expiré, cliquez sur le bouton pour redémarrer.",value_invalid_error:"La valeur saisie n'est pas valide.",passcode_invalid:"Le code fourni n'est pas correct.",passkey_invalid:"Cette clé d'accès ne peut plus être utilisée.",passcode_max_attempts_reached:"Le code a été saisi incorrectement trop de fois. Veuillez demander un nouveau code.",rate_limit_exceeded:"Trop de demandes ont été effectuées. Veuillez attendre avant de répéter l'opération demandée.",unknown_username_error:"Le nom d'utilisateur est inconnu.",unknown_email_error:"L'adresse e-mail est inconnue.",username_already_exists:"Le nom d'utilisateur est déjà utilisé.",invalid_username_error:"Le nom d'utilisateur ne doit contenir que des lettres, des chiffres et des traits de soulignement.",email_already_exists:"L'e-mail est déjà utilisé.",not_found:"La ressource demandée n'a pas été trouvée.",operation_not_permitted_error:"L'opération n'est pas autorisée.",flow_discontinuity_error:"Le processus ne peut pas continuer en raison de la configuration de l'utilisateur ou du fournisseur.",form_data_invalid_error:"Les données du formulaire soumises contiennent des erreurs.",unauthorized:"Votre session a expiré. Veuillez vous reconnecter.",value_missing_error:"La valeur est manquante.",value_too_long_error:"La valeur est trop longue.",value_too_short_error:"La valeur est trop courte.",webauthn_credential_invalid_mfa_only:"Cette credential ne peut être utilisée que comme clé de sécurité de second facteur.",webauthn_credential_already_exists:"La demande a expiré, a été annulée ou l'appareil est déjà enregistré. Réessayez ou essayez d'utiliser un autre appareil.",platform_authenticator_required:"Votre compte est configuré pour utiliser des authentificateurs de plateforme, mais votre appareil ou navigateur actuel ne prend pas en charge cette fonctionnalité. Réessayez avec un appareil ou navigateur compatible.",third_party_access_denied:"Accès refusé par le fournisseur tiers. Veuillez réessayer."}},Ni={headlines:{error:"Ocorreu um erro",loginEmail:"Entrar ou criar conta",loginEmailNoSignup:"Entrar",loginFinished:"Login bem-sucedido",loginPasscode:"Digite o código de acesso",loginPassword:"Digite a senha",registerAuthenticator:"Criar uma chave de acesso",registerConfirm:"Criar conta?",registerPassword:"Definir nova senha",otpSetUp:"Configurar aplicativo de autenticação",profileEmails:"Endereços de e-mail",profilePassword:"Senha",profilePasskeys:"Chaves de acesso",isPrimaryEmail:"Endereço de e-mail principal",setPrimaryEmail:"Definir e-mail principal",createEmail:"Digite um novo e-mail",createUsername:"Digite um novo nome de usuário",emailVerified:"Verificado",emailUnverified:"Não verificado",emailDelete:"Excluir",renamePasskey:"Renomear chave de acesso",deletePasskey:"Excluir chave de acesso",lastUsedAt:"Último uso",createdAt:"Criado",connectedAccounts:"Contas conectadas",deleteAccount:"Excluir conta",accountNotFound:"Conta não encontrada",signIn:"Entrar",signUp:"Criar conta",selectLoginMethod:"Selecionar método de login",setupLoginMethod:"Configurar método de login",lastUsed:"Visto pela última vez",ipAddress:"Endereço IP",revokeSession:"Revogar sessão",profileSessions:"Sessões",mfaSetUp:"Configurar MFA",securityKeySetUp:"Adicionar chave de segurança",securityKeyLogin:"Chave de segurança",otpLogin:"Código de autenticação",renameSecurityKey:"Renomear chave de segurança",deleteSecurityKey:"Excluir chave de segurança",securityKeys:"Chaves de segurança",authenticatorApp:"Aplicativo de autenticação",authenticatorAppAlreadySetUp:"O aplicativo de autenticação está configurado",authenticatorAppNotSetUp:"Configurar aplicativo de autenticação",trustDevice:"Confiar neste navegador?"},texts:{enterPasscode:'Digite o código enviado para "{emailAddress}".',enterPasscodeNoEmail:"Digite o código enviado para seu endereço de e-mail principal.",setupPasskey:"Faça login na sua conta de forma fácil e segura com uma chave de acesso. Nota: Seus dados biométricos são armazenados apenas em seus dispositivos e nunca serão compartilhados com ninguém.",createAccount:'Não existe uma conta para "{emailAddress}". Deseja criar uma nova conta?',otpEnterVerificationCode:"Digite a senha de uso único (OTP) obtida do seu aplicativo de autenticação abaixo:",otpScanQRCode:"Digitalize o código QR usando seu aplicativo de autenticação (como Google Authenticator ou qualquer outro aplicativo TOTP). Alternativamente, você pode inserir manualmente a chave secreta OTP no aplicativo.",otpSecretKey:"Chave secreta OTP",passwordFormatHint:"Deve ter entre {minLength} e {maxLength} caracteres.",securityKeySetUp:"Use uma chave de segurança dedicada via USB, Bluetooth ou NFC, ou seu telefone celular. Conecte ou ative sua chave de segurança, depois clique no botão abaixo e siga as instruções para concluir o registro.",setPrimaryEmail:"Defina este endereço de e-mail para ser usado para entrar em contato com você.",isPrimaryEmail:"Este endereço de e-mail será usado para entrar em contato com você, se necessário.",emailVerified:"Este endereço de e-mail foi verificado.",emailUnverified:"Este endereço de e-mail não foi verificado.",emailDelete:"Se você excluir este endereço de e-mail, não poderá mais usá-lo para fazer login.",renamePasskey:"Definir um nome para a chave de acesso.",deletePasskey:"Excluir esta chave de acesso da sua conta.",deleteAccount:"Tem certeza de que deseja excluir esta conta? Todos os dados serão excluídos imediatamente e não poderão ser recuperados.",noAccountExists:'Não existe uma conta para "{emailAddress}".',selectLoginMethodForFutureLogins:"Selecione um dos seguintes métodos de login para usar em futuros logins.",howDoYouWantToLogin:"Como você deseja fazer login?",mfaSetUp:"Proteja sua conta com autenticação multifator (MFA). MFA adiciona uma etapa extra ao seu processo de login, garantindo que, mesmo se sua senha ou conta de e-mail for comprometida, sua conta permaneça segura.",securityKeyLogin:"Conecte ou ative sua chave de segurança, depois clique no botão abaixo. Uma vez pronto, use-a via USB, NFC ou seu telefone celular. Siga as instruções para concluir o processo de login.",otpLogin:"Abra seu aplicativo de autenticação para obter a senha de uso único (OTP). Digite o código no campo abaixo para concluir seu login.",renameSecurityKey:"Definir um nome para a chave de segurança.",deleteSecurityKey:"Excluir esta chave de segurança da sua conta.",authenticatorAppAlreadySetUp:"Sua conta está protegida com um aplicativo de autenticação que gera senhas de uso único baseadas em tempo (TOTP) para autenticação multifator.",authenticatorAppNotSetUp:"Proteja sua conta com um aplicativo de autenticação que gera senhas de uso único baseadas em tempo (TOTP) para autenticação multifator.",trustDevice:"Se você confiar neste navegador, não precisará inserir seu OTP (senha de uso único) ou usar sua chave de segurança para autenticação multifator (MFA) na próxima vez que fizer login."},labels:{or:"ou",no:"não",yes:"sim",email:"E-mail",continue:"Continuar",copied:"copiado",skip:"Pular",save:"Salvar",password:"Senha",passkey:"Chave de acesso",passcode:"Código de acesso",signInPassword:"Entrar com senha",signInPasscode:"Entrar com código",forgotYourPassword:"Esqueceu sua senha?",back:"Voltar",signInPasskey:"Entrar com chave de acesso",registerAuthenticator:"Criar uma chave de acesso",signIn:"Entrar",signUp:"Criar conta",sendNewPasscode:"Enviar novo código",passwordRetryAfter:"Tentar novamente em {passwordRetryAfter}",passcodeResendAfter:"Solicitar novo código em {passcodeResendAfter}",unverifiedEmail:"não verificado",primaryEmail:"principal",setAsPrimaryEmail:"Definir como principal",verify:"Verificar",delete:"Excluir",newEmailAddress:"Novo endereço de e-mail",newPassword:"Nova senha",rename:"Renomear",newPasskeyName:"Novo nome de chave de acesso",addEmail:"Adicionar e-mail",createPasskey:"Criar uma chave de acesso",webauthnUnsupported:"As chaves de acesso não são compatíveis com seu navegador",signInWith:"Entrar com {provider}",deleteAccount:"Sim, excluir esta conta.",emailOrUsername:"E-mail ou nome de usuário",username:"Nome de usuário",optional:"opcional",dontHaveAnAccount:"Não tem uma conta?",alreadyHaveAnAccount:"Já tem uma conta?",changeUsername:"Alterar nome de usuário",setUsername:"Definir nome de usuário",changePassword:"Alterar senha",setPassword:"Definir senha",revoke:"Revogar",currentSession:"Sessão atual",authenticatorApp:"Aplicativo de autenticação",securityKey:"Chave de segurança",securityKeyUse:"Usar chave de segurança",newSecurityKeyName:"Novo nome de chave de segurança",createSecurityKey:"Adicionar uma chave de segurança",authenticatorAppManage:"Gerenciar aplicativo de autenticação",authenticatorAppAdd:"Configurar",configured:"configurado",useAnotherMethod:"Usar outro método",lastUsed:"Último uso",trustDevice:"Confiar neste navegador",staySignedIn:"Permanecer conectado"},errors:{somethingWentWrong:"Ocorreu um erro técnico. Por favor, tente novamente mais tarde.",requestTimeout:"A solicitação expirou.",invalidPassword:"E-mail ou senha incorretos.",invalidPasscode:"O código fornecido não está correto.",passcodeAttemptsReached:"O código foi inserido incorretamente muitas vezes. Por favor, solicite um novo código.",tooManyRequests:"Muitas solicitações foram feitas. Por favor, aguarde antes de repetir a operação solicitada.",unauthorized:"Sua sessão expirou. Por favor, faça login novamente.",invalidWebauthnCredential:"Esta chave de acesso não pode mais ser usada.",passcodeExpired:"O código expirou. Por favor, solicite um novo.",userVerification:"É necessária verificação do usuário. Certifique-se de que seu dispositivo de autenticação esteja protegido com um PIN ou biometria.",emailAddressAlreadyExistsError:"O endereço de e-mail já existe.",maxNumOfEmailAddressesReached:"Não é possível adicionar mais endereços de e-mail.",thirdPartyAccessDenied:"Acesso negado. A solicitação foi cancelada pelo usuário ou o provedor negou o acesso por outros motivos.",thirdPartyMultipleAccounts:"Não é possível identificar a conta. O endereço de e-mail é usado por várias contas.",thirdPartyUnverifiedEmail:"É necessária verificação de e-mail. Por favor, verifique o endereço de e-mail usado com seu provedor.",signupDisabled:"O registro de contas está desativado.",handlerNotFoundError:"A etapa atual em seu processo não é compatível com esta versão do aplicativo. Tente novamente mais tarde ou entre em contato com o suporte se o problema persistir."},flowErrors:{technical_error:"Ocorreu um erro técnico. Por favor, tente novamente mais tarde.",flow_expired_error:"A sessão expirou, clique no botão para reiniciar.",value_invalid_error:"O valor inserido não é válido.",passcode_invalid:"O código fornecido não está correto.",passkey_invalid:"Esta chave de acesso não pode mais ser usada.",passcode_max_attempts_reached:"O código foi inserido incorretamente muitas vezes. Por favor, solicite um novo código.",rate_limit_exceeded:"Muitas solicitações foram feitas. Por favor, aguarde antes de repetir a operação solicitada.",unknown_username_error:"O nome de usuário é desconhecido.",unknown_email_error:"O endereço de e-mail é desconhecido.",username_already_exists:"O nome de usuário já está em uso.",invalid_username_error:"O nome de usuário deve conter apenas letras, números e sublinhados.",email_already_exists:"O e-mail já está em uso.",not_found:"O recurso solicitado não foi encontrado.",operation_not_permitted_error:"A operação não é permitida.",flow_discontinuity_error:"O processo não pode continuar devido à configuração do usuário ou do provedor.",form_data_invalid_error:"Os dados do formulário enviados contêm erros.",unauthorized:"Sua sessão expirou. Por favor, faça login novamente.",value_missing_error:"O valor está faltando.",value_too_long_error:"O valor é muito longo.",value_too_short_error:"O valor é muito curto.",webauthn_credential_invalid_mfa_only:"Esta credencial só pode ser usada como chave de segurança de segundo fator.",webauthn_credential_already_exists:"A solicitação expirou, foi cancelada ou o dispositivo já está registrado. Tente novamente ou tente usar outro dispositivo.",platform_authenticator_required:"Sua conta está configurada para usar autenticadores de plataforma, mas seu dispositivo ou navegador atual não suporta esse recurso. Tente novamente com um dispositivo ou navegador compatível.",third_party_access_denied:"Acesso negado pelo provedor de terceiros. Por favor, tente novamente."}},ko={en:{logIn:"Log in",logOut:"Log Out",myHotAccount:"My HOT Account",connectToOsm:"Connect to OSM",connectedToOsm:"Connected to OSM",connectedToOpenStreetMap:"Connected to OpenStreetMap",connectingToOpenStreetMap:"Connecting to OpenStreetMap...",checkingOsmConnection:"Checking OSM connection...",osmRequired:"OSM Required",osmRequiredText:"This endpoint requires OSM connection.",connectOsmAccount:"Connect OSM Account",openAccountMenu:"Open account menu",connectedToOsmAs:"Connected to OSM as",osmConnectionRequired:"OSM connection required"},es:{logIn:"Iniciar sesión",logOut:"Cerrar sesión",myHotAccount:"Mi cuenta HOT",connectToOsm:"Conectar a OSM",connectedToOsm:"Conectado a OSM",connectedToOpenStreetMap:"Conectado a OpenStreetMap",connectingToOpenStreetMap:"Conectando a OpenStreetMap...",checkingOsmConnection:"Verificando conexión OSM...",osmRequired:"OSM Requerido",osmRequiredText:"Este endpoint requiere conexión OSM.",connectOsmAccount:"Conectar cuenta OSM",openAccountMenu:"Abrir menú de cuenta",connectedToOsmAs:"Conectado a OSM como",osmConnectionRequired:"Se requiere conexión OSM"},fr:{logIn:"Se connecter",logOut:"Se déconnecter",myHotAccount:"Mon compte HOT",connectToOsm:"Connecter à OSM",connectedToOsm:"Connecté à OSM",connectedToOpenStreetMap:"Connecté à OpenStreetMap",connectingToOpenStreetMap:"Connexion à OpenStreetMap...",checkingOsmConnection:"Vérification de la connexion OSM...",osmRequired:"OSM requis",osmRequiredText:"Ce point de terminaison nécessite une connexion OSM.",connectOsmAccount:"Connecter le compte OSM",openAccountMenu:"Ouvrir le menu du compte",connectedToOsmAs:"Connecté à OSM en tant que",osmConnectionRequired:"Connexion OSM requise"},pt:{logIn:"Entrar",logOut:"Sair",myHotAccount:"Minha conta HOT",connectToOsm:"Conectar ao OSM",connectedToOsm:"Conectado ao OSM",connectedToOpenStreetMap:"Conectado ao OpenStreetMap",connectingToOpenStreetMap:"Conectando ao OpenStreetMap...",checkingOsmConnection:"Verificando conexão OSM...",osmRequired:"OSM Necessário",osmRequiredText:"Este endpoint requer conexão OSM.",connectOsmAccount:"Conectar conta OSM",openAccountMenu:"Abrir menu da conta",connectedToOsmAs:"Conectado ao OSM como",osmConnectionRequired:"Conexão OSM necessária"}},fs="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20fill='currentColor'%20class='bi%20bi-person-vcard'%20viewBox='0%200%2016%2016'%3e%3cpath%20d='M5%208a2%202%200%201%200%200-4%202%202%200%200%200%200%204m4-2.5a.5.5%200%200%201%20.5-.5h4a.5.5%200%200%201%200%201h-4a.5.5%200%200%201-.5-.5M9%208a.5.5%200%200%201%20.5-.5h4a.5.5%200%200%201%200%201h-4A.5.5%200%200%201%209%208m1%202.5a.5.5%200%200%201%20.5-.5h3a.5.5%200%200%201%200%201h-3a.5.5%200%200%201-.5-.5'/%3e%3cpath%20d='M2%202a2%202%200%200%200-2%202v8a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2V4a2%202%200%200%200-2-2zM1%204a1%201%200%200%201%201-1h12a1%201%200%200%201%201%201v8a1%201%200%200%201-1%201H8.96q.04-.245.04-.5C9%2010.567%207.21%209%205%209c-2.086%200-3.8%201.398-3.984%203.181A1%201%200%200%201%201%2012z'/%3e%3c/svg%3e",gs="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20fill='currentColor'%20class='bi%20bi-box-arrow-right'%20viewBox='0%200%2016%2016'%3e%3cpath%20fill-rule='evenodd'%20d='M10%2012.5a.5.5%200%200%201-.5.5h-8a.5.5%200%200%201-.5-.5v-9a.5.5%200%200%201%20.5-.5h8a.5.5%200%200%201%20.5.5v2a.5.5%200%200%200%201%200v-2A1.5%201.5%200%200%200%209.5%202h-8A1.5%201.5%200%200%200%200%203.5v9A1.5%201.5%200%200%200%201.5%2014h8a1.5%201.5%200%200%200%201.5-1.5v-2a.5.5%200%200%200-1%200z'/%3e%3cpath%20fill-rule='evenodd'%20d='M15.854%208.354a.5.5%200%200%200%200-.708l-3-3a.5.5%200%200%200-.708.708L14.293%207.5H5.5a.5.5%200%200%200%200%201h8.793l-2.147%202.146a.5.5%200%200%200%20.708.708z'/%3e%3c/svg%3e",vs="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20fill='currentColor'%20class='bi%20bi-map'%20viewBox='0%200%2016%2016'%3e%3cpath%20fill-rule='evenodd'%20d='M15.817.113A.5.5%200%200%201%2016%20.5v14a.5.5%200%200%201-.402.49l-5%201a.5.5%200%200%201-.196%200L5.5%2015.01l-4.902.98A.5.5%200%200%201%200%2015.5v-14a.5.5%200%200%201%20.402-.49l5-1a.5.5%200%200%201%20.196%200L10.5.99l4.902-.98a.5.5%200%200%201%20.415.103M10%201.91l-4-.8v12.98l4%20.8zm1%2012.98%204-.8V1.11l-4%20.8zm-6-.8V1.11l-4%20.8v12.98z'/%3e%3c/svg%3e",_s="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20fill='currentColor'%20class='bi%20bi-person-check'%20viewBox='0%200%2016%2016'%3e%3cpath%20d='M12.5%2016a3.5%203.5%200%201%200%200-7%203.5%203.5%200%200%200%200%207m1.679-4.493-1.335%202.226a.75.75%200%200%201-1.174.144l-.774-.773a.5.5%200%200%201%20.708-.708l.547.548%201.17-1.951a.5.5%200%201%201%20.858.514M11%205a3%203%200%201%201-6%200%203%203%200%200%201%206%200M8%207a2%202%200%201%200%200-4%202%202%200%200%200%200%204'/%3e%3cpath%20d='M8.256%2014a4.5%204.5%200%200%201-.229-1.004H3c.001-.246.154-.986.832-1.664C4.484%2010.68%205.711%2010%208%2010q.39%200%20.74.025c.226-.341.496-.65.804-.918Q8.844%209.002%208%209c-5%200-6%203-6%204s1%201%201%201z'/%3e%3c/svg%3e";var ys=Object.defineProperty,bs=Object.getOwnPropertyDescriptor,ue=(o,e,t,n)=>{for(var i=n>1?void 0:n?bs(e,t):e,a=o.length-1,s;a>=0;a--)(s=o[a])&&(i=(n?s(e,t,i):s(i))||i);return n&&i&&ys(e,t,i),i};let Mi=!1,Vt=null;async function ks(o){if(!Mi)return Vt||(Vt=(async()=>{console.log("[hanko-auth] Pre-registering Hanko translations...");try{await ji(o,{enablePasskeys:!1,hidePasskeyButtonOnLogin:!0,translations:{en:Ti,es:$i,fr:Ui,pt:Ni},fallbackLanguage:"en"}),Mi=!0,console.log("[hanko-auth] Hanko registration complete")}catch(e){throw console.error("[hanko-auth] Hanko registration failed:",e),Vt=null,e}})(),Vt)}const ne={primary:null,user:null,osmConnected:!1,osmData:null,loading:!0,hanko:null,initialized:!1,instances:new Set,profileDisplayName:"",hankoReady:!1},Ri=o=>`hanko-verified-${o}`,Hi=o=>`hanko-onboarding-${o}`;K.HankoAuth=class extends xt{constructor(){super(...arguments),this.hankoUrlAttr="",this.basePath="",this.authPath="/api/auth/osm",this.osmRequired=!1,this.osmScopes="read_prefs",this.showProfile=!1,this.redirectAfterLogin="",this.autoConnect=!1,this.verifySession=!1,this.redirectAfterLogout="",this.displayNameAttr="",this.mappingCheckUrl="",this.appId="",this.loginUrl="",this.lang="en",this.buttonVariant="plain",this.buttonColor="primary",this.user=null,this.osmConnected=!1,this.osmData=null,this.osmLoading=!1,this.loading=!0,this.error=null,this.hankoReady=!1,this.profileDisplayName="",this.hasAppMapping=!1,this.userProfileLanguage=null,this.isOpen=!1,this.handleOutsideClick=e=>{this.contains(e.target)||this.closeDropdown()},this._trailingSlashCache={},this._debugMode=!1,this._lastSessionId=null,this._hanko=null,this._isPrimary=!1,this._handleVisibilityChange=()=>{this._isPrimary&&!document.hidden&&!this.showProfile&&!this.user&&(this.log("👁️ Page visible, re-checking session..."),this.checkSession())},this._handleWindowFocus=()=>{this._isPrimary&&!this.showProfile&&!this.user&&(this.log("🎯 Window focused, re-checking session..."),this.checkSession())},this._handleExternalLogin=e=>{var n;if(!this._isPrimary)return;const t=e;!this.showProfile&&!this.user&&((n=t.detail)!=null&&n.user)&&(this.log("🔔 External login detected, updating user state..."),this.user=t.detail.user,this._broadcastState(),this.osmRequired&&this.checkOSMConnection())},this._currentHankoAuthElement=null}toggleDropdown(){this.isOpen=!this.isOpen,this.isOpen?setTimeout(()=>{document.addEventListener("click",this.handleOutsideClick)},0):document.removeEventListener("click",this.handleOutsideClick)}closeDropdown(){this.isOpen=!1,document.removeEventListener("click",this.handleOutsideClick)}get hankoUrl(){if(this.hankoUrlAttr)return this.hankoUrlAttr;const e=document.querySelector('meta[name="hanko-url"]');if(e){const n=e.getAttribute("content");if(n)return this.log("🔍 hanko-url auto-detected from <meta> tag:",n),n}if(window.HANKO_URL)return this.log("🔍 hanko-url auto-detected from window.HANKO_URL:",window.HANKO_URL),window.HANKO_URL;const t=window.location.origin;return this.log("🔍 hanko-url auto-detected from window.location.origin:",t),t}connectedCallback(){super.connectedCallback(),this._debugMode=this._checkDebugMode(),this.log("🔌 hanko-auth connectedCallback called"),this.injectHotStyles(),ne.instances.add(this),document.addEventListener("visibilitychange",this._handleVisibilityChange),window.addEventListener("focus",this._handleWindowFocus),document.addEventListener("hanko-login",this._handleExternalLogin)}firstUpdated(){this.log("🔌 hanko-auth firstUpdated called"),this.log(" hankoUrl:",this.hankoUrl),this.log(" basePath:",this.basePath),ne.initialized||ne.primary?(this.log("🔄 Using shared state from primary instance"),this._syncFromShared(),this._isPrimary=!1):(this.log("👑 This is the primary instance"),this._isPrimary=!0,ne.primary=this,ne.initialized=!0,this.init())}disconnectedCallback(){if(super.disconnectedCallback(),document.removeEventListener("visibilitychange",this._handleVisibilityChange),window.removeEventListener("focus",this._handleWindowFocus),document.removeEventListener("hanko-login",this._handleExternalLogin),document.removeEventListener("click",this.handleOutsideClick),ne.instances.delete(this),this._isPrimary&&ne.instances.size>0){const e=ne.instances.values().next().value;e&&(this.log("👑 Promoting new primary instance"),e._isPrimary=!0,ne.primary=e)}ne.instances.size===0&&(ne.initialized=!1,ne.primary=null)}_syncFromShared(){this.user!==ne.user&&(this.user=ne.user),this.osmConnected!==ne.osmConnected&&(this.osmConnected=ne.osmConnected),this.osmData!==ne.osmData&&(this.osmData=ne.osmData),this.loading!==ne.loading&&(this.loading=ne.loading),this._hanko!==ne.hanko&&(this._hanko=ne.hanko),this.profileDisplayName!==ne.profileDisplayName&&(this.profileDisplayName=ne.profileDisplayName),this.hankoReady!==ne.hankoReady&&(this.hankoReady=ne.hankoReady)}_broadcastState(){ne.user=this.user,ne.osmConnected=this.osmConnected,ne.osmData=this.osmData,ne.loading=this.loading,ne.profileDisplayName=this.profileDisplayName,ne.hankoReady=this.hankoReady,ne.instances.forEach(e=>{e!==this&&e._syncFromShared()})}_checkDebugMode(){if(new URLSearchParams(window.location.search).get("debug")==="true")return!0;try{return localStorage.getItem("hanko-auth-debug")==="true"}catch{return!1}}log(...e){this._debugMode&&console.log(...e)}t(e){const t=this.user&&this.userProfileLanguage?this.userProfileLanguage:this.lang;return(ko[t]||ko.en)[e]||ko.en[e]||e}warn(...e){console.warn(...e)}logError(...e){console.error(...e)}getBasePath(){return this.basePath?(this.log("🔍 getBasePath() using basePath:",this.basePath),this.basePath):(this.log("🔍 getBasePath() using default: empty string"),"")}addTrailingSlash(e,t){const n=this._trailingSlashCache[t];return n!==void 0&&n&&!e.endsWith("/")?e+"/":e}injectHotStyles(){[{id:"hot-design-system",href:"https://cdn.jsdelivr.net/npm/@hotosm/ui-design@latest/dist/hot.css"},{id:"google-font-archivo",href:"https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700&display=swap"}].forEach(({id:t,href:n})=>{if(!document.getElementById(t)){const i=document.createElement("link");i.rel="stylesheet",i.href=n,i.id=t,document.head.appendChild(i)}})}async init(){if(!this._isPrimary){this.log("⏭️ Not primary, skipping init...");return}try{this.log("Ensuring Hanko is registered with translations for: en, es, fr, pt"),this.log("Current lang prop:",this.lang),await ks(this.hankoUrl),this.hankoReady=!0,this._broadcastState();const{Hanko:e}=await Promise.resolve().then(()=>hs),t=window.location.hostname,n=t==="localhost"||t==="127.0.0.1",i=t.split("."),a=i.length>=2?`.${i.slice(-2).join(".")}`:t,s=n?{}:{cookieDomain:a,cookieName:"hanko",cookieSameSite:"lax"};this._hanko=new e(this.hankoUrl,s),ne.hanko=this._hanko,this._hanko.onSessionExpired(()=>{this.log("🕒 Hanko session expired event received"),this.handleSessionExpired()}),this._hanko.onUserLoggedOut(()=>{this.log("🚪 Hanko user logged out event received"),this.handleUserLoggedOut()}),await this.checkSession(),this.user&&(this.osmRequired&&await this.checkOSMConnection(),await this.fetchProfileDisplayName()),this.loading=!1,this._broadcastState(),this.setupEventListeners()}catch(e){this.logError("Failed to initialize hanko-auth:",e),this.error=e.message,this.loading=!1,this._broadcastState()}}async checkSession(){if(this.log("🔍 Checking for existing Hanko session..."),!this._hanko){this.log("⚠️ Hanko instance not initialized yet");return}try{this.log("📡 Checking session validity via cookie...");try{const e=await fetch(`${this.hankoUrl}/sessions/validate`,{method:"GET",credentials:"include",headers:{"Content-Type":"application/json"}});if(e.ok){const t=await e.json();if(t.is_valid===!1){this.log("ℹ️ Session validation returned is_valid:false - no valid session");return}this.log("✅ Valid Hanko session found via cookie"),this.log("📋 Session data:",t);try{const n=await fetch(`${this.hankoUrl}/me`,{method:"GET",credentials:"include",headers:{"Content-Type":"application/json"}});let i=!0;if(n.ok){const a=await n.json();this.log("👤 User data retrieved from /me:",a),a.email?(this.user={id:a.user_id||a.id,email:a.email,username:a.username||null,emailVerified:a.email_verified||a.verified||!1},i=!1):this.log("⚠️ /me has no email, will use SDK fallback")}if(i){this.log("🔄 Using SDK to get user with email");const a=await this._hanko.user.getCurrent();this.user={id:a.id,email:a.email,username:a.username,emailVerified:a.email_verified||!1}}}catch(n){this.log("⚠️ Failed to get user data:",n),t.user_id&&(this.user={id:t.user_id,email:t.email||null,username:null,emailVerified:!1})}if(this.user){const n=Ri(window.location.hostname),i=sessionStorage.getItem(n);if(this.verifySession&&this.redirectAfterLogin&&!i){this.log("🔄 verify-session enabled, redirecting to callback for app verification..."),sessionStorage.setItem(n,"true"),window.location.href=this.redirectAfterLogin;return}if(!await this.checkAppMapping())return;this.dispatchEvent(new CustomEvent("hanko-login",{detail:{user:this.user},bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent("auth-complete",{bubbles:!0,composed:!0})),this.osmRequired&&await this.checkOSMConnection(),await this.fetchProfileDisplayName(),this.osmRequired&&this.autoConnect&&!this.osmConnected&&(this.log("🔄 Auto-connecting to OSM (from existing session)..."),this.handleOSMConnect())}}else this.log("ℹ️ No valid session cookie found - user needs to login")}catch(e){this.log("⚠️ Session validation failed:",e),this.log("ℹ️ No valid session - user needs to login")}}catch(e){this.log("⚠️ Session check error:",e),this.log("ℹ️ No existing session - user needs to login")}finally{this._isPrimary&&this._broadcastState()}}async checkOSMConnection(){if(!this.osmRequired){this.log("⏭️ OSM not required, skipping connection check");return}if(this.osmConnected){this.log("⏭️ Already connected to OSM, skipping check");return}const e=this.loading;e||(this.osmLoading=!0);try{const t=this.getBasePath(),n=this.authPath,a=`${`${t}${n}/status`}`;this.log("🔍 Checking OSM connection at:",a),this.log(" basePath:",t),this.log(" authPath:",n),this.log("🍪 Current cookies:",document.cookie);const s=await fetch(a,{credentials:"include",redirect:"follow"});if(this.log("📡 OSM status response:",s.status),this.log("📡 Final URL after redirects:",s.url),this.log("📡 Response headers:",[...s.headers.entries()]),s.ok){const d=await s.text();this.log("📡 OSM raw response:",d.substring(0,200));let c;try{c=JSON.parse(d)}catch{throw this.logError("Failed to parse OSM response as JSON:",d.substring(0,500)),new Error("Invalid JSON response from OSM status endpoint")}this.log("📡 OSM status data:",c),c.connected?(this.log("✅ OSM is connected:",c.osm_username),this.osmConnected=!0,this.osmData=c,this.dispatchEvent(new CustomEvent("osm-connected",{detail:{osmData:c},bubbles:!0,composed:!0}))):(this.log("❌ OSM is NOT connected"),this.osmConnected=!1,this.osmData=null)}}catch(t){this.logError("OSM connection check failed:",t)}finally{e||(this.osmLoading=!1),this._isPrimary&&this._broadcastState()}}async checkAppMapping(){if(!this.mappingCheckUrl||!this.user)return!0;const e=Hi(window.location.hostname);if(sessionStorage.getItem(e))return this.log("✅ Onboarding already completed this session, skipping check"),this.hasAppMapping=!0,!0;this.log("🔍 Checking app mapping at:",this.mappingCheckUrl);try{const n=await fetch(this.mappingCheckUrl,{credentials:"include"});if(n.ok){const i=await n.json();if(this.log("📡 Mapping check response:",i),i.needs_onboarding){this.log("⚠️ User needs onboarding, redirecting...");const a=encodeURIComponent(window.location.origin),s=this.appId?`onboarding=${this.appId}`:"";return window.location.href=`${this.hankoUrl}/app?${s}&return_to=${a}`,!1}return sessionStorage.setItem(e,"true"),this.hasAppMapping=!0,this.log("✅ User has app mapping, onboarding marked complete"),!0}else if(n.status===401||n.status===403){this.log("⚠️ 401/403 - User needs onboarding, redirecting...");const i=encodeURIComponent(window.location.origin),a=this.appId?`onboarding=${this.appId}`:"";return window.location.href=`${this.hankoUrl}/app?${a}&return_to=${i}`,!1}return this.log("⚠️ Unexpected status from mapping check:",n.status),!0}catch(n){return this.log("⚠️ App mapping check failed:",n),!0}}async fetchProfileDisplayName(){try{const e=`${this.hankoUrl}/api/profile/me`;this.log("👤 Fetching profile from:",e);const t=await fetch(e,{credentials:"include"});if(t.ok){const n=await t.json();this.log("👤 Profile data:",n),(n.first_name||n.last_name)&&(this.profileDisplayName=`${n.first_name||""} ${n.last_name||""}`.trim(),this.log("👤 Display name set to:",this.profileDisplayName)),n.language&&(this.userProfileLanguage=n.language,this.log("🌐 Language set from profile:",this.userProfileLanguage))}}catch(e){this.log("⚠️ Could not fetch profile:",e)}}updated(e){super.updated(e),e.has("user")&&this.user===null&&this.showProfile&&(this.log("🔄 User logged out, re-attaching event listeners..."),this._currentHankoAuthElement=null,this.setupEventListeners())}setupEventListeners(){this.updateComplete.then(()=>{var t;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("hanko-auth");if(e&&e===this._currentHankoAuthElement){this.log("⏭️ Event listeners already attached to this element");return}e&&(this._currentHankoAuthElement=e,this.log("🎯 Attaching event listeners to hanko-auth element"),e.addEventListener("onSessionCreated",n=>{var a,s;this.log("🎯 Hanko event: onSessionCreated",n.detail);const i=(s=(a=n.detail)==null?void 0:a.claims)==null?void 0:s.session_id;if(i&&this._lastSessionId===i){this.log("⏭️ Skipping duplicate session event");return}this._lastSessionId=i,this.handleHankoSuccess(n)}),e.addEventListener("hankoAuthLogout",()=>this.handleLogout()))})}async handleHankoSuccess(e){var i;if(this.log("Hanko auth success:",e.detail),!this._hanko){this.logError("Hanko instance not initialized");return}let t=!1;try{const a=new AbortController,s=setTimeout(()=>a.abort(),5e3),d=await fetch(`${this.hankoUrl}/me`,{method:"GET",credentials:"include",headers:{"Content-Type":"application/json"},signal:a.signal});if(clearTimeout(s),d.ok){const c=await d.json();this.log("👤 User data retrieved from /me:",c),c.email?(this.user={id:c.user_id||c.id,email:c.email,username:c.username||null,emailVerified:c.email_verified||c.verified||!1},t=!0):this.log("⚠️ /me has no email, will try SDK fallback")}else this.log("⚠️ /me endpoint returned non-OK status, will try SDK fallback")}catch(a){this.log("⚠️ /me endpoint fetch failed (timeout or cross-origin TLS issue):",a)}if(!t)try{this.log("🔄 Trying SDK fallback for user info...");const a=new Promise((d,c)=>setTimeout(()=>c(new Error("SDK timeout")),5e3)),s=await Promise.race([this._hanko.user.getCurrent(),a]);this.user={id:s.id,email:s.email,username:s.username,emailVerified:s.email_verified||!1},t=!0,this.log("✅ User info retrieved via SDK fallback")}catch(a){this.log("⚠️ SDK fallback failed, trying JWT claims:",a);try{const s=(i=e.detail)==null?void 0:i.claims;if(s!=null&&s.sub)this.user={id:s.sub,email:s.email||null,username:null,emailVerified:s.email_verified||!1},t=!0,this.log("✅ User info extracted from JWT claims");else{this.logError("No user claims available in event"),this.user=null;return}}catch(s){this.logError("Failed to extract user info from claims:",s),this.user=null;return}}if(this.log("✅ User state updated:",this.user),this._isPrimary&&this._broadcastState(),this.dispatchEvent(new CustomEvent("hanko-login",{detail:{user:this.user},bubbles:!0,composed:!0})),this.osmRequired&&await this.checkOSMConnection(),await this.fetchProfileDisplayName(),this.osmRequired&&this.autoConnect&&!this.osmConnected){this.log("🔄 Auto-connecting to OSM..."),this.handleOSMConnect();return}const n=!this.osmRequired||this.osmConnected;this.log("🔄 Checking redirect-after-login:",this.redirectAfterLogin,"showProfile:",this.showProfile,"canRedirect:",n),n?(this.dispatchEvent(new CustomEvent("auth-complete",{bubbles:!0,composed:!0})),this.redirectAfterLogin?(this.log("✅ Redirecting to:",this.redirectAfterLogin),window.location.href=this.redirectAfterLogin):this.log("❌ No redirect (redirectAfterLogin not set)")):this.log("⏸️ Waiting for OSM connection before redirect")}async handleOSMConnect(){const e=this.osmScopes.split(" ").join("+"),t=this.getBasePath(),n=this.authPath,a=`${`${t}${n}/login`}?scopes=${e}`;this.log("🔗 OSM Connect clicked!"),this.log(" basePath:",t),this.log(" authPath:",n),this.log(" Login path:",a),this.log(" Fetching redirect URL from backend...");try{const s=await fetch(a,{method:"GET",credentials:"include",redirect:"manual"});if(this.log(" Response status:",s.status),this.log(" Response type:",s.type),s.status===0||s.type==="opaqueredirect"){const d=s.headers.get("Location")||s.url;this.log(" ✅ Got redirect URL:",d),window.location.href=d}else if(s.status>=300&&s.status<400){const d=s.headers.get("Location");this.log(" ✅ Got redirect URL from header:",d),d&&(window.location.href=d)}else{this.logError(" ❌ Unexpected response:",s.status);const d=await s.text();this.logError(" Response body:",d.substring(0,200))}}catch(s){this.logError(" ❌ Failed to fetch redirect URL:",s)}}async handleLogout(){this.log("🚪 Logout initiated"),this.log("📊 Current state before logout:",{user:this.user,osmConnected:this.osmConnected,osmData:this.osmData}),this.log("🍪 Cookies before logout:",document.cookie);try{const e=this.getBasePath(),t=this.authPath,n=`${e}${t}/disconnect`,i=n.startsWith("http")?n:`${window.location.origin}${n}`;this.log("🔌 Calling OSM disconnect:",i);const a=await fetch(i,{method:"POST",credentials:"include"});this.log("📡 Disconnect response status:",a.status);const s=await a.json();this.log("📡 Disconnect response data:",s),this.log("✅ OSM disconnected")}catch(e){this.logError("❌ OSM disconnect failed:",e)}if(this._hanko)try{await this._hanko.user.logout(),this.log("✅ Hanko logout successful")}catch(e){this.logError("Hanko logout failed:",e)}if(this._clearAuthState(),this.log("✅ Logout complete - component will re-render with updated state"),this.redirectAfterLogout){const e=window.location.href.replace(/\/$/,""),t=this.redirectAfterLogout.replace(/\/$/,"");e!==t&&!e.startsWith(t+"#")?(this.log("🔄 Redirecting after logout to:",this.redirectAfterLogout),window.location.href=this.redirectAfterLogout):this.log("⏭️ Already on logout target, skipping redirect")}}_clearAuthState(){const e=window.location.hostname;document.cookie=`hanko=; path=/; domain=${e}; max-age=0`,document.cookie="hanko=; path=/; max-age=0",document.cookie=`osm_connection=; path=/; domain=${e}; max-age=0`,document.cookie="osm_connection=; path=/; max-age=0",this.log("🍪 Cookies cleared");const t=Ri(e),n=Hi(e);sessionStorage.removeItem(t),sessionStorage.removeItem(n),this.log("🔄 Session flags cleared"),this.user=null,this.osmConnected=!1,this.osmData=null,this.hasAppMapping=!1,this.userProfileLanguage=null,this._isPrimary&&this._broadcastState(),this.dispatchEvent(new CustomEvent("logout",{bubbles:!0,composed:!0}))}async handleSessionExpired(){if(this.log("🕒 Session expired event received"),this.log("📊 Current state:",{user:this.user,osmConnected:this.osmConnected,loading:this.loading}),this.loading){this.log("⏳ Still loading, ignoring session expired event during init");return}if(this.user){this.log("✅ User is logged in, ignoring stale session expired event");return}this.log("🧹 No active user - cleaning up state");try{const e=this.getBasePath(),t=this.authPath,n=`${e}${t}/disconnect`,i=n.startsWith("http")?n:`${window.location.origin}${n}`;this.log("🔌 Calling OSM disconnect (session expired):",i);const a=await fetch(i,{method:"POST",credentials:"include"});this.log("📡 Disconnect response status:",a.status);const s=await a.json();this.log("📡 Disconnect response data:",s),this.log("✅ OSM disconnected")}catch(e){this.logError("❌ OSM disconnect failed:",e)}if(this._clearAuthState(),this.log("✅ Session cleanup complete"),this.redirectAfterLogout){const e=window.location.href.replace(/\/$/,""),t=this.redirectAfterLogout.replace(/\/$/,"");e!==t&&!e.startsWith(t+"#")?(this.log("🔄 Redirecting after session expired to:",this.redirectAfterLogout),window.location.href=this.redirectAfterLogout):this.log("⏭️ Already on logout target, skipping redirect")}}handleUserLoggedOut(){this.log("🚪 User logged out in another window/tab"),this.handleSessionExpired()}handleDropdownSelect(e){const n=e.currentTarget.dataset.action;if(this.log("🎯 Dropdown item selected:",n),n==="profile"){const i=this.hankoUrl,a=this.redirectAfterLogin||window.location.origin;window.location.href=`${i}/app/profile?return_to=${encodeURIComponent(a)}`}else if(n==="connect-osm"){const s=window.location.pathname.includes("/app")?window.location.origin:window.location.href,d=this.hankoUrl;window.location.href=`${d}/app?return_to=${encodeURIComponent(s)}&osm_required=true`}else n==="logout"&&this.handleLogout();this.closeDropdown()}oldHandleDropdownSelect(e){const t=e.detail.item.value;if(this.log("🎯 Dropdown item selected:",t),t==="profile"){const n=this.redirectAfterLogin||window.location.origin,i=this.loginUrl?`${this.loginUrl}/profile`:`${this.hankoUrl}/app/profile`;window.location.href=`${i}?return_to=${encodeURIComponent(n)}`}else if(t==="connect-osm"){const a=window.location.pathname.includes("/app")?window.location.origin:window.location.href,s=this.hankoUrl;window.location.href=`${s}/app?return_to=${encodeURIComponent(a)}&osm_required=true`}else t==="logout"&&this.handleLogout()}handleSkipOSM(){this.dispatchEvent(new CustomEvent("osm-skipped")),this.dispatchEvent(new CustomEvent("auth-complete")),this.redirectAfterLogin&&(window.location.href=this.redirectAfterLogin)}render(){var e,t,n;if(this.log("🎨 RENDER - showProfile:",this.showProfile,"user:",!!this.user,"loading:",this.loading,"lang:",this.lang),this.loading)return Te`<span class="loading-placeholder"
|
|
473
473
|
><span class="loading-placeholder-text">${this.t("logIn")}</span
|
|
474
474
|
><span class="spinner-small"></span
|
|
475
475
|
></span>`;if(this.error)return Te`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hotosm/hanko-auth",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "Web component for HOTOSM SSO authentication with Hanko and OSM integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/hanko-auth.umd.js",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"scripts": {
|
|
21
21
|
"dev": "vite",
|
|
22
22
|
"build": "vite build",
|
|
23
|
+
"watch": "vite build --watch",
|
|
23
24
|
"preview": "vite preview"
|
|
24
25
|
},
|
|
25
26
|
"keywords": [
|
package/src/hanko-auth.ts
CHANGED
|
@@ -858,12 +858,35 @@ export class HankoAuth extends LitElement {
|
|
|
858
858
|
}
|
|
859
859
|
}
|
|
860
860
|
|
|
861
|
+
// Track the current hanko-auth element to detect when it changes
|
|
862
|
+
private _currentHankoAuthElement: Element | null = null;
|
|
863
|
+
|
|
864
|
+
updated(changedProperties: Map<string, any>) {
|
|
865
|
+
super.updated(changedProperties);
|
|
866
|
+
// Re-attach event listeners when user becomes null (after logout)
|
|
867
|
+
// because a new <hanko-auth> element is created
|
|
868
|
+
if (changedProperties.has("user") && this.user === null && this.showProfile) {
|
|
869
|
+
this.log("🔄 User logged out, re-attaching event listeners...");
|
|
870
|
+
this._currentHankoAuthElement = null;
|
|
871
|
+
this.setupEventListeners();
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
|
|
861
875
|
private setupEventListeners() {
|
|
862
876
|
// Use updateComplete to ensure DOM is ready
|
|
863
877
|
this.updateComplete.then(() => {
|
|
864
878
|
const hankoAuth = this.shadowRoot?.querySelector("hanko-auth");
|
|
865
879
|
|
|
880
|
+
// Skip if already attached to the same element
|
|
881
|
+
if (hankoAuth && hankoAuth === this._currentHankoAuthElement) {
|
|
882
|
+
this.log("⏭️ Event listeners already attached to this element");
|
|
883
|
+
return;
|
|
884
|
+
}
|
|
885
|
+
|
|
866
886
|
if (hankoAuth) {
|
|
887
|
+
this._currentHankoAuthElement = hankoAuth;
|
|
888
|
+
this.log("🎯 Attaching event listeners to hanko-auth element");
|
|
889
|
+
|
|
867
890
|
hankoAuth.addEventListener("onSessionCreated", (e: any) => {
|
|
868
891
|
this.log(`🎯 Hanko event: onSessionCreated`, e.detail);
|
|
869
892
|
|
package/src/hanko-i18n-es.ts
CHANGED
|
@@ -225,5 +225,7 @@ export const es = {
|
|
|
225
225
|
"La solicitud expiró, se canceló o el dispositivo ya está registrado. Inténtelo de nuevo o intente usar otro dispositivo.",
|
|
226
226
|
platform_authenticator_required:
|
|
227
227
|
"Su cuenta está configurada para usar autenticadores de plataforma, pero su dispositivo o navegador actual no admite esta función. Inténtelo de nuevo con un dispositivo o navegador compatible.",
|
|
228
|
+
third_party_access_denied:
|
|
229
|
+
"Acceso denegado por el proveedor de terceros. Por favor, inténtelo de nuevo.",
|
|
228
230
|
},
|
|
229
231
|
};
|
package/src/hanko-i18n-fr.ts
CHANGED
|
@@ -225,5 +225,7 @@ export const fr = {
|
|
|
225
225
|
"La demande a expiré, a été annulée ou l'appareil est déjà enregistré. Réessayez ou essayez d'utiliser un autre appareil.",
|
|
226
226
|
platform_authenticator_required:
|
|
227
227
|
"Votre compte est configuré pour utiliser des authentificateurs de plateforme, mais votre appareil ou navigateur actuel ne prend pas en charge cette fonctionnalité. Réessayez avec un appareil ou navigateur compatible.",
|
|
228
|
+
third_party_access_denied:
|
|
229
|
+
"Accès refusé par le fournisseur tiers. Veuillez réessayer.",
|
|
228
230
|
},
|
|
229
231
|
};
|
package/src/hanko-i18n-pt.ts
CHANGED
|
@@ -225,5 +225,7 @@ export const pt = {
|
|
|
225
225
|
"A solicitação expirou, foi cancelada ou o dispositivo já está registrado. Tente novamente ou tente usar outro dispositivo.",
|
|
226
226
|
platform_authenticator_required:
|
|
227
227
|
"Sua conta está configurada para usar autenticadores de plataforma, mas seu dispositivo ou navegador atual não suporta esse recurso. Tente novamente com um dispositivo ou navegador compatível.",
|
|
228
|
+
third_party_access_denied:
|
|
229
|
+
"Acesso negado pelo provedor de terceiros. Por favor, tente novamente.",
|
|
228
230
|
},
|
|
229
231
|
};
|