/** * Copyright since 2025 Mifos Initiative * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * Glassmorphism Login Form Styles */ // ===== Main Form Container ===== .modern-login-form { width: 100%; flex: 1; display: flex; flex-direction: column; } #login-form { display: flex; flex-direction: column; gap: 0.5rem; animation: slide-in 0.4s ease-out; flex: 1; } // ===== Tenant Selector Styles ===== ::ng-deep .tenant-section { width: 100%; mifosx-tenant-selector { display: block; width: 100%; #tenant-selector { width: 100%; margin-bottom: 0; .mat-mdc-text-field-wrapper { border-radius: 14px 14px 0 0; background: rgb(255 255 255 / 8%); } .mat-mdc-form-field-focus-overlay { border-radius: 14px 14px 0 0; background-color: rgb(255 255 255 / 5%); } &.mat-focused { .mat-mdc-form-field-focus-overlay { background-color: rgb(255 255 255 / 8%); } } .mdc-line-ripple::after { border-bottom-color: #0ea5e9; } .mat-mdc-select { font-size: 1rem; font-weight: 400; color: #fff; } .mat-mdc-floating-label { font-size: 1rem; color: rgb(255 255 255 / 60%); } .mat-mdc-form-field-icon-prefix { padding: 0 0.75rem 0 0.5rem; color: rgb(255 255 255 / 50%); fa-icon { font-size: 1.25rem; opacity: 0.7; } } } .tenantselector { width: 100%; } } } // ===== Form Fields ===== .login-field { width: 100%; margin-bottom: 0; ::ng-deep { // Field container .mat-mdc-text-field-wrapper { border-radius: 14px 14px 0 0; background: rgb(255 255 255 / 8%); } // Focus overlay .mat-mdc-form-field-focus-overlay { border-radius: 14px 14px 0 0; background-color: rgb(255 255 255 / 5%); } // Focus state &.mat-focused { .mat-mdc-form-field-focus-overlay { background-color: rgb(255 255 255 / 8%); } } // Bottom indicator line .mdc-line-ripple::after { border-bottom-color: #0ea5e9; } // Input field .mat-mdc-input-element { font-size: 1rem; font-weight: 400; color: #fff; padding: 0.875rem 0; margin-left: 0; caret-color: #0ea5e9; &::placeholder { color: rgb(255 255 255 / 40%); opacity: 1; } } // Label .mat-mdc-floating-label { font-size: 1rem; color: rgb(255 255 255 / 60%); left: 0 !important; } // Prefix icon .mat-mdc-form-field-icon-prefix { padding: 0 0.75rem 0 0.5rem; color: rgb(255 255 255 / 50%); fa-icon { font-size: 1.25rem; opacity: 0.7; } } // Form field infix .mat-mdc-form-field-infix { padding-left: 0; } // Suffix button (password toggle) .mat-mdc-form-field-icon-suffix { button { background: transparent; border: none; color: rgb(255 255 255 / 50%); transition: all 0.2s ease; &:hover { color: rgb(255 255 255 / 80%); } } } // Error state &.mat-form-field-invalid { .mdc-line-ripple::after { border-bottom-color: #f87171; } .mat-mdc-form-field-icon-prefix fa-icon { color: #f87171; } } // Error message .mat-mdc-form-field-error { font-size: 0.75rem; margin-top: 0.25rem; color: #f87171; } } } // ===== Remember Me & Options Row ===== .login-options-row { display: flex; align-items: center; justify-content: space-between; padding: 0.25rem 0; margin-top: 0.25rem; } .remember-me-checkbox { ::ng-deep { .mdc-checkbox { .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate='true']) ~ .mdc-checkbox__background { border-color: rgb(255 255 255 / 40%); } .mdc-checkbox__native-control:enabled:checked ~ .mdc-checkbox__background, .mdc-checkbox__native-control:enabled:indeterminate ~ .mdc-checkbox__background { background-color: #0ea5e9; border-color: #0ea5e9; } } .mdc-label { color: rgb(255 255 255 / 70%); font-size: 0.85rem; font-weight: 400; } } } // ===== Loading Progress ===== .login-progress { height: 3px; border-radius: 4px; margin: -0.5rem 0 0.5rem; ::ng-deep { .mdc-linear-progress__bar-inner { border-color: #0ea5e9; } .mdc-linear-progress__buffer-bar { background-color: rgb(255 255 255 / 10%); } } } // ===== Submit Button ===== .login-submit-button { min-height: 48px; margin-top: 0.75rem; ::ng-deep { md-filled-button, .mdc-button { font-size: 1rem; font-weight: 600; letter-spacing: 0.02em; border-radius: 14px; } } .button-spinner { margin-left: 0.75rem; ::ng-deep circle { stroke: currentcolor; } } } // ===== OIDC Login ===== .oidc-login-container { width: 100%; padding: 1rem 0; } .oidc-login-content { display: flex; flex-direction: column; gap: 1.5rem; text-align: center; } .oidc-description { font-size: 0.95rem; color: rgb(255 255 255 / 60%); margin: 0; line-height: 1.5; } .oidc-logged-in { display: flex; flex-direction: column; gap: 2rem; } .welcome-message { display: flex; flex-direction: column; align-items: center; gap: 1rem; padding: 2rem; background: rgb(14 165 233 / 15%); border-radius: 16px; border: 1px solid rgb(14 165 233 / 20%); .success-icon { font-size: 3rem; color: #0ea5e9; } h3 { margin: 0; font-size: 1.25rem; font-weight: 600; color: #fff; } } .oidc-actions { display: flex; gap: 1rem; flex-wrap: wrap; mifosx-m3-button { flex: 1; min-width: 140px; } } .protected-data { padding: 1rem; background: rgb(255 255 255 / 6%); border-radius: 12px; border: 1px solid rgb(255 255 255 / 10%); max-height: 300px; overflow: auto; pre { margin: 0; font-size: 0.875rem; font-family: 'Courier New', monospace; color: rgb(255 255 255 / 80%); white-space: pre-wrap; word-wrap: break-word; } } // ===== Responsive Design ===== /* stylelint-disable-next-line media-feature-range-notation -- Safari compatibility */ @media (max-width: 768px) { #login-form { gap: 0.25rem; } .login-field { margin-bottom: 0; } .login-submit-button { margin-top: 0.5rem; } .login-options-row { padding: 0.15rem 0; } } /* stylelint-disable-next-line media-feature-range-notation -- Safari compatibility */ @media (max-width: 480px) { #login-form { gap: 0.15rem; } .login-field { margin-bottom: 0; ::ng-deep { .mat-mdc-input-element { font-size: 0.95rem; padding: 0.65rem 0.5rem; } .mat-mdc-floating-label { font-size: 0.9rem; } .mat-mdc-form-field-icon-prefix { padding: 0 0.5rem 0 0.35rem; } } } .login-submit-button { min-height: 42px; margin-top: 0.4rem; } .remember-me-checkbox { ::ng-deep .mdc-label { font-size: 0.8rem; } } .oidc-actions { flex-direction: column; mifosx-m3-button { width: 100%; } } } // ===== Animations ===== @keyframes slide-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }