diff --git a/infra/docker/keycloak/themes/tjwater/login/info.ftl b/infra/docker/keycloak/themes/tjwater/login/info.ftl new file mode 100644 index 0000000..c9643f3 --- /dev/null +++ b/infra/docker/keycloak/themes/tjwater/login/info.ftl @@ -0,0 +1,44 @@ +<#import "template.ftl" as layout> +<#assign isLogout = message.summary == msg("successLogout")> +<@layout.registrationLayout displayMessage=false; section> + <#if section = "header"> + <#if isLogout> + ${kcSanitize(msg("tjwaterLogoutTitle"))?no_esc} + <#elseif messageHeader??> + ${kcSanitize(msg("${messageHeader}"))?no_esc} + <#else> + ${message.summary} + + <#elseif section = "form"> + <#if isLogout> +
+ +
+

${kcSanitize(msg("tjwaterLogoutEyebrow"))?no_esc}

+

${kcSanitize(msg("tjwaterLogoutDescription"))?no_esc}

+
+ <#if pageRedirectUri?has_content> + ${kcSanitize(msg("tjwaterReturnToApplication"))?no_esc} + <#elseif (client.baseUrl)?has_content> + ${kcSanitize(msg("tjwaterReturnToApplication"))?no_esc} + +
+ <#else> +
+

${message.summary}<#if requiredActions??><#list requiredActions>: <#items as reqActionItem>${kcSanitize(msg("requiredAction.${reqActionItem}"))?no_esc}<#sep>, <#else>

+ <#if skipLink??> + <#else> + <#if pageRedirectUri?has_content> +

${kcSanitize(msg("backToApplication"))?no_esc}

+ <#elseif actionUri?has_content> +

${kcSanitize(msg("proceedWithAction"))?no_esc}

+ <#elseif (client.baseUrl)?has_content> +

${kcSanitize(msg("backToApplication"))?no_esc}

+ + +
+ + + diff --git a/infra/docker/keycloak/themes/tjwater/login/messages/messages_en.properties b/infra/docker/keycloak/themes/tjwater/login/messages/messages_en.properties index b7790c0..e0dce29 100644 --- a/infra/docker/keycloak/themes/tjwater/login/messages/messages_en.properties +++ b/infra/docker/keycloak/themes/tjwater/login/messages/messages_en.properties @@ -1,3 +1,7 @@ loginAccountTitle=Account sign in doLogIn=Sign in doForgotPassword=Forgot password +tjwaterLogoutTitle=Signed out securely +tjwaterLogoutEyebrow=Your session has ended +tjwaterLogoutDescription=Your platform and identity-provider sessions have been ended securely. +tjwaterReturnToApplication=Return to sign in diff --git a/infra/docker/keycloak/themes/tjwater/login/messages/messages_zh_CN.properties b/infra/docker/keycloak/themes/tjwater/login/messages/messages_zh_CN.properties index 30bd332..3fba4a9 100644 --- a/infra/docker/keycloak/themes/tjwater/login/messages/messages_zh_CN.properties +++ b/infra/docker/keycloak/themes/tjwater/login/messages/messages_zh_CN.properties @@ -7,3 +7,7 @@ invalidUserMessage=用户名或密码错误 invalidUsernameOrPasswordMessage=用户名或密码错误 expiredCodeMessage=登录已超时,请重新登录 loginTimeout=登录已超时,请重新开始登录 +tjwaterLogoutTitle=已安全退出 +tjwaterLogoutEyebrow=会话已结束 +tjwaterLogoutDescription=您的平台与身份认证会话均已安全结束。 +tjwaterReturnToApplication=返回登录页 diff --git a/infra/docker/keycloak/themes/tjwater/login/resources/css/tjwater-login.css b/infra/docker/keycloak/themes/tjwater/login/resources/css/tjwater-login.css index 9d84925..19a185d 100644 --- a/infra/docker/keycloak/themes/tjwater/login/resources/css/tjwater-login.css +++ b/infra/docker/keycloak/themes/tjwater/login/resources/css/tjwater-login.css @@ -367,6 +367,60 @@ a:focus-visible { background: transparent; } +.tjwater-logout-message { + display: grid; + gap: 20px; + padding-top: 4px; +} + +.tjwater-logout-mark { + display: grid; + width: 52px; + height: 52px; + border: 1px solid oklch(0.76 0.09 184 / 52%); + border-radius: 50%; + background: oklch(0.92 0.04 184 / 58%); + place-items: center; +} + +.tjwater-logout-mark span { + width: 18px; + height: 10px; + border-bottom: 3px solid var(--tjwater-teal); + border-left: 3px solid var(--tjwater-teal); + transform: translateY(-2px) rotate(-45deg); +} + +.tjwater-logout-copy { + display: grid; + gap: 7px; +} + +.tjwater-logout-eyebrow { + margin: 0; + color: var(--tjwater-ink); + font-size: 17px; + font-weight: 700; + line-height: 1.45; +} + +.tjwater-logout-description { + margin: 0; + color: var(--tjwater-muted); + font-size: 14px; + line-height: 1.75; +} + +.tjwater-logout-action { + display: inline-flex; + width: 100%; + min-height: 48px; + align-items: center; + justify-content: center; + text-align: center; + text-decoration: none; +} + @keyframes tjwater-enter { from { opacity: 0;