new configuration version

This commit is contained in:
haburger 2024-10-21 08:20:15 +00:00
parent 2559aa6569
commit 5f6704135d
115 changed files with 993 additions and 1324 deletions

View File

@ -45,7 +45,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-a5b664b2c1f534aab19c8301f3618a8c5096d222"
tag: "r-7bd8f34aeeebe1debccb6e4932b092cf2b2c4c88"
dir: "DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/auth"
credentials: "git-credentials"
keystores:

View File

@ -203,10 +203,8 @@ recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow
recovery_fidokey_auth.keyRegistered=Security key already registered
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
recovery_intro_email.captchaUnchecked=Please tick the captcha field
recovery_intro_email.important=Important:
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=This site is protected by reCAPTCHA and the <a class='link' href='https://policies.google.com/privacy' target='_blank'>Google Privacy Policy</a> and <a class='link' href='https://policies.google.com/terms' target='_blank'>Terms of Service</a> apply.
recovery_intro_email_sent.banner.button=Didn't receive the email?
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
recovery_on_going.finishRecovery=Finish recovery

View File

@ -203,10 +203,8 @@ recovery_fidokey_auth.instruction2=Bitte verwenden Sie !!!SECURITY_KEY_NAME!!! u
recovery_fidokey_auth.keyRegistered=Sicherheitsschl&uuml;ssel schon registriert
recovery_intro_email.banner.error=Der von Ihnen verwendete Link ist abgelaufen. Bitte geben Sie Ihre E-Mail-Adresse ein, um einen neuen Link zu erhalten.
recovery_intro_email.banner.info=Bitte geben Sie Ihre E-Mail-Adresse ein, damit wir Ihnen einen Link schicken k&ouml;nnen, mit dem Sie den Wiederherstellungsprozess starten.
recovery_intro_email.captchaUnchecked=Bitte kreuzen Sie das Captcha-Feld an
recovery_intro_email.important=Wichtig:
recovery_intro_email.process=Der Wiederherstellungsprozess sollte nur verwendet werden, wenn Sie den Zugriff auf Ihre Login-Faktoren verloren haben (gel&ouml;schte AGOV access App, verlorener Sicherheitsschl&uuml;ssel, verlorenes Telefon usw.).
recovery_intro_email.siteProtectedWithRecaptcha=Diese Seite ist durch reCAPTCHA gesch&uuml;tzt, und es gelten die <a class='link' href='https://policies.google.com/privacy' target='_blank'>Datenschutzerkl&auml;rung</a> sowie die <a class='link' href='https://policies.google.com/terms' target='_blank'>Nutzungsbedingungen</a> von Google.
recovery_intro_email_sent.banner.button=Keine E-Mail erhalten?
recovery_intro_email_sent.banner.success=Vielen Dank! Sie werden in K&uuml;rze eine E-Mail mit einem Wiederherstellungslink und Anweisungen erhalten.
recovery_on_going.finishRecovery=Wiederherstellung abschliessen

View File

@ -203,10 +203,8 @@ recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow
recovery_fidokey_auth.keyRegistered=Security key already registered
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
recovery_intro_email.captchaUnchecked=Please tick the captcha field
recovery_intro_email.important=Important:
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=This site is protected by reCAPTCHA and the <a class='link' href='https://policies.google.com/privacy' target='_blank'>Google Privacy Policy</a> and <a class='link' href='https://policies.google.com/terms' target='_blank'>Terms of Service</a> apply.
recovery_intro_email_sent.banner.button=Didn't receive the email?
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
recovery_on_going.finishRecovery=Finish recovery

View File

@ -203,10 +203,8 @@ recovery_fidokey_auth.instruction2=Veuillez utiliser !!!SECURITY_KEY_NAME!!! pou
recovery_fidokey_auth.keyRegistered=Cl&eacute; de s&eacute;curit&eacute; d&eacute;j&agrave; enregistr&eacute;e
recovery_intro_email.banner.error=Le lien que vous avez utilis&eacute; a expir&eacute;. Veuillez saisir votre adresse e-mail pour recevoir un nouveau lien.
recovery_intro_email.banner.info=Veuillez saisir votre adresse e-mail. Nous vous enverrons un e-mail vous permettant de d&eacute;marrer le processus de r&eacute;cup&eacute;ration.
recovery_intro_email.captchaUnchecked=Veuillez cocher la case captcha
recovery_intro_email.important=Important:
recovery_intro_email.process=Le processus de r&eacute;cup&eacute;ration ne doit &ecirc;tre utilis&eacute; que si vous avez perdu l'acc&egrave;s &agrave; vos facteurs de connexion (application AGOV access supprim&eacute;e, cl&eacute; de s&eacute;curit&eacute; perdue, t&eacute;l&eacute;phone perdu, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=Ce site est prot&eacute;g&eacute; par reCAPTCHA: les <a class=&rsquo;link&rsquo; href=&rsquo;https://policies.google.com/privacy&rsquo; target=&rsquo;_blank&rsquo;>r&egrave;gles de confidentialit&eacute;</a> et <a class=&rsquo;link&rsquo; href=&rsquo;https://policies.google.com/terms&rsquo; target=&rsquo;_blank&rsquo;>conditions d&rsquo;utilisation</a> de Google s&rsquo;appliquent.
recovery_intro_email_sent.banner.button=Vous n&rsquo;avez pas re&ccedil;u l'email?
recovery_intro_email_sent.banner.success=Merci! Vous recevrez dans un instant un e-mail contenant un lien de r&eacute;cup&eacute;ration et des instructions.
recovery_on_going.finishRecovery=Terminer la r&eacute;cup&eacute;ration

View File

@ -203,10 +203,8 @@ recovery_fidokey_auth.instruction2=Si prega di usare !!!SECURITY_KEY_NAME!!! per
recovery_fidokey_auth.keyRegistered=Chiave di sicurezza gi&agrave; registrata
recovery_intro_email.banner.error=Il link utilizzato &egrave; scaduto. Per ricevere un nuovo link, inserire l&rsquo;indirizzo e-mail.
recovery_intro_email.banner.info=Per ricevere il link e avviare il processo di ripristino, inserire l&rsquo;indirizzo e-mail.
recovery_intro_email.captchaUnchecked=Per favore selezioni il campo captcha
recovery_intro_email.important=Importante:
recovery_intro_email.process=Il processo di ripristino deve essere utilizzato solo se ha perso l'accesso ai suoi fattori di accesso (app di accesso AGOV eliminata, chiave di sicurezza persa, telefono smarrito, ecc.).
recovery_intro_email.siteProtectedWithRecaptcha=Questo sito &egrave; protetto da reCAPTCHA. Si applicano le <a class='link' href='https://policies.google.com/privacy' target='_blank'>norme sulla privacy</a> e i <a class='link' href='https://policies.google.com/terms' target='_blank'>termini di servizio di Google</a>.
recovery_intro_email_sent.banner.button=Non avete ricevuto l'e-mail?
recovery_intro_email_sent.banner.success=Grazie! &Egrave; stata inviata un&rsquo;e-mail contenente il codice di ripristino e le istruzioni.
recovery_on_going.finishRecovery=Completare il ripristino

View File

@ -46,7 +46,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-a5b664b2c1f534aab19c8301f3618a8c5096d222"
tag: "r-7bd8f34aeeebe1debccb6e4932b092cf2b2c4c88"
dir: "DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/idm-job"
credentials: "git-credentials"
keystores:

View File

@ -1,7 +1,7 @@
# source: pattern://50d6c91ace65f52fa56d7113
nevisIdm.TemplateAdmin=AccessControl.ApplicationSearch,AccessControl.ApplicationView,AccessControl.AuthorizationApplSearch,AccessControl.AuthorizationApplView,AccessControl.AuthorizationClientView,AccessControl.AuthorizationSearch,AccessControl.AuthorizationUnitSearch,AccessControl.AuthorizationUnitView,AccessControl.AuthorizationView,AccessControl.ClientApplView,AccessControl.ClientSearch,AccessControl.ClientView,AccessControl.CollectionView,AccessControl.CredentialSearch,AccessControl.CredentialView,AccessControl.EntityAttributeAccessOverride,AccessControl.GenerateReport,AccessControl.ProfileSearch,AccessControl.ProfileView,AccessControl.PropertyAllowedValueSearch,AccessControl.PropertyAllowedValueView,AccessControl.PropertyAttributeAccessOverride,AccessControl.PropertySearch,AccessControl.PropertyValueModify,AccessControl.PropertyValueSearch,AccessControl.PropertyValueView,AccessControl.PropertyView,AccessControl.RoleSearch,AccessControl.RoleView,AccessControl.SearchResultsExport,AccessControl.UnitSearch,AccessControl.UnitView,AccessControl.UserModify,AccessControl.UserSearch,AccessControl.UserView,AccessControl.EnterpriseAuthorizationSearch,AccessControl.EnterpriseAuthorizationView,AccessControl.EnterpriseRoleMemberSearch,AccessControl.EnterpriseRoleView,AccessControl.AuthorizationEnterpriseRoleSearch,AccessControl.AuthorizationEnterpriseRoleView,AccessControl.HistoryView
# source: pattern://50d6c91ace65f52fa56d7113
nevisIdm.UserAdmin=AccessControl.ApplicationView,AccessControl.AuthorizationSearch,AccessControl.AuthorizationApplView,AccessControl.AuthorizationClientView,AccessControl.AuthorizationUnitView,AccessControl.AuthorizationView,AccessControl.ClientSearch,AccessControl.ClientView,AccessControl.CredentialChangeState,AccessControl.CredentialCreate,AccessControl.CredentialSearch,AccessControl.CredentialView,AccessControl.EntityAttributeAccessOverride,AccessControl.ProfileCreate,AccessControl.ProfileModify,AccessControl.ProfileSearch,AccessControl.ProfileView,AccessControl.PropertyAllowedValueSearch,AccessControl.PropertyAllowedValueView,AccessControl.PropertySearch,AccessControl.PropertyValueCreate,AccessControl.PropertyValueDelete,AccessControl.PropertyValueModify,AccessControl.PropertyValueSearch,AccessControl.PropertyValueView,AccessControl.PropertyView,AccessControl.RoleSearch,AccessControl.RoleView,AccessControl.UnitSearch,AccessControl.UnitView,AccessControl.UserCreate,AccessControl.UserModify,AccessControl.UserSearch,AccessControl.UserView,AccessControl.PropertyAttributeAccessOverride,AccessControl.CollectionView,AccessControl.GenerateReport,AccessControl.SearchResultsExport,AccessControl.EnterpriseAuthorizationSearch,AccessControl.EnterpriseAuthorizationView,AccessControl.EnterpriseRoleMemberSearch,AccessControl.EnterpriseRoleView,AccessControl.AuthorizationEnterpriseRoleSearch,AccessControl.AuthorizationEnterpriseRoleView
nevisIdm.UserAdmin=AccessControl.ApplicationView,AccessControl.AuthorizationSearch,AccessControl.AuthorizationApplView,AccessControl.AuthorizationClientView,AccessControl.AuthorizationUnitView,AccessControl.AuthorizationView,AccessControl.ClientSearch,AccessControl.ClientView,AccessControl.CredentialChangeState.14,AccessControl.CredentialCreate.14,AccessControl.CredentialSearch,AccessControl.CredentialView,AccessControl.EntityAttributeAccessOverride,AccessControl.ProfileCreate,AccessControl.ProfileModify,AccessControl.ProfileSearch,AccessControl.ProfileView,AccessControl.PropertyAllowedValueSearch,AccessControl.PropertyAllowedValueView,AccessControl.PropertySearch,AccessControl.PropertyValueCreate,AccessControl.PropertyValueDelete,AccessControl.PropertyValueModify,AccessControl.PropertyValueSearch,AccessControl.PropertyValueView,AccessControl.PropertyView,AccessControl.RoleSearch,AccessControl.RoleView,AccessControl.UnitSearch,AccessControl.UnitView,AccessControl.UserCreate,AccessControl.UserModify,AccessControl.UserSearch,AccessControl.UserView,AccessControl.PropertyAttributeAccessOverride,AccessControl.CollectionView,AccessControl.GenerateReport,AccessControl.SearchResultsExport,AccessControl.EnterpriseAuthorizationSearch,AccessControl.EnterpriseAuthorizationView,AccessControl.EnterpriseRoleMemberSearch,AccessControl.EnterpriseRoleView,AccessControl.AuthorizationEnterpriseRoleSearch,AccessControl.AuthorizationEnterpriseRoleView
# source: pattern://50d6c91ace65f52fa56d7113
nevisIdm.Root=AccessControl.ApplicationCreate,AccessControl.ApplicationDelete,AccessControl.ApplicationModify,AccessControl.ApplicationSearch,AccessControl.ApplicationView,AccessControl.AuthorizationCreate,AccessControl.AuthorizationDelete,AccessControl.AuthorizationModify,AccessControl.AuthorizationSearch,AccessControl.AuthorizationApplCreate,AccessControl.AuthorizationApplDelete,AccessControl.AuthorizationApplSearch,AccessControl.AuthorizationApplView,AccessControl.AuthorizationClientCreate,AccessControl.AuthorizationClientDelete,AccessControl.AuthorizationClientSearch,AccessControl.AuthorizationClientView,AccessControl.AuthorizationUnitCreate,AccessControl.AuthorizationUnitDelete,AccessControl.AuthorizationUnitSearch,AccessControl.AuthorizationUnitView,AccessControl.AuthorizationView,AccessControl.BatchJobExecute,AccessControl.BatchJobView,AccessControl.ClientCreate,AccessControl.ClientDelete,AccessControl.ClientModify,AccessControl.ClientApplAssign,AccessControl.ClientApplDelete,AccessControl.ClientApplView,AccessControl.ClientSearch,AccessControl.ClientView,AccessControl.CredentialChangeState,AccessControl.CredentialCreate,AccessControl.CredentialDelete,AccessControl.CredentialModify,AccessControl.CredentialSearch,AccessControl.CredentialView,AccessControl.EntityAttributeAccessOverride,AccessControl.PersistentQueueRetry,AccessControl.PersistentQueueDelete,AccessControl.PersistentQueueView,AccessControl.PolicyConfigurationCreate,AccessControl.PolicyConfigurationDelete,AccessControl.PolicyConfigurationModify,AccessControl.PolicyConfigurationSearch,AccessControl.PolicyConfigurationView,AccessControl.ProfileArchive,AccessControl.ProfileCreate,AccessControl.ProfileDelete,AccessControl.ProfileModify,AccessControl.ProfileSearch,AccessControl.ProfileView,AccessControl.PropertyAllowedValueCreate,AccessControl.PropertyAllowedValueDelete,AccessControl.PropertyAllowedValueModify,AccessControl.PropertyAllowedValueSearch,AccessControl.PropertyAllowedValueView,AccessControl.PropertyCreate,AccessControl.PropertyDelete,AccessControl.PropertyModify,AccessControl.PropertySearch,AccessControl.PropertyValueCreate,AccessControl.PropertyValueDelete,AccessControl.PropertyValueModify,AccessControl.PropertyValueSearch,AccessControl.PropertyValueView,AccessControl.PropertyView,AccessControl.RoleCreate,AccessControl.RoleDelete,AccessControl.RoleModify,AccessControl.RoleSearch,AccessControl.RoleView,AccessControl.SelfAdmin,AccessControl.UnitCreate,AccessControl.UnitCreateTopUnit,AccessControl.UnitDelete,AccessControl.UnitModify,AccessControl.UnitSearch,AccessControl.UnitView,AccessControl.UserArchive,AccessControl.UserCreate,AccessControl.UserDelete,AccessControl.UserModify,AccessControl.UserSearch,AccessControl.UserView,AccessControl.PropertyAttributeAccessOverride,AccessControl.HistoryView,AccessControl.LoginIdOverride,AccessControl.TemplateStore,AccessControl.CollectionView,AccessControl.CollectionCreate,AccessControl.CollectionModify,AccessControl.CollectionDelete,AccessControl.TemplateView,AccessControl.TemplateCreate,AccessControl.TemplateModify,AccessControl.TemplateDelete,AccessControl.TemplateTextView,AccessControl.TemplateTextCreate,AccessControl.TemplateTextModify,AccessControl.TemplateTextDelete,AccessControl.GenerateReport,AccessControl.SearchResultsExport,AccessControl.CredentialViewPlainValue,AccessControl.DeputyCreate,AccessControl.DeputyDelete,AccessControl.UnitCredPolicyView,AccessControl.UnitCredPolicyCreate,AccessControl.UnitCredPolicyDelete,AccessControl.UserCreateTechUser,AccessControl.UserModifyTechUser,AccessControl.UserDeleteTechUser,AccessControl.UserArchiveTechUser,AccessControl.CredentialPdfView,AccessControl.EnterpriseAuthorizationCreate,AccessControl.EnterpriseAuthorizationDelete,AccessControl.EnterpriseAuthorizationModify,AccessControl.EnterpriseAuthorizationSearch,AccessControl.EnterpriseAuthorizationView,AccessControl.AuthorizationEnterpriseRoleCreate,AccessControl.AuthorizationEnterpriseRoleDelete,AccessControl.AuthorizationEnterpriseRoleSearch,AccessControl.AuthorizationEnterpriseRoleView,AccessControl.EnterpriseRoleCreate,AccessControl.EnterpriseRoleModify,AccessControl.EnterpriseRoleDelete,AccessControl.EnterpriseRoleSearch,AccessControl.EnterpriseRoleView,AccessControl.EnterpriseRoleMemberCreate,AccessControl.EnterpriseRoleMemberDelete,AccessControl.EnterpriseRoleMemberSearch,AccessControl.PersonalQuestionSearch,AccessControl.PersonalQuestionView,AccessControl.PersonalQuestionCreate,AccessControl.PersonalQuestionModify,AccessControl.PersonalQuestionDelete,AccessControl.LoginIdModify,AccessControl.TermsView,AccessControl.TermsCreate,AccessControl.TermsModify,AccessControl.TermsDelete,AccessControl.ConsentCreate,AccessControl.ConsentView
# source: pattern://50d6c91ace65f52fa56d7113

View File

@ -46,7 +46,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-62cde4d69ffb364927e8f40db105fc6d83470228"
tag: "r-7bd8f34aeeebe1debccb6e4932b092cf2b2c4c88"
dir: "DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/idm"
credentials: "git-credentials"
keystores:

View File

@ -1,7 +1,7 @@
# source: pattern://50d6c91ace65f52fa56d7113
nevisIdm.TemplateAdmin=AccessControl.ApplicationSearch,AccessControl.ApplicationView,AccessControl.AuthorizationApplSearch,AccessControl.AuthorizationApplView,AccessControl.AuthorizationClientView,AccessControl.AuthorizationSearch,AccessControl.AuthorizationUnitSearch,AccessControl.AuthorizationUnitView,AccessControl.AuthorizationView,AccessControl.ClientApplView,AccessControl.ClientSearch,AccessControl.ClientView,AccessControl.CollectionView,AccessControl.CredentialSearch,AccessControl.CredentialView,AccessControl.EntityAttributeAccessOverride,AccessControl.GenerateReport,AccessControl.ProfileSearch,AccessControl.ProfileView,AccessControl.PropertyAllowedValueSearch,AccessControl.PropertyAllowedValueView,AccessControl.PropertyAttributeAccessOverride,AccessControl.PropertySearch,AccessControl.PropertyValueModify,AccessControl.PropertyValueSearch,AccessControl.PropertyValueView,AccessControl.PropertyView,AccessControl.RoleSearch,AccessControl.RoleView,AccessControl.SearchResultsExport,AccessControl.UnitSearch,AccessControl.UnitView,AccessControl.UserModify,AccessControl.UserSearch,AccessControl.UserView,AccessControl.EnterpriseAuthorizationSearch,AccessControl.EnterpriseAuthorizationView,AccessControl.EnterpriseRoleMemberSearch,AccessControl.EnterpriseRoleView,AccessControl.AuthorizationEnterpriseRoleSearch,AccessControl.AuthorizationEnterpriseRoleView,AccessControl.HistoryView
# source: pattern://50d6c91ace65f52fa56d7113
nevisIdm.UserAdmin=AccessControl.ApplicationView,AccessControl.AuthorizationSearch,AccessControl.AuthorizationApplView,AccessControl.AuthorizationClientView,AccessControl.AuthorizationUnitView,AccessControl.AuthorizationView,AccessControl.ClientSearch,AccessControl.ClientView,AccessControl.CredentialChangeState,AccessControl.CredentialCreate,AccessControl.CredentialSearch,AccessControl.CredentialView,AccessControl.EntityAttributeAccessOverride,AccessControl.ProfileCreate,AccessControl.ProfileModify,AccessControl.ProfileSearch,AccessControl.ProfileView,AccessControl.PropertyAllowedValueSearch,AccessControl.PropertyAllowedValueView,AccessControl.PropertySearch,AccessControl.PropertyValueCreate,AccessControl.PropertyValueDelete,AccessControl.PropertyValueModify,AccessControl.PropertyValueSearch,AccessControl.PropertyValueView,AccessControl.PropertyView,AccessControl.RoleSearch,AccessControl.RoleView,AccessControl.UnitSearch,AccessControl.UnitView,AccessControl.UserCreate,AccessControl.UserModify,AccessControl.UserSearch,AccessControl.UserView,AccessControl.PropertyAttributeAccessOverride,AccessControl.CollectionView,AccessControl.GenerateReport,AccessControl.SearchResultsExport,AccessControl.EnterpriseAuthorizationSearch,AccessControl.EnterpriseAuthorizationView,AccessControl.EnterpriseRoleMemberSearch,AccessControl.EnterpriseRoleView,AccessControl.AuthorizationEnterpriseRoleSearch,AccessControl.AuthorizationEnterpriseRoleView
nevisIdm.UserAdmin=AccessControl.ApplicationView,AccessControl.AuthorizationSearch,AccessControl.AuthorizationApplView,AccessControl.AuthorizationClientView,AccessControl.AuthorizationUnitView,AccessControl.AuthorizationView,AccessControl.ClientSearch,AccessControl.ClientView,AccessControl.CredentialChangeState.14,AccessControl.CredentialCreate.14,AccessControl.CredentialSearch,AccessControl.CredentialView,AccessControl.EntityAttributeAccessOverride,AccessControl.ProfileCreate,AccessControl.ProfileModify,AccessControl.ProfileSearch,AccessControl.ProfileView,AccessControl.PropertyAllowedValueSearch,AccessControl.PropertyAllowedValueView,AccessControl.PropertySearch,AccessControl.PropertyValueCreate,AccessControl.PropertyValueDelete,AccessControl.PropertyValueModify,AccessControl.PropertyValueSearch,AccessControl.PropertyValueView,AccessControl.PropertyView,AccessControl.RoleSearch,AccessControl.RoleView,AccessControl.UnitSearch,AccessControl.UnitView,AccessControl.UserCreate,AccessControl.UserModify,AccessControl.UserSearch,AccessControl.UserView,AccessControl.PropertyAttributeAccessOverride,AccessControl.CollectionView,AccessControl.GenerateReport,AccessControl.SearchResultsExport,AccessControl.EnterpriseAuthorizationSearch,AccessControl.EnterpriseAuthorizationView,AccessControl.EnterpriseRoleMemberSearch,AccessControl.EnterpriseRoleView,AccessControl.AuthorizationEnterpriseRoleSearch,AccessControl.AuthorizationEnterpriseRoleView
# source: pattern://50d6c91ace65f52fa56d7113
nevisIdm.Root=AccessControl.ApplicationCreate,AccessControl.ApplicationDelete,AccessControl.ApplicationModify,AccessControl.ApplicationSearch,AccessControl.ApplicationView,AccessControl.AuthorizationCreate,AccessControl.AuthorizationDelete,AccessControl.AuthorizationModify,AccessControl.AuthorizationSearch,AccessControl.AuthorizationApplCreate,AccessControl.AuthorizationApplDelete,AccessControl.AuthorizationApplSearch,AccessControl.AuthorizationApplView,AccessControl.AuthorizationClientCreate,AccessControl.AuthorizationClientDelete,AccessControl.AuthorizationClientSearch,AccessControl.AuthorizationClientView,AccessControl.AuthorizationUnitCreate,AccessControl.AuthorizationUnitDelete,AccessControl.AuthorizationUnitSearch,AccessControl.AuthorizationUnitView,AccessControl.AuthorizationView,AccessControl.BatchJobExecute,AccessControl.BatchJobView,AccessControl.ClientCreate,AccessControl.ClientDelete,AccessControl.ClientModify,AccessControl.ClientApplAssign,AccessControl.ClientApplDelete,AccessControl.ClientApplView,AccessControl.ClientSearch,AccessControl.ClientView,AccessControl.CredentialChangeState,AccessControl.CredentialCreate,AccessControl.CredentialDelete,AccessControl.CredentialModify,AccessControl.CredentialSearch,AccessControl.CredentialView,AccessControl.EntityAttributeAccessOverride,AccessControl.PersistentQueueRetry,AccessControl.PersistentQueueDelete,AccessControl.PersistentQueueView,AccessControl.PolicyConfigurationCreate,AccessControl.PolicyConfigurationDelete,AccessControl.PolicyConfigurationModify,AccessControl.PolicyConfigurationSearch,AccessControl.PolicyConfigurationView,AccessControl.ProfileArchive,AccessControl.ProfileCreate,AccessControl.ProfileDelete,AccessControl.ProfileModify,AccessControl.ProfileSearch,AccessControl.ProfileView,AccessControl.PropertyAllowedValueCreate,AccessControl.PropertyAllowedValueDelete,AccessControl.PropertyAllowedValueModify,AccessControl.PropertyAllowedValueSearch,AccessControl.PropertyAllowedValueView,AccessControl.PropertyCreate,AccessControl.PropertyDelete,AccessControl.PropertyModify,AccessControl.PropertySearch,AccessControl.PropertyValueCreate,AccessControl.PropertyValueDelete,AccessControl.PropertyValueModify,AccessControl.PropertyValueSearch,AccessControl.PropertyValueView,AccessControl.PropertyView,AccessControl.RoleCreate,AccessControl.RoleDelete,AccessControl.RoleModify,AccessControl.RoleSearch,AccessControl.RoleView,AccessControl.SelfAdmin,AccessControl.UnitCreate,AccessControl.UnitCreateTopUnit,AccessControl.UnitDelete,AccessControl.UnitModify,AccessControl.UnitSearch,AccessControl.UnitView,AccessControl.UserArchive,AccessControl.UserCreate,AccessControl.UserDelete,AccessControl.UserModify,AccessControl.UserSearch,AccessControl.UserView,AccessControl.PropertyAttributeAccessOverride,AccessControl.HistoryView,AccessControl.LoginIdOverride,AccessControl.TemplateStore,AccessControl.CollectionView,AccessControl.CollectionCreate,AccessControl.CollectionModify,AccessControl.CollectionDelete,AccessControl.TemplateView,AccessControl.TemplateCreate,AccessControl.TemplateModify,AccessControl.TemplateDelete,AccessControl.TemplateTextView,AccessControl.TemplateTextCreate,AccessControl.TemplateTextModify,AccessControl.TemplateTextDelete,AccessControl.GenerateReport,AccessControl.SearchResultsExport,AccessControl.CredentialViewPlainValue,AccessControl.DeputyCreate,AccessControl.DeputyDelete,AccessControl.UnitCredPolicyView,AccessControl.UnitCredPolicyCreate,AccessControl.UnitCredPolicyDelete,AccessControl.UserCreateTechUser,AccessControl.UserModifyTechUser,AccessControl.UserDeleteTechUser,AccessControl.UserArchiveTechUser,AccessControl.CredentialPdfView,AccessControl.EnterpriseAuthorizationCreate,AccessControl.EnterpriseAuthorizationDelete,AccessControl.EnterpriseAuthorizationModify,AccessControl.EnterpriseAuthorizationSearch,AccessControl.EnterpriseAuthorizationView,AccessControl.AuthorizationEnterpriseRoleCreate,AccessControl.AuthorizationEnterpriseRoleDelete,AccessControl.AuthorizationEnterpriseRoleSearch,AccessControl.AuthorizationEnterpriseRoleView,AccessControl.EnterpriseRoleCreate,AccessControl.EnterpriseRoleModify,AccessControl.EnterpriseRoleDelete,AccessControl.EnterpriseRoleSearch,AccessControl.EnterpriseRoleView,AccessControl.EnterpriseRoleMemberCreate,AccessControl.EnterpriseRoleMemberDelete,AccessControl.EnterpriseRoleMemberSearch,AccessControl.PersonalQuestionSearch,AccessControl.PersonalQuestionView,AccessControl.PersonalQuestionCreate,AccessControl.PersonalQuestionModify,AccessControl.PersonalQuestionDelete,AccessControl.LoginIdModify,AccessControl.TermsView,AccessControl.TermsCreate,AccessControl.TermsModify,AccessControl.TermsDelete,AccessControl.ConsentCreate,AccessControl.ConsentView
# source: pattern://50d6c91ace65f52fa56d7113

View File

@ -44,7 +44,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-e55486a997fb8f6cdab5eac835e6374e73b3824f"
tag: "r-7bd8f34aeeebe1debccb6e4932b092cf2b2c4c88"
dir: "DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/logrend"
credentials: "git-credentials"
podSecurity:

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow
recovery_fidokey_auth.keyRegistered=Security key already registered
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
recovery_intro_email.captchaUnchecked=Please tick the captcha field
recovery_intro_email.important=Important:
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=This site is protected by reCAPTCHA and the <a class='link' href='https://policies.google.com/privacy' target='_blank'>Google Privacy Policy</a> and <a class='link' href='https://policies.google.com/terms' target='_blank'>Terms of Service</a> apply.
recovery_intro_email_sent.banner.button=Didn't receive the email?
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
recovery_on_going.finishRecovery=Finish recovery

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Bitte verwenden Sie !!!SECURITY_KEY_NAME!!! u
recovery_fidokey_auth.keyRegistered=Sicherheitsschl&uuml;ssel schon registriert
recovery_intro_email.banner.error=Der von Ihnen verwendete Link ist abgelaufen. Bitte geben Sie Ihre E-Mail-Adresse ein, um einen neuen Link zu erhalten.
recovery_intro_email.banner.info=Bitte geben Sie Ihre E-Mail-Adresse ein, damit wir Ihnen einen Link schicken k&ouml;nnen, mit dem Sie den Wiederherstellungsprozess starten.
recovery_intro_email.captchaUnchecked=Bitte kreuzen Sie das Captcha-Feld an
recovery_intro_email.important=Wichtig:
recovery_intro_email.process=Der Wiederherstellungsprozess sollte nur verwendet werden, wenn Sie den Zugriff auf Ihre Login-Faktoren verloren haben (gel&ouml;schte AGOV access App, verlorener Sicherheitsschl&uuml;ssel, verlorenes Telefon usw.).
recovery_intro_email.siteProtectedWithRecaptcha=Diese Seite ist durch reCAPTCHA gesch&uuml;tzt, und es gelten die <a class='link' href='https://policies.google.com/privacy' target='_blank'>Datenschutzerkl&auml;rung</a> sowie die <a class='link' href='https://policies.google.com/terms' target='_blank'>Nutzungsbedingungen</a> von Google.
recovery_intro_email_sent.banner.button=Keine E-Mail erhalten?
recovery_intro_email_sent.banner.success=Vielen Dank! Sie werden in K&uuml;rze eine E-Mail mit einem Wiederherstellungslink und Anweisungen erhalten.
recovery_on_going.finishRecovery=Wiederherstellung abschliessen

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow
recovery_fidokey_auth.keyRegistered=Security key already registered
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
recovery_intro_email.captchaUnchecked=Please tick the captcha field
recovery_intro_email.important=Important:
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=This site is protected by reCAPTCHA and the <a class='link' href='https://policies.google.com/privacy' target='_blank'>Google Privacy Policy</a> and <a class='link' href='https://policies.google.com/terms' target='_blank'>Terms of Service</a> apply.
recovery_intro_email_sent.banner.button=Didn't receive the email?
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
recovery_on_going.finishRecovery=Finish recovery

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Veuillez utiliser !!!SECURITY_KEY_NAME!!! pou
recovery_fidokey_auth.keyRegistered=Cl&eacute; de s&eacute;curit&eacute; d&eacute;j&agrave; enregistr&eacute;e
recovery_intro_email.banner.error=Le lien que vous avez utilis&eacute; a expir&eacute;. Veuillez saisir votre adresse e-mail pour recevoir un nouveau lien.
recovery_intro_email.banner.info=Veuillez saisir votre adresse e-mail. Nous vous enverrons un e-mail vous permettant de d&eacute;marrer le processus de r&eacute;cup&eacute;ration.
recovery_intro_email.captchaUnchecked=Veuillez cocher la case captcha
recovery_intro_email.important=Important:
recovery_intro_email.process=Le processus de r&eacute;cup&eacute;ration ne doit &ecirc;tre utilis&eacute; que si vous avez perdu l'acc&egrave;s &agrave; vos facteurs de connexion (application AGOV access supprim&eacute;e, cl&eacute; de s&eacute;curit&eacute; perdue, t&eacute;l&eacute;phone perdu, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=Ce site est prot&eacute;g&eacute; par reCAPTCHA: les <a class=&rsquo;link&rsquo; href=&rsquo;https://policies.google.com/privacy&rsquo; target=&rsquo;_blank&rsquo;>r&egrave;gles de confidentialit&eacute;</a> et <a class=&rsquo;link&rsquo; href=&rsquo;https://policies.google.com/terms&rsquo; target=&rsquo;_blank&rsquo;>conditions d&rsquo;utilisation</a> de Google s&rsquo;appliquent.
recovery_intro_email_sent.banner.button=Vous n&rsquo;avez pas re&ccedil;u l'email?
recovery_intro_email_sent.banner.success=Merci! Vous recevrez dans un instant un e-mail contenant un lien de r&eacute;cup&eacute;ration et des instructions.
recovery_on_going.finishRecovery=Terminer la r&eacute;cup&eacute;ration

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Si prega di usare !!!SECURITY_KEY_NAME!!! per
recovery_fidokey_auth.keyRegistered=Chiave di sicurezza gi&agrave; registrata
recovery_intro_email.banner.error=Il link utilizzato &egrave; scaduto. Per ricevere un nuovo link, inserire l&rsquo;indirizzo e-mail.
recovery_intro_email.banner.info=Per ricevere il link e avviare il processo di ripristino, inserire l&rsquo;indirizzo e-mail.
recovery_intro_email.captchaUnchecked=Per favore selezioni il campo captcha
recovery_intro_email.important=Importante:
recovery_intro_email.process=Il processo di ripristino deve essere utilizzato solo se ha perso l'accesso ai suoi fattori di accesso (app di accesso AGOV eliminata, chiave di sicurezza persa, telefono smarrito, ecc.).
recovery_intro_email.siteProtectedWithRecaptcha=Questo sito &egrave; protetto da reCAPTCHA. Si applicano le <a class='link' href='https://policies.google.com/privacy' target='_blank'>norme sulla privacy</a> e i <a class='link' href='https://policies.google.com/terms' target='_blank'>termini di servizio di Google</a>.
recovery_intro_email_sent.banner.button=Non avete ricevuto l'e-mail?
recovery_intro_email_sent.banner.success=Grazie! &Egrave; stata inviata un&rsquo;e-mail contenente il codice di ripristino e le istruzioni.
recovery_on_going.finishRecovery=Completare il ripristino

View File

@ -0,0 +1,5 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initQRCode'));
document.dispatchEvent(new Event('initDrawer'));
document.dispatchEvent(new Event('initCantonalBranding'));
});

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

View File

@ -1,9 +1,3 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initAnswer'));
});
// eslint-disable-next-line no-unused-vars
function setErrorBanner(value) {
document.getElementById('errorBanner').style.display = value ? 'none' : 'flex';
document.getElementById('buttons').style.marginTop = value ? '16px' : '8px';
}

View File

@ -1,9 +1,3 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initAnswer'));
});
// eslint-disable-next-line no-unused-vars
function setErrorBanner(value) {
document.getElementById('errorBanner').style.display = value ? 'none' : 'flex';
console.log(document.getElementById('errorBanner').style.display);
}

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -15,16 +15,16 @@
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.securityKey")</h4>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8">
<div class="flex flex-row items-center justify-between">
#set ($emailInput = $gui.getGuiElem('email'))
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#set ($emailInput = $gui.getGuiElem('email'))
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
<p class="text-space-blue dark:text-white font-body-semi text-body-l truncate">$utils.escapeHtmlAttribute($emailInput.value)</p>
#else
#else
<p class="text-space-blue dark:text-white font-body-semi text-body-l truncate"></p>
#end
#end
<agov-button
class="shrink-0"
data-style="frameless"
@ -40,11 +40,10 @@
</form>
<div class="mt-3 mb-6 w-full h-px bg-platinum rounded-full"></div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("fido2_auth.cancel.fido")
$text.get("fido2_auth.cancel.fido")
</p>
</div>
@ -53,21 +52,21 @@
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">1</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction1")</p>
"fido2_auth.instruction1")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">2</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction2")</p>
"fido2_auth.instruction2")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">3</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction3")</p>
"fido2_auth.instruction3")</p>
</div>
</div>
@ -79,12 +78,12 @@
</agov-checkbox>
<label for="skip" class="font-body text-body-l text-space-blue dark:text-white cursor-pointer">
$text.get("fido2_auth.skipInstructions")
$text.get("fido2_auth.skipInstructions")
</label>
</div>
<div class="mt-auto mb-6 sm:mb-0">
<agov-button
onclick="fido.authenticate()"
id="fido_authenticate"
data-type="button"
data-label="$text.get("general.continue")"
data-fullwidth="true"
@ -94,7 +93,7 @@
<div class="flex items-center mt-6 mb-4">
<span class="h-px w-full bg-silver"></span>
<span class="px-2 text-disabled-grey font-body-semi text-body-l whitespace-nowrap">
$text.get("fido2_auth.switchLogin")
$text.get("fido2_auth.switchLogin")
</span>
<span class="h-px w-full bg-silver"></span>
</div>

View File

@ -3,7 +3,7 @@
$text.get("footer.text")
<a target="_blank" class='text-hyperlink dark:text-dark-hyperlink underline' href='$text.get("footer.link")'>$text.get("footer.link.label")</a>
</div>
<p>1.5.7.77-20240809T142941Z</p>
<p>1.6.8.13-20240919T195132Z</p>
</footer>
<script src="${login.appDataPath}/static/bundle.js"></script>
</body>

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-screen h-full mx-4 flex sm:block" style="min-height: 100svh">
<html lang="$login.language" class="relative min-h-100 h-full mx-4 flex sm:block">
<head>
<title>AGOV</title>
<meta charset="UTF-8">

View File

@ -10,15 +10,15 @@
class="flex items-center rounded-xl gap-5 p-2 sm:p-0 sm:w-auto w-full hidden bg-pale-blue dark:bg-purple-black sm:bg-transparent">
<div class="flex items-center p-2 bg-white rounded sm:rounded-xl w-16 h-16" id="logo"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
@ -28,7 +28,7 @@
<h1 class="font-header text-h4 text-space-blue dark:text-white mb-8">$text.get("general.registration")</h1>
<h2 class="font-header text-h5 text-space-blue dark:text-white text-center mb-4">
$text.get("mauth_usernameless.noAccount")
$text.get("mauth_usernameless.noAccount")
</h2>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
@ -49,6 +49,8 @@
<div id="agovLoginImage"
class="relative md:max-w-[520px] max-w-[350px] sm:max-w-[300px] mb-10 w-full mx-auto hidden md:block">
<div class="hidden flex items-center p-2 bg-white dark:bg-black rounded-xl w-16 h-16 absolute left-[calc(39%-32px)] top-8"
id="logoDoor"></div>
<img alt="" src="${login.appDataPath}/static/images/login.svg"
class="hidden md:block dark:hidden w-full">
<img alt="" src="${login.appDataPath}/static/images/login-dark.svg"
@ -69,15 +71,15 @@
<div class="flex items-center p-2 bg-white dark:bg-black rounded sm:rounded-xl w-16 h-16"
id="logoMobile"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
@ -93,65 +95,65 @@
<div id="accessAppModal" class="h-full">
<div class="desktopBanner" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4
mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center
p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div class="relative flex flex-col h-full">
<div id="blurBackdrop" class="absolute backdrop-blur-sm -top-1 -bottom-8 -left-4 -right-4 z-10"
style="display:none "></div>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-8 -left-4 -right-4
z-10"></div>
<div class="mobileBanner relative z-20" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center
p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background
items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div id="agovLoginImageMobile" style="display: none"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full mx-auto mb-6">
<div id="agovLoginImageMobile" class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full
mx-auto mb-6">
<img alt=""
src="${login.appDataPath}/static/images/login.svg"
class="block sm:hidden md:block dark:hidden w-full">
@ -165,12 +167,12 @@
<canvas role="img" aria-labelledby="labelQRCodeInstructions" id="mauth_qrcode"
class="mb-6 mx-auto"></canvas>
<div class="hidden" id="QRcodeHiddenLink"></div>
<span id="spinner" class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20"
style="display: none">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2
z-20">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg"
class="animate-spin hidden dark:block">
</span>
</span>
</div>
<a id="accessAppLinkIpad" href="" class="hidden">
@ -189,7 +191,7 @@
dark:bg-purple-black">
<img alt="" src="${login.appDataPath}/static/images/access-app.svg" class="h-12 mr-4">
<p id="labelQRCodeInstructions" class="font-header text-h5 text-space-blue dark:text-white">
$text.get("mauth_usernameless.instructions")
$text.get("mauth_usernameless.instructions")
</p>
</div>
</div>
@ -197,7 +199,7 @@
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" class="w-full sm:static mt-auto mb-20 sm:mb-0">
<div id="mobileButtons" style="display: none" class="w-full">
<div id="mobileButtons" class="hidden w-full">
<div class="flex flex-col">
<a id="accessAppLink" href="">
<agov-button
@ -218,21 +220,20 @@
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.showQR")"
"mauth_usernameless.showQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
<agov-button
style="display: none"
id="hideQR"
class="block basis-full"
class="hidden basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye-slash align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.hideQR")"
"mauth_usernameless.hideQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
@ -246,11 +247,11 @@
<div id="securityKeyModal" class="hidden mt-16">
<h2 class="font-header text-h5 text-space-blue dark:text-white mt-4 text-center">
$text.get("mauth_usernameless.useSecurityKey")
$text.get("mauth_usernameless.useSecurityKey")
</h2>
<p class="font-body text-body-l text-space-blue dark:text-white text-center my-6">
$text.get("mauth_usernameless.useSecurityKeyInfo")
$text.get("mauth_usernameless.useSecurityKeyInfo")
</p>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
@ -280,14 +281,14 @@
<button class="hidden" id="onReload" name="onReload"></button>
<h2 class="font-header text-h5 text-space-blue dark:text-white mt-7 mb-4 text-center">
$text.get("mauth_usernameless.cannotLogin")
$text.get("mauth_usernameless.cannotLogin")
</h2>
<agov-button
data-style="secondary"
data-name="fallback"
data-value="recovery"
data-label="<i class='fa-regular fa-suitcase-medical text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.startRecovery")"
"mauth_usernameless.startRecovery")"
data-type="submit"
data-fullwidth="true"
class="block">
@ -300,7 +301,7 @@
</div>
</div>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" style="display: none" class="sm:hidden formDrawer">
accept-charset="UTF-8" class="hidden sm:hidden formDrawer">
<div class="w-full z-30 fixed left-0 pointer-events-none" id="drawerContainer">
<div class="w-full bg-white dark:bg-surface-black px-4 pb-[130px] rounded-t-2xl pointer-events-auto" id="drawer">
<div class="pt-2 pb-4 cursor-pointer">
@ -309,12 +310,12 @@
<div class="flex items-center justify-center mb-6">
<span class="px-2 text-disabled-grey dark:text-white font-body-semi text-body-l whitespace-nowrap">
$text.get("general.otherOptions")
$text.get("general.otherOptions")
</span>
</div>
<p class="font-body-semi text-body-l text-space-blue dark:text-white text-center mb-2">
$text.get("mauth_usernameless.noAccount")
$text.get("mauth_usernameless.noAccount")
</p>
<agov-button
@ -330,14 +331,14 @@
<div class="flex items-center mt-6 mb-6">
<span class="h-px w-full bg-silver"></span>
<span class="px-2 text-disabled-grey dark:text-white font-body-semi text-body-l whitespace-nowrap">
$text.get("general.or")</span>
$text.get("general.or")</span>
<span class="h-px w-full bg-silver"></span>
</div>
<div class="flex flex-col flex-wrap justify-center items-center mb-6 gap-1">
<p class="font-body-semi text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.cannotLogin")
$text.get("mauth_usernameless.cannotLogin")
</p>
<agov-button
data-style="frameless"
@ -353,9 +354,9 @@
<div class="font-body text-body-s text-disabled-grey dark:text-silver text-center">
$text.get("footer.text")
$text.get("footer.text")
<a target="_blank" class='text-hyperlink dark:text-info underline' href='$text.get("footer.link")'>$text.get(
"footer.link.label")</a>
"footer.link.label")</a>
</div>
</div>
</div>
@ -363,13 +364,10 @@
</form>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
document.dispatchEvent(new Event('initQRCode'));
document.dispatchEvent(new Event('initDrawer'));
document.dispatchEvent(new Event('initCantonalBranding'));
cantonalBranding.getLogo("$gui.getGuiElem('agov.appSamlRpEntityId').value", "$login.language");
});
<script src="${login.appDataPath}/static/js-code/mauth_usernameless.js" defer>
</script>
<div id="appSamlRpEntityId" class="hidden" data-value="$gui.getGuiElem('agov.appSamlRpEntityId').value"
data-language="$login.language">
</div>
#parse("${templatePath}/footer.vm")

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-screen h-full mx-4 flex sm:block" style="min-height: 100svh">
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-100 h-full mx-4 flex sm:block">
<head>
<title>AGOV Operations</title>
<meta charset="UTF-8">
@ -20,51 +20,53 @@
<img alt="agov Logo" src="${login.appDataPath}/static/images/agov-logo.svg" class="h-5 sm:h-8 sm:mr-6 dark:hidden">
<img alt="agov Logo" src="${login.appDataPath}/static/images/agov-logo-dark.svg" class="h-5 sm:h-8 sm:mr-6 hidden dark:block">
<div class="flex items-center flex-1 sm:flex-initial justify-end">
#set ($langMenu = '')
#foreach ($locale in $login.locales)
## find translated label of current locale
#if ($text.contains("language.$locale"))
#set ($langLabel = $text.get("language.$locale"))
#elseif ($locale.length() > 2)
#set ($langLabel = $text.get("language.${locale.substring(0,2).toLowerCase()}"))
#else
#set ($langLabel = $locale)
#end
## emit link or text for each language
#set ($langTarget = $utils.escapeHtmlAttribute($gui.target('language', $locale)))
#set ($langMenu = '')
#foreach ($locale in $login.locales)
## find translated label of current locale
#if ($text.contains("language.$locale"))
#set ($langLabel = $text.get("language.$locale"))
#elseif ($locale.length() > 2)
#set ($langLabel = $text.get("language.${locale.substring(0,2).toLowerCase()}"))
#else
#set ($langLabel = $locale)
#end
## emit link or text for each language
#set ($langTarget = $utils.escapeHtmlAttribute($gui.target('language', $locale)))
#if ($login.localeCode != $locale && $login.language != $locale)
#set ($langMenu = $langMenu + '<li><a
#if ($login.localeCode != $locale && $login.language != $locale)
#set ($langMenu = $langMenu + '<li><a
class="block px-8 sm:px-4 py-3 hover:bg-lavender-blush dark:hover:bg-purple-black"
aria-current="false"
href="'+$langTarget+'">'+$langLabel+' - '+$locale.toUpperCase()
+'</a></li>')
#else
#set ($langMenu = $langMenu + '<li><a
+'</a></li>')
#else
#set ($langMenu = $langMenu + '<li><a
class="flex items-center px-8 sm:px-4 justify-between w-full py-3 bg-indigo-light dark:bg-purple-black"
aria-current="true"
href="'+$langTarget+'"><span class="font-body-semi"
>'+$langLabel+' - '+$locale.toUpperCase()+'</span><span class="fa-solid fa-check text-indigo dark:text-white text-body-l"></span></li>')
#end
#end ## end foreach
>'+$langLabel+' - '+$locale.toUpperCase()+
'</span><span class="fa-solid fa-check text-indigo dark:text-white text-body-l"></span></li>')
#end
#end ## end foreach
<agov-language
class="hidden sm:inline-block"
data-lang='$login.localeCode.toUpperCase()'
data-links='$langMenu'
data-aria_label='$text.get("languageDropdown.aria.label")'
>
>
</agov-language>
<a href="$text.get("general.help.link")" target="_blank" class="cursor-pointer hidden sm:inline-block">
<div class="mx-6 flex items-center">
<i class="text-xl pr-2 fa-regular fa-circle-question ml-auto text-space-blue dark:text-white transition-all"></i>
<span class="text-space-blue dark:text-white font-body-semi text-body-l transition-colors">$text.get("general.help")</span>
<span class="text-space-blue dark:text-white font-body-semi text-body-l transition-colors">$text.get(
"general.help")</span>
</div>
</a>
<agov-darkmode
class="hidden sm:inline-block"
data-aria_label='$text.get("darkModeSwitch.aria.label")'>
class="hidden sm:inline-block"
data-aria_label='$text.get("darkModeSwitch.aria.label")'>
</agov-darkmode>
<agov-mobile-menu

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -16,79 +16,73 @@
</div>
<h3 class="font-header text-h5 text-space-blue dark:text-white mb-4">$text.get(
"recovery_accessapp_auth.accessAppRegistered")</h3>
"recovery_accessapp_auth.accessAppRegistered")</h3>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
${text.get("recovery_accessapp_auth.instruction1").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
${text.get("recovery_accessapp_auth.instruction1").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
</p>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
${text.get("recovery_accessapp_auth.instruction2").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
${text.get("recovery_accessapp_auth.instruction2").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
</p>
<div id="accessAppModal" class="h-full">
<div class="desktopBanner" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4
mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div class="relative flex flex-col h-full">
<div id="blurBackdrop" class="absolute backdrop-blur-sm top-0 bottom-0 -left-4 -right-4 z-10"
style="display:none "></div>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm top-0 bottom-0 -left-4 -right-4 z-10"></div>
<div class="mobileBanner relative z-20" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div id="agovLoginImageMobile" style="display: none"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full basis-1/2 mx-auto mb-4">
<div id="agovLoginImageMobile"
class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full basis-1/2 mx-auto mb-4">
<img alt=""
src="${login.appDataPath}/static/images/recovery.svg"
class="block sm:hidden md:block dark:hidden w-full">
@ -102,8 +96,7 @@
<canvas role="img" aria-labelledby="labelQRCodeInstructions" id="mauth_qrcode"
class="mb-4 mx-auto"></canvas>
<div class="hidden" id="QRcodeHiddenLink"></div>
<span id="spinner" class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20"
style="display: none">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg"
class="animate-spin hidden dark:block">
@ -125,16 +118,16 @@
<div class="accessAppInstructions flex bg-indigo-light rounded-xl p-4 mb-4 items-center dark:bg-purple-black">
<img alt="" src="${login.appDataPath}/static/images/access-app.svg" class="h-12 mr-4">
<p id="labelQRCodeInstructions" class="font-header text-h5 text-space-blue dark:text-white">
$text.get("mauth_usernameless.instructions")
$text.get("mauth_usernameless.instructions")
</p>
</div>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" class="w-full bottom-8 sm:static mt-auto mb-6 sm:mb-0">
<div id="mobileButtons" style="display: none" class="w-full bottom-8 sm:static mt-auto mb-16 sm:mb-0">
<div id="mobileButtons" class="hidden w-full bottom-8 sm:static mt-auto mb-16 sm:mb-0">
<div class="flex flex-col">
<a id="accessAppLink" href="">
<agov-button
@ -155,21 +148,20 @@
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.showQR")"
"mauth_usernameless.showQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
<agov-button
style="display: none"
id="hideQR"
class="block basis-full"
class="hidden basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye-slash align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.hideQR")"
"mauth_usernameless.hideQR")"
data-type="button"
data-fullwidth="true">
</agov-button>

View File

@ -2,8 +2,8 @@
<agov-backdrop></agov-backdrop>
<div id="modal" class="fixed top-0 bottom-0 left-0 right-0 pb-20 z-50 hidden">
<div class="fixed top-0 bottom-0 left-0 right-0 backdrop-blur-[10px]" onclick="modal.setInvisible()"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 bg-[#E2E2E2E5]/80 dark:bg-[#111111]/90" onclick="modal.setInvisible()"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 backdrop-blur-[10px]" id="modal_light"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 bg-[#E2E2E2E5]/80 dark:bg-[#111111]/90" id="modal_dark"></div>
<div id="drawer"
class="fixed bg-white dark:bg-surface-black rounded-[20px] p-10 w-11/12 sm:max-w-[660px] top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
@ -13,12 +13,12 @@
</div>
<h4 id="modalTitle" class="font-header text-h4 text-space-blue dark:text-white mb-8">
$text.get("recovery_check_code.noCodeAccess")
$text.get("recovery_check_code.noCodeAccess")
</h4>
<div id="modalDescription" class="mb-20">
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.noCodeAccessInstructions")
$text.get("recovery_check_code.noCodeAccessInstructions")
</p>
</div>
@ -26,12 +26,12 @@
<div class="w-full sm:static mt-auto">
<div class="flex justify-end flex-col-reverse sm:flex-row gap-4">
<agov-button
id="recovery_check_code"
class="block"
data-style="secondary"
data-label="$text.get("general.cancel")"
data-type="button"
data-fullwidth="true"
onclick="modal.setInvisible()">
data-fullwidth="true">
</agov-button>
<a href="$text.get("general.help.link")" target="_blank" rel="noopener noreferrer">
<agov-button
@ -51,31 +51,36 @@
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.recovery")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.entryCode")</h4>
</div>
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-6">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.codeIncorrect")
$text.get("recovery_check_code.codeIncorrect")
</p>
</div>
#end
#end
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
$text.get("recovery_check_code.instruction")
$text.get("recovery_check_code.instruction")
</p>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
<agov-input
id="recovery_code_input"
class="mb-4 py-16"
data-label="$text.get("recovery_check_code.enterRecoveryCode")"
data-isLabelHidden="true"
@ -85,10 +90,6 @@
data-value=""
data-type="text"
data-autofocus="true"
oninput="validateCode.onInputCodeAndroid(event)"
onkeyup="validateCode.onKeyUp(event)"
onkeydown="validateCode.onInputCode(event)"
onpaste="validateCode.paste(event)"
data-email_invalid="$text.get("recovery_check_code.invalid.code")"
data-email_too_long="$text.get("recovery_check_code.invalid.code.tooLong")"
data-email_required="$text.get("recovery_check_code.invalid.code.required")">
@ -97,17 +98,18 @@
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn"
class="block basis-full"
data-name="confirm"
data-value="confirm"
data-id="confirm"
data-label="$text.get("general.confirm")"
data-type="submit"
data-fullwidth="true"
onclick="validateCode.validateForm(event)">
data-fullwidth="true">
</agov-button>
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-style="frameless"
data-name="cancelFido2"
@ -116,8 +118,7 @@
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false"
onclick="modal.setVisible()">
data-validate="false">
</agov-button>
</div>
</div>

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($PDFRecoveryTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','').replaceAll(
'^(https:\/\/[^\/]+\/).*$', '$1')))
'^(https:\/\/[^\/]+\/).*$', '$1')))
#set ($concat = "recovery/pdf?authToken=")
#set ($PDFLink = "$PDFRecoveryTarget$concat$gui.getGuiElem('pdfAuthToken').value")
@ -15,19 +15,19 @@
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.login")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get(
"recovery_code.newRecoveryCode")</h4>
"recovery_code.newRecoveryCode")</h4>
</div>
<div id="codeNotSeen"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_code.banner.error")
$text.get("recovery_code.banner.error")
</p>
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
$text.get("recovery_code.instruction")
$text.get("recovery_code.instruction")
</p>
<div class="flex justify-between items-center relative mb-4 py-4 pr-4 pl-8 rounded-xl bg-indigo-light dark:bg-purple-black">
@ -35,7 +35,7 @@
<div>
<p class="font-header text-h5 text-space-blue dark:text-white">$gui.getGuiElem('isiwebpasswd').value</p>
<p class="font-body text-body-m text-space-blue dark:text-white">
$text.get("recovery_code.validUntil")
$text.get("recovery_code.validUntil")
$gui.getGuiElem('validTil').value
</p>
@ -56,8 +56,7 @@
data-style="secondary"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>Reveal code"
data-type="button"
data-fullwidth="true"
onclick="blurCode.unBlurCode()">
data-fullwidth="true">
</agov-button>
<a class="mb-20" target="_blank" href="$PDFLink">
<agov-button
@ -77,14 +76,14 @@
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_continue"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="blurCode.continue(event)">
data-fullwidth="true">
</agov-button>
</div>

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -16,24 +16,23 @@
</div>
<h3 class="font-header text-h5 text-space-blue dark:text-white mb-4">$text.get(
"recovery_fidokey_auth.keyRegistered")</h3>
"recovery_fidokey_auth.keyRegistered")</h3>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
${text.get("recovery_fidokey_auth.instruction1").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
${text.get("recovery_fidokey_auth.instruction1").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
</p>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
${text.get("recovery_fidokey_auth.instruction2").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
${text.get("recovery_fidokey_auth.instruction2").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
</p>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("fido2_auth.cancel.fido")
$text.get("fido2_auth.cancel.fido")
</p>
</div>
@ -42,27 +41,27 @@
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">1</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"recovery_fidokey_auth.fidoInstruction")</p>
"recovery_fidokey_auth.fidoInstruction")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">2</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction2")</p>
"fido2_auth.instruction2")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">3</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction3")</p>
"fido2_auth.instruction3")</p>
</div>
</div>
<div class="mt-auto mb-6 sm:mb-0">
<agov-button
onclick="fido.authenticate()"
id="recovery_fido"
data-type="button"
data-label="$text.get("recovery_fidokey_auth.button")"
data-fullwidth="true"

View File

@ -2,6 +2,11 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
@ -13,43 +18,43 @@
<div class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.banner.info")
$text.get("recovery_intro_email.banner.info")
</p>
</div>
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.banner.error")
$text.get("recovery_intro_email.banner.error")
</p>
</div>
#end
#end
<div id="captchaNotFilled" style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div id="captchaNotFilled"
class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.captchaUnchecked")
$text.get("error_9909")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="mt-4 flex flex-col flex-auto block ">
#set ($emailInput = $gui.getGuiElem('email'))
#set ($emailInput = $gui.getGuiElem('email'))
<agov-input
data-label="$text.get("general.email.address")"
data-placeholder="$text.get("general.email")"
data-id="email"
data-name="email"
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
data-value="$utils.escapeHtmlAttribute($emailInput.value)"
#else
#else
data-value=""
#end
#end
data-type="text"
data-autofocus="true"
data-left_icon="fa-envelope"
@ -60,108 +65,55 @@
<p class="font-body text-body-l text-space-blue dark:text-white mb-2 sm:mb-8">
<span class="font-body-semi">$text.get("recovery_intro_email.important")</span>
$text.get("recovery_intro_email.process")
$text.get("recovery_intro_email.process")
</p>
#if ($utils.escapeHtmlAttribute($gui.getGuiElem("X-ReCAPTCHA-Integration").value) == "INVISIBLE")
#set ($isCaptchaVisible = true)
#else
#set ($isCaptchaVisible = false)
#end
#if ($isCaptchaVisible)
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaInvisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?render=$captcha.value"></script>
#set ($siteKey = $gui.getGuiElem("friendlyCaptchaSettings.siteKey"))
#set ($puzzleUrl = $gui.getGuiElem("friendlyCaptchaSettings.puzzleUrl"))
#set ($captchaEnabled = $gui.getGuiElem("captchaSettings.enabled"))
<script>
function emailCaptcha(event) {
event.preventDefault();
if (validateEmail.validateForm(event)) {
grecaptcha.enterprise.ready(async () => {
await grecaptcha.enterprise.execute('$captcha.value', { action: 'LOGIN' })
.then((token) => {
document.querySelector('input[name="recaptcha_response"]').value = token;
addButton();
});
});
}
return false;
}
function addButton() {
let btn = document.createElement("button");
btn.type = "submit";
btn.name = "continue";
btn.value = "continue";
btn.style.display = "none";
document.querySelector('#$gui.name').appendChild(btn);
btn.click()
}
</script>
#else
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaVisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?onload=onloadCallback&render=explicit" async
defer></script>
<script>
var verifyCallback = function (response) {
document.querySelector('input[name="recaptcha_response"]').value = response;
};
var expiredCallback = function () {
document.querySelector('input[name="recaptcha_response"]').value = 'captcha';
};
var onloadCallback = function () {
grecaptcha.enterprise.render(document.getElementById('captchaRender'), {
'sitekey': '$captcha.value',
'action': 'LOGIN',
'callback': verifyCallback,
'expired-callback': expiredCallback
});
};
</script>
#end
<div class="font-body text-body-l mb-4">
#if ($isCaptchaVisible)
<div class="text-disabled-grey dark:text-silver">
$text.get("recovery_intro_email.siteProtectedWithRecaptcha")
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<div class="font-body w-full text-body-l mb-4">
<div class="flex mt-8">
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"
data-lang="$login.language"
data-solution-field-name="captcha_response">
</div>
</div>
#else
<div class="flex mt-8" id="captchaRender"></div>
#end
</div>
</div>
#end ## if
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col sm:flex-row-reverse gap-4">
#if ($isCaptchaVisible)
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<agov-button
id="submit_btn_captcha_enabled"
disabled="true"
class="block basis-full"
data-name="continue"
data-value="continue"
data-id="continue"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="return emailCaptcha(event)">
data-fullwidth="true">
</agov-button>
#else
#else
<agov-button
id="submit_btn_captcha_disabled"
class="block basis-full"
data-name="continue"
data-value="continue"
data-id="continue"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="validateEmail.validateForm(event, true)">
data-fullwidth="true">
</agov-button>
#end
#end ## if
<agov-button
class="block basis-full"
data-style="secondary"

View File

@ -2,6 +2,11 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
@ -14,12 +19,12 @@
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email_sent.banner.success")
$text.get("recovery_intro_email_sent.banner.success")
</p>
</div>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">

View File

@ -11,18 +11,18 @@
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
$text.get("recovery_questionnaire_loginfactor.question")
$text.get("recovery_questionnaire_loginfactor.question")
</p>
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden"
id="errorBanner">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_questionnaire_loginfactor.banner.error")
$text.get("recovery_questionnaire_loginfactor.banner.error")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
@ -42,11 +42,11 @@
<div id="buttons" class="w-full sm:static mt-auto mb-6 sm:mb-0 mt-24 sm:mt-24">
<div class="flex sm:flex-row-reverse flex-col gap-2">
<agov-button
id="questionnaire_continue_btn"
class="block basis-full"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="setErrorBanner(validateAnswer.validateFormYesOrNo(event))">
data-fullwidth="true">
</agov-button>
<agov-button
class="block basis-full"

View File

@ -11,60 +11,60 @@
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
$text.get("recovery_questionnaire_reason_selection.instruction")
$text.get("recovery_questionnaire_reason_selection.instruction")
</p>
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden"
id="errorBanner">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_questionnaire_reason_selection.banner.error")
$text.get("recovery_questionnaire_reason_selection.banner.error")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="answersForm" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
#set ($previousAnswer = $gui.getGuiElem("question"))
#if ($previousAnswer.value == "yes")
#set ($answers = ["answer7", "answer8", "answer9", "answer10"])
#elseif ($previousAnswer.value == "no")
#set ($answers = ["answer1", "answer2", "answer3", "answer4", "answer5", "answer6"])
#else
#set ($answers = [])
#end
#set ($previousAnswer = $gui.getGuiElem("question"))
#if ($previousAnswer.value == "yes")
#set ($answers = ["answer7", "answer8", "answer9", "answer10"])
#elseif ($previousAnswer.value == "no")
#set ($answers = ["answer1", "answer2", "answer3", "answer4", "answer5", "answer6"])
#else
#set ($answers = [])
#end
#if ($answers.size() > 0)
#foreach ($answer in $answers)
#set ($isYes = "yes")
#set ($isNo = "no")
#set ($dataValue = "")
#if ($answers.size() > 0)
#foreach ($answer in $answers)
#set ($isYes = "yes")
#set ($isNo = "no")
#set ($dataValue = "")
#if ($answer == "answer2" || $answer == "answer3" || $answer ==
"answer4" || $answer == "answer5" || $answer == "answer6" || $answer == "answer8")
#set ($dataValue = $isYes)
#elseif ($answer == "answer1" || $answer == "answer7" || $answer == "answer9" || $answer == "answer10")
#set ($dataValue = $isNo)
#end
#if ($answer == "answer2" || $answer == "answer3" || $answer ==
"answer4" || $answer == "answer5" || $answer == "answer6" || $answer == "answer8")
#set ($dataValue = $isYes)
#elseif ($answer == "answer1" || $answer == "answer7" || $answer == "answer9" || $answer == "answer10")
#set ($dataValue = $isNo)
#end
<agov-radio-button data-text="$text.get("recovery_questionnaire_reason_selection.$answer")"
data-value="$dataValue"
data-id="$answer"
data-name="continue"
data-groupName="button-answers">
</agov-radio-button>
#end
#end
#end
#end
<div class="w-full sm:static mt-8 mb-6 sm:mb-0 ">
<div class="flex sm:flex-row-reverse flex-col gap-2">
<agov-button
id="questionnaire_continue_btn_reason"
class="block basis-full"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="setErrorBanner(validateAnswer.validateForm(event))">
data-fullwidth="true">
</agov-button>
<agov-button

View File

@ -2,31 +2,43 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.login")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.securityKey")</h4>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div id="captchaNotFilled"
class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("error_9909")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
#set ($emailInput = $gui.getGuiElem('email'))
#set ($emailInput = $gui.getGuiElem('email'))
<agov-input
class="mb-4 sm:mb-40"
data-label="$text.get("general.email.address")"
data-placeholder="$text.get("general.email")"
data-id="email"
data-name="userInputValue_prompt.email"
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
data-value="$utils.escapeHtmlAttribute($emailInput.value)"
#else
#else
data-value=""
#end
#end
data-type="text"
data-autofocus="true"
data-left_icon="fa-envelope"
@ -35,106 +47,51 @@
data-email_required="$text.get("user_input.invalid.email.required")">
</agov-input>
#if ($gui.getGuiElem("X-ReCAPTCHA-Integration").value == "INVISIBLE")
#set ($isCaptchaVisible = true)
#else
#set ($isCaptchaVisible = false)
#end
#set ($siteKey = $gui.getGuiElem("friendlyCaptchaSettings.siteKey"))
#set ($puzzleUrl = $gui.getGuiElem("friendlyCaptchaSettings.puzzleUrl"))
#set ($captchaEnabled = $gui.getGuiElem("captchaSettings.enabled"))
#if ($isCaptchaVisible)
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaInvisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?render=$captcha.value"></script>
<script>
function emailCaptcha(event) {
event.preventDefault();
if (validateEmail.validateForm(event)) {
grecaptcha.enterprise.ready(async () => {
await grecaptcha.enterprise.execute('$captcha.value', { action: 'LOGIN' })
.then((token) => {
document.querySelector('input[name="recaptcha_response"]').value = token;
addButton();
});
});
}
return false;
}
function addButton() {
let btn = document.createElement("button");
btn.type = "submit";
btn.name = "submit";
btn.value = "submit";
btn.style.display = "none";
document.querySelector('#$gui.name').appendChild(btn);
btn.click()
}
</script>
#else
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaVisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?onload=onloadCallback&render=explicit" async
defer></script>
<script>
var verifyCallback = function (response) {
document.querySelector('input[name="recaptcha_response"]').value = response;
};
var expiredCallback = function () {
document.querySelector('input[name="recaptcha_response"]').value = 'captcha';
};
var onloadCallback = function () {
grecaptcha.enterprise.render(document.getElementById('captchaRender'), {
'sitekey': '$captcha.value',
'action': 'LOGIN',
'callback': verifyCallback,
'expired-callback': expiredCallback
});
};
</script>
#end
<div class="font-body text-body-l mb-4">
#if ($isCaptchaVisible)
<div class="text-disabled-grey dark:text-silver">
$text.get("recovery_intro_email.siteProtectedWithRecaptcha")
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<div class="w-full font-body text-body-l mb-4">
<div class="flex mt-8">
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"
data-lang="$login.language"
data-solution-field-name="captcha_response">
</div>
</div>
#else
<div class="flex mt-8" id="captchaRender"></div>
#end
</div>
</div>
#end ## if
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col sm:flex-row-reverse gap-4">
#if ($isCaptchaVisible)
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<agov-button
id="submit_btn_captcha_enabled"
disabled="true"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.login")"
data-type="submit"
data-fullwidth="true"
onclick="return emailCaptcha(event)">
data-fullwidth="true">
</agov-button>
#else
#else
<agov-button
id="submit_btn_captcha_disabled"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.login")"
data-type="submit"
data-fullwidth="true"
onclick="validateEmail.validateForm(event)">
data-fullwidth="true">
</agov-button>
#end
#end ## if
<agov-button
class="block basis-full"
data-style="secondary"

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow
recovery_fidokey_auth.keyRegistered=Security key already registered
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
recovery_intro_email.captchaUnchecked=Please tick the captcha field
recovery_intro_email.important=Important:
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=This site is protected by reCAPTCHA and the <a class='link' href='https://policies.google.com/privacy' target='_blank'>Google Privacy Policy</a> and <a class='link' href='https://policies.google.com/terms' target='_blank'>Terms of Service</a> apply.
recovery_intro_email_sent.banner.button=Didn't receive the email?
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
recovery_on_going.finishRecovery=Finish recovery

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Bitte verwenden Sie !!!SECURITY_KEY_NAME!!! u
recovery_fidokey_auth.keyRegistered=Sicherheitsschl&uuml;ssel schon registriert
recovery_intro_email.banner.error=Der von Ihnen verwendete Link ist abgelaufen. Bitte geben Sie Ihre E-Mail-Adresse ein, um einen neuen Link zu erhalten.
recovery_intro_email.banner.info=Bitte geben Sie Ihre E-Mail-Adresse ein, damit wir Ihnen einen Link schicken k&ouml;nnen, mit dem Sie den Wiederherstellungsprozess starten.
recovery_intro_email.captchaUnchecked=Bitte kreuzen Sie das Captcha-Feld an
recovery_intro_email.important=Wichtig:
recovery_intro_email.process=Der Wiederherstellungsprozess sollte nur verwendet werden, wenn Sie den Zugriff auf Ihre Login-Faktoren verloren haben (gel&ouml;schte AGOV access App, verlorener Sicherheitsschl&uuml;ssel, verlorenes Telefon usw.).
recovery_intro_email.siteProtectedWithRecaptcha=Diese Seite ist durch reCAPTCHA gesch&uuml;tzt, und es gelten die <a class='link' href='https://policies.google.com/privacy' target='_blank'>Datenschutzerkl&auml;rung</a> sowie die <a class='link' href='https://policies.google.com/terms' target='_blank'>Nutzungsbedingungen</a> von Google.
recovery_intro_email_sent.banner.button=Keine E-Mail erhalten?
recovery_intro_email_sent.banner.success=Vielen Dank! Sie werden in K&uuml;rze eine E-Mail mit einem Wiederherstellungslink und Anweisungen erhalten.
recovery_on_going.finishRecovery=Wiederherstellung abschliessen

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow
recovery_fidokey_auth.keyRegistered=Security key already registered
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
recovery_intro_email.captchaUnchecked=Please tick the captcha field
recovery_intro_email.important=Important:
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=This site is protected by reCAPTCHA and the <a class='link' href='https://policies.google.com/privacy' target='_blank'>Google Privacy Policy</a> and <a class='link' href='https://policies.google.com/terms' target='_blank'>Terms of Service</a> apply.
recovery_intro_email_sent.banner.button=Didn't receive the email?
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
recovery_on_going.finishRecovery=Finish recovery

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Veuillez utiliser !!!SECURITY_KEY_NAME!!! pou
recovery_fidokey_auth.keyRegistered=Cl&eacute; de s&eacute;curit&eacute; d&eacute;j&agrave; enregistr&eacute;e
recovery_intro_email.banner.error=Le lien que vous avez utilis&eacute; a expir&eacute;. Veuillez saisir votre adresse e-mail pour recevoir un nouveau lien.
recovery_intro_email.banner.info=Veuillez saisir votre adresse e-mail. Nous vous enverrons un e-mail vous permettant de d&eacute;marrer le processus de r&eacute;cup&eacute;ration.
recovery_intro_email.captchaUnchecked=Veuillez cocher la case captcha
recovery_intro_email.important=Important:
recovery_intro_email.process=Le processus de r&eacute;cup&eacute;ration ne doit &ecirc;tre utilis&eacute; que si vous avez perdu l'acc&egrave;s &agrave; vos facteurs de connexion (application AGOV access supprim&eacute;e, cl&eacute; de s&eacute;curit&eacute; perdue, t&eacute;l&eacute;phone perdu, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=Ce site est prot&eacute;g&eacute; par reCAPTCHA: les <a class=&rsquo;link&rsquo; href=&rsquo;https://policies.google.com/privacy&rsquo; target=&rsquo;_blank&rsquo;>r&egrave;gles de confidentialit&eacute;</a> et <a class=&rsquo;link&rsquo; href=&rsquo;https://policies.google.com/terms&rsquo; target=&rsquo;_blank&rsquo;>conditions d&rsquo;utilisation</a> de Google s&rsquo;appliquent.
recovery_intro_email_sent.banner.button=Vous n&rsquo;avez pas re&ccedil;u l'email?
recovery_intro_email_sent.banner.success=Merci! Vous recevrez dans un instant un e-mail contenant un lien de r&eacute;cup&eacute;ration et des instructions.
recovery_on_going.finishRecovery=Terminer la r&eacute;cup&eacute;ration

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Si prega di usare !!!SECURITY_KEY_NAME!!! per
recovery_fidokey_auth.keyRegistered=Chiave di sicurezza gi&agrave; registrata
recovery_intro_email.banner.error=Il link utilizzato &egrave; scaduto. Per ricevere un nuovo link, inserire l&rsquo;indirizzo e-mail.
recovery_intro_email.banner.info=Per ricevere il link e avviare il processo di ripristino, inserire l&rsquo;indirizzo e-mail.
recovery_intro_email.captchaUnchecked=Per favore selezioni il campo captcha
recovery_intro_email.important=Importante:
recovery_intro_email.process=Il processo di ripristino deve essere utilizzato solo se ha perso l'accesso ai suoi fattori di accesso (app di accesso AGOV eliminata, chiave di sicurezza persa, telefono smarrito, ecc.).
recovery_intro_email.siteProtectedWithRecaptcha=Questo sito &egrave; protetto da reCAPTCHA. Si applicano le <a class='link' href='https://policies.google.com/privacy' target='_blank'>norme sulla privacy</a> e i <a class='link' href='https://policies.google.com/terms' target='_blank'>termini di servizio di Google</a>.
recovery_intro_email_sent.banner.button=Non avete ricevuto l'e-mail?
recovery_intro_email_sent.banner.success=Grazie! &Egrave; stata inviata un&rsquo;e-mail contenente il codice di ripristino e le istruzioni.
recovery_on_going.finishRecovery=Completare il ripristino

View File

@ -0,0 +1,5 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initQRCode'));
document.dispatchEvent(new Event('initDrawer'));
document.dispatchEvent(new Event('initCantonalBranding'));
});

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

View File

@ -1,9 +1,3 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initAnswer'));
});
// eslint-disable-next-line no-unused-vars
function setErrorBanner(value) {
document.getElementById('errorBanner').style.display = value ? 'none' : 'flex';
document.getElementById('buttons').style.marginTop = value ? '16px' : '8px';
}

View File

@ -1,9 +1,3 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initAnswer'));
});
// eslint-disable-next-line no-unused-vars
function setErrorBanner(value) {
document.getElementById('errorBanner').style.display = value ? 'none' : 'flex';
console.log(document.getElementById('errorBanner').style.display);
}

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -15,16 +15,16 @@
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.securityKey")</h4>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8">
<div class="flex flex-row items-center justify-between">
#set ($emailInput = $gui.getGuiElem('email'))
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#set ($emailInput = $gui.getGuiElem('email'))
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
<p class="text-space-blue dark:text-white font-body-semi text-body-l truncate">$utils.escapeHtmlAttribute($emailInput.value)</p>
#else
#else
<p class="text-space-blue dark:text-white font-body-semi text-body-l truncate"></p>
#end
#end
<agov-button
class="shrink-0"
data-style="frameless"
@ -40,11 +40,10 @@
</form>
<div class="mt-3 mb-6 w-full h-px bg-platinum rounded-full"></div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("fido2_auth.cancel.fido")
$text.get("fido2_auth.cancel.fido")
</p>
</div>
@ -53,21 +52,21 @@
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">1</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction1")</p>
"fido2_auth.instruction1")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">2</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction2")</p>
"fido2_auth.instruction2")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">3</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction3")</p>
"fido2_auth.instruction3")</p>
</div>
</div>
@ -79,12 +78,12 @@
</agov-checkbox>
<label for="skip" class="font-body text-body-l text-space-blue dark:text-white cursor-pointer">
$text.get("fido2_auth.skipInstructions")
$text.get("fido2_auth.skipInstructions")
</label>
</div>
<div class="mt-auto mb-6 sm:mb-0">
<agov-button
onclick="fido.authenticate()"
id="fido_authenticate"
data-type="button"
data-label="$text.get("general.continue")"
data-fullwidth="true"
@ -94,7 +93,7 @@
<div class="flex items-center mt-6 mb-4">
<span class="h-px w-full bg-silver"></span>
<span class="px-2 text-disabled-grey font-body-semi text-body-l whitespace-nowrap">
$text.get("fido2_auth.switchLogin")
$text.get("fido2_auth.switchLogin")
</span>
<span class="h-px w-full bg-silver"></span>
</div>

View File

@ -3,7 +3,7 @@
$text.get("footer.text")
<a target="_blank" class='text-hyperlink dark:text-dark-hyperlink underline' href='$text.get("footer.link")'>$text.get("footer.link.label")</a>
</div>
<p>1.5.7.77-20240809T142941Z</p>
<p>1.6.8.13-20240919T195132Z</p>
</footer>
<script src="${login.appDataPath}/static/bundle.js"></script>
</body>

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-screen h-full mx-4 flex sm:block" style="min-height: 100svh">
<html lang="$login.language" class="relative min-h-100 h-full mx-4 flex sm:block">
<head>
<title>AGOV</title>
<meta charset="UTF-8">

View File

