Last active
July 18, 2024 13:08
-
-
Save thomasdarimont/8021ef4bf715aae2cb28ca2ca3151ab7 to your computer and use it in GitHub Desktop.
Keycloak Login template.ftl with support for footer macros
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<#import "footer.ftl" as pageFooter> | |
<#import "login-footer.ftl" as loginFooter> | |
<#macro registrationLayout bodyClass="" displayInfo=false displayMessage=true displayRequiredFields=false> | |
<!DOCTYPE html> | |
<html class="${properties.kcHtmlClass!}"<#if realm.internationalizationEnabled> lang="${locale.currentLanguageTag}" dir="${(locale.rtl)?then('rtl','ltr')}"</#if>> | |
<head> | |
<meta charset="utf-8"> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | |
<meta name="robots" content="noindex, nofollow"> | |
<#if properties.meta?has_content> | |
<#list properties.meta?split(' ') as meta> | |
<meta name="${meta?split('==')[0]}" content="${meta?split('==')[1]}"/> | |
</#list> | |
</#if> | |
<title>${msg("loginTitle",(realm.displayName!''))}</title> | |
<link rel="icon" href="${url.resourcesPath}/img/favicon.ico" /> | |
<#if properties.stylesCommon?has_content> | |
<#list properties.stylesCommon?split(' ') as style> | |
<link href="${url.resourcesCommonPath}/${style}" rel="stylesheet" /> | |
</#list> | |
</#if> | |
<#if properties.styles?has_content> | |
<#list properties.styles?split(' ') as style> | |
<link href="${url.resourcesPath}/${style}" rel="stylesheet" /> | |
</#list> | |
</#if> | |
<#if properties.scripts?has_content> | |
<#list properties.scripts?split(' ') as script> | |
<script src="${url.resourcesPath}/${script}" type="text/javascript"></script> | |
</#list> | |
</#if> | |
<script type="importmap"> | |
{ | |
"imports": { | |
"rfc4648": "${url.resourcesCommonPath}/node_modules/rfc4648/lib/rfc4648.js" | |
} | |
} | |
</script> | |
<script src="${url.resourcesPath}/js/menu-button-links.js" type="module"></script> | |
<#if scripts??> | |
<#list scripts as script> | |
<script src="${script}" type="text/javascript"></script> | |
</#list> | |
</#if> | |
<script type="module"> | |
import { checkCookiesAndSetTimer } from "${url.resourcesPath}/js/authChecker.js"; | |
checkCookiesAndSetTimer( | |
"${url.ssoLoginInOtherTabsUrl?no_esc}" | |
); | |
</script> | |
</head> | |
<body class="${properties.kcBodyClass!}"> | |
<div class="${properties.kcLoginClass!}"> | |
<div id="kc-header" class="${properties.kcHeaderClass!}"> | |
<div id="kc-header-wrapper" | |
class="${properties.kcHeaderWrapperClass!}">${kcSanitize(msg("loginTitleHtml",(realm.displayNameHtml!'')))?no_esc}</div> | |
</div> | |
<div class="${properties.kcFormCardClass!}"> | |
<header class="${properties.kcFormHeaderClass!}"> | |
<#if realm.internationalizationEnabled && locale.supported?size gt 1> | |
<div class="${properties.kcLocaleMainClass!}" id="kc-locale"> | |
<div id="kc-locale-wrapper" class="${properties.kcLocaleWrapperClass!}"> | |
<div id="kc-locale-dropdown" class="menu-button-links ${properties.kcLocaleDropDownClass!}"> | |
<button tabindex="1" id="kc-current-locale-link" aria-label="${msg("languages")}" aria-haspopup="true" aria-expanded="false" aria-controls="language-switch1">${locale.current}</button> | |
<ul role="menu" tabindex="-1" aria-labelledby="kc-current-locale-link" aria-activedescendant="" id="language-switch1" class="${properties.kcLocaleListClass!}"> | |
<#assign i = 1> | |
<#list locale.supported as l> | |
<li class="${properties.kcLocaleListItemClass!}" role="none"> | |
<a role="menuitem" id="language-${i}" class="${properties.kcLocaleItemClass!}" href="${l.url}">${l.label}</a> | |
</li> | |
<#assign i++> | |
</#list> | |
</ul> | |
</div> | |
</div> | |
</div> | |
</#if> | |
<#if !(auth?has_content && auth.showUsername() && !auth.showResetCredentials())> | |
<#if displayRequiredFields> | |
<div class="${properties.kcContentWrapperClass!}"> | |
<div class="${properties.kcLabelWrapperClass!} subtitle"> | |
<span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span> | |
</div> | |
<div class="col-md-10"> | |
<h1 id="kc-page-title"><#nested "header"></h1> | |
</div> | |
</div> | |
<#else> | |
<h1 id="kc-page-title"><#nested "header"></h1> | |
</#if> | |
<#else> | |
<#if displayRequiredFields> | |
<div class="${properties.kcContentWrapperClass!}"> | |
<div class="${properties.kcLabelWrapperClass!} subtitle"> | |
<span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span> | |
</div> | |
<div class="col-md-10"> | |
<#nested "show-username"> | |
<div id="kc-username" class="${properties.kcFormGroupClass!}"> | |
<label id="kc-attempted-username">${auth.attemptedUsername}</label> | |
<a id="reset-login" href="${url.loginRestartFlowUrl}" aria-label="${msg("restartLoginTooltip")}"> | |
<div class="kc-login-tooltip"> | |
<i class="${properties.kcResetFlowIcon!}"></i> | |
<span class="kc-tooltip-text">${msg("restartLoginTooltip")}</span> | |
</div> | |
</a> | |
</div> | |
</div> | |
</div> | |
<#else> | |
<#nested "show-username"> | |
<div id="kc-username" class="${properties.kcFormGroupClass!}"> | |
<label id="kc-attempted-username">${auth.attemptedUsername}</label> | |
<a id="reset-login" href="${url.loginRestartFlowUrl}" aria-label="${msg("restartLoginTooltip")}"> | |
<div class="kc-login-tooltip"> | |
<i class="${properties.kcResetFlowIcon!}"></i> | |
<span class="kc-tooltip-text">${msg("restartLoginTooltip")}</span> | |
</div> | |
</a> | |
</div> | |
</#if> | |
</#if> | |
</header> | |
<div id="kc-content"> | |
<div id="kc-content-wrapper"> | |
<#-- 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??)> | |
<div class="alert-${message.type} ${properties.kcAlertClass!} pf-m-<#if message.type = 'error'>danger<#else>${message.type}</#if>"> | |
<div class="pf-c-alert__icon"> | |
<#if message.type = 'success'><span class="${properties.kcFeedbackSuccessIcon!}"></span></#if> | |
<#if message.type = 'warning'><span class="${properties.kcFeedbackWarningIcon!}"></span></#if> | |
<#if message.type = 'error'><span class="${properties.kcFeedbackErrorIcon!}"></span></#if> | |
<#if message.type = 'info'><span class="${properties.kcFeedbackInfoIcon!}"></span></#if> | |
</div> | |
<span class="${properties.kcAlertTitleClass!}">${kcSanitize(message.summary)?no_esc}</span> | |
</div> | |
</#if> | |
<#nested "form"> | |
<#if auth?has_content && auth.showTryAnotherWayLink()> | |
<form id="kc-select-try-another-way-form" action="${url.loginAction}" method="post"> | |
<div class="${properties.kcFormGroupClass!}"> | |
<input type="hidden" name="tryAnotherWay" value="on"/> | |
<a href="#" id="try-another-way" | |
onclick="document.forms['kc-select-try-another-way-form'].submit();return false;">${msg("doTryAnotherWay")}</a> | |
</div> | |
</form> | |
</#if> | |
<#nested "socialProviders"> | |
<#if displayInfo> | |
<div id="kc-info" class="${properties.kcSignUpClass!}"> | |
<div id="kc-info-wrapper" class="${properties.kcInfoAreaWrapperClass!}"> | |
<#nested "info"> | |
</div> | |
</div> | |
</#if> | |
</div> | |
</div> | |
<@loginFooter.content/> | |
</div> | |
</div> | |
<@pageFooter.content/> | |
</body> | |
</html> | |
</#macro> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment