first commit
|
After Width: | Height: | Size: 627 B |
@@ -0,0 +1,22 @@
|
|||||||
|
/*!
|
||||||
|
* This folder contains updated PatternFly4 icons (version 2020.13).
|
||||||
|
* After the PF4 transition is finished this folder will be deleted.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "pficon-tmp";
|
||||||
|
src: url("./pficon.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
.pf-icon-openshift:before {
|
||||||
|
font-family: "pficon-tmp";
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
text-decoration: none;
|
||||||
|
text-transform: none; }
|
||||||
|
|
||||||
|
.pf-icon-openshift:before {
|
||||||
|
content: ""; }
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
parent=base
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
<#import "template.ftl" as layout>
|
||||||
|
<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username','password') displayInfo=realm.password && realm.registrationAllowed && !registrationDisabled??; section>
|
||||||
|
<#if section = "header">
|
||||||
|
${msg("loginAccountTitle")}
|
||||||
|
<#elseif section = "form">
|
||||||
|
<div id="kc-form">
|
||||||
|
<div id="kc-form-wrapper">
|
||||||
|
|
||||||
|
<div class="login-container">
|
||||||
|
<div class="login-card">
|
||||||
|
<!-- Logo -->
|
||||||
|
<div class="logo-section">
|
||||||
|
<img src="${url.resourcesPath}/img/rssa-logo.webp" alt="RSSA Logo" class="login-logo" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Title -->
|
||||||
|
<h1 class="login-heading">RSSA Login</h1>
|
||||||
|
<p class="login-subtitle">Masukkan akses Anda untuk melanjutkan</p>
|
||||||
|
|
||||||
|
<!-- Alert Messages -->
|
||||||
|
<#if message?has_content && (message.type != 'warning' || !isAppInitiatedAction??)>
|
||||||
|
<div class="alert alert-${message.type}">
|
||||||
|
<#if message.type = 'success'><span class="pficon pficon-ok"></span></#if>
|
||||||
|
<#if message.type = 'warning'><span class="pficon pficon-warning-triangle-o"></span></#if>
|
||||||
|
<#if message.type = 'error'></span></#if>
|
||||||
|
<#if message.type = 'info'><span class="pficon pficon-info"></span></#if>
|
||||||
|
<span class="kc-feedback-text">${kcSanitize(message.summary)?no_esc}</span>
|
||||||
|
</div>
|
||||||
|
</#if>
|
||||||
|
|
||||||
|
<!-- Login Form -->
|
||||||
|
<form id="kc-form-login" onsubmit="login.disabled = true; return true;" action="${url.loginAction}" method="post">
|
||||||
|
|
||||||
|
<!-- Username Field -->
|
||||||
|
<div class="form-group">
|
||||||
|
<input tabindex="1"
|
||||||
|
id="username"
|
||||||
|
class="form-control"
|
||||||
|
name="username"
|
||||||
|
value="${(login.username!'')}"
|
||||||
|
type="text"
|
||||||
|
autofocus
|
||||||
|
autocomplete="off"
|
||||||
|
aria-invalid="<#if messagesPerField.existsError('username','password')>true</#if>"
|
||||||
|
placeholder="Username atau alamat email"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Password Field -->
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="password-wrapper">
|
||||||
|
<input tabindex="2"
|
||||||
|
id="password"
|
||||||
|
class="form-control"
|
||||||
|
name="password"
|
||||||
|
type="password"
|
||||||
|
autocomplete="off"
|
||||||
|
aria-invalid="<#if messagesPerField.existsError('username','password')>true</#if>"
|
||||||
|
placeholder="Kata sandi"
|
||||||
|
/>
|
||||||
|
<button type="button" class="password-toggle" onclick="togglePassword()" aria-label="Toggle password visibility">
|
||||||
|
<svg class="eye-icon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
|
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
|
||||||
|
<circle cx="12" cy="12" r="3"></circle>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Forgot Password -->
|
||||||
|
<#if realm.resetPasswordAllowed>
|
||||||
|
<div class="forgot-password">
|
||||||
|
<a tabindex="5" href="${url.loginResetCredentialsUrl}">Lupa Kata sandi</a>
|
||||||
|
</div>
|
||||||
|
</#if>
|
||||||
|
|
||||||
|
<!-- Login Button -->
|
||||||
|
<div class="form-actions">
|
||||||
|
<input type="hidden" id="id-hidden-input" name="credentialId" <#if auth.selectedCredential?has_content>value="${auth.selectedCredential}"</#if>/>
|
||||||
|
<button tabindex="4" class="btn-login" name="login" id="kc-login" type="submit">
|
||||||
|
Login
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function togglePassword() {
|
||||||
|
var passwordInput = document.getElementById('password');
|
||||||
|
var eyeIcon = document.querySelector('.eye-icon');
|
||||||
|
if (passwordInput.type === 'password') {
|
||||||
|
passwordInput.type = 'text';
|
||||||
|
eyeIcon.innerHTML = '<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path><line x1="1" y1="1" x2="23" y2="23"></line>';
|
||||||
|
} else {
|
||||||
|
passwordInput.type = 'password';
|
||||||
|
eyeIcon.innerHTML = '<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</#if>
|
||||||
|
</@layout.registrationLayout>
|
||||||
@@ -0,0 +1,561 @@
|
|||||||
|
doLogIn=Sign In
|
||||||
|
doRegister=Register
|
||||||
|
doRegisterSecurityKey=Register
|
||||||
|
doCancel=Cancel
|
||||||
|
doSubmit=Submit
|
||||||
|
doBack=Back
|
||||||
|
doYes=Yes
|
||||||
|
doNo=No
|
||||||
|
doContinue=Continue
|
||||||
|
doIgnore=Ignore
|
||||||
|
doAccept=Accept
|
||||||
|
doDecline=Decline
|
||||||
|
doForgotPassword=Forgot Password?
|
||||||
|
doClickHere=Click here
|
||||||
|
doImpersonate=Impersonate
|
||||||
|
doTryAgain=Try again
|
||||||
|
doTryAnotherWay=Try Another Way
|
||||||
|
doConfirmDelete=Confirm deletion
|
||||||
|
errorDeletingAccount=Error happened while deleting account
|
||||||
|
deletingAccountForbidden=You do not have enough permissions to delete your own account, contact admin.
|
||||||
|
kerberosNotConfigured=Kerberos Not Configured
|
||||||
|
kerberosNotConfiguredTitle=Kerberos Not Configured
|
||||||
|
bypassKerberosDetail=Either you are not logged in by Kerberos or your browser is not set up for Kerberos login. Please click continue to login in through other means
|
||||||
|
kerberosNotSetUp=Kerberos is not set up. You cannot login.
|
||||||
|
registerTitle=Register
|
||||||
|
loginAccountTitle=
|
||||||
|
loginTitle=Sign in to {0}
|
||||||
|
loginTitleHtml={0}
|
||||||
|
impersonateTitle={0} Impersonate User
|
||||||
|
impersonateTitleHtml=<strong>{0}</strong> Impersonate User
|
||||||
|
realmChoice=Realm
|
||||||
|
unknownUser=Unknown user
|
||||||
|
loginTotpTitle=Mobile Authenticator Setup
|
||||||
|
loginProfileTitle=Update Account Information
|
||||||
|
loginIdpReviewProfileTitle=Update Account Information
|
||||||
|
loginTimeout=Your login attempt timed out. Login will start from the beginning.
|
||||||
|
reauthenticate=Please re-authenticate to continue
|
||||||
|
authenticateStrong=Strong authentication required to continue
|
||||||
|
oauthGrantTitle=Grant Access to {0}
|
||||||
|
oauthGrantTitleHtml={0}
|
||||||
|
oauthGrantInformation=Make sure you trust {0} by learning how {0} will handle your data.
|
||||||
|
oauthGrantReview=You could review the
|
||||||
|
oauthGrantTos=terms of service.
|
||||||
|
oauthGrantPolicy=privacy policy.
|
||||||
|
errorTitle=We are sorry...
|
||||||
|
errorTitleHtml=We are <strong>sorry</strong> ...
|
||||||
|
emailVerifyTitle=Email verification
|
||||||
|
emailForgotTitle=Forgot Your Password?
|
||||||
|
updateEmailTitle=Update email
|
||||||
|
emailUpdateConfirmationSentTitle=Confirmation email sent
|
||||||
|
emailUpdateConfirmationSent=A confirmation email has been sent to {0}. You must follow the instructions of the former to complete the email update.
|
||||||
|
emailUpdatedTitle=Email updated
|
||||||
|
emailUpdated=The account email has been successfully updated to {0}.
|
||||||
|
updatePasswordTitle=Update password
|
||||||
|
codeSuccessTitle=Success code
|
||||||
|
codeSuccess=Success code
|
||||||
|
codeErrorTitle=Error code\: {0}
|
||||||
|
displayUnsupported=Requested display type unsupported
|
||||||
|
browserRequired=Browser required to login
|
||||||
|
browserContinue=Browser required to complete login
|
||||||
|
browserContinuePrompt=Open browser and continue login? [y/n]:
|
||||||
|
browserContinueAnswer=y
|
||||||
|
|
||||||
|
# Transports
|
||||||
|
usb=USB
|
||||||
|
nfc=NFC
|
||||||
|
bluetooth=Bluetooth
|
||||||
|
internal=Internal
|
||||||
|
unknown=Unknown
|
||||||
|
|
||||||
|
termsTitle=Terms and Conditions
|
||||||
|
termsText=<p>Terms and conditions to be defined</p>
|
||||||
|
termsPlainText=Terms and conditions to be defined.
|
||||||
|
termsAcceptanceRequired=You must agree to our terms and conditions.
|
||||||
|
acceptTerms=I agree to the terms and conditions
|
||||||
|
|
||||||
|
deleteCredentialTitle=Delete {0}
|
||||||
|
deleteCredentialMessage=Do you want to delete {0}?
|
||||||
|
|
||||||
|
linkIdpActionTitle=Linking {0}
|
||||||
|
linkIdpActionMessage=Do you want to link your account with {0}?
|
||||||
|
|
||||||
|
recaptchaFailed=Invalid Recaptcha
|
||||||
|
recaptchaNotConfigured=Recaptcha is required, but not configured
|
||||||
|
consentDenied=Consent denied.
|
||||||
|
|
||||||
|
noAccount=New user?
|
||||||
|
username=Username
|
||||||
|
usernameOrEmail=Username or email
|
||||||
|
firstName=First name
|
||||||
|
givenName=Given name
|
||||||
|
fullName=Full name
|
||||||
|
lastName=Last name
|
||||||
|
familyName=Family name
|
||||||
|
email=Email
|
||||||
|
password=Password
|
||||||
|
passwordConfirm=Confirm password
|
||||||
|
passwordNew=New Password
|
||||||
|
passwordNewConfirm=New Password confirmation
|
||||||
|
hidePassword=Hide password
|
||||||
|
showPassword=Show password
|
||||||
|
rememberMe=Remember me
|
||||||
|
authenticatorCode=One-time code
|
||||||
|
address=Address
|
||||||
|
street=Street
|
||||||
|
locality=City or Locality
|
||||||
|
region=State, Province, or Region
|
||||||
|
postal_code=Zip or Postal code
|
||||||
|
country=Country
|
||||||
|
emailVerified=Email verified
|
||||||
|
website=Web page
|
||||||
|
phoneNumber=Phone number
|
||||||
|
phoneNumberVerified=Phone number verified
|
||||||
|
gender=Gender
|
||||||
|
birthday=Birthdate
|
||||||
|
zoneinfo=Time zone
|
||||||
|
gssDelegationCredential=GSS Delegation Credential
|
||||||
|
logoutOtherSessions=Sign out from other devices
|
||||||
|
|
||||||
|
profileScopeConsentText=User profile
|
||||||
|
emailScopeConsentText=Email address
|
||||||
|
addressScopeConsentText=Address
|
||||||
|
phoneScopeConsentText=Phone number
|
||||||
|
offlineAccessScopeConsentText=Offline Access
|
||||||
|
samlRoleListScopeConsentText=My Roles
|
||||||
|
rolesScopeConsentText=User roles
|
||||||
|
organizationScopeConsentText=Organization
|
||||||
|
|
||||||
|
restartLoginTooltip=Restart login
|
||||||
|
|
||||||
|
loginTotpIntro=You need to set up a One Time Password generator to access this account
|
||||||
|
loginTotpStep1=Install one of the following applications on your mobile:
|
||||||
|
loginTotpStep2=Open the application and scan the barcode:
|
||||||
|
loginTotpStep3=Enter the one-time code provided by the application and click Submit to finish the setup.
|
||||||
|
loginTotpStep3DeviceName=Provide a Device Name to help you manage your OTP devices.
|
||||||
|
loginTotpManualStep2=Open the application and enter the key:
|
||||||
|
loginTotpManualStep3=Use the following configuration values if the application allows setting them:
|
||||||
|
loginTotpUnableToScan=Unable to scan?
|
||||||
|
loginTotpScanBarcode=Scan barcode?
|
||||||
|
loginCredential=Credential
|
||||||
|
loginOtpOneTime=One-time code
|
||||||
|
loginTotpType=Type
|
||||||
|
loginTotpAlgorithm=Algorithm
|
||||||
|
loginTotpDigits=Digits
|
||||||
|
loginTotpInterval=Interval
|
||||||
|
loginTotpCounter=Counter
|
||||||
|
loginTotpDeviceName=Device Name
|
||||||
|
|
||||||
|
loginTotp.totp=Time-based
|
||||||
|
loginTotp.hotp=Counter-based
|
||||||
|
|
||||||
|
totpAppFreeOTPName=FreeOTP
|
||||||
|
totpAppGoogleName=Google Authenticator
|
||||||
|
totpAppMicrosoftAuthenticatorName=Microsoft Authenticator
|
||||||
|
|
||||||
|
loginChooseAuthenticator=Select login method
|
||||||
|
|
||||||
|
oauthGrantRequest=Do you grant these access privileges?
|
||||||
|
inResource=in
|
||||||
|
|
||||||
|
oauth2DeviceVerificationTitle=Device Login
|
||||||
|
verifyOAuth2DeviceUserCode=Enter the code provided by your device and click Submit
|
||||||
|
oauth2DeviceInvalidUserCodeMessage=Invalid code, please try again.
|
||||||
|
oauth2DeviceExpiredUserCodeMessage=The code has expired. Please go back to your device and try connecting again.
|
||||||
|
oauth2DeviceVerificationCompleteHeader=Device Login Successful
|
||||||
|
oauth2DeviceVerificationCompleteMessage=You may close this browser window and go back to your device.
|
||||||
|
oauth2DeviceVerificationFailedHeader=Device Login Failed
|
||||||
|
oauth2DeviceVerificationFailedMessage=You may close this browser window and go back to your device and try connecting again.
|
||||||
|
oauth2DeviceConsentDeniedMessage=Consent denied for connecting the device.
|
||||||
|
oauth2DeviceAuthorizationGrantDisabledMessage=Client is not allowed to initiate OAuth 2.0 Device Authorization Grant. The flow is disabled for the client.
|
||||||
|
|
||||||
|
emailVerifyInstruction1=An email with instructions to verify your email address has been sent to your address {0}.
|
||||||
|
emailVerifyInstruction2=Haven''t received a verification code in your email?
|
||||||
|
emailVerifyInstruction3=to re-send the email.
|
||||||
|
emailVerifyInstruction4=To verify your email address, we are about to send you email with instructions to the address {0}.
|
||||||
|
emailVerifyResend=Re-send verification email
|
||||||
|
emailVerifySend=Send verification email
|
||||||
|
emailVerifySendCooldown=You must wait {0} seconds before resending the verification email.
|
||||||
|
|
||||||
|
emailLinkIdpTitle=Link {0}
|
||||||
|
emailLinkIdp1=An email with instructions to link {0} account {1} with your {2} account has been sent to you.
|
||||||
|
emailLinkIdp2=Haven''t received a verification code in your email?
|
||||||
|
emailLinkIdp3=to re-send the email.
|
||||||
|
emailLinkIdp4=If you already verified the email in a different browser
|
||||||
|
emailLinkIdp5=to continue.
|
||||||
|
|
||||||
|
backToLogin=« Back to Login
|
||||||
|
|
||||||
|
emailInstruction=Enter your username or email address and we will send you instructions on how to create a new password.
|
||||||
|
emailInstructionUsername=Enter your username and we will send you instructions on how to create a new password.
|
||||||
|
|
||||||
|
copyCodeInstruction=Please copy this code and paste it into your application:
|
||||||
|
|
||||||
|
pageExpiredTitle=Page has expired
|
||||||
|
pageExpiredMsg1=To restart the login process
|
||||||
|
pageExpiredMsg2=To continue the login process
|
||||||
|
|
||||||
|
personalInfo=Personal Info:
|
||||||
|
role_admin=Admin
|
||||||
|
role_realm-admin=Realm Admin
|
||||||
|
role_create-realm=Create realm
|
||||||
|
role_create-client=Create client
|
||||||
|
role_view-realm=View realm
|
||||||
|
role_view-users=View users
|
||||||
|
role_view-applications=View applications
|
||||||
|
role_view-clients=View clients
|
||||||
|
role_view-events=View events
|
||||||
|
role_view-identity-providers=View identity providers
|
||||||
|
role_manage-realm=Manage realm
|
||||||
|
role_manage-users=Manage users
|
||||||
|
role_manage-applications=Manage applications
|
||||||
|
role_manage-identity-providers=Manage identity providers
|
||||||
|
role_manage-clients=Manage clients
|
||||||
|
role_manage-events=Manage events
|
||||||
|
role_view-profile=View profile
|
||||||
|
role_manage-account=Manage account
|
||||||
|
role_manage-account-links=Manage account links
|
||||||
|
role_read-token=Read token
|
||||||
|
role_offline-access=Offline access
|
||||||
|
client_account=Account
|
||||||
|
client_account-console=Account Console
|
||||||
|
client_security-admin-console=Security Admin Console
|
||||||
|
client_admin-cli=Admin CLI
|
||||||
|
client_realm-management=Realm Management
|
||||||
|
client_broker=Broker
|
||||||
|
|
||||||
|
requiredFields=Required fields
|
||||||
|
|
||||||
|
invalidUserMessage=Invalid username or password.
|
||||||
|
invalidUsernameMessage=Invalid username.
|
||||||
|
invalidUsernameOrEmailMessage=Invalid username or email.
|
||||||
|
invalidPasswordMessage=Invalid password.
|
||||||
|
invalidEmailMessage=Invalid email address.
|
||||||
|
accountDisabledMessage=Account is disabled, contact your administrator.
|
||||||
|
# These properties are deliberately the same as "invalidUsernameMessage", so by default, it is not possible to recognize the reason of failed authentication is temporarily disabled account
|
||||||
|
accountTemporarilyDisabledMessage=Invalid username or password.
|
||||||
|
accountPermanentlyDisabledMessage=Invalid username or password.
|
||||||
|
# These properties are deliberately the same as "invalidTotpMessage", so by default, it is not possible to recognize the reason of failed authentication is temporarily disabled account
|
||||||
|
accountTemporarilyDisabledMessageTotp=Invalid authenticator code.
|
||||||
|
accountPermanentlyDisabledMessageTotp=Invalid authenticator code.
|
||||||
|
expiredCodeMessage=Login timeout. Please sign in again.
|
||||||
|
expiredActionMessage=Action expired. Please continue with login now.
|
||||||
|
expiredActionTokenNoSessionMessage=Action expired.
|
||||||
|
expiredActionTokenSessionExistsMessage=Action expired. Please start again.
|
||||||
|
sessionLimitExceeded=There are too many sessions
|
||||||
|
identityProviderLogoutFailure=SAML IdP Logout Failure
|
||||||
|
|
||||||
|
missingFirstNameMessage=Please specify first name.
|
||||||
|
missingLastNameMessage=Please specify last name.
|
||||||
|
missingEmailMessage=Please specify email.
|
||||||
|
missingUsernameMessage=Please specify username.
|
||||||
|
missingPasswordMessage=Please specify password.
|
||||||
|
missingTotpMessage=Please specify authenticator code.
|
||||||
|
missingTotpDeviceNameMessage=Please specify device name.
|
||||||
|
notMatchPasswordMessage=Passwords don''t match.
|
||||||
|
|
||||||
|
error-invalid-value=Invalid value.
|
||||||
|
error-invalid-blank=Please specify value.
|
||||||
|
error-empty=Please specify value.
|
||||||
|
error-invalid-length=Length must be between {1} and {2}.
|
||||||
|
error-invalid-length-too-short=Minimal length is {1}.
|
||||||
|
error-invalid-length-too-long=Maximal length is {2}.
|
||||||
|
error-invalid-email=Invalid email address.
|
||||||
|
error-invalid-number=Invalid number.
|
||||||
|
error-number-out-of-range=Number must be between {1} and {2}.
|
||||||
|
error-number-out-of-range-too-small=Number must have minimal value of {1}.
|
||||||
|
error-number-out-of-range-too-big=Number must have maximal value of {2}.
|
||||||
|
error-pattern-no-match=Invalid value.
|
||||||
|
error-invalid-uri=Invalid URL.
|
||||||
|
error-invalid-uri-scheme=Invalid URL scheme.
|
||||||
|
error-invalid-uri-fragment=Invalid URL fragment.
|
||||||
|
error-user-attribute-required=Please specify this field.
|
||||||
|
error-invalid-date=Invalid date.
|
||||||
|
error-user-attribute-read-only=This field is read only.
|
||||||
|
error-username-invalid-character=Value contains invalid character.
|
||||||
|
error-person-name-invalid-character=Value contains invalid character.
|
||||||
|
error-reset-otp-missing-id=Please choose an OTP configuration.
|
||||||
|
error-non-ascii-local-part-email=Local part of the address must contain only ASCII characters.
|
||||||
|
|
||||||
|
invalidPasswordExistingMessage=Invalid existing password.
|
||||||
|
invalidPasswordBlacklistedMessage=Invalid password: password is blacklisted.
|
||||||
|
invalidPasswordConfirmMessage=Password confirmation doesn''t match.
|
||||||
|
invalidTotpMessage=Invalid authenticator code.
|
||||||
|
|
||||||
|
usernameExistsMessage=Username already exists.
|
||||||
|
emailExistsMessage=Email already exists.
|
||||||
|
|
||||||
|
federatedIdentityExistsMessage=User with {0} {1} already exists. Please login to account management to link the account.
|
||||||
|
federatedIdentityUnavailableMessage=User {0} authenticated with identity provider {1} does not exist. Please contact your administrator.
|
||||||
|
federatedIdentityUnmatchedEssentialClaimMessage=The ID token issued by the identity provider does not match the configured essential claim. Please contact your administrator.
|
||||||
|
|
||||||
|
confirmLinkIdpTitle=Account already exists
|
||||||
|
confirmOverrideIdpTitle=Broker link already exists
|
||||||
|
federatedIdentityConfirmLinkMessage=User with {0} {1} already exists. How do you want to continue?
|
||||||
|
federatedIdentityConfirmOverrideMessage=You are trying to link your account {0} with the {1} account {2}. But your account is already linked with different {3} account {4}. Can you confirm if you want to replace the existing link with the new account?
|
||||||
|
federatedIdentityConfirmReauthenticateMessage=Authenticate to link your account with {0}
|
||||||
|
nestedFirstBrokerFlowMessage=The {0} user {1} is not linked to any known user.
|
||||||
|
confirmLinkIdpReviewProfile=Review profile
|
||||||
|
confirmLinkIdpContinue=Add to existing account
|
||||||
|
confirmOverrideIdpContinue=Yes, override link with current account
|
||||||
|
|
||||||
|
configureTotpMessage=You need to set up Mobile Authenticator to activate your account.
|
||||||
|
configureBackupCodesMessage=You need to set up Backup Codes to activate your account.
|
||||||
|
updateProfileMessage=You need to update your user profile to activate your account.
|
||||||
|
updatePasswordMessage=You need to change your password to activate your account.
|
||||||
|
updateEmailMessage=You need to update your email address to activate your account.
|
||||||
|
resetPasswordMessage=You need to change your password.
|
||||||
|
verifyEmailMessage=You need to verify your email address to activate your account.
|
||||||
|
linkIdpMessage=You need to verify your email address to link your account with {0}.
|
||||||
|
|
||||||
|
emailSentMessage=You should receive an email shortly with further instructions.
|
||||||
|
emailSendErrorMessage=Failed to send email, please try again later.
|
||||||
|
|
||||||
|
accountUpdatedMessage=Your account has been updated.
|
||||||
|
accountPasswordUpdatedMessage=Your password has been updated.
|
||||||
|
|
||||||
|
delegationCompleteHeader=Login Successful
|
||||||
|
delegationCompleteMessage=You may close this browser window and go back to your console application.
|
||||||
|
delegationFailedHeader=Login Failed
|
||||||
|
delegationFailedMessage=You may close this browser window and go back to your console application and try logging in again.
|
||||||
|
|
||||||
|
noAccessMessage=No access
|
||||||
|
|
||||||
|
invalidPasswordMinLengthMessage=Invalid password: minimum length {0}.
|
||||||
|
invalidPasswordMaxLengthMessage=Invalid password: maximum length {0}.
|
||||||
|
invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits.
|
||||||
|
invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters.
|
||||||
|
invalidPasswordMinUpperCaseCharsMessage=Invalid password: must contain at least {0} upper case characters.
|
||||||
|
invalidPasswordMinSpecialCharsMessage=Invalid password: must contain at least {0} special characters.
|
||||||
|
invalidPasswordNotUsernameMessage=Invalid password: must not be equal to the username.
|
||||||
|
invalidPasswordNotContainsUsernameMessage=Invalid password: Can not contain the username.
|
||||||
|
invalidPasswordNotEmailMessage=Invalid password: must not be equal to the email.
|
||||||
|
invalidPasswordRegexPatternMessage=Invalid password: fails to match regex pattern(s).
|
||||||
|
invalidPasswordHistoryMessage=Invalid password: must not be equal to any of last {0} passwords.
|
||||||
|
invalidPasswordGenericMessage=Invalid password: new password doesn''t match password policies.
|
||||||
|
|
||||||
|
failedToProcessResponseMessage=Failed to process response
|
||||||
|
httpsRequiredMessage=HTTPS required
|
||||||
|
realmNotEnabledMessage=Realm not enabled
|
||||||
|
invalidRequestMessage=Invalid Request
|
||||||
|
successLogout=You are logged out
|
||||||
|
failedLogout=Logout failed
|
||||||
|
unknownLoginRequesterMessage=Unknown login requester
|
||||||
|
loginRequesterNotEnabledMessage=Login requester not enabled
|
||||||
|
bearerOnlyMessage=Bearer-only applications are not allowed to initiate browser login
|
||||||
|
standardFlowDisabledMessage=Client is not allowed to initiate browser login with given response_type. Standard flow is disabled for the client.
|
||||||
|
implicitFlowDisabledMessage=Client is not allowed to initiate browser login with given response_type. Implicit flow is disabled for the client.
|
||||||
|
invalidRedirectUriMessage=Invalid redirect uri
|
||||||
|
unsupportedNameIdFormatMessage=Unsupported NameIDFormat
|
||||||
|
invalidRequesterMessage=Invalid requester
|
||||||
|
registrationNotAllowedMessage=Registration not allowed
|
||||||
|
resetCredentialNotAllowedMessage=Reset Credential not allowed
|
||||||
|
|
||||||
|
permissionNotApprovedMessage=Permission not approved.
|
||||||
|
noRelayStateInResponseMessage=No relay state in response from identity provider.
|
||||||
|
insufficientPermissionMessage=Insufficient permissions to link identities.
|
||||||
|
couldNotProceedWithAuthenticationRequestMessage=Could not proceed with authentication request to identity provider.
|
||||||
|
couldNotObtainTokenMessage=Could not obtain token from identity provider.
|
||||||
|
unexpectedErrorRetrievingTokenMessage=Unexpected error when retrieving token from identity provider.
|
||||||
|
unexpectedErrorHandlingResponseMessage=Unexpected error when handling response from identity provider.
|
||||||
|
identityProviderAuthenticationFailedMessage=Authentication failed. Could not authenticate with identity provider.
|
||||||
|
couldNotSendAuthenticationRequestMessage=Could not send authentication request to identity provider.
|
||||||
|
unexpectedErrorHandlingRequestMessage=Unexpected error when handling authentication request to identity provider.
|
||||||
|
invalidAccessCodeMessage=Invalid access code.
|
||||||
|
sessionNotActiveMessage=Session not active.
|
||||||
|
invalidCodeMessage=An error occurred, please login again through your application.
|
||||||
|
cookieNotFoundMessage=Restart login cookie not found. It may have expired; it may have been deleted or cookies are disabled in your browser. If cookies are disabled then enable them. Click Back to Application to login again.
|
||||||
|
insufficientLevelOfAuthentication=The requested level of authentication has not been satisfied.
|
||||||
|
identityProviderUnexpectedErrorMessage=Unexpected error when authenticating with identity provider
|
||||||
|
identityProviderMissingStateMessage=Missing state parameter in response from identity provider.
|
||||||
|
identityProviderMissingCodeOrErrorMessage=Missing code or error parameter in response from identity provider.
|
||||||
|
identityProviderInvalidResponseMessage=Invalid response from identity provider.
|
||||||
|
identityProviderInvalidSignatureMessage=Invalid signature in response from identity provider.
|
||||||
|
identityProviderNotFoundMessage=Could not find an identity provider with the identifier.
|
||||||
|
identityProviderLinkSuccess=You successfully verified your email. Please go back to your original browser and continue there with the login.
|
||||||
|
staleCodeMessage=This page is no longer valid, please go back to your application and sign in again
|
||||||
|
realmSupportsNoCredentialsMessage=Realm does not support any credential type.
|
||||||
|
credentialSetupRequired=Cannot login, credential setup required.
|
||||||
|
identityProviderNotUniqueMessage=Realm supports multiple identity providers. Could not determine which identity provider should be used to authenticate with.
|
||||||
|
emailVerifiedMessageHeader=Email address verified
|
||||||
|
emailVerifiedMessage=Your email address has been verified.
|
||||||
|
emailVerifiedAlreadyMessageHeader=Email address verified
|
||||||
|
emailVerifiedAlreadyMessage=Your email address has been verified already.
|
||||||
|
staleEmailVerificationLink=The link you clicked is an old stale link and is no longer valid. Maybe you have already verified your email.
|
||||||
|
emailVerificationCancelled=This email verification has been cancelled by an administrator.
|
||||||
|
identityProviderAlreadyLinkedMessage=Federated identity returned by {0} is already linked to another user.
|
||||||
|
confirmAccountLinking=Confirm linking the account {0} of identity provider {1} with your account.
|
||||||
|
confirmAccountLinkingBody=If you link the account, you will also be able to login using account {0} of the identity provider {1}. Do not proceed if you did not initiate this process or you do not want to link the account.
|
||||||
|
confirmEmailAddressVerificationHeader=Email address validation
|
||||||
|
confirmEmailAddressVerification=Confirm validity of e-mail address {0}.
|
||||||
|
confirmExecutionOfActions=Perform the following action(s)
|
||||||
|
|
||||||
|
backToApplication=« Back to Application
|
||||||
|
missingParameterMessage=Missing parameters\: {0}
|
||||||
|
clientNotFoundMessage=Client not found.
|
||||||
|
clientDisabledMessage=Client disabled.
|
||||||
|
invalidParameterMessage=Invalid parameter\: {0}
|
||||||
|
alreadyLoggedIn=You are already logged in.
|
||||||
|
differentUserAuthenticated=You are already authenticated as different user ''{0}'' in this session. Please sign out first.
|
||||||
|
brokerLinkingSessionExpired=Requested broker account linking, but current session is no longer valid.
|
||||||
|
proceedWithAction=» Click here to proceed
|
||||||
|
acrNotFulfilled=Authentication requirements not fulfilled
|
||||||
|
|
||||||
|
requiredAction.CONFIGURE_TOTP=Configure OTP
|
||||||
|
requiredAction.TERMS_AND_CONDITIONS=Terms and Conditions
|
||||||
|
requiredAction.UPDATE_PASSWORD=Update Password
|
||||||
|
requiredAction.UPDATE_PROFILE=Update Profile
|
||||||
|
requiredAction.VERIFY_EMAIL=Verify Email
|
||||||
|
requiredAction.delete_account=Delete Account
|
||||||
|
requiredAction.UPDATE_EMAIL=Update Email
|
||||||
|
requiredAction.webauthn-register=WebAuthn Register
|
||||||
|
requiredAction.webauthn-register-passwordless=WebAuthn Register Passwordless
|
||||||
|
requiredAction.VERIFY_PROFILE=Verify Profile
|
||||||
|
requiredAction.delete_credential=Delete Credential
|
||||||
|
requiredAction.idp_link=Linking Identity Provider
|
||||||
|
requiredAction.CONFIGURE_RECOVERY_AUTHN_CODES=Generate Recovery Codes
|
||||||
|
requiredAction.update_user_locale=Update User Locale
|
||||||
|
|
||||||
|
invalidTokenRequiredActions=Required actions included in the link are not valid
|
||||||
|
|
||||||
|
doX509Login=You will be logged in as\:
|
||||||
|
clientCertificate=X509 client certificate\:
|
||||||
|
noCertificate=[No Certificate]
|
||||||
|
|
||||||
|
|
||||||
|
pageNotFound=Page not found
|
||||||
|
internalServerError=An internal server error has occurred
|
||||||
|
|
||||||
|
console-username=Username:
|
||||||
|
console-password=Password:
|
||||||
|
console-otp=One Time Password:
|
||||||
|
console-new-password=New Password:
|
||||||
|
console-confirm-password=Confirm Password:
|
||||||
|
console-update-password=Update of your password is required.
|
||||||
|
console-verify-email=You need to verify your email address. We sent an email to {0} that contains a verification code. Please enter this code into the input below.
|
||||||
|
console-email-code=Email Code:
|
||||||
|
console-accept-terms=Accept Terms? [y/n]:
|
||||||
|
console-accept=y
|
||||||
|
|
||||||
|
# Openshift messages
|
||||||
|
openshift.scope.user_info=User information
|
||||||
|
openshift.scope.user_check-access=User access information
|
||||||
|
openshift.scope.user_full=Full Access
|
||||||
|
openshift.scope.list-projects=List projects
|
||||||
|
|
||||||
|
# SAML authentication
|
||||||
|
saml.post-form.title=Authentication Redirect
|
||||||
|
saml.post-form.message=Redirecting, please wait.
|
||||||
|
saml.post-form.js-disabled=JavaScript is disabled. We strongly recommend to enable it. Click the button below to continue.
|
||||||
|
saml.artifactResolutionServiceInvalidResponse=Unable to resolve artifact.
|
||||||
|
|
||||||
|
#authenticators
|
||||||
|
otp-display-name=Authenticator Application
|
||||||
|
otp-help-text=Enter a verification code from authenticator application.
|
||||||
|
otp-reset-description=Which OTP configuration should be removed?
|
||||||
|
password-display-name=Password
|
||||||
|
password-help-text=Sign in by entering your password.
|
||||||
|
auth-username-form-display-name=Username
|
||||||
|
auth-username-form-help-text=Start sign in by entering your username
|
||||||
|
auth-username-password-form-display-name=Username and password
|
||||||
|
auth-username-password-form-help-text=Sign in by entering your username and password.
|
||||||
|
auth-x509-client-username-form-display-name=X509 Certificate
|
||||||
|
auth-x509-client-username-form-help-text=Sign in with an X509 client certificate.
|
||||||
|
|
||||||
|
# Recovery Codes
|
||||||
|
recovery-authn-codes-display-name=Recovery Authentication Code
|
||||||
|
recovery-authn-codes-help-text=Enter a recovery authentication code from a previously generated list.
|
||||||
|
auth-recovery-code-info-message=Enter the specified recovery code.
|
||||||
|
auth-recovery-code-prompt=Recovery code #{0}
|
||||||
|
auth-recovery-code-header=Login with a recovery authentication code
|
||||||
|
recovery-codes-error-invalid=Invalid recovery authentication code
|
||||||
|
recovery-code-config-header=Recovery Authentication Codes
|
||||||
|
recovery-code-config-warning-title=These recovery codes won''t appear again after leaving this page
|
||||||
|
recovery-code-config-warning-message=Make sure to print, download, or copy them to a password manager and keep them save. Canceling this setup will remove these recovery codes from your account.
|
||||||
|
recovery-codes-print=Print
|
||||||
|
recovery-codes-download=Download
|
||||||
|
recovery-codes-copy=Copy
|
||||||
|
recovery-codes-copied=Copied
|
||||||
|
recovery-codes-confirmation-message=I have saved these codes somewhere safe
|
||||||
|
recovery-codes-action-complete=Complete setup
|
||||||
|
recovery-codes-action-cancel=Cancel setup
|
||||||
|
recovery-codes-download-file-header=Keep these recovery codes somewhere safe.
|
||||||
|
recovery-codes-download-file-description=Recovery codes are single-use passcodes that allow you to sign in to your account if you do not have access to your authenticator.
|
||||||
|
recovery-codes-download-file-date=These codes were generated on
|
||||||
|
recovery-codes-label-default=Recovery codes
|
||||||
|
|
||||||
|
# WebAuthn
|
||||||
|
webauthn-display-name=Passkey
|
||||||
|
webauthn-help-text=Use your Passkey to sign in.
|
||||||
|
webauthn-passwordless-display-name=Passkey
|
||||||
|
webauthn-passwordless-help-text=Use your Passkey for passwordless sign in.
|
||||||
|
webauthn-login-title=Passkey login
|
||||||
|
webauthn-registration-title=Passkey Registration
|
||||||
|
webauthn-available-authenticators=Available Passkeys
|
||||||
|
webauthn-unsupported-browser-text=WebAuthn is not supported by this browser. Try another one or contact your administrator.
|
||||||
|
webauthn-doAuthenticate=Sign in with Passkey
|
||||||
|
webauthn-createdAt-label=Created
|
||||||
|
webauthn-registration-init-label=Passkey (Default Label)
|
||||||
|
webauthn-registration-init-label-prompt=Please input your registered passkey''s label
|
||||||
|
|
||||||
|
|
||||||
|
# WebAuthn Error
|
||||||
|
webauthn-error-title=Passkey Error
|
||||||
|
webauthn-error-registration=Failed to register your Passkey.<br /> {0}
|
||||||
|
webauthn-error-api-get=Failed to authenticate by the Passkey.<br /> {0}
|
||||||
|
webauthn-error-different-user=First authenticated user is not the one authenticated by the Passkey.
|
||||||
|
webauthn-error-auth-verification=Passkey authentication result is invalid.<br /> {0}
|
||||||
|
webauthn-error-register-verification=Passkey registration result is invalid.<br /> {0}
|
||||||
|
webauthn-error-user-not-found=Unknown user authenticated by the Passkey.
|
||||||
|
|
||||||
|
# Passkey
|
||||||
|
passkey-login-title=Passkey login
|
||||||
|
passkey-available-authenticators=Available Passkeys
|
||||||
|
passkey-unsupported-browser-text=Passkey is not supported by this browser. Try another one or contact your administrator.
|
||||||
|
passkey-doAuthenticate=Sign in with Passkey
|
||||||
|
passkey-createdAt-label=Created
|
||||||
|
passkey-autofill-select=Select your passkey
|
||||||
|
|
||||||
|
# Identity provider
|
||||||
|
identity-provider-redirector=Connect with another Identity Provider
|
||||||
|
identity-provider-login-label=Or sign in with
|
||||||
|
idp-email-verification-display-name=Email Verification
|
||||||
|
idp-email-verification-help-text=Link your account by validating your email.
|
||||||
|
idp-username-password-form-display-name=Username and password
|
||||||
|
idp-username-password-form-help-text=Link your account by logging in.
|
||||||
|
|
||||||
|
# Code
|
||||||
|
code-clipboard-label=Show content
|
||||||
|
code-copy-label=Copy to clipboard
|
||||||
|
code-copy-success=Code copied to clipboard
|
||||||
|
code-copy-failure=Failed to copy code to clipboard
|
||||||
|
|
||||||
|
finalDeletionConfirmation=If you delete your account, it cannot be restored. To keep your account, click Cancel.
|
||||||
|
irreversibleAction=This action is irreversible
|
||||||
|
deleteAccountConfirm=Delete account confirmation
|
||||||
|
|
||||||
|
deletingImplies=Deleting your account implies:
|
||||||
|
errasingData=Erasing all your data
|
||||||
|
loggingOutImmediately=Logging you out immediately
|
||||||
|
accountUnusable=Any subsequent use of the application will not be possible with this account
|
||||||
|
userDeletedSuccessfully=User deleted successfully
|
||||||
|
|
||||||
|
access-denied=Access denied
|
||||||
|
access-denied-when-idp-auth=Access denied when authenticating with {0}
|
||||||
|
|
||||||
|
frontchannel-logout.title=Logging out
|
||||||
|
frontchannel-logout.message=You are logging out from following apps
|
||||||
|
logoutConfirmTitle=Logging out
|
||||||
|
logoutConfirmHeader=Do you want to log out?
|
||||||
|
doLogout=Logout
|
||||||
|
|
||||||
|
readOnlyUsernameMessage=You can''t update your username as it is read-only.
|
||||||
|
error-invalid-multivalued-size=Attribute {0} must have at least {1} and at most {2} {2,choice,0#values|1#value|1<values}.
|
||||||
|
|
||||||
|
organization.confirm-membership.title=You are about to join organization ${kc.org.name}
|
||||||
|
organization.confirm-membership=By clicking on the link below, you will become a member of the {0} organization:
|
||||||
|
organization.member.register.title=Create an account to join the ${kc.org.name} organization
|
||||||
|
organization.select=Select an organization to proceed:
|
||||||
|
notMemberOfOrganization=User is not a member of the organization {0}
|
||||||
|
notMemberOfAnyOrganization=User is not a member of any organization
|
||||||
|
emailVerificationPending=A verification email was sent to {0}. You can submit without changes to resend the verification email, or enter a different email address.
|
||||||
@@ -0,0 +1,482 @@
|
|||||||
|
/*
|
||||||
|
* RSUD Dr. Saiful Anwar - Centered Card Login Design
|
||||||
|
* Version: 6.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Import Inter Font */
|
||||||
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
CSS CUSTOM PROPERTIES
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
/* Color Palette */
|
||||||
|
--primary-orange: #FF9800;
|
||||||
|
--primary-orange-light: #FFB74D;
|
||||||
|
--primary-orange-dark: #F57C00;
|
||||||
|
|
||||||
|
/* Background Colors */
|
||||||
|
--bg-page: #F6F6F6;
|
||||||
|
--bg-card: #FFFFFF;
|
||||||
|
|
||||||
|
/* Text Colors */
|
||||||
|
--text-primary: #333333;
|
||||||
|
--text-secondary: #999999;
|
||||||
|
--text-placeholder: #BBBBBB;
|
||||||
|
|
||||||
|
/* Border Colors */
|
||||||
|
--border-light: #E0E0E0;
|
||||||
|
--border-focus: #FF9800;
|
||||||
|
|
||||||
|
/* Spacing */
|
||||||
|
--spacing-xs: 4px;
|
||||||
|
--spacing-sm: 8px;
|
||||||
|
--spacing-md: 16px;
|
||||||
|
--spacing-lg: 24px;
|
||||||
|
--spacing-xl: 32px;
|
||||||
|
--spacing-2xl: 48px;
|
||||||
|
|
||||||
|
/* Typography */
|
||||||
|
--font-size-xs: 12px;
|
||||||
|
--font-size-sm: 14px;
|
||||||
|
--font-size-base: 15px;
|
||||||
|
--font-size-lg: 18px;
|
||||||
|
--font-size-xl: 24px;
|
||||||
|
--font-size-2xl: 28px;
|
||||||
|
|
||||||
|
/* Border Radius */
|
||||||
|
--radius-sm: 4px;
|
||||||
|
--radius-md: 8px;
|
||||||
|
--radius-lg: 12px;
|
||||||
|
|
||||||
|
/* Shadows */
|
||||||
|
--shadow-card: 0 2px 10px rgba(0, 0, 0, 0.08);
|
||||||
|
--shadow-input-focus: 0 0 0 3px rgba(255, 152, 0, 0.1);
|
||||||
|
|
||||||
|
/* Transitions */
|
||||||
|
--transition-base: 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
BASE RESET
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-pf {
|
||||||
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
background: var(--bg-page);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-pf body {
|
||||||
|
background: var(--bg-page);
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#kc-header {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-pf {
|
||||||
|
background: none;
|
||||||
|
box-shadow: none;
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-pf .container {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
max-width: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#kc-content {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#kc-form {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#kc-form-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: var(--spacing-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
LOGIN CONTAINER
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
.login-container {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 580px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
LOGIN CARD
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
.login-card {
|
||||||
|
background: var(--bg-card);
|
||||||
|
border-radius: var(--radius-lg);
|
||||||
|
box-shadow: var(--shadow-card);
|
||||||
|
padding: var(--spacing-2xl) var(--spacing-2xl) var(--spacing-xl);
|
||||||
|
border: 1px solid #EFE9E3;
|
||||||
|
animation: fadeIn 0.4s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(20px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
LOGO SECTION
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
.logo-section {
|
||||||
|
text-align: left;
|
||||||
|
margin-bottom: var(--spacing-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-logo {
|
||||||
|
width: 90px;
|
||||||
|
height: 90px;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
TITLE & SUBTITLE
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
.login-heading {
|
||||||
|
font-size: 32px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
text-align: left;
|
||||||
|
margin-bottom: var(--spacing-md);
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-subtitle {
|
||||||
|
font-size: var(--font-size-base);
|
||||||
|
color: var(--text-secondary);
|
||||||
|
text-align: left;
|
||||||
|
margin-bottom: var(--spacing-2xl);
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
ALERTS
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
padding: var(--spacing-md) var(--spacing-lg);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
margin-bottom: var(--spacing-lg);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--spacing-md);
|
||||||
|
font-size: var(--font-size-sm);
|
||||||
|
border-left: 4px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-success {
|
||||||
|
background: #E8F5E9;
|
||||||
|
border-left-color: #4CAF50;
|
||||||
|
color: #2E7D32;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-error {
|
||||||
|
background: #FFEBEE;
|
||||||
|
border-left-color: #E53935;
|
||||||
|
color: #C62828;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-warning {
|
||||||
|
background: #FFF8E1;
|
||||||
|
border-left-color: #FFA726;
|
||||||
|
color: #E65100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-info {
|
||||||
|
background: #E3F2FD;
|
||||||
|
border-left-color: #2196F3;
|
||||||
|
color: #1565C0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kc-feedback-text {
|
||||||
|
font-weight: 500;
|
||||||
|
flex: 1;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pficon {
|
||||||
|
font-size: 20px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
line-height: 1;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
FORM STYLES
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
#kc-form-login {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group {
|
||||||
|
margin-bottom: var(--spacing-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Input Fields */
|
||||||
|
.form-control {
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px var(--spacing-lg);
|
||||||
|
font-size: var(--font-size-base);
|
||||||
|
border: 1px solid var(--border-light);
|
||||||
|
border-radius: var(--radius-sm);
|
||||||
|
transition: all var(--transition-base);
|
||||||
|
background: var(--bg-card);
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: var(--border-focus);
|
||||||
|
box-shadow: var(--shadow-input-focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control[aria-invalid="true"] {
|
||||||
|
border-color: #E53935;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control[aria-invalid="true"]:focus {
|
||||||
|
border-color: #E53935;
|
||||||
|
box-shadow: 0 0 0 3px rgba(229, 57, 53, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control::placeholder {
|
||||||
|
color: var(--text-placeholder);
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Password Field */
|
||||||
|
.password-wrapper {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.password-wrapper .form-control {
|
||||||
|
padding-right: 45px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.password-toggle {
|
||||||
|
position: absolute;
|
||||||
|
right: 12px;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: var(--spacing-sm);
|
||||||
|
color: var(--text-secondary);
|
||||||
|
transition: color var(--transition-base);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.password-toggle:hover {
|
||||||
|
color: var(--primary-orange);
|
||||||
|
}
|
||||||
|
|
||||||
|
.eye-icon {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Error Messages */
|
||||||
|
.error-message {
|
||||||
|
display: block;
|
||||||
|
color: #E53935;
|
||||||
|
font-size: var(--font-size-xs);
|
||||||
|
margin-top: var(--spacing-xs);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
FORGOT PASSWORD
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
.forgot-password {
|
||||||
|
text-align: right;
|
||||||
|
margin-bottom: var(--spacing-xl);
|
||||||
|
margin-top: var(--spacing-md);
|
||||||
|
}
|
||||||
|
|
||||||
|
.forgot-password a {
|
||||||
|
color: var(--primary-orange);
|
||||||
|
font-size: var(--font-size-base);
|
||||||
|
font-weight: 500;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color var(--transition-base);
|
||||||
|
}
|
||||||
|
|
||||||
|
.forgot-password a:hover {
|
||||||
|
color: var(--primary-orange-dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
LOGIN BUTTON
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
.form-actions {
|
||||||
|
margin-top: var(--spacing-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-login {
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px var(--spacing-xl);
|
||||||
|
background: var(--primary-orange);
|
||||||
|
border: none;
|
||||||
|
border-radius: var(--radius-sm);
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: var(--font-size-base);
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all var(--transition-base);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-login:hover {
|
||||||
|
background: var(--primary-orange-light);
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 4px 8px rgba(255, 152, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-login:active {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-login:disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
RESPONSIVE DESIGN
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
#kc-form-wrapper {
|
||||||
|
padding: var(--spacing-md);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-card {
|
||||||
|
padding: var(--spacing-xl) var(--spacing-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-logo {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-heading {
|
||||||
|
font-size: var(--font-size-xl);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-subtitle {
|
||||||
|
font-size: var(--font-size-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control {
|
||||||
|
padding: 11px var(--spacing-sm);
|
||||||
|
font-size: var(--font-size-sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-login {
|
||||||
|
padding: 12px var(--spacing-lg);
|
||||||
|
font-size: var(--font-size-sm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 360px) {
|
||||||
|
.login-card {
|
||||||
|
padding: var(--spacing-lg) var(--spacing-md);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
ACCESSIBILITY
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
*:focus-visible {
|
||||||
|
outline: 3px solid var(--primary-orange);
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:focus-visible,
|
||||||
|
a:focus-visible,
|
||||||
|
input:focus-visible {
|
||||||
|
outline: 3px solid var(--primary-orange);
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reduced motion */
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
animation-duration: 0.01ms !important;
|
||||||
|
animation-iteration-count: 1 !important;
|
||||||
|
transition-duration: 0.01ms !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
UTILITY CLASSES
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
.sr-only {
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
padding: 0;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
clip: rect(0, 0, 0, 0);
|
||||||
|
white-space: nowrap;
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 513 B |
|
After Width: | Height: | Size: 343 B |
|
After Width: | Height: | Size: 678 B |
|
After Width: | Height: | Size: 410 B |
|
After Width: | Height: | Size: 513 B |
|
After Width: | Height: | Size: 646 B |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 30 KiB |
@@ -0,0 +1,168 @@
|
|||||||
|
parent=base
|
||||||
|
import=common/keycloak
|
||||||
|
|
||||||
|
styles=css/login.css
|
||||||
|
favicon=img/favicon.ico
|
||||||
|
stylesCommon=vendor/patternfly-v4/patternfly.min.css vendor/patternfly-v3/css/patternfly.min.css vendor/patternfly-v3/css/patternfly-additions.min.css lib/pficon/pficon.css
|
||||||
|
|
||||||
|
meta=viewport==width=device-width,initial-scale=1
|
||||||
|
|
||||||
|
kcHtmlClass=login-pf
|
||||||
|
kcLoginClass=login-pf-page
|
||||||
|
|
||||||
|
kcLogoLink=http://www.keycloak.org
|
||||||
|
|
||||||
|
kcLogoClass=login-pf-brand
|
||||||
|
|
||||||
|
kcContainerClass=container-fluid
|
||||||
|
kcContentClass=col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3 col-lg-6 col-lg-offset-3
|
||||||
|
|
||||||
|
kcHeaderClass=login-pf-page-header
|
||||||
|
kcFeedbackAreaClass=col-md-12
|
||||||
|
kcLocaleClass=col-xs-12 col-sm-1
|
||||||
|
|
||||||
|
## Locale
|
||||||
|
kcLocaleMainClass=pf-c-dropdown
|
||||||
|
kcLocaleListClass=pf-c-dropdown__menu pf-m-align-right
|
||||||
|
kcLocaleItemClass=pf-c-dropdown__menu-item
|
||||||
|
|
||||||
|
## Alert
|
||||||
|
kcAlertClass=pf-c-alert pf-m-inline
|
||||||
|
kcAlertTitleClass=pf-c-alert__title kc-feedback-text
|
||||||
|
|
||||||
|
kcFormAreaClass=col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-2
|
||||||
|
kcFormCardClass=card-pf
|
||||||
|
|
||||||
|
### Social providers
|
||||||
|
kcFormSocialAccountListClass=pf-c-login__main-footer-links kc-social-links
|
||||||
|
kcFormSocialAccountListGridClass=pf-l-grid kc-social-grid
|
||||||
|
kcFormSocialAccountListButtonClass=pf-c-button pf-m-control pf-m-block kc-social-item kc-social-gray
|
||||||
|
kcFormSocialAccountListButtonDisabledClass=pf-m-aria-disabled
|
||||||
|
kcFormSocialAccountGridItem=pf-l-grid__item
|
||||||
|
|
||||||
|
kcFormSocialAccountNameClass=kc-social-provider-name
|
||||||
|
kcFormSocialAccountLinkClass=pf-c-login__main-footer-links-item-link
|
||||||
|
kcFormSocialAccountSectionClass=kc-social-section kc-social-gray
|
||||||
|
kcFormHeaderClass=login-pf-header
|
||||||
|
|
||||||
|
kcFeedbackErrorIcon=fa fa-fw fa-exclamation-circle
|
||||||
|
kcFeedbackWarningIcon=fa fa-fw fa-exclamation-triangle
|
||||||
|
kcFeedbackSuccessIcon=fa fa-fw fa-check-circle
|
||||||
|
kcFeedbackInfoIcon=fa fa-fw fa-info-circle
|
||||||
|
|
||||||
|
kcResetFlowIcon=pficon pficon-arrow fa
|
||||||
|
|
||||||
|
# WebAuthn icons
|
||||||
|
kcWebAuthnKeyIcon=pficon pficon-key
|
||||||
|
kcWebAuthnDefaultIcon=pficon pficon-key
|
||||||
|
kcWebAuthnUnknownIcon=pficon pficon-key unknown-transport-class
|
||||||
|
kcWebAuthnUSB=fa fa-usb
|
||||||
|
kcWebAuthnNFC=fa fa-wifi
|
||||||
|
kcWebAuthnBLE=fa fa-bluetooth-b
|
||||||
|
kcWebAuthnInternal=pficon pficon-key
|
||||||
|
|
||||||
|
kcFormClass=form-horizontal
|
||||||
|
kcFormGroupClass=form-group
|
||||||
|
kcFormGroupErrorClass=has-error
|
||||||
|
kcLabelClass=pf-c-form__label pf-c-form__label-text
|
||||||
|
kcLabelWrapperClass=col-xs-12 col-sm-12 col-md-12 col-lg-12
|
||||||
|
kcInputClass=pf-c-form-control
|
||||||
|
kcInputHelperTextBeforeClass=pf-c-form__helper-text pf-c-form__helper-text-before
|
||||||
|
kcInputHelperTextAfterClass=pf-c-form__helper-text pf-c-form__helper-text-after
|
||||||
|
kcInputClassRadio=pf-c-radio
|
||||||
|
kcInputClassRadioInput=pf-c-radio__input
|
||||||
|
kcInputClassRadioLabel=pf-c-radio__label
|
||||||
|
kcInputClassCheckbox=pf-c-check
|
||||||
|
kcInputClassCheckboxInput=pf-c-check__input
|
||||||
|
kcInputClassCheckboxLabel=pf-c-check__label
|
||||||
|
kcInputClassRadioCheckboxLabelDisabled=pf-m-disabled
|
||||||
|
kcInputErrorMessageClass=pf-c-form__helper-text pf-m-error required kc-feedback-text
|
||||||
|
kcInputGroup=pf-c-input-group
|
||||||
|
kcInputWrapperClass=col-xs-12 col-sm-12 col-md-12 col-lg-12
|
||||||
|
kcFormOptionsClass=col-xs-12 col-sm-12 col-md-12 col-lg-12
|
||||||
|
kcFormButtonsClass=col-xs-12 col-sm-12 col-md-12 col-lg-12
|
||||||
|
kcFormSettingClass=login-pf-settings
|
||||||
|
kcTextareaClass=form-control
|
||||||
|
kcSignUpClass=login-pf-signup
|
||||||
|
|
||||||
|
|
||||||
|
kcInfoAreaClass=col-xs-12 col-sm-4 col-md-4 col-lg-5 details
|
||||||
|
|
||||||
|
### user-profile grouping
|
||||||
|
kcFormGroupHeader=pf-c-form__group
|
||||||
|
|
||||||
|
##### css classes for form buttons
|
||||||
|
# main class used for all buttons
|
||||||
|
kcButtonClass=pf-c-button
|
||||||
|
# classes defining priority of the button - primary or default (there is typically only one priority button for the form)
|
||||||
|
kcButtonPrimaryClass=pf-m-primary
|
||||||
|
kcButtonDefaultClass=btn-default
|
||||||
|
# classes defining size of the button
|
||||||
|
kcButtonLargeClass=btn-lg
|
||||||
|
kcButtonBlockClass=pf-m-block
|
||||||
|
|
||||||
|
##### css classes for input
|
||||||
|
kcInputLargeClass=input-lg
|
||||||
|
|
||||||
|
##### css classes for form accessibility
|
||||||
|
kcSrOnlyClass=sr-only
|
||||||
|
|
||||||
|
##### css classes for select-authenticator form
|
||||||
|
kcSelectAuthListClass=pf-l-stack select-auth-container
|
||||||
|
kcSelectAuthListItemClass=pf-l-stack__item select-auth-box-parent pf-l-split
|
||||||
|
kcSelectAuthListItemIconClass=pf-l-split__item select-auth-box-icon
|
||||||
|
kcSelectAuthListItemIconPropertyClass=fa-2x select-auth-box-icon-properties
|
||||||
|
kcSelectAuthListItemBodyClass=pf-l-split__item pf-l-stack
|
||||||
|
kcSelectAuthListItemHeadingClass=pf-l-stack__item select-auth-box-headline pf-c-title
|
||||||
|
kcSelectAuthListItemDescriptionClass=pf-l-stack__item select-auth-box-desc
|
||||||
|
kcSelectAuthListItemFillClass=pf-l-split__item pf-m-fill
|
||||||
|
kcSelectAuthListItemArrowClass=pf-l-split__item select-auth-box-arrow
|
||||||
|
kcSelectAuthListItemArrowIconClass=fa fa-angle-right fa-lg
|
||||||
|
kcSelectAuthListItemTitle=select-auth-box-paragraph
|
||||||
|
|
||||||
|
##### css classes for the authenticators
|
||||||
|
kcAuthenticatorDefaultClass=fa fa-list list-view-pf-icon-lg
|
||||||
|
kcAuthenticatorPasswordClass=fa fa-unlock list-view-pf-icon-lg
|
||||||
|
kcAuthenticatorOTPClass=fa fa-mobile list-view-pf-icon-lg
|
||||||
|
kcAuthenticatorWebAuthnClass=fa fa-key list-view-pf-icon-lg
|
||||||
|
kcAuthenticatorWebAuthnPasswordlessClass=fa fa-key list-view-pf-icon-lg
|
||||||
|
|
||||||
|
##### css classes for the OTP Login Form
|
||||||
|
kcLoginOTPListClass=pf-c-tile
|
||||||
|
kcLoginOTPListInputClass=pf-c-tile__input
|
||||||
|
kcLoginOTPListItemHeaderClass=pf-c-tile__header
|
||||||
|
kcLoginOTPListItemIconBodyClass=pf-c-tile__icon
|
||||||
|
kcLoginOTPListItemIconClass=fa fa-mobile
|
||||||
|
kcLoginOTPListItemTitleClass=pf-c-tile__title
|
||||||
|
|
||||||
|
##### css classes for identity providers logos
|
||||||
|
kcCommonLogoIdP=kc-social-provider-logo kc-social-gray
|
||||||
|
|
||||||
|
## Social
|
||||||
|
kcLogoIdP-facebook=fa fa-facebook
|
||||||
|
kcLogoIdP-google=fa fa-google
|
||||||
|
kcLogoIdP-github=fa fa-github
|
||||||
|
kcLogoIdP-linkedin=fa fa-linkedin
|
||||||
|
kcLogoIdP-instagram=fa fa-instagram
|
||||||
|
## windows instead of microsoft - not included in PF4
|
||||||
|
kcLogoIdP-microsoft=fa fa-windows
|
||||||
|
kcLogoIdP-bitbucket=fa fa-bitbucket
|
||||||
|
kcLogoIdP-gitlab=fa fa-gitlab
|
||||||
|
kcLogoIdP-paypal=fa fa-paypal
|
||||||
|
kcLogoIdP-stackoverflow=fa fa-stack-overflow
|
||||||
|
kcLogoIdP-twitter=fa fa-twitter
|
||||||
|
kcLogoIdP-openshift-v4=pf-icon pf-icon-openshift
|
||||||
|
|
||||||
|
## Recovery codes
|
||||||
|
kcRecoveryCodesWarning=kc-recovery-codes-warning
|
||||||
|
kcRecoveryCodesList=kc-recovery-codes-list
|
||||||
|
kcRecoveryCodesActions=kc-recovery-codes-actions
|
||||||
|
kcRecoveryCodesConfirmation=kc-recovery-codes-confirmation
|
||||||
|
kcCheckClass=pf-c-check
|
||||||
|
kcCheckInputClass=pf-c-check__input
|
||||||
|
kcCheckLabelClass=pf-c-check__label
|
||||||
|
|
||||||
|
## Password visibility
|
||||||
|
kcFormPasswordVisibilityButtonClass=pf-c-button pf-m-control
|
||||||
|
kcFormPasswordVisibilityIconShow=fa fa-eye
|
||||||
|
kcFormPasswordVisibilityIconHide=fa fa-eye-slash
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta name="color-scheme" content="light${(properties.darkMode)?boolean?then(' dark', '')}">
|
||||||
|
<title>Welcome to ${productName}</title>
|
||||||
|
<link rel="shortcut icon" href="${resourcesCommonPath}/img/favicon.ico">
|
||||||
|
<#if properties.darkMode?boolean>
|
||||||
|
<script type="module" async blocking="render">
|
||||||
|
const DARK_MODE_CLASS = "${properties.kcDarkModeClass}";
|
||||||
|
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
||||||
|
|
||||||
|
updateDarkMode(mediaQuery.matches);
|
||||||
|
mediaQuery.addEventListener("change", (event) => updateDarkMode(event.matches));
|
||||||
|
|
||||||
|
function updateDarkMode(isEnabled) {
|
||||||
|
const { classList } = document.documentElement;
|
||||||
|
|
||||||
|
if (isEnabled) {
|
||||||
|
classList.add(DARK_MODE_CLASS);
|
||||||
|
} else {
|
||||||
|
classList.remove(DARK_MODE_CLASS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</#if>
|
||||||
|
<#if properties.stylesCommon?has_content>
|
||||||
|
<#list properties.stylesCommon?split(' ') as style>
|
||||||
|
<link rel="stylesheet" href="${resourcesCommonPath}/${style}">
|
||||||
|
</#list>
|
||||||
|
</#if>
|
||||||
|
<#if properties.styles?has_content>
|
||||||
|
<#list properties.styles?split(' ') as style>
|
||||||
|
<link rel="stylesheet" href="${resourcesPath}/${style}">
|
||||||
|
</#list>
|
||||||
|
</#if>
|
||||||
|
</head>
|
||||||
|
<body data-page-id="welcome">
|
||||||
|
<div class="pf-v5-c-background-image" style="--pf-v5-c-background-image--BackgroundImage: url(${baseUrl}${resourcesPath}/background.svg)"></div>
|
||||||
|
<div class="pf-v5-c-login">
|
||||||
|
<div class="pf-v5-c-login__container">
|
||||||
|
<header class="pf-v5-c-login__header">
|
||||||
|
<div class="pf-v5-c-brand">
|
||||||
|
<img src="${resourcesPath}/logo.svg" alt="${productName} Logo" class="kc-brand">
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<#if adminConsoleEnabled && (bootstrap || successMessage?has_content)>
|
||||||
|
<main class="pf-v5-c-login__main">
|
||||||
|
<header class="pf-v5-c-login__main-header">
|
||||||
|
<#if localUser>
|
||||||
|
<h1 class="pf-v5-c-title pf-m-2xl">Create an administrative user</h1>
|
||||||
|
<#if !successMessage?has_content>
|
||||||
|
<p class="pf-v5-c-login__main-header-desc">To get started with ${productName}, you first create an administrative user.</p>
|
||||||
|
</#if>
|
||||||
|
<#else>
|
||||||
|
<h1 class="pf-v5-c-title pf-m-3xl">Local access required</h1>
|
||||||
|
<p class="pf-v5-c-login__main-header-desc">You will need local access to create the administrative user.</p>
|
||||||
|
</#if>
|
||||||
|
</header>
|
||||||
|
<div class="pf-v5-c-login__main-body">
|
||||||
|
<#if successMessage?has_content>
|
||||||
|
<div class="pf-v5-c-alert pf-m-inline pf-m-success pf-v5-u-mb-xl">
|
||||||
|
<div class="pf-v5-c-alert__icon">
|
||||||
|
<svg class="pf-v5-svg" viewBox="0 0 512 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em">
|
||||||
|
<path d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h4 class="pf-v5-c-alert__title">
|
||||||
|
<span class="pf-v5-screen-reader">Success alert:</span>${successMessage}
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<a class="pf-v5-c-button pf-m-primary pf-m-block" href="${adminUrl}">Open Administration Console</a>
|
||||||
|
</#if>
|
||||||
|
<#if bootstrap>
|
||||||
|
<#if localUser>
|
||||||
|
<form class="pf-v5-c-form" method="post" novalidate>
|
||||||
|
<#if errorMessage?has_content>
|
||||||
|
<div class="pf-v5-c-form__alert">
|
||||||
|
<div class="pf-v5-c-alert pf-m-inline pf-m-danger">
|
||||||
|
<div class="pf-v5-c-alert__icon">
|
||||||
|
<svg class="pf-v5-svg" viewBox="0 0 512 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em">
|
||||||
|
<path d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h4 class="pf-v5-c-alert__title">
|
||||||
|
<span class="pf-v5-screen-reader">Danger alert:</span>${errorMessage}
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</#if>
|
||||||
|
<div class="pf-v5-c-form__group">
|
||||||
|
<div class="pf-v5-c-form__group-label">
|
||||||
|
<label class="pf-v5-c-form__label" for="username">
|
||||||
|
<span class="pf-v5-c-form__label-text">Username</span> <span class="pf-v5-c-form__label-required" aria-hidden="true">*</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="pf-v5-c-form__group-control">
|
||||||
|
<span class="pf-v5-c-form-control pf-m-required">
|
||||||
|
<input id="username" type="text" name="username" autocomplete="username" required>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pf-v5-c-form__group">
|
||||||
|
<div class="pf-v5-c-form__group-label">
|
||||||
|
<label class="pf-v5-c-form__label" for="password">
|
||||||
|
<span class="pf-v5-c-form__label-text">Password</span> <span class="pf-v5-c-form__label-required" aria-hidden="true">*</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="pf-v5-c-form__group-control">
|
||||||
|
<span class="pf-v5-c-form-control pf-m-required">
|
||||||
|
<input id="password" type="password" name="password" autocomplete="new-password" required>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pf-v5-c-form__group">
|
||||||
|
<div class="pf-v5-c-form__group-label">
|
||||||
|
<label class="pf-v5-c-form__label" for="password-confirmation">
|
||||||
|
<span class="pf-v5-c-form__label-text">Password confirmation</span> <span class="pf-v5-c-form__label-required" aria-hidden="true">*</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="pf-v5-c-form__group-control">
|
||||||
|
<span class="pf-v5-c-form-control pf-m-required">
|
||||||
|
<input id="password-confirmation" type="password" name="passwordConfirmation" autocomplete="new-password" required>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input name="stateChecker" type="hidden" value="${stateChecker}">
|
||||||
|
<div class="pf-v5-c-form__group pf-m-action">
|
||||||
|
<button class="pf-v5-c-button pf-m-primary pf-m-block" type="submit">Create user</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<#else>
|
||||||
|
<p>To create the administrative user, access the Administration Console over localhost, or use a <code>bootstrap-admin</code> command.</p>
|
||||||
|
</#if>
|
||||||
|
</#if>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</#if>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
After Width: | Height: | Size: 65 KiB |
@@ -0,0 +1,17 @@
|
|||||||
|
.pf-v5-c-background-image {
|
||||||
|
/* Change background size so that the image covers the entire background. */
|
||||||
|
--pf-v5-c-background-image--BackgroundSize: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pf-v5-c-login__container {
|
||||||
|
/* Change the grid layout so that the header is always above the main area. */
|
||||||
|
grid-template-areas: "header" "main";
|
||||||
|
--pf-v5-c-login__container--xl--GridTemplateColumns: minmax(auto, 34rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
.kc-brand {
|
||||||
|
height: 63px;
|
||||||
|
width: 300px;
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 6.8 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
import=common/keycloak
|
||||||
|
|
||||||
|
stylesCommon=vendor/patternfly-v5/patternfly.min.css vendor/patternfly-v5/patternfly-addons.css
|
||||||
|
styles=css/welcome.css
|
||||||
|
|
||||||
|
# When set to true, the user will be redirected to the Administration Console if an administrative users already exists.
|
||||||
|
redirectToAdmin=true
|
||||||
|
darkMode=true
|
||||||
|
|
||||||
|
kcDarkModeClass=pf-v5-theme-dark
|
||||||