@ -10,15 +10,15 @@
class="flex items-center rounded-xl gap-5 p-2 sm:p-0 sm:w-auto w-full hidden bg-pale-blue dark:bg-purple-black sm:bg-transparent">
<div class="flex items-center p-2 bg-white rounded sm:rounded-xl w-16 h-16" id="logo"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
@ -28,7 +28,7 @@
<h1 class="font-header text-h4 text-space-blue dark:text-white mb-8">$text.get("general.registration")</h1>
<h2 class="font-header text-h5 text-space-blue dark:text-white text-center mb-4">
$text.get("mauth_usernameless.noAccount")
$text.get("mauth_usernameless.noAccount")
</h2>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
@ -49,6 +49,8 @@
<div id="agovLoginImage"
class="relative md:max-w-[520px] max-w-[350px] sm:max-w-[300px] mb-10 w-full mx-auto hidden md:block">
<div class="hidden flex items-center p-2 bg-white dark:bg-black rounded-xl w-16 h-16 absolute left-[calc(39%-32px)] top-8"
id="logoDoor"></div>
<img alt="" src="${login.appDataPath}/static/images/login.svg"
class="hidden md:block dark:hidden w-full">
<img alt="" src="${login.appDataPath}/static/images/login-dark.svg"
@ -69,15 +71,15 @@
<div class="flex items-center p-2 bg-white dark:bg-black rounded sm:rounded-xl w-16 h-16"
id="logoMobile"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
@ -93,65 +95,65 @@
<div id="accessAppModal" class="h-full">
<div class="desktopBanner" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4
mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center
p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div class="relative flex flex-col h-full">
<div id="blurBackdrop" class="absolute backdrop-blur-sm -top-1 -bottom-8 -left-4 -right-4 z-10"
style="display:none "></div>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-8 -left-4 -right-4
z-10"></div>
<div class="mobileBanner relative z-20" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center
p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background
items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div id="agovLoginImageMobile" style="display: none"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full mx-auto mb-6">
<div id="agovLoginImageMobile" class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full
mx-auto mb-6">
<img alt=""
src="${login.appDataPath}/static/images/login.svg"
class="block sm:hidden md:block dark:hidden w-full">
@ -165,12 +167,12 @@
<canvas role="img" aria-labelledby="labelQRCodeInstructions" id="mauth_qrcode"
class="mb-6 mx-auto"></canvas>
<div class="hidden" id="QRcodeHiddenLink"></div>
<span id="spinner" class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20"
style="display: none">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2
z-20">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg"
class="animate-spin hidden dark:block">
</span>
</span>
</div>
<a id="accessAppLinkIpad" href="" class="hidden">
@ -189,7 +191,7 @@
dark:bg-purple-black">
<img alt="" src="${login.appDataPath}/static/images/access-app.svg" class="h-12 mr-4">
<p id="labelQRCodeInstructions" class="font-header text-h5 text-space-blue dark:text-white">
$text.get("mauth_usernameless.instructions")
$text.get("mauth_usernameless.instructions")
</p>
</div>
</div>
@ -197,7 +199,7 @@
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" class="w-full sm:static mt-auto mb-20 sm:mb-0">
<div id="mobileButtons" style="display: none" class="w-full">
<div id="mobileButtons" class="hidden w-full">
<div class="flex flex-col">
<a id="accessAppLink" href="">
<agov-button
@ -218,21 +220,20 @@
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.showQR")"
"mauth_usernameless.showQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
<agov-button
style="display: none"
id="hideQR"
class="block basis-full"
class="hidden basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye-slash align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.hideQR")"
"mauth_usernameless.hideQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
@ -246,11 +247,11 @@
<div id="securityKeyModal" class="hidden mt-16">
<h2 class="font-header text-h5 text-space-blue dark:text-white mt-4 text-center">
$text.get("mauth_usernameless.useSecurityKey")
$text.get("mauth_usernameless.useSecurityKey")
</h2>
<p class="font-body text-body-l text-space-blue dark:text-white text-center my-6">
$text.get("mauth_usernameless.useSecurityKeyInfo")
$text.get("mauth_usernameless.useSecurityKeyInfo")
</p>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
@ -280,14 +281,14 @@
<button class="hidden" id="onReload" name="onReload"></button>
<h2 class="font-header text-h5 text-space-blue dark:text-white mt-7 mb-4 text-center">
$text.get("mauth_usernameless.cannotLogin")
$text.get("mauth_usernameless.cannotLogin")
</h2>
<agov-button
data-style="secondary"
data-name="fallback"
data-value="recovery"
data-label="<i class='fa-regular fa-suitcase-medical text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.startRecovery")"
"mauth_usernameless.startRecovery")"
data-type="submit"
data-fullwidth="true"
class="block">
@ -300,7 +301,7 @@
</div>
</div>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" style="display: none" class="sm:hidden formDrawer">
accept-charset="UTF-8" class="hidden sm:hidden formDrawer">
<div class="w-full z-30 fixed left-0 pointer-events-none" id="drawerContainer">
<div class="w-full bg-white dark:bg-surface-black px-4 pb-[130px] rounded-t-2xl pointer-events-auto" id="drawer">
<div class="pt-2 pb-4 cursor-pointer">
@ -309,12 +310,12 @@
<div class="flex items-center justify-center mb-6">
<span class="px-2 text-disabled-grey dark:text-white font-body-semi text-body-l whitespace-nowrap">
$text.get("general.otherOptions")
$text.get("general.otherOptions")
</span>
</div>
<p class="font-body-semi text-body-l text-space-blue dark:text-white text-center mb-2">
$text.get("mauth_usernameless.noAccount")
$text.get("mauth_usernameless.noAccount")
</p>
<agov-button
@ -330,14 +331,14 @@
<div class="flex items-center mt-6 mb-6">
<span class="h-px w-full bg-silver"></span>
<span class="px-2 text-disabled-grey dark:text-white font-body-semi text-body-l whitespace-nowrap">
$text.get("general.or")</span>
$text.get("general.or")</span>
<span class="h-px w-full bg-silver"></span>
</div>
<div class="flex flex-col flex-wrap justify-center items-center mb-6 gap-1">
<p class="font-body-semi text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.cannotLogin")
$text.get("mauth_usernameless.cannotLogin")
</p>
<agov-button
data-style="frameless"
@ -353,9 +354,9 @@
<div class="font-body text-body-s text-disabled-grey dark:text-silver text-center">
$text.get("footer.text")
$text.get("footer.text")
<a target="_blank" class='text-hyperlink dark:text-info underline' href='$text.get("footer.link")'>$text.get(
"footer.link.label")</a>
"footer.link.label")</a>
</div>
</div>
</div>
@ -363,13 +364,10 @@
</form>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
document.dispatchEvent(new Event('initQRCode'));
document.dispatchEvent(new Event('initDrawer'));
document.dispatchEvent(new Event('initCantonalBranding'));
cantonalBranding.getLogo("$gui.getGuiElem('agov.appSamlRpEntityId').value", "$login.language");
});
<script src="${login.appDataPath}/static/js-code/mauth_usernameless.js" defer>
</script>
<div id="appSamlRpEntityId" class="hidden" data-value="$gui.getGuiElem('agov.appSamlRpEntityId').value"
data-language="$login.language">
</div>
#parse("${templatePath}/footer.vm")

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-screen h-full mx-4 flex sm:block" style="min-height: 100svh">
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-100 h-full mx-4 flex sm:block">
<head>
<title>AGOV Operations</title>
<meta charset="UTF-8">
@ -20,51 +20,53 @@
<img alt="agov Logo" src="${login.appDataPath}/static/images/agov-logo.svg" class="h-5 sm:h-8 sm:mr-6 dark:hidden">
<img alt="agov Logo" src="${login.appDataPath}/static/images/agov-logo-dark.svg" class="h-5 sm:h-8 sm:mr-6 hidden dark:block">
<div class="flex items-center flex-1 sm:flex-initial justify-end">
#set ($langMenu = '')
#foreach ($locale in $login.locales)
## find translated label of current locale
#if ($text.contains("language.$locale"))
#set ($langLabel = $text.get("language.$locale"))
#elseif ($locale.length() > 2)
#set ($langLabel = $text.get("language.${locale.substring(0,2).toLowerCase()}"))
#else
#set ($langLabel = $locale)
#end
## emit link or text for each language
#set ($langTarget = $utils.escapeHtmlAttribute($gui.target('language', $locale)))
#set ($langMenu = '')
#foreach ($locale in $login.locales)
## find translated label of current locale
#if ($text.contains("language.$locale"))
#set ($langLabel = $text.get("language.$locale"))
#elseif ($locale.length() > 2)
#set ($langLabel = $text.get("language.${locale.substring(0,2).toLowerCase()}"))
#else
#set ($langLabel = $locale)
#end
## emit link or text for each language
#set ($langTarget = $utils.escapeHtmlAttribute($gui.target('language', $locale)))
#if ($login.localeCode != $locale && $login.language != $locale)
#set ($langMenu = $langMenu + '<li><a
#if ($login.localeCode != $locale && $login.language != $locale)
#set ($langMenu = $langMenu + '<li><a
class="block px-8 sm:px-4 py-3 hover:bg-lavender-blush dark:hover:bg-purple-black"
aria-current="false"
href="'+$langTarget+'">'+$langLabel+' - '+$locale.toUpperCase()
+'</a></li>')
#else
#set ($langMenu = $langMenu + '<li><a
+'</a></li>')
#else
#set ($langMenu = $langMenu + '<li><a
class="flex items-center px-8 sm:px-4 justify-between w-full py-3 bg-indigo-light dark:bg-purple-black"
aria-current="true"
href="'+$langTarget+'"><span class="font-body-semi"
>'+$langLabel+' - '+$locale.toUpperCase()+'</span><span class="fa-solid fa-check text-indigo dark:text-white text-body-l"></span></li>')
#end
#end ## end foreach
>'+$langLabel+' - '+$locale.toUpperCase()+
'</span><span class="fa-solid fa-check text-indigo dark:text-white text-body-l"></span></li>')
#end
#end ## end foreach
<agov-language
class="hidden sm:inline-block"
data-lang='$login.localeCode.toUpperCase()'
data-links='$langMenu'
data-aria_label='$text.get("languageDropdown.aria.label")'
>
>
</agov-language>
<a href="$text.get("general.help.link")" target="_blank" class="cursor-pointer hidden sm:inline-block">
<div class="mx-6 flex items-center">
<i class="text-xl pr-2 fa-regular fa-circle-question ml-auto text-space-blue dark:text-white transition-all"></i>
<span class="text-space-blue dark:text-white font-body-semi text-body-l transition-colors">$text.get("general.help")</span>
<span class="text-space-blue dark:text-white font-body-semi text-body-l transition-colors">$text.get(
"general.help")</span>
</div>
</a>
<agov-darkmode
class="hidden sm:inline-block"
data-aria_label='$text.get("darkModeSwitch.aria.label")'>
class="hidden sm:inline-block"
data-aria_label='$text.get("darkModeSwitch.aria.label")'>
</agov-darkmode>
<agov-mobile-menu

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -16,79 +16,73 @@
</div>
<h3 class="font-header text-h5 text-space-blue dark:text-white mb-4">$text.get(
"recovery_accessapp_auth.accessAppRegistered")</h3>
"recovery_accessapp_auth.accessAppRegistered")</h3>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
${text.get("recovery_accessapp_auth.instruction1").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
${text.get("recovery_accessapp_auth.instruction1").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
</p>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
${text.get("recovery_accessapp_auth.instruction2").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
${text.get("recovery_accessapp_auth.instruction2").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
</p>
<div id="accessAppModal" class="h-full">
<div class="desktopBanner" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4
mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div class="relative flex flex-col h-full">
<div id="blurBackdrop" class="absolute backdrop-blur-sm top-0 bottom-0 -left-4 -right-4 z-10"
style="display:none "></div>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm top-0 bottom-0 -left-4 -right-4 z-10"></div>
<div class="mobileBanner relative z-20" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div id="agovLoginImageMobile" style="display: none"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full basis-1/2 mx-auto mb-4">
<div id="agovLoginImageMobile"
class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full basis-1/2 mx-auto mb-4">
<img alt=""
src="${login.appDataPath}/static/images/recovery.svg"
class="block sm:hidden md:block dark:hidden w-full">
@ -102,8 +96,7 @@
<canvas role="img" aria-labelledby="labelQRCodeInstructions" id="mauth_qrcode"
class="mb-4 mx-auto"></canvas>
<div class="hidden" id="QRcodeHiddenLink"></div>
<span id="spinner" class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20"
style="display: none">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg"
class="animate-spin hidden dark:block">
@ -125,16 +118,16 @@
<div class="accessAppInstructions flex bg-indigo-light rounded-xl p-4 mb-4 items-center dark:bg-purple-black">
<img alt="" src="${login.appDataPath}/static/images/access-app.svg" class="h-12 mr-4">
<p id="labelQRCodeInstructions" class="font-header text-h5 text-space-blue dark:text-white">
$text.get("mauth_usernameless.instructions")
$text.get("mauth_usernameless.instructions")
</p>
</div>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" class="w-full bottom-8 sm:static mt-auto mb-6 sm:mb-0">
<div id="mobileButtons" style="display: none" class="w-full bottom-8 sm:static mt-auto mb-16 sm:mb-0">
<div id="mobileButtons" class="hidden w-full bottom-8 sm:static mt-auto mb-16 sm:mb-0">
<div class="flex flex-col">
<a id="accessAppLink" href="">
<agov-button
@ -155,21 +148,20 @@
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.showQR")"
"mauth_usernameless.showQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
<agov-button
style="display: none"
id="hideQR"
class="block basis-full"
class="hidden basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye-slash align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.hideQR")"
"mauth_usernameless.hideQR")"
data-type="button"
data-fullwidth="true">
</agov-button>

View File

@ -2,8 +2,8 @@
<agov-backdrop></agov-backdrop>
<div id="modal" class="fixed top-0 bottom-0 left-0 right-0 pb-20 z-50 hidden">
<div class="fixed top-0 bottom-0 left-0 right-0 backdrop-blur-[10px]" onclick="modal.setInvisible()"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 bg-[#E2E2E2E5]/80 dark:bg-[#111111]/90" onclick="modal.setInvisible()"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 backdrop-blur-[10px]" id="modal_light"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 bg-[#E2E2E2E5]/80 dark:bg-[#111111]/90" id="modal_dark"></div>
<div id="drawer"
class="fixed bg-white dark:bg-surface-black rounded-[20px] p-10 w-11/12 sm:max-w-[660px] top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
@ -13,12 +13,12 @@
</div>
<h4 id="modalTitle" class="font-header text-h4 text-space-blue dark:text-white mb-8">
$text.get("recovery_check_code.noCodeAccess")
$text.get("recovery_check_code.noCodeAccess")
</h4>
<div id="modalDescription" class="mb-20">
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.noCodeAccessInstructions")
$text.get("recovery_check_code.noCodeAccessInstructions")
</p>
</div>
@ -26,12 +26,12 @@
<div class="w-full sm:static mt-auto">
<div class="flex justify-end flex-col-reverse sm:flex-row gap-4">
<agov-button
id="recovery_check_code"
class="block"
data-style="secondary"
data-label="$text.get("general.cancel")"
data-type="button"
data-fullwidth="true"
onclick="modal.setInvisible()">
data-fullwidth="true">
</agov-button>
<a href="$text.get("general.help.link")" target="_blank" rel="noopener noreferrer">
<agov-button
@ -51,31 +51,36 @@
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.recovery")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.entryCode")</h4>
</div>
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-6">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.codeIncorrect")
$text.get("recovery_check_code.codeIncorrect")
</p>
</div>
#end
#end
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
$text.get("recovery_check_code.instruction")
$text.get("recovery_check_code.instruction")
</p>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
<agov-input
id="recovery_code_input"
class="mb-4 py-16"
data-label="$text.get("recovery_check_code.enterRecoveryCode")"
data-isLabelHidden="true"
@ -85,10 +90,6 @@
data-value=""
data-type="text"
data-autofocus="true"
oninput="validateCode.onInputCodeAndroid(event)"
onkeyup="validateCode.onKeyUp(event)"
onkeydown="validateCode.onInputCode(event)"
onpaste="validateCode.paste(event)"
data-email_invalid="$text.get("recovery_check_code.invalid.code")"
data-email_too_long="$text.get("recovery_check_code.invalid.code.tooLong")"
data-email_required="$text.get("recovery_check_code.invalid.code.required")">
@ -97,17 +98,18 @@
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn"
class="block basis-full"
data-name="confirm"
data-value="confirm"
data-id="confirm"
data-label="$text.get("general.confirm")"
data-type="submit"
data-fullwidth="true"
onclick="validateCode.validateForm(event)">
data-fullwidth="true">
</agov-button>
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-style="frameless"
data-name="cancelFido2"
@ -116,8 +118,7 @@
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false"
onclick="modal.setVisible()">
data-validate="false">
</agov-button>
</div>
</div>

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($PDFRecoveryTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','').replaceAll(
'^(https:\/\/[^\/]+\/).*$', '$1')))
'^(https:\/\/[^\/]+\/).*$', '$1')))
#set ($concat = "recovery/pdf?authToken=")
#set ($PDFLink = "$PDFRecoveryTarget$concat$gui.getGuiElem('pdfAuthToken').value")
@ -15,19 +15,19 @@
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.login")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get(
"recovery_code.newRecoveryCode")</h4>
"recovery_code.newRecoveryCode")</h4>
</div>
<div id="codeNotSeen"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_code.banner.error")
$text.get("recovery_code.banner.error")
</p>
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
$text.get("recovery_code.instruction")
$text.get("recovery_code.instruction")
</p>
<div class="flex justify-between items-center relative mb-4 py-4 pr-4 pl-8 rounded-xl bg-indigo-light dark:bg-purple-black">
@ -35,7 +35,7 @@
<div>
<p class="font-header text-h5 text-space-blue dark:text-white">$gui.getGuiElem('isiwebpasswd').value</p>
<p class="font-body text-body-m text-space-blue dark:text-white">
$text.get("recovery_code.validUntil")
$text.get("recovery_code.validUntil")
$gui.getGuiElem('validTil').value
</p>
@ -56,8 +56,7 @@
data-style="secondary"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>Reveal code"
data-type="button"
data-fullwidth="true"
onclick="blurCode.unBlurCode()">
data-fullwidth="true">
</agov-button>
<a class="mb-20" target="_blank" href="$PDFLink">
<agov-button
@ -77,14 +76,14 @@
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_continue"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="blurCode.continue(event)">
data-fullwidth="true">
</agov-button>
</div>

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -16,24 +16,23 @@
</div>
<h3 class="font-header text-h5 text-space-blue dark:text-white mb-4">$text.get(
"recovery_fidokey_auth.keyRegistered")</h3>
"recovery_fidokey_auth.keyRegistered")</h3>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
${text.get("recovery_fidokey_auth.instruction1").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
${text.get("recovery_fidokey_auth.instruction1").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
</p>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
${text.get("recovery_fidokey_auth.instruction2").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
${text.get("recovery_fidokey_auth.instruction2").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
</p>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("fido2_auth.cancel.fido")
$text.get("fido2_auth.cancel.fido")
</p>
</div>
@ -42,27 +41,27 @@
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">1</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"recovery_fidokey_auth.fidoInstruction")</p>
"recovery_fidokey_auth.fidoInstruction")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">2</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction2")</p>
"fido2_auth.instruction2")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">3</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction3")</p>
"fido2_auth.instruction3")</p>
</div>
</div>
<div class="mt-auto mb-6 sm:mb-0">
<agov-button
onclick="fido.authenticate()"
id="recovery_fido"
data-type="button"
data-label="$text.get("recovery_fidokey_auth.button")"
data-fullwidth="true"

View File

