feat: Implement Dark Mode
Added styles and configurations to enable dark mode throughout the application. The dark mode features a deep blue color scheme for primary elements and improved visibility for cursor. Selected option text in mat-select now appears in white for better contrast. This enhancement provides users with the option to switch between light and dark modes seamlessly. Changes: - Added dark mode styles in the theme service - Updated mifosx-theme.scss for dark mode customization - Adjusted cursor visibility in dark mode - Modified selected option text color in mat-select Fixes #2021 Implemented the black-logo image into white-logo-image dynamically
This commit is contained in:
committed by
Jose Alberto Hernandez
parent
fcbbb03acb
commit
ccd6e8dded
@@ -58,6 +58,10 @@
|
|||||||
<mifosx-notifications-tray fxHide.lt-md></mifosx-notifications-tray>
|
<mifosx-notifications-tray fxHide.lt-md></mifosx-notifications-tray>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div #themeToggle>
|
||||||
|
<theme-toggle-component></theme-toggle-component>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div #appMenu>
|
<div #appMenu>
|
||||||
<button mat-icon-button class="ml-1 img-button" [matMenuTriggerFor]="applicationMenu">
|
<button mat-icon-button class="ml-1 img-button" [matMenuTriggerFor]="applicationMenu">
|
||||||
<img src="assets/images/user_placeholder.png">
|
<img src="assets/images/user_placeholder.png">
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
|
|
||||||
<img mat-card-image src="assets/images/mifos_lg-logo.jpg" alt="Mifos X">
|
<img mat-card-image src="assets/images/mifos_lg-logo.png" alt="Mifos X">
|
||||||
|
|
||||||
</mat-card>
|
</mat-card>
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import { SearchToolComponent } from './search-tool/search-tool.component';
|
|||||||
import { KeyboardShortcutsDialogComponent } from './keyboard-shortcuts-dialog/keyboard-shortcuts-dialog.component';
|
import { KeyboardShortcutsDialogComponent } from './keyboard-shortcuts-dialog/keyboard-shortcuts-dialog.component';
|
||||||
import { ServerSelectorComponent } from './server-selector/server-selector.component';
|
import { ServerSelectorComponent } from './server-selector/server-selector.component';
|
||||||
import { TenantSelectorComponent } from './tenant-selector/tenant-selector.component';
|
import { TenantSelectorComponent } from './tenant-selector/tenant-selector.component';
|
||||||
|
import { ThemeToggleComponent } from '../theme-toggle/theme-toggle.component';
|
||||||
|
|
||||||
/** Custom Modules */
|
/** Custom Modules */
|
||||||
import { IconsModule } from './icons.module';
|
import { IconsModule } from './icons.module';
|
||||||
@@ -98,7 +99,8 @@ import { ViewSavingsAccountingDetailsComponent } from './accounting/view-savings
|
|||||||
StepperButtonsComponent,
|
StepperButtonsComponent,
|
||||||
GlAccountSelectorComponent,
|
GlAccountSelectorComponent,
|
||||||
GlAccountDisplayComponent,
|
GlAccountDisplayComponent,
|
||||||
ViewSavingsAccountingDetailsComponent
|
ViewSavingsAccountingDetailsComponent,
|
||||||
|
ThemeToggleComponent
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
FileUploadComponent,
|
FileUploadComponent,
|
||||||
@@ -130,6 +132,7 @@ import { ViewSavingsAccountingDetailsComponent } from './accounting/view-savings
|
|||||||
GlAccountSelectorComponent,
|
GlAccountSelectorComponent,
|
||||||
GlAccountDisplayComponent,
|
GlAccountDisplayComponent,
|
||||||
ViewSavingsAccountingDetailsComponent,
|
ViewSavingsAccountingDetailsComponent,
|
||||||
|
ThemeToggleComponent,
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
export class SharedModule { }
|
export class SharedModule { }
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<button mat-icon-button (click)="toggleTheme()">
|
||||||
|
<mat-icon>{{ isDarkMode ? 'wb_sunny' : 'nights_stay' }}</mat-icon>
|
||||||
|
</button>
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ThemeToggleComponent } from './theme-toggle.component';
|
||||||
|
|
||||||
|
describe('ThemeToggleComponent', () => {
|
||||||
|
let component: ThemeToggleComponent;
|
||||||
|
let fixture: ComponentFixture<ThemeToggleComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ ThemeToggleComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(ThemeToggleComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { Component } from '@angular/core';
|
||||||
|
import { ThemeService } from '../theme.service';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'theme-toggle-component',
|
||||||
|
templateUrl: './theme-toggle.component.html',
|
||||||
|
styleUrls: ['./theme-toggle.component.scss'],
|
||||||
|
})
|
||||||
|
export class ThemeToggleComponent {
|
||||||
|
isDarkMode: boolean;
|
||||||
|
|
||||||
|
constructor(private themeService: ThemeService) {
|
||||||
|
this.isDarkMode = this.themeService.isDarkMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleTheme() {
|
||||||
|
this.isDarkMode = !this.isDarkMode;
|
||||||
|
this.themeService.setDarkMode(this.isDarkMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ThemeService } from './theme.service';
|
||||||
|
|
||||||
|
describe('ThemeService', () => {
|
||||||
|
let service: ThemeService;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({});
|
||||||
|
service = TestBed.inject(ThemeService);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be created', () => {
|
||||||
|
expect(service).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root',
|
||||||
|
})
|
||||||
|
export class ThemeService {
|
||||||
|
private darkMode = false;
|
||||||
|
|
||||||
|
isDarkMode() {
|
||||||
|
return this.darkMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
setDarkMode(isDarkMode: boolean) {
|
||||||
|
this.darkMode = isDarkMode;
|
||||||
|
if (isDarkMode) {
|
||||||
|
document.body.classList.add('dark-theme');
|
||||||
|
} else {
|
||||||
|
document.body.classList.remove('dark-theme');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
@@ -1,3 +1,6 @@
|
|||||||
|
|
||||||
|
/* ############ Light mode palettes ################*/
|
||||||
|
|
||||||
$primary-palette: (
|
$primary-palette: (
|
||||||
100: #5ba2ec,
|
100: #5ba2ec,
|
||||||
500: #1074b9,
|
500: #1074b9,
|
||||||
@@ -19,3 +22,27 @@ $accent-palette: (
|
|||||||
700: rgba(black, 0.87)
|
700: rgba(black, 0.87)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* ############ Dark mode palettes ################*/
|
||||||
|
|
||||||
|
$dark-primary-palette: (
|
||||||
|
100: #273350,
|
||||||
|
500: #313f6b,
|
||||||
|
700: #39415c,
|
||||||
|
contrast: (
|
||||||
|
100: white,
|
||||||
|
500: rgba(white, 0.87),
|
||||||
|
700: rgba(white, 0.87)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$dark-accent-palette: (
|
||||||
|
100: #364461,
|
||||||
|
500: #3e5372,
|
||||||
|
700: #476385,
|
||||||
|
contrast: (
|
||||||
|
100: white,
|
||||||
|
500: white,
|
||||||
|
700: white
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|||||||
@@ -15,6 +15,10 @@
|
|||||||
// Be sure that you only ever include this mixin once!
|
// Be sure that you only ever include this mixin once!
|
||||||
@include mat.core();
|
@include mat.core();
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## Light theme ################################### */
|
||||||
|
|
||||||
|
|
||||||
// Define the palettes for your theme using the Material Design palettes available in palette.scss
|
// Define the palettes for your theme using the Material Design palettes available in palette.scss
|
||||||
// (imported above). For each palette, you can optionally specify a default, lighter, and darker
|
// (imported above). For each palette, you can optionally specify a default, lighter, and darker
|
||||||
// hue. Available color palettes: https://material.io/design/color/
|
// hue. Available color palettes: https://material.io/design/color/
|
||||||
@@ -36,3 +40,51 @@ $mifosx-app-theme: mat.define-light-theme($mifosx-app-primary, $mifosx-app-accen
|
|||||||
@include dashboard-component-theme($mifosx-app-theme);
|
@include dashboard-component-theme($mifosx-app-theme);
|
||||||
@include shares-account-view-component-theme($mifosx-app-theme);
|
@include shares-account-view-component-theme($mifosx-app-theme);
|
||||||
@include account-view-component-theme($mifosx-app-theme);
|
@include account-view-component-theme($mifosx-app-theme);
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## Dark theme ################################### */
|
||||||
|
|
||||||
|
|
||||||
|
// Define the palettes for your theme using the Material Design palettes available in palette.scss
|
||||||
|
$mifosx-app-dark-primary: mat.define-palette($dark-primary-palette);
|
||||||
|
$mifosx-app-dark-accent: mat.define-palette($dark-accent-palette);
|
||||||
|
$mifosx-app-dark-warn: mat.define-palette(mat.$red-palette);
|
||||||
|
|
||||||
|
// Create the theme object (a Sass map containing all of the palettes).
|
||||||
|
$mifosx-app-dark-theme: mat.define-dark-theme($mifosx-app-dark-primary, $mifosx-app-dark-accent, $mifosx-app-dark-warn);
|
||||||
|
|
||||||
|
// Include theme styles for core and each component used in your app.
|
||||||
|
.dark-theme {
|
||||||
|
|
||||||
|
// Override the background color of the label text for dark theme
|
||||||
|
.mat-option-text,.mat-input-element,.mat-form-field-label{
|
||||||
|
color: white !important;
|
||||||
|
}
|
||||||
|
mifosx-popover,.mat-menu-content{
|
||||||
|
background-color: #303135;
|
||||||
|
color : white;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override the background color of the calendar for dark theme
|
||||||
|
.mat-calendar,
|
||||||
|
.mat-calendar-body-cell,
|
||||||
|
.mat-calendar-body-label,
|
||||||
|
.mat-calendar-table{
|
||||||
|
background-color: #303135;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Changing the logo color for dark mode
|
||||||
|
.img-button,
|
||||||
|
.app-user-photo,
|
||||||
|
.profile-image{
|
||||||
|
filter: invert(100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include mat.all-component-themes($mifosx-app-dark-theme);
|
||||||
|
@include groups-view-component-theme($mifosx-app-dark-theme);
|
||||||
|
@include centers-view-component-theme($mifosx-app-dark-theme);
|
||||||
|
@include dashboard-component-theme($mifosx-app-dark-theme);
|
||||||
|
@include shares-account-view-component-theme($mifosx-app-dark-theme);
|
||||||
|
@include account-view-component-theme($mifosx-app-dark-theme);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user