diff --git a/tenants/plataforma/36-kc-theme.yaml b/tenants/plataforma/36-kc-theme.yaml index 52e904b..cf25923 100644 --- a/tenants/plataforma/36-kc-theme.yaml +++ b/tenants/plataforma/36-kc-theme.yaml @@ -1,5 +1,5 @@ # GERADO por scripts/tema_login_escolinha.py — nao edite na mao. -# Fonte: keycloak-theme/escolinha/*.ftl (login.ftl, login-update-password.ftl, estilo.ftl, template.ftl, error.ftl, info.ftl, logout-confirm.ftl, login-page-expired.ftl, login-reset-password.ftl, login-config-totp.ftl, login-otp.ftl, webauthn-register.ftl, webauthn-authenticate.ftl, select-authenticator.ftl) +# Fonte: keycloak-theme/escolinha/*.ftl (login.ftl, login-update-password.ftl, estilo.ftl, template.ftl, error.ftl, info.ftl, logout-confirm.ftl, login-page-expired.ftl, login-reset-password.ftl, login-config-totp.ftl, login-otp.ftl, webauthn-register.ftl, webauthn-authenticate.ftl, select-authenticator.ftl, login-username.ftl, login-password.ftl) apiVersion: v1 kind: ConfigMap metadata: @@ -616,6 +616,26 @@ data: .credenciais input:checked+label.cartao{border-color:var(--orange);box-shadow:0 0 0 3px rgba(245,130,32,.16)} .conteudo .cartao.estatico{cursor:default} + /* "Primeiro o usuario, depois a senha" (login-username, login-password — + 2026-10-08): os mesmos campos do login, agora DENTRO de `.conteudo`, cujo + `button` laranja de largura toda e `a` sublinhado engoliriam o olho da + senha, o "Esqueceu sua senha?" e o botao de passkey da macro do base. */ + .conteudo button.olho{width:40px;height:40px;margin:0;padding:0;background:transparent; + color:#8F8F8B;border-radius:9px} + .conteudo button.olho:hover{background:#F2F0EC;color:var(--navy)} + .conteudo .esqueci{text-decoration:none} + .conteudo .esqueci:hover{text-decoration:underline} + .sub .trocar-conta{color:var(--blue);text-decoration:none;white-space:nowrap} + .sub .trocar-conta:hover{text-decoration:underline} + .sociais{display:flex;flex-direction:column;gap:12px;margin-top:16px} + .conteudo a#authenticateWebAuthnButton{ + display:flex;align-items:center;justify-content:center;gap:10px; + width:100%;height:56px;margin-top:12px;border-radius:12px;box-sizing:border-box; + font-size:16px;font-weight:700;text-decoration:none; + background:#fff;color:var(--navy);border:1.5px solid var(--line); + } + .conteudo a#authenticateWebAuthnButton:hover{background:#F6F4F1;color:var(--navy)} + /* ---------- Telas estreitas ---------- */ @media (max-width:980px){ .stage{grid-template-columns:1fr} @@ -1438,3 +1458,172 @@ data: + login-username.ftl: |- + <#-- + PRIMEIRO O USUARIO — a etapa "Username Form" de um fluxo que pede o e-mail + numa tela e a senha (ou a passkey) na seguinte. A senha e a login-password.ftl. + + Nenhum realm usa esse fluxo hoje (o login de todos e a login.ftl, usuario e + senha juntos). Esta pagina existe para que, se um fluxo passar a usa-lo — o + caminho natural da passkey sem senha —, a tela nao caia no tema de fabrica no + meio do login (2026-10-08). + + NAO MUDE OS NOMES: sao os do tema base do Keycloak 26.x. O authenticator le + `username` e `rememberMe` do POST; o form e `kc-form-login` e o botao + `kc-login` (name `login`, que o `onsubmit` desliga); o erro do campo e + `input-error-username`. Com `usernameHidden` (o usuario ja foi identificado + por outra etapa), o campo e o "Lembrar-me" saem, como no base. + + A passkey e a macro do tema BASE (`passkeys.ftl`), como no login.ftl: o + `webauthn` no autocomplete faz o navegador sugerir a passkey no proprio campo, + e sem a politica "Passkeys" no realm a macro nao desenha nada. + --> + <#import "template.ftl" as layout> + <#import "passkeys.ftl" as passkeys> + <@layout.registrationLayout displayMessage=!messagesPerField.existsError('username') displayInfo=(realm.password && realm.registrationAllowed && !registrationDisabled??); section> + <#if section = "header"> + <#if (realm.name!"") == "athleticmap"> + Painel do dono + <#elseif (realm.name!"") == "clientes"> + Painel da sua conta + <#else> + Bem-vindo de volta! + + <#elseif section = "sub"> + <#if (realm.name!"") == "athleticmap"> + Área restrita à administração da Athletic Map + <#else> + Acesse sua conta para continuar + + <#elseif section = "form"> + <#if realm.password> +
+ <#if !usernameHidden??> +
+ +
+ + + + +
+ <#if messagesPerField.existsError('username')> + ${kcSanitize(messagesPerField.get('username'))?no_esc} + +
+ + + <#if realm.rememberMe && !usernameHidden??> +
+ +
+ + + +
+ <#-- FORA do form: a macro traz os proprios forms (`webauth`, `authn_select`). --> + <@passkeys.conditionalUIData /> + + <#elseif section = "info"> + <#if realm.password && realm.registrationAllowed && !registrationDisabled??> +
+ ${msg("noAccount")} ${msg("doRegister")} +
+ + <#elseif section = "socialProviders"> + <#-- Mesmo desenho do login.ftl. Hoje nenhum realm tem provedor. --> + <#if realm.password && social?? && social.providers?? && social.providers?has_content> +
+
ou
+ <#list social.providers as p> + + <#if p.providerId?? && p.providerId == "google"> + + <#else> + + + Entrar com ${p.displayName!'SSO'} + + +
+ + + + + login-password.ftl: |- + <#-- + DEPOIS A SENHA — a etapa "Password Form" de um fluxo que pediu o e-mail + antes (login-username.ftl, ou o usuario ja identificado por outra etapa). + + Nenhum realm usa esse fluxo hoje; ver o cabecalho da login-username.ftl. + + NAO MUDE OS NOMES: sao os do tema base do Keycloak 26.x. O authenticator le + `password` do POST; o form e `kc-form-login`, o botao `kc-login` (name + `login`) e o erro do campo `input-error-password`. + + O tema base mostra QUEM esta entrando (`kc-attempted-username`) com o link + para recomecar (`reset-login` -> `url.loginRestartFlowUrl`) na moldura dele. + A moldura deste tema nao faz isso, entao a pagina faz, no subtitulo: sem o + link, quem digitou o e-mail errado so sai fechando a aba. O "Tente outra + forma" (passkey, 2FA) e da moldura e aparece sozinho quando o fluxo oferece. + --> + <#import "template.ftl" as layout> + <#import "passkeys.ftl" as passkeys> + <@layout.registrationLayout displayMessage=!messagesPerField.existsError('password'); section> + <#if section = "header"> + Digite sua senha + <#elseif section = "sub"> + <#if (auth.attemptedUsername)?has_content> + Entrando como ${auth.attemptedUsername}. + Não é você? + <#else> + Acesse sua conta para continuar + + <#elseif section = "form"> +
+
+ +
+ + + + + +
+ <#if messagesPerField.existsError('password')> + ${kcSanitize(messagesPerField.get('password'))?no_esc} + +
+ + <#if realm.resetPasswordAllowed> +
+ Esqueceu sua senha? +
+ + + +
+ <#-- Como no keycloak.v2: a macro so desenha com a politica "Passkeys" ligada. --> + <@passkeys.conditionalUIData /> + + +