@ -2,6 +2,11 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
@ -13,43 +18,43 @@
<div class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.banner.info")
$text.get("recovery_intro_email.banner.info")
</p>
</div>
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.banner.error")
$text.get("recovery_intro_email.banner.error")
</p>
</div>
#end
#end
<div id="captchaNotFilled" style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div id="captchaNotFilled"
class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.captchaUnchecked")
$text.get("error_9909")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="mt-4 flex flex-col flex-auto block ">
#set ($emailInput = $gui.getGuiElem('email'))
#set ($emailInput = $gui.getGuiElem('email'))
<agov-input
data-label="$text.get("general.email.address")"
data-placeholder="$text.get("general.email")"
data-id="email"
data-name="email"
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
data-value="$utils.escapeHtmlAttribute($emailInput.value)"
#else
#else
data-value=""
#end
#end
data-type="text"
data-autofocus="true"
data-left_icon="fa-envelope"
@ -60,108 +65,55 @@
<p class="font-body text-body-l text-space-blue dark:text-white mb-2 sm:mb-8">
<span class="font-body-semi">$text.get("recovery_intro_email.important")</span>
$text.get("recovery_intro_email.process")
$text.get("recovery_intro_email.process")
</p>
#if ($utils.escapeHtmlAttribute($gui.getGuiElem("X-ReCAPTCHA-Integration").value) == "INVISIBLE")
#set ($isCaptchaVisible = true)
#else
#set ($isCaptchaVisible = false)
#end
#if ($isCaptchaVisible)
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaInvisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?render=$captcha.value"></script>
#set ($siteKey = $gui.getGuiElem("friendlyCaptchaSettings.siteKey"))
#set ($puzzleUrl = $gui.getGuiElem("friendlyCaptchaSettings.puzzleUrl"))
#set ($captchaEnabled = $gui.getGuiElem("captchaSettings.enabled"))
<script>
function emailCaptcha(event) {
event.preventDefault();
if (validateEmail.validateForm(event)) {
grecaptcha.enterprise.ready(async () => {
await grecaptcha.enterprise.execute('$captcha.value', { action: 'LOGIN' })
.then((token) => {
document.querySelector('input[name="recaptcha_response"]').value = token;
addButton();
});
});
}
return false;
}
function addButton() {
let btn = document.createElement("button");
btn.type = "submit";
btn.name = "continue";
btn.value = "continue";
btn.style.display = "none";
document.querySelector('#$gui.name').appendChild(btn);
btn.click()
}
</script>
#else
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaVisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?onload=onloadCallback&render=explicit" async
defer></script>
<script>
var verifyCallback = function (response) {
document.querySelector('input[name="recaptcha_response"]').value = response;
};
var expiredCallback = function () {
document.querySelector('input[name="recaptcha_response"]').value = 'captcha';
};
var onloadCallback = function () {
grecaptcha.enterprise.render(document.getElementById('captchaRender'), {
'sitekey': '$captcha.value',
'action': 'LOGIN',
'callback': verifyCallback,
'expired-callback': expiredCallback
});
};
</script>
#end
<div class="font-body text-body-l mb-4">
#if ($isCaptchaVisible)
<div class="text-disabled-grey dark:text-silver">
$text.get("recovery_intro_email.siteProtectedWithRecaptcha")
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<div class="font-body w-full text-body-l mb-4">
<div class="flex mt-8">
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"
data-lang="$login.language"
data-solution-field-name="captcha_response">
</div>
</div>
#else
<div class="flex mt-8" id="captchaRender"></div>
#end
</div>
</div>
#end ## if
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col sm:flex-row-reverse gap-4">
#if ($isCaptchaVisible)
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<agov-button
id="submit_btn_captcha_enabled"
disabled="true"
class="block basis-full"
data-name="continue"
data-value="continue"
data-id="continue"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="return emailCaptcha(event)">
data-fullwidth="true">
</agov-button>
#else
#else
<agov-button
id="submit_btn_captcha_disabled"
class="block basis-full"
data-name="continue"
data-value="continue"
data-id="continue"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="validateEmail.validateForm(event, true)">
data-fullwidth="true">
</agov-button>
#end
#end ## if
<agov-button
class="block basis-full"
data-style="secondary"

View File

@ -2,6 +2,11 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
@ -14,12 +19,12 @@
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email_sent.banner.success")
$text.get("recovery_intro_email_sent.banner.success")
</p>
</div>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">

View File

@ -11,18 +11,18 @@
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
$text.get("recovery_questionnaire_loginfactor.question")
$text.get("recovery_questionnaire_loginfactor.question")
</p>
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden"
id="errorBanner">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_questionnaire_loginfactor.banner.error")
$text.get("recovery_questionnaire_loginfactor.banner.error")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
@ -42,11 +42,11 @@
<div id="buttons" class="w-full sm:static mt-auto mb-6 sm:mb-0 mt-24 sm:mt-24">
<div class="flex sm:flex-row-reverse flex-col gap-2">
<agov-button
id="questionnaire_continue_btn"
class="block basis-full"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="setErrorBanner(validateAnswer.validateFormYesOrNo(event))">
data-fullwidth="true">
</agov-button>
<agov-button
class="block basis-full"

View File

@ -11,60 +11,60 @@
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
$text.get("recovery_questionnaire_reason_selection.instruction")
$text.get("recovery_questionnaire_reason_selection.instruction")
</p>
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden"
id="errorBanner">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_questionnaire_reason_selection.banner.error")
$text.get("recovery_questionnaire_reason_selection.banner.error")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="answersForm" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
#set ($previousAnswer = $gui.getGuiElem("question"))
#if ($previousAnswer.value == "yes")
#set ($answers = ["answer7", "answer8", "answer9", "answer10"])
#elseif ($previousAnswer.value == "no")
#set ($answers = ["answer1", "answer2", "answer3", "answer4", "answer5", "answer6"])
#else
#set ($answers = [])
#end
#set ($previousAnswer = $gui.getGuiElem("question"))
#if ($previousAnswer.value == "yes")
#set ($answers = ["answer7", "answer8", "answer9", "answer10"])
#elseif ($previousAnswer.value == "no")
#set ($answers = ["answer1", "answer2", "answer3", "answer4", "answer5", "answer6"])
#else
#set ($answers = [])
#end
#if ($answers.size() > 0)
#foreach ($answer in $answers)
#set ($isYes = "yes")
#set ($isNo = "no")
#set ($dataValue = "")
#if ($answers.size() > 0)
#foreach ($answer in $answers)
#set ($isYes = "yes")
#set ($isNo = "no")
#set ($dataValue = "")
#if ($answer == "answer2" || $answer == "answer3" || $answer ==
"answer4" || $answer == "answer5" || $answer == "answer6" || $answer == "answer8")
#set ($dataValue = $isYes)
#elseif ($answer == "answer1" || $answer == "answer7" || $answer == "answer9" || $answer == "answer10")
#set ($dataValue = $isNo)
#end
#if ($answer == "answer2" || $answer == "answer3" || $answer ==
"answer4" || $answer == "answer5" || $answer == "answer6" || $answer == "answer8")
#set ($dataValue = $isYes)
#elseif ($answer == "answer1" || $answer == "answer7" || $answer == "answer9" || $answer == "answer10")
#set ($dataValue = $isNo)
#end
<agov-radio-button data-text="$text.get("recovery_questionnaire_reason_selection.$answer")"
data-value="$dataValue"
data-id="$answer"
data-name="continue"
data-groupName="button-answers">
</agov-radio-button>
#end
#end
#end
#end
<div class="w-full sm:static mt-8 mb-6 sm:mb-0 ">
<div class="flex sm:flex-row-reverse flex-col gap-2">
<agov-button
id="questionnaire_continue_btn_reason"
class="block basis-full"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="setErrorBanner(validateAnswer.validateForm(event))">
data-fullwidth="true">
</agov-button>
<agov-button

View File

@ -2,31 +2,43 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.login")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.securityKey")</h4>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div id="captchaNotFilled"
class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("error_9909")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
#set ($emailInput = $gui.getGuiElem('email'))
#set ($emailInput = $gui.getGuiElem('email'))
<agov-input
class="mb-4 sm:mb-40"
data-label="$text.get("general.email.address")"
data-placeholder="$text.get("general.email")"
data-id="email"
data-name="userInputValue_prompt.email"
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
data-value="$utils.escapeHtmlAttribute($emailInput.value)"
#else
#else
data-value=""
#end
#end
data-type="text"
data-autofocus="true"
data-left_icon="fa-envelope"
@ -35,106 +47,51 @@
data-email_required="$text.get("user_input.invalid.email.required")">
</agov-input>
#if ($gui.getGuiElem("X-ReCAPTCHA-Integration").value == "INVISIBLE")
#set ($isCaptchaVisible = true)
#else
#set ($isCaptchaVisible = false)
#end
#set ($siteKey = $gui.getGuiElem("friendlyCaptchaSettings.siteKey"))
#set ($puzzleUrl = $gui.getGuiElem("friendlyCaptchaSettings.puzzleUrl"))
#set ($captchaEnabled = $gui.getGuiElem("captchaSettings.enabled"))
#if ($isCaptchaVisible)
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaInvisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?render=$captcha.value"></script>
<script>
function emailCaptcha(event) {
event.preventDefault();
if (validateEmail.validateForm(event)) {
grecaptcha.enterprise.ready(async () => {
await grecaptcha.enterprise.execute('$captcha.value', { action: 'LOGIN' })
.then((token) => {
document.querySelector('input[name="recaptcha_response"]').value = token;
addButton();
});
});
}
return false;
}
function addButton() {
let btn = document.createElement("button");
btn.type = "submit";
btn.name = "submit";
btn.value = "submit";
btn.style.display = "none";
document.querySelector('#$gui.name').appendChild(btn);
btn.click()
}
</script>
#else
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaVisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?onload=onloadCallback&render=explicit" async
defer></script>
<script>
var verifyCallback = function (response) {
document.querySelector('input[name="recaptcha_response"]').value = response;
};
var expiredCallback = function () {
document.querySelector('input[name="recaptcha_response"]').value = 'captcha';
};
var onloadCallback = function () {
grecaptcha.enterprise.render(document.getElementById('captchaRender'), {
'sitekey': '$captcha.value',
'action': 'LOGIN',
'callback': verifyCallback,
'expired-callback': expiredCallback
});
};
</script>
#end
<div class="font-body text-body-l mb-4">
#if ($isCaptchaVisible)
<div class="text-disabled-grey dark:text-silver">
$text.get("recovery_intro_email.siteProtectedWithRecaptcha")
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<div class="w-full font-body text-body-l mb-4">
<div class="flex mt-8">
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"
data-lang="$login.language"
data-solution-field-name="captcha_response">
</div>
</div>
#else
<div class="flex mt-8" id="captchaRender"></div>
#end
</div>
</div>
#end ## if
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col sm:flex-row-reverse gap-4">
#if ($isCaptchaVisible)
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<agov-button
id="submit_btn_captcha_enabled"
disabled="true"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.login")"
data-type="submit"
data-fullwidth="true"
onclick="return emailCaptcha(event)">
data-fullwidth="true">
</agov-button>
#else
#else
<agov-button
id="submit_btn_captcha_disabled"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.login")"
data-type="submit"
data-fullwidth="true"
onclick="validateEmail.validateForm(event)">
data-fullwidth="true">
</agov-button>
#end
#end ## if
<agov-button
class="block basis-full"
data-style="secondary"

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow
recovery_fidokey_auth.keyRegistered=Security key already registered
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
recovery_intro_email.captchaUnchecked=Please tick the captcha field
recovery_intro_email.important=Important:
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=This site is protected by reCAPTCHA and the <a class='link' href='https://policies.google.com/privacy' target='_blank'>Google Privacy Policy</a> and <a class='link' href='https://policies.google.com/terms' target='_blank'>Terms of Service</a> apply.
recovery_intro_email_sent.banner.button=Didn't receive the email?
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
recovery_on_going.finishRecovery=Finish recovery

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Bitte verwenden Sie !!!SECURITY_KEY_NAME!!! u
recovery_fidokey_auth.keyRegistered=Sicherheitsschl&uuml;ssel schon registriert
recovery_intro_email.banner.error=Der von Ihnen verwendete Link ist abgelaufen. Bitte geben Sie Ihre E-Mail-Adresse ein, um einen neuen Link zu erhalten.
recovery_intro_email.banner.info=Bitte geben Sie Ihre E-Mail-Adresse ein, damit wir Ihnen einen Link schicken k&ouml;nnen, mit dem Sie den Wiederherstellungsprozess starten.
recovery_intro_email.captchaUnchecked=Bitte kreuzen Sie das Captcha-Feld an
recovery_intro_email.important=Wichtig:
recovery_intro_email.process=Der Wiederherstellungsprozess sollte nur verwendet werden, wenn Sie den Zugriff auf Ihre Login-Faktoren verloren haben (gel&ouml;schte AGOV access App, verlorener Sicherheitsschl&uuml;ssel, verlorenes Telefon usw.).
recovery_intro_email.siteProtectedWithRecaptcha=Diese Seite ist durch reCAPTCHA gesch&uuml;tzt, und es gelten die <a class='link' href='https://policies.google.com/privacy' target='_blank'>Datenschutzerkl&auml;rung</a> sowie die <a class='link' href='https://policies.google.com/terms' target='_blank'>Nutzungsbedingungen</a> von Google.
recovery_intro_email_sent.banner.button=Keine E-Mail erhalten?
recovery_intro_email_sent.banner.success=Vielen Dank! Sie werden in K&uuml;rze eine E-Mail mit einem Wiederherstellungslink und Anweisungen erhalten.
recovery_on_going.finishRecovery=Wiederherstellung abschliessen

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow
recovery_fidokey_auth.keyRegistered=Security key already registered
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
recovery_intro_email.captchaUnchecked=Please tick the captcha field
recovery_intro_email.important=Important:
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=This site is protected by reCAPTCHA and the <a class='link' href='https://policies.google.com/privacy' target='_blank'>Google Privacy Policy</a> and <a class='link' href='https://policies.google.com/terms' target='_blank'>Terms of Service</a> apply.
recovery_intro_email_sent.banner.button=Didn't receive the email?
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
recovery_on_going.finishRecovery=Finish recovery

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Veuillez utiliser !!!SECURITY_KEY_NAME!!! pou
recovery_fidokey_auth.keyRegistered=Cl&eacute; de s&eacute;curit&eacute; d&eacute;j&agrave; enregistr&eacute;e
recovery_intro_email.banner.error=Le lien que vous avez utilis&eacute; a expir&eacute;. Veuillez saisir votre adresse e-mail pour recevoir un nouveau lien.
recovery_intro_email.banner.info=Veuillez saisir votre adresse e-mail. Nous vous enverrons un e-mail vous permettant de d&eacute;marrer le processus de r&eacute;cup&eacute;ration.
recovery_intro_email.captchaUnchecked=Veuillez cocher la case captcha
recovery_intro_email.important=Important:
recovery_intro_email.process=Le processus de r&eacute;cup&eacute;ration ne doit &ecirc;tre utilis&eacute; que si vous avez perdu l'acc&egrave;s &agrave; vos facteurs de connexion (application AGOV access supprim&eacute;e, cl&eacute; de s&eacute;curit&eacute; perdue, t&eacute;l&eacute;phone perdu, etc.).
recovery_intro_email.siteProtectedWithRecaptcha=Ce site est prot&eacute;g&eacute; par reCAPTCHA: les <a class=&rsquo;link&rsquo; href=&rsquo;https://policies.google.com/privacy&rsquo; target=&rsquo;_blank&rsquo;>r&egrave;gles de confidentialit&eacute;</a> et <a class=&rsquo;link&rsquo; href=&rsquo;https://policies.google.com/terms&rsquo; target=&rsquo;_blank&rsquo;>conditions d&rsquo;utilisation</a> de Google s&rsquo;appliquent.
recovery_intro_email_sent.banner.button=Vous n&rsquo;avez pas re&ccedil;u l'email?
recovery_intro_email_sent.banner.success=Merci! Vous recevrez dans un instant un e-mail contenant un lien de r&eacute;cup&eacute;ration et des instructions.
recovery_on_going.finishRecovery=Terminer la r&eacute;cup&eacute;ration

View File

@ -153,10 +153,8 @@ recovery_fidokey_auth.instruction2=Si prega di usare !!!SECURITY_KEY_NAME!!! per
recovery_fidokey_auth.keyRegistered=Chiave di sicurezza gi&agrave; registrata
recovery_intro_email.banner.error=Il link utilizzato &egrave; scaduto. Per ricevere un nuovo link, inserire l&rsquo;indirizzo e-mail.
recovery_intro_email.banner.info=Per ricevere il link e avviare il processo di ripristino, inserire l&rsquo;indirizzo e-mail.
recovery_intro_email.captchaUnchecked=Per favore selezioni il campo captcha
recovery_intro_email.important=Importante:
recovery_intro_email.process=Il processo di ripristino deve essere utilizzato solo se ha perso l'accesso ai suoi fattori di accesso (app di accesso AGOV eliminata, chiave di sicurezza persa, telefono smarrito, ecc.).
recovery_intro_email.siteProtectedWithRecaptcha=Questo sito &egrave; protetto da reCAPTCHA. Si applicano le <a class='link' href='https://policies.google.com/privacy' target='_blank'>norme sulla privacy</a> e i <a class='link' href='https://policies.google.com/terms' target='_blank'>termini di servizio di Google</a>.
recovery_intro_email_sent.banner.button=Non avete ricevuto l'e-mail?
recovery_intro_email_sent.banner.success=Grazie! &Egrave; stata inviata un&rsquo;e-mail contenente il codice di ripristino e le istruzioni.
recovery_on_going.finishRecovery=Completare il ripristino

View File

@ -0,0 +1,5 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initQRCode'));
document.dispatchEvent(new Event('initDrawer'));
document.dispatchEvent(new Event('initCantonalBranding'));
});

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

View File

@ -1,9 +1,3 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initAnswer'));
});
// eslint-disable-next-line no-unused-vars
function setErrorBanner(value) {
document.getElementById('errorBanner').style.display = value ? 'none' : 'flex';
document.getElementById('buttons').style.marginTop = value ? '16px' : '8px';
}

View File

@ -1,9 +1,3 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initAnswer'));
});
// eslint-disable-next-line no-unused-vars
function setErrorBanner(value) {
document.getElementById('errorBanner').style.display = value ? 'none' : 'flex';
console.log(document.getElementById('errorBanner').style.display);
}

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -15,16 +15,16 @@
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.securityKey")</h4>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8">
<div class="flex flex-row items-center justify-between">
#set ($emailInput = $gui.getGuiElem('email'))
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#set ($emailInput = $gui.getGuiElem('email'))
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
<p class="text-space-blue dark:text-white font-body-semi text-body-l truncate">$utils.escapeHtmlAttribute($emailInput.value)</p>
#else
#else
<p class="text-space-blue dark:text-white font-body-semi text-body-l truncate"></p>
#end
#end
<agov-button
class="shrink-0"
data-style="frameless"
@ -40,11 +40,10 @@
</form>
<div class="mt-3 mb-6 w-full h-px bg-platinum rounded-full"></div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("fido2_auth.cancel.fido")
$text.get("fido2_auth.cancel.fido")
</p>
</div>
@ -53,21 +52,21 @@
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">1</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction1")</p>
"fido2_auth.instruction1")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">2</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction2")</p>
"fido2_auth.instruction2")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">3</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction3")</p>
"fido2_auth.instruction3")</p>
</div>
</div>
@ -79,12 +78,12 @@
</agov-checkbox>
<label for="skip" class="font-body text-body-l text-space-blue dark:text-white cursor-pointer">
$text.get("fido2_auth.skipInstructions")
$text.get("fido2_auth.skipInstructions")
</label>
</div>
<div class="mt-auto mb-6 sm:mb-0">
<agov-button
onclick="fido.authenticate()"
id="fido_authenticate"
data-type="button"
data-label="$text.get("general.continue")"
data-fullwidth="true"
@ -94,7 +93,7 @@
<div class="flex items-center mt-6 mb-4">
<span class="h-px w-full bg-silver"></span>
<span class="px-2 text-disabled-grey font-body-semi text-body-l whitespace-nowrap">
$text.get("fido2_auth.switchLogin")
$text.get("fido2_auth.switchLogin")
</span>
<span class="h-px w-full bg-silver"></span>
</div>

View File

