From ac3e7165e5210fc71113ce7092d5ac7f2f8fa13d Mon Sep 17 00:00:00 2001 From: Cyril Joseph Date: Sat, 2 Aug 2025 22:35:52 -0300 Subject: [PATCH] ui and feedback updates --- public/themes/default.css | 252 ++++++++++++++++++ src/app/app.component.ts | 15 +- src/app/app.config.ts | 5 +- src/app/common/footer/footer.component.html | 4 +- src/app/common/footer/footer.component.scss | 40 ++- src/app/common/footer/footer.component.ts | 23 +- .../secured-header.component.html | 8 +- .../secured-header.component.scss | 72 +++-- .../secured-header.component.ts | 3 + .../core/models/service-provider/basic-fee.ts | 1 + .../models/service-provider/carnet-fee.ts | 1 + .../continuation-sheet-fee.ts | 1 + .../service-provider/counterfoil-fee.ts | 1 + .../models/service-provider/expedited-fee.ts | 1 + .../service-provider/security-deposit.ts | 1 + src/app/core/models/user.ts | 1 + .../core/services/common/common.service.ts | 38 +-- src/app/core/services/common/user.service.ts | 3 +- src/app/core/services/param/param.service.ts | 2 - .../service-provider/basic-fee.service.ts | 3 +- .../service-provider/carnet-fee.service.ts | 3 +- .../service-provider/contact.service.ts | 3 +- .../continuation-sheet-fee.service.ts | 3 +- .../counterfoil-fee.service.ts | 3 +- .../service-provider/expedited-fee.service.ts | 3 +- .../security-deposit.service.ts | 3 +- src/app/core/services/stylemanager.service.ts | 44 +++ src/app/core/services/theme.service.ts | 18 ++ .../forgot-password.component.ts | 6 + src/app/home/chart/chart.component.scss | 6 +- src/app/home/home.component.html | 8 +- src/app/login/login.component.scss | 6 +- src/app/login/login.component.ts | 4 + .../manage-param-record.component.ts | 5 +- .../manage-table-record.component.html | 2 +- .../manage-table-record.component.ts | 3 +- .../param/table/param-table.component.html | 176 ++++++------ .../param/table/param-table.component.scss | 23 +- src/app/param/table/param-table.component.ts | 19 +- src/app/register/register.component.ts | 6 + .../basic-details.component.html | 5 +- .../basic-details/basic-details.component.ts | 43 +-- .../basic-fee/basic-fee.component.html | 14 +- .../basic-fee/basic-fee.component.scss | 17 +- .../basic-fee/basic-fee.component.ts | 43 ++- .../carnet-fee/carnet-fee.component.html | 12 +- .../carnet-fee/carnet-fee.component.scss | 10 +- .../carnet-fee/carnet-fee.component.ts | 32 ++- .../carnet-sequence.component.html | 9 +- .../carnet-sequence.component.scss | 2 +- .../carnet-sequence.component.ts | 23 +- .../contacts/contacts.component.html | 13 +- .../contacts/contacts.component.scss | 12 +- .../contacts/contacts.component.ts | 37 ++- .../continuation-sheet-fee.component.html | 12 +- .../continuation-sheet-fee.component.scss | 16 +- .../continuation-sheet-fee.component.ts | 33 ++- .../counterfoil-fee.component.html | 12 +- .../counterfoil-fee.component.scss | 16 +- .../counterfoil-fee.component.ts | 32 ++- .../edit/edit-service-provider.component.scss | 4 +- .../expedited-fee.component.html | 12 +- .../expedited-fee.component.scss | 16 +- .../expedited-fee/expedited-fee.component.ts | 38 ++- .../security-deposit.component.html | 12 +- .../security-deposit.component.scss | 16 +- .../security-deposit.component.ts | 36 ++- .../confirm-dialog.component.ts | 2 +- .../shared/module/angular-material.module.ts | 7 +- ...properCase.pipe.ts => proper-case.pipe.ts} | 0 .../user-settings.component.scss | 7 +- src/styles.scss | 109 +++++++- src/styles/colors.scss | 69 ----- 73 files changed, 1119 insertions(+), 421 deletions(-) create mode 100644 public/themes/default.css create mode 100644 src/app/core/services/stylemanager.service.ts create mode 100644 src/app/core/services/theme.service.ts rename src/app/shared/pipes/{properCase.pipe.ts => proper-case.pipe.ts} (100%) delete mode 100644 src/styles/colors.scss diff --git a/public/themes/default.css b/public/themes/default.css new file mode 100644 index 0000000..1814e08 --- /dev/null +++ b/public/themes/default.css @@ -0,0 +1,252 @@ +/* Note: Color palettes are generated from primary: #607c7c, secondary: #9cb4b8 */ +html { + /* COLOR SYSTEM VARIABLES */ + color-scheme: light; + + /* Primary palette variables */ + --mat-sys-primary: light-dark(#607c7c, #afcccc); + --mat-sys-on-primary: light-dark(#ffffff, #193535); + --mat-sys-primary-container: light-dark(#ffffff, #304b4c); + --mat-sys-on-primary-container: light-dark(#607c7c, #cae8e8); + --mat-sys-inverse-primary: light-dark(#afcccc, #486363); + --mat-sys-primary-fixed: light-dark(#cae8e8, #cae8e8); + --mat-sys-primary-fixed-dim: light-dark(#afcccc, #afcccc); + --mat-sys-on-primary-fixed: light-dark(#022020, #022020); + --mat-sys-on-primary-fixed-variant: light-dark(#304b4c, #304b4c); + + /* Secondary palette variables */ + --mat-sys-secondary: light-dark(#607c7c, #b3cbcf); + --mat-sys-on-secondary: light-dark(#ffffff, #1d3437); + --mat-sys-secondary-container: light-dark(#607c7c, #344a4e); + --mat-sys-on-secondary-container: light-dark(#ffffff, #cee7eb); + --mat-sys-secondary-fixed: light-dark(#cee7eb, #cee7eb); + --mat-sys-secondary-fixed-dim: light-dark(#b3cbcf, #b3cbcf); + --mat-sys-on-secondary-fixed: light-dark(#071f22, #071f22); + --mat-sys-on-secondary-fixed-variant: light-dark(#344a4e, #344a4e); + + /* Tertiary palette variables */ + --mat-sys-tertiary: light-dark(#635b72, #cdc2dd); + --mat-sys-on-tertiary: light-dark(#ffffff, #342d42); + --mat-sys-tertiary-container: light-dark(#e9def9, #4b4359); + --mat-sys-on-tertiary-container: light-dark(#1f182c, #e9def9); + --mat-sys-tertiary-fixed: light-dark(#e9def9, #e9def9); + --mat-sys-tertiary-fixed-dim: light-dark(#cdc2dd, #cdc2dd); + --mat-sys-on-tertiary-fixed: light-dark(#1f182c, #1f182c); + --mat-sys-on-tertiary-fixed-variant: light-dark(#4b4359, #4b4359); + + /* Neutral palette variables */ + --mat-sys-background: light-dark(#faf9f8, #121414); + --mat-sys-on-background: light-dark(#1a1c1c, #e3e2e2); + --mat-sys-surface: light-dark(#faf9f8, #121414); + --mat-sys-surface-dim: light-dark(#dadad9, #121414); + --mat-sys-surface-bright: light-dark(#faf9f8, #383939); + --mat-sys-surface-container-low: light-dark(#f4f3f3, #1a1c1c); + --mat-sys-surface-container-lowest: light-dark(#ffffff, #0d0e0e); + --mat-sys-surface-container: light-dark(#eeeeed, #1e2020); + --mat-sys-surface-container-high: light-dark(#e9e8e7, #292a2a); + --mat-sys-surface-container-highest: light-dark(#e3e2e2, #343535); + --mat-sys-on-surface: light-dark(#1a1c1c, #e3e2e2); + --mat-sys-shadow: light-dark(#000000, #000000); + --mat-sys-scrim: light-dark(#000000, #000000); + --mat-sys-surface-tint: light-dark(#486363, #afcccc); + --mat-sys-inverse-surface: light-dark(#2f3130, #e3e2e2); + --mat-sys-inverse-on-surface: light-dark(#f1f0f0, #2f3130); + --mat-sys-outline: light-dark(#727878, #8b9292); + --mat-sys-outline-variant: light-dark(#c1c8c7, #414848); + --mat-sys-neutral10: light-dark(#1a1c1c, #1a1c1c); + /* Variable used for the form field native select option text color */ + + /* Error palette variables */ + --mat-sys-error: light-dark(#ba1a1a, #ffb4ab); + --mat-sys-on-error: light-dark(#ffffff, #690005); + --mat-sys-error-container: light-dark(#ffdad6, #93000a); + --mat-sys-on-error-container: light-dark(#410002, #ffdad6); + + /* Neutral variant palette variables */ + --mat-sys-surface-variant: light-dark(#dde4e3, #414848); + --mat-sys-on-surface-variant: light-dark(#414848, #c1c8c7); + --mat-sys-neutral-variant20: light-dark(#2b3232, #2b3232); + /* Variable used for the sidenav scrim (container background shadow when opened) */ + + /* TYPOGRAPHY SYSTEM VARIABLES */ + + /* Typography variables. Only used in the different typescale system variables. */ + --mat-sys-brand-font-family: Roboto; + /* The font-family to use for brand text. */ + --mat-sys-plain-font-family: Roboto; + /* The font-family to use for plain text. */ + --mat-sys-bold-font-weight: 700; + /* The font-weight to use for bold text. */ + --mat-sys-medium-font-weight: 500; + /* The font-weight to use for medium text. */ + --mat-sys-regular-font-weight: 400; + /* The font-weight to use for regular text. */ + + /* Typescale variables. */ + /* Warning: Risk of reduced fidelity from using the composite typography tokens (ex. --mat-sys-body-large) since + tracking cannot be represented in the "font" property shorthand. Consider using the discrete properties instead. */ + --mat-sys-body-large: var(--mat-sys-body-large-weight) var(--mat-sys-body-large-size) / var(--mat-sys-body-large-line-height) var(--mat-sys-body-large-font); + --mat-sys-body-large-font: var(--mat-sys-plain-font-family); + --mat-sys-body-large-line-height: 1.5rem; + --mat-sys-body-large-size: 1rem; + --mat-sys-body-large-tracking: 0.031rem; + --mat-sys-body-large-weight: var(--mat-sys-regular-font-weight); + + /* Body medium typescale */ + --mat-sys-body-medium: var(--mat-sys-body-medium-weight) var(--mat-sys-body-medium-size) / var(--mat-sys-body-medium-line-height) var(--mat-sys-body-medium-font); + --mat-sys-body-medium-font: var(--mat-sys-plain-font-family); + --mat-sys-body-medium-line-height: 1.25rem; + --mat-sys-body-medium-size: 0.875rem; + --mat-sys-body-medium-tracking: 0.016rem; + --mat-sys-body-medium-weight: var(--mat-sys-regular-font-weight); + + /* Body small typescale */ + --mat-sys-body-small: var(--mat-sys-body-small-weight) var(--mat-sys-body-small-size) / var(--mat-sys-body-small-line-height) var(--mat-sys-body-small-font); + --mat-sys-body-small-font: var(--mat-sys-plain-font-family); + --mat-sys-body-small-line-height: 1rem; + --mat-sys-body-small-size: 0.75rem; + --mat-sys-body-small-tracking: 0.025rem; + --mat-sys-body-small-weight: var(--mat-sys-regular-font-weight); + + /* Display large typescale */ + --mat-sys-display-large: var(--mat-sys-display-large-weight) var(--mat-sys-display-large-size) / var(--mat-sys-display-large-line-height) var(--mat-sys-display-large-font); + --mat-sys-display-large-font: var(--mat-sys-brand-font-family); + --mat-sys-display-large-line-height: 4rem; + --mat-sys-display-large-size: 3.562rem; + --mat-sys-display-large-tracking: -0.016rem; + --mat-sys-display-large-weight: var(--mat-sys-regular-font-weight); + + /* Display medium typescale */ + --mat-sys-display-medium: var(--mat-sys-display-medium-weight) var(--mat-sys-display-medium-size) / var(--mat-sys-display-medium-line-height) var(--mat-sys-display-medium-font); + --mat-sys-display-medium-font: var(--mat-sys-brand-font-family); + --mat-sys-display-medium-line-height: 3.25rem; + --mat-sys-display-medium-size: 2.812rem; + --mat-sys-display-medium-tracking: 0; + --mat-sys-display-medium-weight: var(--mat-sys-regular-font-weight); + + /* Display small typescale */ + --mat-sys-display-small: var(--mat-sys-display-small-weight) var(--mat-sys-display-small-size) / var(--mat-sys-display-small-line-height) var(--mat-sys-display-small-font); + --mat-sys-display-small-font: var(--mat-sys-brand-font-family); + --mat-sys-display-small-line-height: 2.75rem; + --mat-sys-display-small-size: 2.25rem; + --mat-sys-display-small-tracking: 0; + --mat-sys-display-small-weight: var(--mat-sys-regular-font-weight); + + /* Headline large typescale */ + --mat-sys-headline-large: var(--mat-sys-headline-large-weight) var(--mat-sys-headline-large-size) / var(--mat-sys-headline-large-line-height) var(--mat-sys-headline-large-font); + --mat-sys-headline-large-font: var(--mat-sys-brand-font-family); + --mat-sys-headline-large-line-height: 2.5rem; + --mat-sys-headline-large-size: 2rem; + --mat-sys-headline-large-tracking: 0; + --mat-sys-headline-large-weight: var(--mat-sys-regular-font-weight); + + /* Headline medium typescale */ + --mat-sys-headline-medium: var(--mat-sys-headline-medium-weight) var(--mat-sys-headline-medium-size) / var(--mat-sys-headline-medium-line-height) var(--mat-sys-headline-medium-font); + --mat-sys-headline-medium-font: var(--mat-sys-brand-font-family); + --mat-sys-headline-medium-line-height: 2.25rem; + --mat-sys-headline-medium-size: 1.75rem; + --mat-sys-headline-medium-tracking: 0; + --mat-sys-headline-medium-weight: var(--mat-sys-regular-font-weight); + + /* Headline small typescale */ + --mat-sys-headline-small: var(--mat-sys-headline-small-weight) var(--mat-sys-headline-small-size) / var(--mat-sys-headline-small-line-height) var(--mat-sys-headline-small-font); + --mat-sys-headline-small-font: var(--mat-sys-brand-font-family); + --mat-sys-headline-small-line-height: 2rem; + --mat-sys-headline-small-size: 1.5rem; + --mat-sys-headline-small-tracking: 0; + --mat-sys-headline-small-weight: var(--mat-sys-regular-font-weight); + + /* Label large typescale */ + --mat-sys-label-large: var(--mat-sys-label-large-weight) var(--mat-sys-label-large-size) / var(--mat-sys-label-large-line-height) var(--mat-sys-label-large-font); + --mat-sys-label-large-font: var(--mat-sys-plain-font-family); + --mat-sys-label-large-line-height: 1.25rem; + --mat-sys-label-large-size: 0.875rem; + --mat-sys-label-large-tracking: 0.006rem; + --mat-sys-label-large-weight: var(--mat-sys-medium-font-weight); + --mat-sys-label-large-weight-prominent: var(--mat-sys-bold-font-weight); + + /* Label medium typescale */ + --mat-sys-label-medium: var(--mat-sys-label-medium-weight) var(--mat-sys-label-medium-size) / var(--mat-sys-label-medium-line-height) var(--mat-sys-label-medium-font); + --mat-sys-label-medium-font: var(--mat-sys-plain-font-family); + --mat-sys-label-medium-line-height: 1rem; + --mat-sys-label-medium-size: 0.75rem; + --mat-sys-label-medium-tracking: 0.031rem; + --mat-sys-label-medium-weight: var(--mat-sys-medium-font-weight); + --mat-sys-label-medium-weight-prominent: var(--mat-sys-bold-font-weight); + + /* Label small typescale */ + --mat-sys-label-small: var(--mat-sys-label-small-weight) var(--mat-sys-label-small-size) / var(--mat-sys-label-small-line-height) var(--mat-sys-label-small-font); + --mat-sys-label-small-font: var(--mat-sys-plain-font-family); + --mat-sys-label-small-line-height: 1rem; + --mat-sys-label-small-size: 0.688rem; + --mat-sys-label-small-tracking: 0.031rem; + --mat-sys-label-small-weight: var(--mat-sys-medium-font-weight); + + /* Title large typescale */ + --mat-sys-title-large: var(--mat-sys-title-large-weight) var(--mat-sys-title-large-size) / var(--mat-sys-title-large-line-height) var(--mat-sys-title-large-font); + --mat-sys-title-large-font: var(--mat-sys-brand-font-family); + --mat-sys-title-large-line-height: 1.75rem; + --mat-sys-title-large-size: 1.375rem; + --mat-sys-title-large-tracking: 0; + --mat-sys-title-large-weight: var(--mat-sys-regular-font-weight); + + /* Title medium typescale */ + --mat-sys-title-medium: var(--mat-sys-title-medium-weight) var(--mat-sys-title-medium-size) / var(--mat-sys-title-medium-line-height) var(--mat-sys-title-medium-font); + --mat-sys-title-medium-font: var(--mat-sys-plain-font-family); + --mat-sys-title-medium-line-height: 1.5rem; + --mat-sys-title-medium-size: 1rem; + --mat-sys-title-medium-tracking: 0.009rem; + --mat-sys-title-medium-weight: var(--mat-sys-medium-font-weight); + + /* Title small typescale */ + --mat-sys-title-small: var(--mat-sys-title-small-weight) var(--mat-sys-title-small-size) / var(--mat-sys-title-small-line-height) var(--mat-sys-title-small-font); + --mat-sys-title-small-font: var(--mat-sys-plain-font-family); + --mat-sys-title-small-line-height: 1.25rem; + --mat-sys-title-small-size: 0.875rem; + --mat-sys-title-small-tracking: 0.006rem; + --mat-sys-title-small-weight: var(--mat-sys-medium-font-weight); + + /* ELEVATION SYSTEM VARIABLES */ + + /* Box shadow colors. Only used in the elevation level system variables. */ + --mat-sys-umbra-color: color-mix(in srgb, var(--mat-sys-shadow), transparent 80%); + --mat-sys-penumbra-color: color-mix(in srgb, var(--mat-sys-shadow), transparent 86%); + --mat-sys-ambient-color: color-mix(in srgb, var(--mat-sys-shadow), transparent 88%); + + /* Elevation level system variables. These are used as the value for box-shadow CSS property. */ + --mat-sys-level0: 0px 0px 0px 0px var(--mat-sys-umbra-color), 0px 0px 0px 0px var(--mat-sys-penumbra-color), 0px 0px 0px 0px var(--mat-sys-ambient-color); + --mat-sys-level1: 0px 2px 1px -1px var(--mat-sys-umbra-color), 0px 1px 1px 0px var(--mat-sys-penumbra-color), 0px 1px 3px 0px var(--mat-sys-ambient-color); + --mat-sys-level2: 0px 3px 3px -2px var(--mat-sys-umbra-color), 0px 3px 4px 0px var(--mat-sys-penumbra-color), 0px 1px 8px 0px var(--mat-sys-ambient-color); + --mat-sys-level3: 0px 3px 5px -1px var(--mat-sys-umbra-color), 0px 6px 10px 0px var(--mat-sys-penumbra-color), 0px 1px 18px 0px var(--mat-sys-ambient-color); + --mat-sys-level4: 0px 5px 5px -3px var(--mat-sys-umbra-color), 0px 8px 10px 1px var(--mat-sys-penumbra-color), 0px 3px 14px 2px var(--mat-sys-ambient-color); + --mat-sys-level5: 0px 7px 8px -4px var(--mat-sys-umbra-color), 0px 12px 17px 2px var(--mat-sys-penumbra-color), 0px 5px 22px 4px var(--mat-sys-ambient-color); + + /* SHAPE SYSTEM VARIABLES */ + --mat-sys-corner-extra-large: 28px; + --mat-sys-corner-extra-large-top: 28px 28px 0 0; + --mat-sys-corner-extra-small: 4px; + --mat-sys-corner-extra-small-top: 4px 4px 0 0; + --mat-sys-corner-full: 9999px; + --mat-sys-corner-large: 16px; + --mat-sys-corner-large-end: 0 16px 16px 0; + --mat-sys-corner-large-start: 16px 0 0 16px; + --mat-sys-corner-large-top: 16px 16px 0 0; + --mat-sys-corner-medium: 12px; + --mat-sys-corner-none: 0; + --mat-sys-corner-small: 8px; + + /* STATE SYSTEM VARIABLES */ + --mat-sys-dragged-state-layer-opacity: 0.16; + --mat-sys-focus-state-layer-opacity: 0.12; + --mat-sys-hover-state-layer-opacity: 0.08; + --mat-sys-pressed-state-layer-opacity: 0.12; + + /* CUSTOM BUTTON COLORS */ + --custom-button-color: #ffffff; + --custom-button-background-color: #627f9a; + --custom-hover-color: #384857; + + /* CUSTOM NAV COLORS */ + --custom-nav-color: #ffffff; + --custom-nav-background-color: #607c7c; +} \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts index dc18765..74d79ee 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,14 +1,14 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { RouterOutlet } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { CommonModule } from '@angular/common'; +import { FooterComponent } from './common/footer/footer.component'; import { SecuredHeaderComponent } from './common/secured-header/secured-header.component'; import { UserService } from './core/services/common/user.service'; -import { FooterComponent } from './common/footer/footer.component'; -import { CommonModule } from '@angular/common'; -import { Subscription } from 'rxjs'; @Component({ selector: 'app-root', - imports: [RouterOutlet, SecuredHeaderComponent, FooterComponent, CommonModule], + imports: [RouterOutlet, FooterComponent, CommonModule, SecuredHeaderComponent], templateUrl: './app.component.html', styleUrl: './app.component.scss' }) @@ -17,9 +17,8 @@ export class AppComponent { isUserLoggedIn = false; private userSubscription!: Subscription; - constructor(private userService: UserService - ) { } - + private userService = inject(UserService); + ngOnInit(): void { this.isUserLoggedIn = this.userService.isLoggedIn(); diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 1c4d63a..5581dcc 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -10,6 +10,7 @@ import { withDefaultRegisterables, } from 'ng2-charts'; import { AuthInterceptor } from './core/interceptors/auth.interceptor'; +import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; export const appConfig: ApplicationConfig = { @@ -20,5 +21,7 @@ export const appConfig: ApplicationConfig = { provideHttpClient(), provideHttpClient(withInterceptorsFromDi()), provideCharts(withDefaultRegisterables()), - { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },] + { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }, + { provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { subscriptSizing: 'dynamic' } } + ] }; diff --git a/src/app/common/footer/footer.component.html b/src/app/common/footer/footer.component.html index 7f3012d..01d4752 100644 --- a/src/app/common/footer/footer.component.html +++ b/src/app/common/footer/footer.component.html @@ -1,4 +1,4 @@ -