WEB-492: Material Design 3 implementation: Login

This commit is contained in:
Jose Alberto Hernandez
2026-01-04 14:06:28 -05:00
parent 5af11fe757
commit df7274626c
58 changed files with 3396 additions and 855 deletions
+749 -102
View File
@@ -1,140 +1,787 @@
mifosx-server-selector {
padding-left: 5px;
width: 40%;
/**
* Modern Material Design 3 Login Component Styles
*/
// ===== Main Wrapper =====
.login-wrapper {
display: flex;
min-height: 100vh;
height: 100%;
width: 100%;
background: var(--md-sys-color-background, #fafafa);
}
.mat-mdc-form-field-infix {
width: 144px !important;
}
mifosx-tenant-selector {
border-radius: 8px;
width: 14rem;
margin-bottom: 0.1rem;
::ng-deep .mat-mdc-form-field {
width: 14rem;
}
::ng-deep .mat-mdc-form-field-infix {
width: 144px !important;
border-radius: 8px;
}
::ng-deep [matPrefix] fa-icon {
font-size: 16px;
position: absolute;
left: 190px;
border-radius: 8px;
top: 50%;
transform: translateY(-50%);
}
}
.cover {
// ===== Hero Panel (Left Side) =====
.hero-panel {
flex: 0 0 70%;
position: relative;
background: url('../../assets/images/cover_image_resized.webp') no-repeat center center;
background-size: cover;
position: relative;
z-index: 0;
max-width: 70vw;
overflow: hidden;
&::after {
content: '';
opacity: 0.5;
background: linear-gradient(#000, #000);
width: 100%;
height: 100%;
top: 0;
left: 0;
display: block;
z-index: 1;
// Dark overlay for better text contrast
.hero-overlay {
position: absolute;
inset: 0;
background: linear-gradient(135deg, #1074b99e 0%, #004989a6 100%);
z-index: 1;
}
.width-40 {
width: 40%;
}
.cover-content {
display: block;
max-width: 80%;
margin: 100px;
color: #fff;
text-align: justify;
.hero-content {
position: relative;
z-index: 2;
font-size: 1.2rem;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
padding: 4rem;
}
.cover-title {
border-bottom: 2px solid #fff;
margin: 0 0 20px;
padding-bottom: 10px;
.hero-text {
max-width: 600px;
color: #fff;
animation: fade-in-up 0.8s ease-out;
flex: 0 1 auto;
}
// Footer in hero panel
mifosx-footer {
width: 100%;
margin-top: auto;
padding-top: 2rem;
::ng-deep .footer-compact {
color: rgb(255 255 255 / 90%);
align-items: center;
text-align: center;
.footer-info {
justify-content: center;
.info-label {
color: rgb(255 255 255 / 80%);
font-weight: 500;
}
.info-value {
color: rgb(255 255 255 / 95%);
font-weight: 400;
}
.info-separator {
color: rgb(255 255 255 / 50%);
}
}
.footer-copyright {
color: rgb(255 255 255 / 75%);
font-size: 0.875rem;
text-align: center;
}
}
}
.hero-title {
font-size: 3.5rem;
font-weight: 700;
margin: 0 0 1.5rem;
line-height: 1.2;
letter-spacing: -0.02em;
background: linear-gradient(135deg, #fff 0%, #e3f2fd 100%);
background-clip: text;
-webkit-text-fill-color: transparent;
}
.hero-subtitle {
font-size: 1.25rem;
line-height: 1.6;
margin: 0 0 3rem;
opacity: 0.95;
font-weight: 400;
}
.hero-highlight {
font-weight: 600;
color: #b4d575;
}
.hero-features {
display: flex;
flex-direction: column;
gap: 1.5rem;
margin-bottom: 3rem;
}
.feature-item {
display: flex;
align-items: center;
gap: 1rem;
padding: 1rem;
background: #ffffff1a;
border-radius: 12px;
backdrop-filter: blur(10px);
transition: all 0.3s ease;
&:hover {
background: #ffffff26;
transform: translateX(8px);
}
}
.feature-icon {
font-size: 1.5rem;
color: #b4d575;
}
.feature-text {
font-size: 1rem;
font-weight: 500;
}
.hero-links {
display: flex;
gap: 2rem;
flex-wrap: wrap;
}
.hero-link {
color: #fff;
text-decoration: none;
font-weight: 500;
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1.5rem;
border: 2px solid #ffffff4d;
border-radius: 24px;
transition: all 0.3s ease;
&:hover {
background: #ffffff1a;
border-color: #fff;
transform: translateY(-2px);
}
.cover-description {
.cover-link {
text-decoration: underline;
color: #fff;
fa-icon {
opacity: 0.7;
}
}
}
&:hover {
color: #d3d3d3;
// ===== Login Panel (Right Side) =====
.login-panel {
flex: 1;
display: flex;
flex-direction: column;
background: var(--md-sys-color-surface, #fff);
position: relative;
min-height: 100vh;
overflow-y: auto;
}
.login-header {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 1rem 1.5rem;
background: transparent;
.header-control {
opacity: 0.8;
transition: opacity 0.2s ease;
&:hover {
opacity: 1;
}
}
.theme-toggle {
min-height: -webkit-fill-available;
}
// Theme Toggle Button Styles
::ng-deep mifosx-theme-toggle {
button {
color: var(--md-sys-color-on-surface, #1a1c1e);
transition: all 0.3s ease;
&:hover {
background: #1074b914;
color: var(--md-sys-color-primary, #1074b9);
}
mat-icon {
font-size: 24px;
width: 24px;
height: 24px;
}
}
}
// Language Selector Outlined Styles
::ng-deep mifosx-language-selector {
width: 20%;
#language-selector.outlined-variant {
width: 100%;
margin: 0;
// Compact outlined field for header
.mat-mdc-form-field-flex {
height: 44px;
}
.mat-mdc-form-field-infix {
padding: 10px 0;
min-height: 44px;
}
// Rounded corners for Material Design 3
.mdc-notched-outline {
.mdc-notched-outline__leading {
border-radius: 12px 0 0 12px;
width: 12px;
}
.mdc-notched-outline__trailing {
border-radius: 0 12px 12px 0;
}
}
}
}
// Server Selector Outlined Styles
::ng-deep mifosx-server-selector {
width: 70%;
#server-selector.outlined-variant {
width: 100%;
margin: 0;
// Compact outlined field for header
.mat-mdc-form-field-flex {
height: 44px;
}
.mat-mdc-form-field-infix {
padding: 10px 0;
min-height: 44px;
}
// Rounded corners for Material Design 3
.mdc-notched-outline {
.mdc-notched-outline__leading {
border-radius: 12px 0 0 12px;
width: 12px;
}
.mdc-notched-outline__trailing {
border-radius: 0 12px 12px 0;
}
}
}
}
}
.login-container {
box-shadow: 1px 1px 50px #000;
height: 100vh;
width: 100%;
min-width: 21.5rem;
padding: 0.5rem 1rem;
.img-container {
max-width: 18rem;
margin-bottom: 2rem;
gap: 20px;
}
}
.layout-column {
// ===== Login Card Container =====
.login-card-container {
flex: 1 1 auto;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1rem;
height: 100%;
animation: fade-in 0.6s ease-out;
}
.custom-horizontal-list {
display: flex !important;
flex-direction: row !important;
.login-card {
width: 100%;
max-width: 480px;
background: var(--md-sys-color-surface-container-low, #fff);
border-radius: 28px;
padding: 1.5rem;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
flex-direction: column;
&:hover {
box-shadow:
0 2px 4px #00000014,
0 4px 12px #0000000f,
0 12px 32px #0000001f;
}
}
// ===== Logo Section =====
.logo-section {
text-align: center;
margin-bottom: 1rem;
flex-shrink: 0;
animation: fade-in-down 0.6s ease-out 0.2s both;
}
.logo-image {
max-width: 180px;
height: auto;
margin-bottom: 1rem;
filter: drop-shadow(0 2px 8px #0000001a);
}
.welcome-text {
font-size: 1.75rem;
font-weight: 600;
margin: 0 0 0.5rem;
color: var(--md-sys-color-on-surface, #1a1c1e);
letter-spacing: -0.01em;
}
.welcome-subtitle {
font-size: 0.95rem;
color: var(--md-sys-color-on-surface-variant, #44474e);
margin: 0;
font-weight: 400;
}
// ===== Form Section =====
.form-section {
margin-bottom: 1rem;
flex: 0 1 auto;
display: flex;
flex-direction: column;
animation: fade-in-up 0.6s ease-out 0.3s both;
}
.tenant-section {
margin-bottom: 1rem;
flex-shrink: 0;
}
// ===== Resources Section =====
.resources-section {
margin-top: auto;
padding-top: 1rem;
flex-shrink: 0;
animation: fade-in-up 0.6s ease-out 0.4s both;
}
.resources-divider {
position: relative;
text-align: center;
margin-bottom: 1.5rem;
&::before {
content: '';
position: absolute;
top: 50%;
left: 0;
right: 0;
height: 1px;
background: var(--md-sys-color-outline-variant, #c4c6d0);
}
.divider-text {
position: relative;
display: inline-block;
padding: 0 1rem;
background: var(--md-sys-color-surface-container-low, #fff);
color: var(--md-sys-color-on-surface-variant, #44474e);
font-size: 0.85rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.05em;
}
}
.resources-links {
display: flex;
justify-content: center;
align-items: center;
gap: 1.5rem;
gap: 0.5rem;
flex-wrap: wrap;
}
mat-list-item {
width: auto !important;
min-width: 0 !important;
padding: 0 !important;
.resource-button {
font-size: 0.875rem;
color: var(--md-sys-color-primary, #1074b9);
transition: all 0.2s ease;
[mat-button] {
white-space: nowrap;
fa-icon {
margin-right: 0.4rem;
opacity: 0.7;
}
&:hover {
background: #1074b914;
fa-icon {
opacity: 1;
}
}
}
.p-t-10 {
padding-top: 0;
// ===== Footer =====
.login-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 1rem 1.5rem;
position: relative;
margin-top: auto;
flex-direction: column;
flex-shrink: 0;
mifosx-footer {
flex: 1;
text-align: left;
}
.reload-button {
color: var(--mat-app-text-color, #c4c6d0);
opacity: 0.6;
transition: all 0.2s ease;
background: transparent;
border: none;
flex-shrink: 0;
&:hover {
opacity: 1;
transform: rotate(90deg);
}
}
}
.p-r-10 {
padding-right: 10px;
// ===== Modern Menus =====
::ng-deep .modern-menu {
border-radius: 12px;
box-shadow:
0 4px 12px #0000001a,
0 2px 4px #0000000f;
.mat-mdc-menu-item {
border-radius: 8px;
margin: 4px 8px;
transition: all 0.2s ease;
.menu-icon {
margin-right: 0.75rem;
color: var(--md-sys-color-primary, #1074b9);
opacity: 0.7;
}
&:hover .menu-icon {
opacity: 1;
}
}
}
::ng-deep .login-container mifosx-footer .divider {
margin: 0 !important;
width: 14rem !important;
margin-top: 2px !important;
// ===== Animations =====
@keyframes fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
::ng-deep .login-container #footer {
align-items: unset !important;
@keyframes fade-in-up {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fade-in-down {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
// ===== Dark Theme Support =====
:host-context(.dark-theme) {
.login-wrapper {
background: #1a1c1e;
}
.login-panel {
background: #1a1c1e;
}
.login-card {
background: #1a1c1e;
box-shadow:
0 1px 2px #0000004d,
0 2px 6px #0003,
0 8px 24px #0000004d;
}
.logo-image {
max-width: 20rem;
padding: 0;
margin: 0;
height: 63px;
content: url('../../assets/images/white-mifos.png');
}
.welcome-text {
color: var(--md-sys-color-on-surface, #e2e2e5);
}
.welcome-subtitle {
color: var(--md-sys-color-on-surface-variant, #c4c6d0);
}
.resources-divider {
&::before {
background: var(--md-sys-color-outline-variant, #44474e);
}
.divider-text {
background: var(--md-sys-color-surface-container-low, #2c2f36);
color: var(--md-sys-color-on-surface, #e2e2e5);
}
}
.resource-button {
color: var(--md-sys-color-primary, #5ba2ec);
&:hover {
background: #5ba2ec1f;
}
}
// Header controls dark theme
.login-header {
::ng-deep mifosx-theme-toggle {
button {
color: var(--md-sys-color-on-surface, #e2e2e5);
&:hover {
background: #5ba2ec1f;
color: var(--md-sys-color-primary, #5ba2ec);
}
}
}
// Language selector and server selector dark theme styles are handled by the components themselves
}
}
// ===== Responsive Design =====
// Tablet
@media (width <= 1024px) {
.hero-panel {
flex: 0 0 45%;
.hero-title {
font-size: 2.75rem;
}
.hero-subtitle {
font-size: 1.1rem;
}
.hero-content {
padding: 3rem 2rem;
}
mifosx-footer {
padding-top: 1.5rem;
::ng-deep .footer-compact {
.footer-info {
font-size: 0.7rem;
}
.footer-copyright {
font-size: 0.8rem;
}
}
}
}
.login-card {
padding: 1.5rem 1rem;
}
// Hide resources section on medium screens
.resources-section {
display: none;
}
}
// Mobile
@media (width <= 768px) {
.login-wrapper {
flex-direction: column;
}
.hero-panel {
display: none;
}
.login-panel {
min-height: 100vh;
}
.login-card-container {
padding: 1rem;
justify-content: center;
height: auto;
min-height: calc(100vh - 56px); // 56px for header
}
.login-header {
padding: 0.75rem 1rem;
gap: 0.25rem;
::ng-deep mifosx-language-selector {
width: 30%;
#language-selector.outlined-variant {
width: 100%;
font-size: 0.8rem;
}
}
::ng-deep mifosx-server-selector {
width: 60%;
#server-selector.outlined-variant {
width: 100%;
font-size: 0.8rem;
}
}
::ng-deep mifosx-theme-toggle {
button {
padding: 8px;
mat-icon {
font-size: 20px;
width: 20px;
height: 20px;
}
}
}
}
.login-card {
padding: 0.75rem 1rem;
border-radius: 24px;
margin: 0;
}
.logo-section {
margin-bottom: 1rem;
}
.logo-image {
max-width: 140px;
margin-bottom: 0.75rem;
}
.welcome-text {
font-size: 1.5rem;
}
// Hide resources section on medium and small screens
.resources-section {
display: none;
}
.form-section {
margin-bottom: 0.75rem;
}
.login-footer {
flex-direction: column;
align-items: center;
padding: 0.5rem;
mifosx-footer {
text-align: center;
}
.reload-button {
color: var(--md-sys-color-on-surface-variant, #c4c6d0);
border: none;
margin-top: 0.5rem;
}
}
}
// Small mobile
@media (width <= 480px) {
.login-header {
padding: 0.5rem 0.75rem;
gap: 0.25rem;
}
.login-card-container {
padding: 0.5rem;
justify-content: center;
}
.login-card {
padding: 0.75rem 0.875rem;
}
.logo-section {
margin-bottom: 0.75rem;
}
.logo-image {
max-width: 110px;
margin-bottom: 0.5rem;
}
.welcome-text {
font-size: 1.25rem;
}
.welcome-subtitle {
font-size: 0.875rem;
}
.form-section {
margin-bottom: 0.5rem;
}
// Hide resources section on small screens
.resources-section {
display: none;
}
.login-footer {
padding: 0.25rem 1rem;
}
}
// ===== Utilities =====
.hide-lt-md {
@media (width <= 768px) {
display: none !important;
}
}
.hide-lt-lg {
@media (width <= 1024px) {
display: none !important;
}
}