@ -3,7 +3,7 @@
$text.get("footer.text")
<a target="_blank" class='text-hyperlink dark:text-dark-hyperlink underline' href='$text.get("footer.link")'>$text.get("footer.link.label")</a>
</div>
<p>1.5.7.77-20240809T142941Z</p>
<p>1.6.8.13-20240919T195132Z</p>
</footer>
<script src="${login.appDataPath}/static/bundle.js"></script>
</body>

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-screen h-full mx-4 flex sm:block" style="min-height: 100svh">
<html lang="$login.language" class="relative min-h-100 h-full mx-4 flex sm:block">
<head>
<title>AGOV</title>
<meta charset="UTF-8">

View File

@ -10,15 +10,15 @@
class="flex items-center rounded-xl gap-5 p-2 sm:p-0 sm:w-auto w-full hidden bg-pale-blue dark:bg-purple-black sm:bg-transparent">
<div class="flex items-center p-2 bg-white rounded sm:rounded-xl w-16 h-16" id="logo"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
@ -28,7 +28,7 @@
<h1 class="font-header text-h4 text-space-blue dark:text-white mb-8">$text.get("general.registration")</h1>
<h2 class="font-header text-h5 text-space-blue dark:text-white text-center mb-4">
$text.get("mauth_usernameless.noAccount")
$text.get("mauth_usernameless.noAccount")
</h2>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
@ -49,6 +49,8 @@
<div id="agovLoginImage"
class="relative md:max-w-[520px] max-w-[350px] sm:max-w-[300px] mb-10 w-full mx-auto hidden md:block">
<div class="hidden flex items-center p-2 bg-white dark:bg-black rounded-xl w-16 h-16 absolute left-[calc(39%-32px)] top-8"
id="logoDoor"></div>
<img alt="" src="${login.appDataPath}/static/images/login.svg"
class="hidden md:block dark:hidden w-full">
<img alt="" src="${login.appDataPath}/static/images/login-dark.svg"
@ -69,15 +71,15 @@
<div class="flex items-center p-2 bg-white dark:bg-black rounded sm:rounded-xl w-16 h-16"
id="logoMobile"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
@ -93,65 +95,65 @@
<div id="accessAppModal" class="h-full">
<div class="desktopBanner" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4
mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center
p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div class="relative flex flex-col h-full">
<div id="blurBackdrop" class="absolute backdrop-blur-sm -top-1 -bottom-8 -left-4 -right-4 z-10"
style="display:none "></div>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-8 -left-4 -right-4
z-10"></div>
<div class="mobileBanner relative z-20" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center
p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background
items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div id="agovLoginImageMobile" style="display: none"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full mx-auto mb-6">
<div id="agovLoginImageMobile" class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full
mx-auto mb-6">
<img alt=""
src="${login.appDataPath}/static/images/login.svg"
class="block sm:hidden md:block dark:hidden w-full">
@ -165,12 +167,12 @@
<canvas role="img" aria-labelledby="labelQRCodeInstructions" id="mauth_qrcode"
class="mb-6 mx-auto"></canvas>
<div class="hidden" id="QRcodeHiddenLink"></div>
<span id="spinner" class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20"
style="display: none">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2
z-20">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg"
class="animate-spin hidden dark:block">
</span>
</span>
</div>
<a id="accessAppLinkIpad" href="" class="hidden">
@ -189,7 +191,7 @@
dark:bg-purple-black">
<img alt="" src="${login.appDataPath}/static/images/access-app.svg" class="h-12 mr-4">
<p id="labelQRCodeInstructions" class="font-header text-h5 text-space-blue dark:text-white">
$text.get("mauth_usernameless.instructions")
$text.get("mauth_usernameless.instructions")
</p>
</div>
</div>
@ -197,7 +199,7 @@
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" class="w-full sm:static mt-auto mb-20 sm:mb-0">
<div id="mobileButtons" style="display: none" class="w-full">
<div id="mobileButtons" class="hidden w-full">
<div class="flex flex-col">
<a id="accessAppLink" href="">
<agov-button
@ -218,21 +220,20 @@
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.showQR")"
"mauth_usernameless.showQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
<agov-button
style="display: none"
id="hideQR"
class="block basis-full"
class="hidden basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye-slash align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.hideQR")"
"mauth_usernameless.hideQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
@ -246,11 +247,11 @@
<div id="securityKeyModal" class="hidden mt-16">
<h2 class="font-header text-h5 text-space-blue dark:text-white mt-4 text-center">
$text.get("mauth_usernameless.useSecurityKey")
$text.get("mauth_usernameless.useSecurityKey")
</h2>
<p class="font-body text-body-l text-space-blue dark:text-white text-center my-6">
$text.get("mauth_usernameless.useSecurityKeyInfo")
$text.get("mauth_usernameless.useSecurityKeyInfo")
</p>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
@ -280,14 +281,14 @@
<button class="hidden" id="onReload" name="onReload"></button>
<h2 class="font-header text-h5 text-space-blue dark:text-white mt-7 mb-4 text-center">
$text.get("mauth_usernameless.cannotLogin")
$text.get("mauth_usernameless.cannotLogin")
</h2>
<agov-button
data-style="secondary"
data-name="fallback"
data-value="recovery"
data-label="<i class='fa-regular fa-suitcase-medical text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.startRecovery")"
"mauth_usernameless.startRecovery")"
data-type="submit"
data-fullwidth="true"
class="block">
@ -300,7 +301,7 @@
</div>
</div>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" style="display: none" class="sm:hidden formDrawer">
accept-charset="UTF-8" class="hidden sm:hidden formDrawer">
<div class="w-full z-30 fixed left-0 pointer-events-none" id="drawerContainer">
<div class="w-full bg-white dark:bg-surface-black px-4 pb-[130px] rounded-t-2xl pointer-events-auto" id="drawer">
<div class="pt-2 pb-4 cursor-pointer">
@ -309,12 +310,12 @@
<div class="flex items-center justify-center mb-6">
<span class="px-2 text-disabled-grey dark:text-white font-body-semi text-body-l whitespace-nowrap">
$text.get("general.otherOptions")
$text.get("general.otherOptions")
</span>
</div>
<p class="font-body-semi text-body-l text-space-blue dark:text-white text-center mb-2">
$text.get("mauth_usernameless.noAccount")
$text.get("mauth_usernameless.noAccount")
</p>
<agov-button
@ -330,14 +331,14 @@
<div class="flex items-center mt-6 mb-6">
<span class="h-px w-full bg-silver"></span>
<span class="px-2 text-disabled-grey dark:text-white font-body-semi text-body-l whitespace-nowrap">
$text.get("general.or")</span>
$text.get("general.or")</span>
<span class="h-px w-full bg-silver"></span>
</div>
<div class="flex flex-col flex-wrap justify-center items-center mb-6 gap-1">
<p class="font-body-semi text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.cannotLogin")
$text.get("mauth_usernameless.cannotLogin")
</p>
<agov-button
data-style="frameless"
@ -353,9 +354,9 @@
<div class="font-body text-body-s text-disabled-grey dark:text-silver text-center">
$text.get("footer.text")
$text.get("footer.text")
<a target="_blank" class='text-hyperlink dark:text-info underline' href='$text.get("footer.link")'>$text.get(
"footer.link.label")</a>
"footer.link.label")</a>
</div>
</div>
</div>
@ -363,13 +364,10 @@
</form>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
document.dispatchEvent(new Event('initQRCode'));
document.dispatchEvent(new Event('initDrawer'));
document.dispatchEvent(new Event('initCantonalBranding'));
cantonalBranding.getLogo("$gui.getGuiElem('agov.appSamlRpEntityId').value", "$login.language");
});
<script src="${login.appDataPath}/static/js-code/mauth_usernameless.js" defer>
</script>
<div id="appSamlRpEntityId" class="hidden" data-value="$gui.getGuiElem('agov.appSamlRpEntityId').value"
data-language="$login.language">
</div>
#parse("${templatePath}/footer.vm")

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-screen h-full mx-4 flex sm:block" style="min-height: 100svh">
## svh -> Small View Height. It's not taking the height of the search bar on mobile into account
<html lang="$login.language" class="relative min-h-100 h-full mx-4 flex sm:block">
<head>
<title>AGOV Operations</title>
<meta charset="UTF-8">
@ -20,51 +20,53 @@
<img alt="agov Logo" src="${login.appDataPath}/static/images/agov-logo.svg" class="h-5 sm:h-8 sm:mr-6 dark:hidden">
<img alt="agov Logo" src="${login.appDataPath}/static/images/agov-logo-dark.svg" class="h-5 sm:h-8 sm:mr-6 hidden dark:block">
<div class="flex items-center flex-1 sm:flex-initial justify-end">
#set ($langMenu = '')
#foreach ($locale in $login.locales)
## find translated label of current locale
#if ($text.contains("language.$locale"))
#set ($langLabel = $text.get("language.$locale"))
#elseif ($locale.length() > 2)
#set ($langLabel = $text.get("language.${locale.substring(0,2).toLowerCase()}"))
#else
#set ($langLabel = $locale)
#end
## emit link or text for each language
#set ($langTarget = $utils.escapeHtmlAttribute($gui.target('language', $locale)))
#set ($langMenu = '')
#foreach ($locale in $login.locales)
## find translated label of current locale
#if ($text.contains("language.$locale"))
#set ($langLabel = $text.get("language.$locale"))
#elseif ($locale.length() > 2)
#set ($langLabel = $text.get("language.${locale.substring(0,2).toLowerCase()}"))
#else
#set ($langLabel = $locale)
#end
## emit link or text for each language
#set ($langTarget = $utils.escapeHtmlAttribute($gui.target('language', $locale)))
#if ($login.localeCode != $locale && $login.language != $locale)
#set ($langMenu = $langMenu + '<li><a
#if ($login.localeCode != $locale && $login.language != $locale)
#set ($langMenu = $langMenu + '<li><a
class="block px-8 sm:px-4 py-3 hover:bg-lavender-blush dark:hover:bg-purple-black"
aria-current="false"
href="'+$langTarget+'">'+$langLabel+' - '+$locale.toUpperCase()
+'</a></li>')
#else
#set ($langMenu = $langMenu + '<li><a
+'</a></li>')
#else
#set ($langMenu = $langMenu + '<li><a
class="flex items-center px-8 sm:px-4 justify-between w-full py-3 bg-indigo-light dark:bg-purple-black"
aria-current="true"
href="'+$langTarget+'"><span class="font-body-semi"
>'+$langLabel+' - '+$locale.toUpperCase()+'</span><span class="fa-solid fa-check text-indigo dark:text-white text-body-l"></span></li>')
#end
#end ## end foreach
>'+$langLabel+' - '+$locale.toUpperCase()+
'</span><span class="fa-solid fa-check text-indigo dark:text-white text-body-l"></span></li>')
#end
#end ## end foreach
<agov-language
class="hidden sm:inline-block"
data-lang='$login.localeCode.toUpperCase()'
data-links='$langMenu'
data-aria_label='$text.get("languageDropdown.aria.label")'
>
>
</agov-language>
<a href="$text.get("general.help.link")" target="_blank" class="cursor-pointer hidden sm:inline-block">
<div class="mx-6 flex items-center">
<i class="text-xl pr-2 fa-regular fa-circle-question ml-auto text-space-blue dark:text-white transition-all"></i>
<span class="text-space-blue dark:text-white font-body-semi text-body-l transition-colors">$text.get("general.help")</span>
<span class="text-space-blue dark:text-white font-body-semi text-body-l transition-colors">$text.get(
"general.help")</span>
</div>
</a>
<agov-darkmode
class="hidden sm:inline-block"
data-aria_label='$text.get("darkModeSwitch.aria.label")'>
class="hidden sm:inline-block"
data-aria_label='$text.get("darkModeSwitch.aria.label")'>
</agov-darkmode>
<agov-mobile-menu

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -16,79 +16,73 @@
</div>
<h3 class="font-header text-h5 text-space-blue dark:text-white mb-4">$text.get(
"recovery_accessapp_auth.accessAppRegistered")</h3>
"recovery_accessapp_auth.accessAppRegistered")</h3>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
${text.get("recovery_accessapp_auth.instruction1").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
${text.get("recovery_accessapp_auth.instruction1").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
</p>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
${text.get("recovery_accessapp_auth.instruction2").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
${text.get("recovery_accessapp_auth.instruction2").replaceAll(
"!!!ACCESS_APP_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('accessApp').value)")}
</p>
<div id="accessAppModal" class="h-full">
<div class="desktopBanner" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4
mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div class="relative flex flex-col h-full">
<div id="blurBackdrop" class="absolute backdrop-blur-sm top-0 bottom-0 -left-4 -right-4 z-10"
style="display:none "></div>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm top-0 bottom-0 -left-4 -right-4 z-10"></div>
<div class="mobileBanner relative z-20" aria-live="assertive">
<div style="display: none"
class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.info")
$text.get("mauth_usernameless.banner.info")
</p>
</div>
<div style="display: none"
class="success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.success")
$text.get("mauth_usernameless.banner.success")
</p>
</div>
</div>
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("mauth_usernameless.banner.error")
$text.get("mauth_usernameless.banner.error")
</p>
</div>
</div>
<div id="agovLoginImageMobile" style="display: none"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full basis-1/2 mx-auto mb-4">
<div id="agovLoginImageMobile"
class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full basis-1/2 mx-auto mb-4">
<img alt=""
src="${login.appDataPath}/static/images/recovery.svg"
class="block sm:hidden md:block dark:hidden w-full">
@ -102,8 +96,7 @@
<canvas role="img" aria-labelledby="labelQRCodeInstructions" id="mauth_qrcode"
class="mb-4 mx-auto"></canvas>
<div class="hidden" id="QRcodeHiddenLink"></div>
<span id="spinner" class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20"
style="display: none">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-20">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg"
class="animate-spin hidden dark:block">
@ -125,16 +118,16 @@
<div class="accessAppInstructions flex bg-indigo-light rounded-xl p-4 mb-4 items-center dark:bg-purple-black">
<img alt="" src="${login.appDataPath}/static/images/access-app.svg" class="h-12 mr-4">
<p id="labelQRCodeInstructions" class="font-header text-h5 text-space-blue dark:text-white">
$text.get("mauth_usernameless.instructions")
$text.get("mauth_usernameless.instructions")
</p>
</div>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" class="w-full bottom-8 sm:static mt-auto mb-6 sm:mb-0">
<div id="mobileButtons" style="display: none" class="w-full bottom-8 sm:static mt-auto mb-16 sm:mb-0">
<div id="mobileButtons" class="hidden w-full bottom-8 sm:static mt-auto mb-16 sm:mb-0">
<div class="flex flex-col">
<a id="accessAppLink" href="">
<agov-button
@ -155,21 +148,20 @@
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.showQR")"
"mauth_usernameless.showQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
<agov-button
style="display: none"
id="hideQR"
class="block basis-full"
class="hidden basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye-slash align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"mauth_usernameless.hideQR")"
"mauth_usernameless.hideQR")"
data-type="button"
data-fullwidth="true">
</agov-button>

View File

@ -2,8 +2,8 @@
<agov-backdrop></agov-backdrop>
<div id="modal" class="fixed top-0 bottom-0 left-0 right-0 pb-20 z-50 hidden">
<div class="fixed top-0 bottom-0 left-0 right-0 backdrop-blur-[10px]" onclick="modal.setInvisible()"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 bg-[#E2E2E2E5]/80 dark:bg-[#111111]/90" onclick="modal.setInvisible()"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 backdrop-blur-[10px]" id="modal_light"></div>
<div class="fixed top-0 bottom-0 left-0 right-0 bg-[#E2E2E2E5]/80 dark:bg-[#111111]/90" id="modal_dark"></div>
<div id="drawer"
class="fixed bg-white dark:bg-surface-black rounded-[20px] p-10 w-11/12 sm:max-w-[660px] top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
@ -13,12 +13,12 @@
</div>
<h4 id="modalTitle" class="font-header text-h4 text-space-blue dark:text-white mb-8">
$text.get("recovery_check_code.noCodeAccess")
$text.get("recovery_check_code.noCodeAccess")
</h4>
<div id="modalDescription" class="mb-20">
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.noCodeAccessInstructions")
$text.get("recovery_check_code.noCodeAccessInstructions")
</p>
</div>
@ -26,12 +26,12 @@
<div class="w-full sm:static mt-auto">
<div class="flex justify-end flex-col-reverse sm:flex-row gap-4">
<agov-button
id="recovery_check_code"
class="block"
data-style="secondary"
data-label="$text.get("general.cancel")"
data-type="button"
data-fullwidth="true"
onclick="modal.setInvisible()">
data-fullwidth="true">
</agov-button>
<a href="$text.get("general.help.link")" target="_blank" rel="noopener noreferrer">
<agov-button
@ -51,31 +51,36 @@
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.recovery")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.entryCode")</h4>
</div>
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-6">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.codeIncorrect")
$text.get("recovery_check_code.codeIncorrect")
</p>
</div>
#end
#end
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
$text.get("recovery_check_code.instruction")
$text.get("recovery_check_code.instruction")
</p>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
<agov-input
id="recovery_code_input"
class="mb-4 py-16"
data-label="$text.get("recovery_check_code.enterRecoveryCode")"
data-isLabelHidden="true"
@ -85,10 +90,6 @@
data-value=""
data-type="text"
data-autofocus="true"
oninput="validateCode.onInputCodeAndroid(event)"
onkeyup="validateCode.onKeyUp(event)"
onkeydown="validateCode.onInputCode(event)"
onpaste="validateCode.paste(event)"
data-email_invalid="$text.get("recovery_check_code.invalid.code")"
data-email_too_long="$text.get("recovery_check_code.invalid.code.tooLong")"
data-email_required="$text.get("recovery_check_code.invalid.code.required")">
@ -97,17 +98,18 @@
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn"
class="block basis-full"
data-name="confirm"
data-value="confirm"
data-id="confirm"
data-label="$text.get("general.confirm")"
data-type="submit"
data-fullwidth="true"
onclick="validateCode.validateForm(event)">
data-fullwidth="true">
</agov-button>
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-style="frameless"
data-name="cancelFido2"
@ -116,8 +118,7 @@
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false"
onclick="modal.setVisible()">
data-validate="false">
</agov-button>
</div>
</div>

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($PDFRecoveryTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','').replaceAll(
'^(https:\/\/[^\/]+\/).*$', '$1')))
'^(https:\/\/[^\/]+\/).*$', '$1')))
#set ($concat = "recovery/pdf?authToken=")
#set ($PDFLink = "$PDFRecoveryTarget$concat$gui.getGuiElem('pdfAuthToken').value")
@ -15,19 +15,19 @@
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.login")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get(
"recovery_code.newRecoveryCode")</h4>
"recovery_code.newRecoveryCode")</h4>
</div>
<div id="codeNotSeen"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_code.banner.error")
$text.get("recovery_code.banner.error")
</p>
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
$text.get("recovery_code.instruction")
$text.get("recovery_code.instruction")
</p>
<div class="flex justify-between items-center relative mb-4 py-4 pr-4 pl-8 rounded-xl bg-indigo-light dark:bg-purple-black">
@ -35,7 +35,7 @@
<div>
<p class="font-header text-h5 text-space-blue dark:text-white">$gui.getGuiElem('isiwebpasswd').value</p>
<p class="font-body text-body-m text-space-blue dark:text-white">
$text.get("recovery_code.validUntil")
$text.get("recovery_code.validUntil")
$gui.getGuiElem('validTil').value
</p>
@ -56,8 +56,7 @@
data-style="secondary"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>Reveal code"
data-type="button"
data-fullwidth="true"
onclick="blurCode.unBlurCode()">
data-fullwidth="true">
</agov-button>
<a class="mb-20" target="_blank" href="$PDFLink">
<agov-button
@ -77,14 +76,14 @@
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_continue"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="blurCode.continue(event)">
data-fullwidth="true">
</agov-button>
</div>

View File

