From 3db80463bdeb5806b0f645093e0750af142dc64e Mon Sep 17 00:00:00 2001 From: Pheeef Date: Fri, 14 Feb 2025 21:20:26 +0100 Subject: [PATCH] custom theme for keycloak --- login/resources/css/styles.css | 46 ++++++ login/resources/img/background.svg | 28 ++++ login/resources/img/logo.png | Bin 0 -> 8533 bytes login/resources/img/logo.svg | 22 +++ login/template.ftl | 238 +++++++++++++++++++++++++++++ login/theme.properties | 4 + 6 files changed, 338 insertions(+) create mode 100644 login/resources/css/styles.css create mode 100644 login/resources/img/background.svg create mode 100644 login/resources/img/logo.png create mode 100644 login/resources/img/logo.svg create mode 100644 login/template.ftl create mode 100644 login/theme.properties diff --git a/login/resources/css/styles.css b/login/resources/css/styles.css new file mode 100644 index 0000000..bd0ab77 --- /dev/null +++ b/login/resources/css/styles.css @@ -0,0 +1,46 @@ +:root { + --pf-global--primary-color--100: #FFDF5D; + --pf-global--primary-color--200: #ffd738; +} + + +.login-pf body { + background-image: url('../img/background.svg'); + background-size: cover; +} + +.pf-v5-c-login__main { + border-radius: 0.75rem; + background-color: #282828; +} + +.pf-v5-c-button.pf-m-primary { + background-color: #FFDF5D; + color: #282828; +} + +.pf-v5-c-button.pf-m-primary:hover { + background-color: #ffd738; +} + +.pf-v5-c-form-control:focus-within { + --pf-v5-c-form-control--after--BorderBottomColor: #FFDF5D; + --pf-v5-c-form-control--after--BorderBottomWidth: var(--pf-v5-c-form-control--focus--after--BorderBottomWidth); +} + +#kc-header { + display: none; +} + +.pf-v5-c-login__main-header { + display: flex; + flex-direction: column; +} + +.cccsbg-logo { + background-image: url('../img/logo.svg'); + height: 170px; + width: 300px; + background-repeat: no-repeat; + margin-bottom: 50px; +} \ No newline at end of file diff --git a/login/resources/img/background.svg b/login/resources/img/background.svg new file mode 100644 index 0000000..1eb10a9 --- /dev/null +++ b/login/resources/img/background.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/login/resources/img/logo.png b/login/resources/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..607066894c6926920b594a5ea70baae2bb21f6fc GIT binary patch literal 8533 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 + + + + + + diff --git a/login/template.ftl b/login/template.ftl new file mode 100644 index 0000000..161df5b --- /dev/null +++ b/login/template.ftl @@ -0,0 +1,238 @@ +<#import "field.ftl" as field> +<#import "footer.ftl" as loginFooter> +<#macro username> + <#assign label> + <#if !realm.loginWithEmailAllowed>${msg("username")}<#elseif !realm.registrationEmailAsUsername>${msg("usernameOrEmail")}<#else>${msg("email")} + + <@field.group name="username" label=label> +
+
+ + + +
+
+ +
+ + + +<#macro registrationLayout bodyClass="" displayInfo=false displayMessage=true displayRequiredFields=false> + + dir="${(locale.rtl)?then('rtl','ltr')}"> + + + + + + + + + <#if properties.meta?has_content> + <#list properties.meta?split(' ') as meta> + + + + ${msg("loginTitle",(realm.displayName!''))} + + <#if properties.stylesCommon?has_content> + <#list properties.stylesCommon?split(' ') as style> + + + + <#if properties.styles?has_content> + <#list properties.styles?split(' ') as style> + + + + + <#if darkMode> + + + <#if properties.scripts?has_content> + <#list properties.scripts?split(' ') as script> + + + + <#if scripts??> + <#list scripts as script> + + + + + + <#if authenticationSession??> + + + + + + +
+
+ +
+
+ +

<#nested "header">

+ <#if realm.internationalizationEnabled && locale.supported?size gt 1> +
+
+ + + + + + +
+
+ +
+
+ <#if !(auth?has_content && auth.showUsername() && !auth.showResetCredentials())> + <#if displayRequiredFields> +
+
+ + * ${msg("requiredFields")} + +
+
+ + <#else> + <#if displayRequiredFields> +
+
+ + * ${msg("requiredFields")} + +
+
+ <#nested "show-username"> + <@username /> +
+
+ <#else> +
+ <#nested "show-username"> + <@username /> +
+ + + + <#-- App-initiated actions should not see warning messages about the need to complete the action --> + <#-- during login. --> + <#if displayMessage && message?has_content && (message.type != 'warning' || !isAppInitiatedAction??)> +
+
+ <#if message.type = 'success'> + <#if message.type = 'warning'> + <#if message.type = 'error'> + <#if message.type = 'info'> +
+ +
+ + + <#nested "form"> + + <#if auth?has_content && auth.showTryAnotherWayLink()> +
+ + + ${kcSanitize(msg("doTryAnotherWay"))?no_esc} + +
+ + + <#if displayInfo> +
+
+ <#nested "info"> +
+
+ +
+ +
+ + <@loginFooter.content/> +
+
+ + + diff --git a/login/theme.properties b/login/theme.properties new file mode 100644 index 0000000..5ef5858 --- /dev/null +++ b/login/theme.properties @@ -0,0 +1,4 @@ +parent=keycloak.v2 +import=common/keycloak +styles=css/styles.css +logo=/img/logo.svg \ No newline at end of file