@ -1,7 +1,7 @@
#parse("${templatePath}/header.vm")
<agov-backdrop></agov-backdrop>
<div id="fidoBackdrop" style="display: none">
<div id="fidoBackdrop" class="hidden">
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 backdrop-blur-[10px]"></div>
<div class="fixed z-50 top-0 left-0 bottom-0 right-0 bg-zinc-50 opacity-80"></div>
</div>
@ -16,24 +16,23 @@
</div>
<h3 class="font-header text-h5 text-space-blue dark:text-white mb-4">$text.get(
"recovery_fidokey_auth.keyRegistered")</h3>
"recovery_fidokey_auth.keyRegistered")</h3>
<p class="font-body text-body-l text-space-blue dark:text-white mb-2">
${text.get("recovery_fidokey_auth.instruction1").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
${text.get("recovery_fidokey_auth.instruction1").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
</p>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
${text.get("recovery_fidokey_auth.instruction2").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
${text.get("recovery_fidokey_auth.instruction2").replaceAll(
"!!!SECURITY_KEY_NAME!!!", "$utils.escapeHtmlAttribute($gui.getGuiElem('securityKey').value)")}
</p>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("fido2_auth.cancel.fido")
$text.get("fido2_auth.cancel.fido")
</p>
</div>
@ -42,27 +41,27 @@
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">1</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"recovery_fidokey_auth.fidoInstruction")</p>
"recovery_fidokey_auth.fidoInstruction")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">2</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction2")</p>
"fido2_auth.instruction2")</p>
</div>
<div class="flex mb-2 items-center">
<span class="font-header text-h6 bg-royal-light-blue dark:bg-blueish-black w-12 h-12 flex flex-none items-center justify-center rounded-full
text-space-blue dark:text-white leading-none">3</span>
<p class="font-body-semi text-body-l text-space-blue dark:text-white ml-4">$text.get(
"fido2_auth.instruction3")</p>
"fido2_auth.instruction3")</p>
</div>
</div>
<div class="mt-auto mb-6 sm:mb-0">
<agov-button
onclick="fido.authenticate()"
id="recovery_fido"
data-type="button"
data-label="$text.get("recovery_fidokey_auth.button")"
data-fullwidth="true"

View File

@ -2,6 +2,11 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
@ -13,43 +18,43 @@
<div class="info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.banner.info")
$text.get("recovery_intro_email.banner.info")
</p>
</div>
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
#set($error = $gui.getGuiElem("lasterror"))
#if (($error.value && $error.value != ""))
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.banner.error")
$text.get("recovery_intro_email.banner.error")
</p>
</div>
#end
#end
<div id="captchaNotFilled" style="display: none"
class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<div id="captchaNotFilled"
class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email.captchaUnchecked")
$text.get("error_9909")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="mt-4 flex flex-col flex-auto block ">
#set ($emailInput = $gui.getGuiElem('email'))
#set ($emailInput = $gui.getGuiElem('email'))
<agov-input
data-label="$text.get("general.email.address")"
data-placeholder="$text.get("general.email")"
data-id="email"
data-name="email"
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
data-value="$utils.escapeHtmlAttribute($emailInput.value)"
#else
#else
data-value=""
#end
#end
data-type="text"
data-autofocus="true"
data-left_icon="fa-envelope"
@ -60,108 +65,55 @@
<p class="font-body text-body-l text-space-blue dark:text-white mb-2 sm:mb-8">
<span class="font-body-semi">$text.get("recovery_intro_email.important")</span>
$text.get("recovery_intro_email.process")
$text.get("recovery_intro_email.process")
</p>
#if ($utils.escapeHtmlAttribute($gui.getGuiElem("X-ReCAPTCHA-Integration").value) == "INVISIBLE")
#set ($isCaptchaVisible = true)
#else
#set ($isCaptchaVisible = false)
#end
#if ($isCaptchaVisible)
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaInvisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?render=$captcha.value"></script>
#set ($siteKey = $gui.getGuiElem("friendlyCaptchaSettings.siteKey"))
#set ($puzzleUrl = $gui.getGuiElem("friendlyCaptchaSettings.puzzleUrl"))
#set ($captchaEnabled = $gui.getGuiElem("captchaSettings.enabled"))
<script>
function emailCaptcha(event) {
event.preventDefault();
if (validateEmail.validateForm(event)) {
grecaptcha.enterprise.ready(async () => {
await grecaptcha.enterprise.execute('$captcha.value', { action: 'LOGIN' })
.then((token) => {
document.querySelector('input[name="recaptcha_response"]').value = token;
addButton();
});
});
}
return false;
}
function addButton() {
let btn = document.createElement("button");
btn.type = "submit";
btn.name = "continue";
btn.value = "continue";
btn.style.display = "none";
document.querySelector('#$gui.name').appendChild(btn);
btn.click()
}
</script>
#else
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaVisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?onload=onloadCallback&render=explicit" async
defer></script>
<script>
var verifyCallback = function (response) {
document.querySelector('input[name="recaptcha_response"]').value = response;
};
var expiredCallback = function () {
document.querySelector('input[name="recaptcha_response"]').value = 'captcha';
};
var onloadCallback = function () {
grecaptcha.enterprise.render(document.getElementById('captchaRender'), {
'sitekey': '$captcha.value',
'action': 'LOGIN',
'callback': verifyCallback,
'expired-callback': expiredCallback
});
};
</script>
#end
<div class="font-body text-body-l mb-4">
#if ($isCaptchaVisible)
<div class="text-disabled-grey dark:text-silver">
$text.get("recovery_intro_email.siteProtectedWithRecaptcha")
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<div class="font-body w-full text-body-l mb-4">
<div class="flex mt-8">
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"
data-lang="$login.language"
data-solution-field-name="captcha_response">
</div>
</div>
#else
<div class="flex mt-8" id="captchaRender"></div>
#end
</div>
</div>
#end ## if
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col sm:flex-row-reverse gap-4">
#if ($isCaptchaVisible)
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<agov-button
id="submit_btn_captcha_enabled"
disabled="true"
class="block basis-full"
data-name="continue"
data-value="continue"
data-id="continue"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="return emailCaptcha(event)">
data-fullwidth="true">
</agov-button>
#else
#else
<agov-button
id="submit_btn_captcha_disabled"
class="block basis-full"
data-name="continue"
data-value="continue"
data-id="continue"
data-id="submit"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="validateEmail.validateForm(event, true)">
data-fullwidth="true">
</agov-button>
#end
#end ## if
<agov-button
class="block basis-full"
data-style="secondary"

View File

@ -2,6 +2,11 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
@ -14,12 +19,12 @@
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_intro_email_sent.banner.success")
$text.get("recovery_intro_email_sent.banner.success")
</p>
</div>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">

View File

@ -11,18 +11,18 @@
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
$text.get("recovery_questionnaire_loginfactor.question")
$text.get("recovery_questionnaire_loginfactor.question")
</p>
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden"
id="errorBanner">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_questionnaire_loginfactor.banner.error")
$text.get("recovery_questionnaire_loginfactor.banner.error")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
@ -42,11 +42,11 @@
<div id="buttons" class="w-full sm:static mt-auto mb-6 sm:mb-0 mt-24 sm:mt-24">
<div class="flex sm:flex-row-reverse flex-col gap-2">
<agov-button
id="questionnaire_continue_btn"
class="block basis-full"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="setErrorBanner(validateAnswer.validateFormYesOrNo(event))">
data-fullwidth="true">
</agov-button>
<agov-button
class="block basis-full"

View File

@ -11,60 +11,60 @@
</div>
<p class="font-body text-body-l text-space-blue dark:text-white mb-8">
$text.get("recovery_questionnaire_reason_selection.instruction")
$text.get("recovery_questionnaire_reason_selection.instruction")
</p>
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4 hidden"
id="errorBanner">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_questionnaire_reason_selection.banner.error")
$text.get("recovery_questionnaire_reason_selection.banner.error")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="answersForm" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
#set ($previousAnswer = $gui.getGuiElem("question"))
#if ($previousAnswer.value == "yes")
#set ($answers = ["answer7", "answer8", "answer9", "answer10"])
#elseif ($previousAnswer.value == "no")
#set ($answers = ["answer1", "answer2", "answer3", "answer4", "answer5", "answer6"])
#else
#set ($answers = [])
#end
#set ($previousAnswer = $gui.getGuiElem("question"))
#if ($previousAnswer.value == "yes")
#set ($answers = ["answer7", "answer8", "answer9", "answer10"])
#elseif ($previousAnswer.value == "no")
#set ($answers = ["answer1", "answer2", "answer3", "answer4", "answer5", "answer6"])
#else
#set ($answers = [])
#end
#if ($answers.size() > 0)
#foreach ($answer in $answers)
#set ($isYes = "yes")
#set ($isNo = "no")
#set ($dataValue = "")
#if ($answers.size() > 0)
#foreach ($answer in $answers)
#set ($isYes = "yes")
#set ($isNo = "no")
#set ($dataValue = "")
#if ($answer == "answer2" || $answer == "answer3" || $answer ==
"answer4" || $answer == "answer5" || $answer == "answer6" || $answer == "answer8")
#set ($dataValue = $isYes)
#elseif ($answer == "answer1" || $answer == "answer7" || $answer == "answer9" || $answer == "answer10")
#set ($dataValue = $isNo)
#end
#if ($answer == "answer2" || $answer == "answer3" || $answer ==
"answer4" || $answer == "answer5" || $answer == "answer6" || $answer == "answer8")
#set ($dataValue = $isYes)
#elseif ($answer == "answer1" || $answer == "answer7" || $answer == "answer9" || $answer == "answer10")
#set ($dataValue = $isNo)
#end
<agov-radio-button data-text="$text.get("recovery_questionnaire_reason_selection.$answer")"
data-value="$dataValue"
data-id="$answer"
data-name="continue"
data-groupName="button-answers">
</agov-radio-button>
#end
#end
#end
#end
<div class="w-full sm:static mt-8 mb-6 sm:mb-0 ">
<div class="flex sm:flex-row-reverse flex-col gap-2">
<agov-button
id="questionnaire_continue_btn_reason"
class="block basis-full"
data-label="$text.get("general.continue")"
data-type="submit"
data-fullwidth="true"
onclick="setErrorBanner(validateAnswer.validateForm(event))">
data-fullwidth="true">
</agov-button>
<agov-button

View File

@ -2,31 +2,43 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2">
<div class="flex mb-6 items-baseline">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">$text.get("general.login")</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">$text.get("general.securityKey")</h4>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<div id="captchaNotFilled"
class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("error_9909")
</p>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block ">
#set ($emailInput = $gui.getGuiElem('email'))
#set ($emailInput = $gui.getGuiElem('email'))
<agov-input
class="mb-4 sm:mb-40"
data-label="$text.get("general.email.address")"
data-placeholder="$text.get("general.email")"
data-id="email"
data-name="userInputValue_prompt.email"
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
#if ($emailInput && $emailInput.value && $emailInput.value.length() > 0)
data-value="$utils.escapeHtmlAttribute($emailInput.value)"
#else
#else
data-value=""
#end
#end
data-type="text"
data-autofocus="true"
data-left_icon="fa-envelope"
@ -35,106 +47,51 @@
data-email_required="$text.get("user_input.invalid.email.required")">
</agov-input>
#if ($gui.getGuiElem("X-ReCAPTCHA-Integration").value == "INVISIBLE")
#set ($isCaptchaVisible = true)
#else
#set ($isCaptchaVisible = false)
#end
#set ($siteKey = $gui.getGuiElem("friendlyCaptchaSettings.siteKey"))
#set ($puzzleUrl = $gui.getGuiElem("friendlyCaptchaSettings.puzzleUrl"))
#set ($captchaEnabled = $gui.getGuiElem("captchaSettings.enabled"))
#if ($isCaptchaVisible)
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaInvisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?render=$captcha.value"></script>
<script>
function emailCaptcha(event) {
event.preventDefault();
if (validateEmail.validateForm(event)) {
grecaptcha.enterprise.ready(async () => {
await grecaptcha.enterprise.execute('$captcha.value', { action: 'LOGIN' })
.then((token) => {
document.querySelector('input[name="recaptcha_response"]').value = token;
addButton();
});
});
}
return false;
}
function addButton() {
let btn = document.createElement("button");
btn.type = "submit";
btn.name = "submit";
btn.value = "submit";
btn.style.display = "none";
document.querySelector('#$gui.name').appendChild(btn);
btn.click()
}
</script>
#else
#set ($captcha = $gui.getGuiElem("captchaSettings.reCaptchaVisibleSiteKey"))
<input type="hidden" name="recaptcha_sitekey" value="$captcha.value"/>
<input type="hidden" name="recaptcha_response" value="captcha">
<script src="https://www.google.com/recaptcha/enterprise.js?onload=onloadCallback&render=explicit" async
defer></script>
<script>
var verifyCallback = function (response) {
document.querySelector('input[name="recaptcha_response"]').value = response;
};
var expiredCallback = function () {
document.querySelector('input[name="recaptcha_response"]').value = 'captcha';
};
var onloadCallback = function () {
grecaptcha.enterprise.render(document.getElementById('captchaRender'), {
'sitekey': '$captcha.value',
'action': 'LOGIN',
'callback': verifyCallback,
'expired-callback': expiredCallback
});
};
</script>
#end
<div class="font-body text-body-l mb-4">
#if ($isCaptchaVisible)
<div class="text-disabled-grey dark:text-silver">
$text.get("recovery_intro_email.siteProtectedWithRecaptcha")
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<div class="w-full font-body text-body-l mb-4">
<div class="flex mt-8">
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"
data-lang="$login.language"
data-solution-field-name="captcha_response">
</div>
</div>
#else
<div class="flex mt-8" id="captchaRender"></div>
#end
</div>
</div>
#end ## if
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col sm:flex-row-reverse gap-4">
#if ($isCaptchaVisible)
#if ($captchaEnabled.value && $captchaEnabled.value == "true")
<agov-button
id="submit_btn_captcha_enabled"
disabled="true"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.login")"
data-type="submit"
data-fullwidth="true"
onclick="return emailCaptcha(event)">
data-fullwidth="true">
</agov-button>
#else
#else
<agov-button
id="submit_btn_captcha_disabled"
class="block basis-full"
data-name="submit"
data-value="submit"
data-id="submit"
data-label="$text.get("general.login")"
data-type="submit"
data-fullwidth="true"
onclick="validateEmail.validateForm(event)">
data-fullwidth="true">
</agov-button>
#end
#end ## if
<agov-button
class="block basis-full"
data-style="secondary"

View File

@ -46,7 +46,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-a5b664b2c1f534aab19c8301f3618a8c5096d222"
tag: "r-7bd8f34aeeebe1debccb6e4932b092cf2b2c4c88"
dir: "DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/proxy-idm"
credentials: "git-credentials"
keystores:

View File

@ -175,17 +175,23 @@
<param-value>false</param-value>
</init-param>
</filter>
<!-- source: pattern://1200a58c76686d520c21edb0 -->
<!-- source: pattern://9c6ad44795320a7adec1ccde -->
<filter>
<filter-name>ResponseHeader_Default</filter-name>
<filter-name>ResponseHeader_Security_Response_Headers</filter-name>
<filter-class>ch::nevis::isiweb4::filter::delegation::HeaderDelegationFilter</filter-class>
<!-- source: pattern://1200a58c76686d520c21edb0 -->
<!-- source: pattern://9c6ad44795320a7adec1ccde -->
<init-param>
<param-name>DelegateToFrontend</param-name>
<param-value>
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Content-Security-Policy-Report-Only:default-src 'none'; script-src 'self' 'sha256-4r4l/2aahtvPIxQP0YmmqfftYXNwNqxxqOUaXVE0FjM=' 'sha256-3sconOU5uxdS6tVa5DhEli3N+/aY9IvYh873WqDptD0=' 'sha256-N3+RfLbnlpBc0lUnNy4soyLbX0tNDqQt5LPzkEsYOHo=' 'sha256-uOoE0nq21NJDv37YLUOxV9aCnNstJ0GK7BiXNMXQAcI='; img-src 'self'; style-src 'self' 'sha256-/yxYnm5QjS5hz1/KbfNQ/Deyfb9rK1xZefYJGNT9UmU=' 'sha256-2diQqrANllVP9IWjXj1A6fjjvlPtpN6NXlmTiRJneCU=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-DHdp+1g/LIFDKreGcezYZywjzyvqUEbmjv4fv+nEQeE=' 'sha256-DtJ0G5eArSV7tvvFUUeV7iyiWfBGflIkRW64/tmMWUk=' 'sha256-JhfXJ5URuB/EAqhZ9vqgEO6trOuCE0w2/ChmfrVzxFo=' 'sha256-MdFWcEIx4V82/ap9SUt01BxZMN4eFGEl8hNDFEGIzJU=' 'sha256-dnsMWK7eeuHUJm/wLL2CXCibJJV0lnUxjpqlu5fcUsg=' 'sha256-iKyiqXXi2KXxNcOUCr+VCUo09ipHFWuIkztLNvUXhd0=' 'sha256-ifPclQYYwRDXSPQgB9/6UgAgEICBpwegJBWNhOI8dOA='; form-action 'self' https://trustbroker.agov-d.azure.adnovum.net/adfs/ls; font-src 'self'; connect-src 'self';
Cross-Origin-Embedder-Policy:require-corp
Cross-Origin-Opener-Policy:same-origin
Cross-Origin-Resource-Policy:same-site
Permissions-Policy:geolocation=(), camera=(), microphone=(), interest-cohort=()
Referrer-Policy:strict-origin-when-cross-origin
Strict-Transport-Security:max-age=63072000; includeSubDomains;
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
</param-value>
</init-param>
</filter>
@ -371,9 +377,9 @@
<filter-name>URLHandler_Virtual_Host_idmOperations-Loggedout</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- source: pattern://1200a58c76686d520c21edb0 -->
<!-- source: pattern://9c6ad44795320a7adec1ccde -->
<filter-mapping>
<filter-name>ResponseHeader_Default</filter-name>
<filter-name>ResponseHeader_Security_Response_Headers</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- source: pattern://6f9c9f982dcc7ef59a34f1f7 -->

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<!-- If you change something here, make sure all the pages are modified accordingly -->
<!-- svh -> Small View Height. It's not taking the height of the search bar on mobile into account -->
<html class="relative min-h-screen h-full mx-4 flex sm:block" lang="$login.language" style="min-height: 100svh">
<html class="relative h-full mx-4 flex sm:block min-h-100" lang="$login.language">
<head>
<title>AGOV Operations</title>
<meta charset="UTF-8">

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<!-- If you change something here, make sure all the pages are modified accordingly -->
<!-- svh -> Small View Height. It's not taking the height of the search bar on mobile into account -->
<html class="relative min-h-screen h-full mx-4 flex sm:block" lang="$login.language" style="min-height: 100svh">
<html class="relative min-h-100 h-full mx-4 flex sm:block" lang="$login.language">
<head>
<title>AGOV Operations</title>
<meta charset="UTF-8">

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<!-- If you change something here, make sure all the pages are modified accordingly -->
<!-- svh -> Small View Height. It's not taking the height of the search bar on mobile into account -->
<html class="relative min-h-screen h-full mx-4 flex sm:block" lang="$login.language" style="min-height: 100svh">
<html class="relative min-h-100 h-full mx-4 flex sm:block" lang="$login.language">
<head>
<title>AGOV Operations</title>
<meta charset="UTF-8">

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<!-- If you change something here, make sure all the pages are modified accordingly -->
<!-- svh -> Small View Height. It's not taking the height of the search bar on mobile into account -->
<html class="relative min-h-screen h-full mx-4 flex sm:block" lang="$login.language" style="min-height: 100svh">
<html class="relative min-h-100 h-full mx-4 flex sm:block" lang="$login.language">
<head>
<title>AGOV Operations</title>
<meta charset="UTF-8">

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<!-- If you change something here, make sure all the pages are modified accordingly -->
<!-- svh -> Small View Height. It's not taking the height of the search bar on mobile into account -->
<html class="relative min-h-screen h-full mx-4 flex sm:block" lang="$login.language" style="min-height: 100svh">
<html class="relative min-h-100 h-full mx-4 flex sm:block" lang="$login.language">
<head>
<title>AGOV Operations</title>
<meta charset="UTF-8">

Some files were not shown because too many files have changed in this diff Show More