diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html
index 815fb52..134c34e 100644
--- a/frontend/src/app/app.component.html
+++ b/frontend/src/app/app.component.html
@@ -1,5 +1,26 @@
+
admin-sidebar works!
diff --git a/frontend/src/app/routes/admin/admin-sidebar/admin-sidebar.component.scss b/frontend/src/app/routes/admin/admin-sidebar/admin-sidebar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/app/routes/admin/admin-sidebar/admin-sidebar.component.ts b/frontend/src/app/routes/admin/admin-sidebar/admin-sidebar.component.ts new file mode 100644 index 0000000..4711184 --- /dev/null +++ b/frontend/src/app/routes/admin/admin-sidebar/admin-sidebar.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-admin-sidebar', + templateUrl: './admin-sidebar.component.html', + styleUrls: ['./admin-sidebar.component.scss'] +}) +export class AdminSidebarComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/frontend/src/app/routes/admin/admin.module.ts b/frontend/src/app/routes/admin/admin.module.ts index 2644649..6855b5a 100644 --- a/frontend/src/app/routes/admin/admin.module.ts +++ b/frontend/src/app/routes/admin/admin.module.ts @@ -1,11 +1,16 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { AdminSidebarComponent } from './admin-sidebar/admin-sidebar.component'; import { AdminRoutingModule } from './admin.routing.module'; import { AdminComponent } from './admin/admin.component'; @NgModule({ - declarations: [AdminComponent], - imports: [CommonModule, AdminRoutingModule, MatProgressSpinnerModule], + declarations: [AdminComponent, AdminSidebarComponent], + imports: [ + CommonModule, + AdminRoutingModule, + MatProgressSpinnerModule, + ], }) export class AdminRouteModule {} diff --git a/frontend/src/app/routes/admin/admin.routing.module.ts b/frontend/src/app/routes/admin/admin.routing.module.ts index 859de1f..054219b 100644 --- a/frontend/src/app/routes/admin/admin.routing.module.ts +++ b/frontend/src/app/routes/admin/admin.routing.module.ts @@ -1,11 +1,16 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { RouterModule } from '@angular/router'; +import { PRoutes } from 'src/app/models/picsur-routes'; +import { AdminSidebarComponent } from './admin-sidebar/admin-sidebar.component'; import { AdminComponent } from './admin/admin.component'; -const routes: Routes = [ +const routes: PRoutes = [ { path: 'admin', component: AdminComponent, + data: { + sidebar: AdminSidebarComponent, + }, }, ]; diff --git a/frontend/src/app/routes/admin/admin/admin.component.ts b/frontend/src/app/routes/admin/admin/admin.component.ts index 27129b6..dcef160 100644 --- a/frontend/src/app/routes/admin/admin/admin.component.ts +++ b/frontend/src/app/routes/admin/admin/admin.component.ts @@ -1,11 +1,18 @@ -import { Component, OnInit } from '@angular/core'; +import { + Component, + OnInit +} from '@angular/core'; @Component({ templateUrl: './admin.component.html', styleUrls: ['./admin.component.scss'], }) export class AdminComponent implements OnInit { - constructor() {} - ngOnInit(): void {} + constructor( + ) {} + + ngOnInit(): void { + console.log('AdminComponent'); + } } diff --git a/frontend/src/app/routes/pagenotfound/processing.routing.module.ts b/frontend/src/app/routes/pagenotfound/processing.routing.module.ts index e58d4e3..3f84c82 100644 --- a/frontend/src/app/routes/pagenotfound/processing.routing.module.ts +++ b/frontend/src/app/routes/pagenotfound/processing.routing.module.ts @@ -1,8 +1,9 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { RouterModule } from '@angular/router'; +import { PRoutes } from 'src/app/models/picsur-routes'; import { PageNotFoundComponent } from './pagenotfound.component'; -const routes: Routes = [ +const routes: PRoutes = [ { path: 'pagenotfound', component: PageNotFoundComponent, diff --git a/frontend/src/app/routes/processing/processing.component.ts b/frontend/src/app/routes/processing/processing.component.ts index baee7ec..3e5c6a0 100644 --- a/frontend/src/app/routes/processing/processing.component.ts +++ b/frontend/src/app/routes/processing/processing.component.ts @@ -1,8 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { HasFailed } from 'picsur-shared/dist/types'; -import { ImageService } from 'src/app/api/image.service'; import { ProcessingViewMetadata } from 'src/app/models/processing-view-metadata'; +import { ImageService } from 'src/app/services/api/image.service'; import { UtilService } from 'src/app/util/util.service'; @Component({ diff --git a/frontend/src/app/routes/processing/processing.routing.module.ts b/frontend/src/app/routes/processing/processing.routing.module.ts index cc8acd4..378703d 100644 --- a/frontend/src/app/routes/processing/processing.routing.module.ts +++ b/frontend/src/app/routes/processing/processing.routing.module.ts @@ -1,8 +1,9 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { RouterModule } from '@angular/router'; +import { PRoutes } from 'src/app/models/picsur-routes'; import { ProcessingComponent } from './processing.component'; -const routes: Routes = [ +const routes: PRoutes = [ { path: 'processing', component: ProcessingComponent, diff --git a/frontend/src/app/routes/upload/upload.component.ts b/frontend/src/app/routes/upload/upload.component.ts index 387f9c8..af0d287 100644 --- a/frontend/src/app/routes/upload/upload.component.ts +++ b/frontend/src/app/routes/upload/upload.component.ts @@ -3,7 +3,7 @@ import { Router } from '@angular/router'; import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator'; import { NgxDropzoneChangeEvent } from 'ngx-dropzone'; import { Permission, Permissions } from 'picsur-shared/dist/dto/permissions'; -import { PermissionService } from 'src/app/api/permission.service'; +import { PermissionService } from 'src/app/services/api/permission.service'; import { UtilService } from 'src/app/util/util.service'; import { ProcessingViewMetadata } from '../../models/processing-view-metadata'; diff --git a/frontend/src/app/routes/upload/upload.routing.module.ts b/frontend/src/app/routes/upload/upload.routing.module.ts index def6cda..d4e2879 100644 --- a/frontend/src/app/routes/upload/upload.routing.module.ts +++ b/frontend/src/app/routes/upload/upload.routing.module.ts @@ -1,8 +1,9 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { RouterModule } from '@angular/router'; +import { PRoutes } from 'src/app/models/picsur-routes'; import { UploadComponent } from './upload.component'; -const routes: Routes = [ +const routes: PRoutes = [ { path: '', component: UploadComponent, diff --git a/frontend/src/app/routes/user/login/login.component.ts b/frontend/src/app/routes/user/login/login.component.ts index 993e407..5e68811 100644 --- a/frontend/src/app/routes/user/login/login.component.ts +++ b/frontend/src/app/routes/user/login/login.component.ts @@ -3,9 +3,9 @@ import { Router } from '@angular/router'; import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator'; import { Permission, Permissions } from 'picsur-shared/dist/dto/permissions'; import { HasFailed } from 'picsur-shared/dist/types'; -import { PermissionService } from 'src/app/api/permission.service'; -import { UserService } from 'src/app/api/user.service'; import { SnackBarType } from 'src/app/models/snack-bar-type'; +import { PermissionService } from 'src/app/services/api/permission.service'; +import { UserService } from 'src/app/services/api/user.service'; import { UtilService } from 'src/app/util/util.service'; import { LoginControl } from '../../../models/forms/login.model'; import { UserPassModel } from '../../../models/forms/userpass'; diff --git a/frontend/src/app/routes/user/register/register.component.ts b/frontend/src/app/routes/user/register/register.component.ts index 9ed555d..bdcfe61 100644 --- a/frontend/src/app/routes/user/register/register.component.ts +++ b/frontend/src/app/routes/user/register/register.component.ts @@ -3,10 +3,10 @@ import { Router } from '@angular/router'; import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator'; import { Permission, Permissions } from 'picsur-shared/dist/dto/permissions'; import { HasFailed } from 'picsur-shared/dist/types'; -import { PermissionService } from 'src/app/api/permission.service'; -import { UserService } from 'src/app/api/user.service'; import { UserPassModel } from 'src/app/models/forms/userpass'; import { SnackBarType } from 'src/app/models/snack-bar-type'; +import { PermissionService } from 'src/app/services/api/permission.service'; +import { UserService } from 'src/app/services/api/user.service'; import { UtilService } from 'src/app/util/util.service'; import { RegisterControl } from '../../../models/forms/register.model'; diff --git a/frontend/src/app/routes/user/user.routing.module.ts b/frontend/src/app/routes/user/user.routing.module.ts index c341806..f416a6c 100644 --- a/frontend/src/app/routes/user/user.routing.module.ts +++ b/frontend/src/app/routes/user/user.routing.module.ts @@ -1,11 +1,12 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { RouterModule } from '@angular/router'; import { Permission } from 'picsur-shared/dist/dto/permissions'; import { PermissionGuard } from 'src/app/guards/permission.guard'; +import { PRoutes } from 'src/app/models/picsur-routes'; import { LoginComponent } from './login/login.component'; import { RegisterComponent } from './register/register.component'; -const routes: Routes = [ +const routes: PRoutes = [ { path: 'login', component: LoginComponent, diff --git a/frontend/src/app/routes/view/view.component.ts b/frontend/src/app/routes/view/view.component.ts index eb8f37e..8a0c866 100644 --- a/frontend/src/app/routes/view/view.component.ts +++ b/frontend/src/app/routes/view/view.component.ts @@ -3,7 +3,7 @@ import { ActivatedRoute, Router } from '@angular/router'; import { isHash } from 'class-validator'; import { ImageLinks } from 'picsur-shared/dist/dto/imagelinks.dto'; import { HasFailed } from 'picsur-shared/dist/types'; -import { ImageService } from 'src/app/api/image.service'; +import { ImageService } from 'src/app/services/api/image.service'; import { UtilService } from 'src/app/util/util.service'; @Component({ diff --git a/frontend/src/app/routes/view/view.routing.module.ts b/frontend/src/app/routes/view/view.routing.module.ts index ad1e3eb..1bef30c 100644 --- a/frontend/src/app/routes/view/view.routing.module.ts +++ b/frontend/src/app/routes/view/view.routing.module.ts @@ -1,10 +1,11 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { RouterModule } from '@angular/router'; import { Permission } from 'picsur-shared/dist/dto/permissions'; import { PermissionGuard } from 'src/app/guards/permission.guard'; +import { PRoutes } from 'src/app/models/picsur-routes'; import { ViewComponent } from './view.component'; -const routes: Routes = [ +const routes: PRoutes = [ { path: 'view/:hash', component: ViewComponent, diff --git a/frontend/src/app/api/api.module.ts b/frontend/src/app/services/api/api.module.ts similarity index 100% rename from frontend/src/app/api/api.module.ts rename to frontend/src/app/services/api/api.module.ts diff --git a/frontend/src/app/api/api.service.ts b/frontend/src/app/services/api/api.service.ts similarity index 98% rename from frontend/src/app/api/api.service.ts rename to frontend/src/app/services/api/api.service.ts index 08768aa..f50d80c 100644 --- a/frontend/src/app/api/api.service.ts +++ b/frontend/src/app/services/api/api.service.ts @@ -6,7 +6,7 @@ import { ApiSuccessResponse } from 'picsur-shared/dist/dto/api'; import { AsyncFailable, Fail, HasFailed } from 'picsur-shared/dist/types'; -import { MultiPartRequest } from '../models/multi-part-request'; +import { MultiPartRequest } from '../../models/multi-part-request'; import { KeyService } from './key.service'; @Injectable({ diff --git a/frontend/src/app/api/image.service.ts b/frontend/src/app/services/api/image.service.ts similarity index 94% rename from frontend/src/app/api/image.service.ts rename to frontend/src/app/services/api/image.service.ts index 396305e..46cc42d 100644 --- a/frontend/src/app/api/image.service.ts +++ b/frontend/src/app/services/api/image.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { ImageMetaResponse } from 'picsur-shared/dist/dto/api/image.dto'; import { EImage } from 'picsur-shared/dist/entities/image.entity'; import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types'; -import { ImageUploadRequest } from '../models/image-upload-request'; +import { ImageUploadRequest } from '../../models/image-upload-request'; import { ApiService } from './api.service'; @Injectable({ diff --git a/frontend/src/app/api/info.service.ts b/frontend/src/app/services/api/info.service.ts similarity index 94% rename from frontend/src/app/api/info.service.ts rename to frontend/src/app/services/api/info.service.ts index 36a74f2..8c3da63 100644 --- a/frontend/src/app/api/info.service.ts +++ b/frontend/src/app/services/api/info.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { InfoResponse } from 'picsur-shared/dist/dto/api/info.dto'; import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types'; import { BehaviorSubject } from 'rxjs'; -import { ServerInfo } from '../models/server-info'; +import { ServerInfo } from '../../models/server-info'; import { ApiService } from './api.service'; @Injectable({ diff --git a/frontend/src/app/api/key.service.ts b/frontend/src/app/services/api/key.service.ts similarity index 100% rename from frontend/src/app/api/key.service.ts rename to frontend/src/app/services/api/key.service.ts diff --git a/frontend/src/app/api/permission.service.ts b/frontend/src/app/services/api/permission.service.ts similarity index 100% rename from frontend/src/app/api/permission.service.ts rename to frontend/src/app/services/api/permission.service.ts diff --git a/frontend/src/app/api/user.service.ts b/frontend/src/app/services/api/user.service.ts similarity index 100% rename from frontend/src/app/api/user.service.ts rename to frontend/src/app/services/api/user.service.ts diff --git a/frontend/src/scss/bootstrap.scss b/frontend/src/scss/bootstrap.scss new file mode 100644 index 0000000..47f9e9c --- /dev/null +++ b/frontend/src/scss/bootstrap.scss @@ -0,0 +1,2 @@ +// Include bootstrap-grid.scss from node_modules +@import "../node_modules/bootstrap/scss/bootstrap-grid.scss"; diff --git a/frontend/src/scss/fixes.scss b/frontend/src/scss/fixes.scss index 18d490c..ca2fac9 100644 --- a/frontend/src/scss/fixes.scss +++ b/frontend/src/scss/fixes.scss @@ -1,3 +1,29 @@ +html, +body { + height: 100%; +} + +app-root { + height: 100%; + + display: flex; + flex-direction: column; +} + +html { + box-sizing: border-box; +} +*, +*:before, +*:after { + box-sizing: inherit; + + -webkit-transition: 0.2s; + -moz-transition: 0.2s; + -o-transition: 0.2s; + transition: 0.2s; +} + .mat-icon { // Yes yes, !important is here, deal with it // If someone wants to properly figure out why icons are escaping their 24px box, feel free to diff --git a/frontend/src/scss/index.scss b/frontend/src/scss/index.scss index e31bb84..f4c8754 100644 --- a/frontend/src/scss/index.scss +++ b/frontend/src/scss/index.scss @@ -1,3 +1,5 @@ +@import "./material-theme.scss"; +@import "./bootstrap.scss"; +@import "./fixes.scss"; @import "./personal.scss"; @import "./snackbar.scss"; -@import "./fixes.scss"; diff --git a/frontend/src/scss/material-theme.scss b/frontend/src/scss/material-theme.scss new file mode 100644 index 0000000..a51efe0 --- /dev/null +++ b/frontend/src/scss/material-theme.scss @@ -0,0 +1,252 @@ +/** +* Generated theme by Material Theme Generator +* https://materialtheme.arcsine.dev +* Fork at: https://materialtheme.arcsine.dev/?c=YHBhbGV0dGU$YHByaW1hcnk$YF48IzI3MjcyNyIsIj9lcjwjYmViZWJlIiwiO2VyPCMxNzE3MTd$LCIlPmBePCM0M2EwNDciLCI~ZXI8I2M3ZTNjOCIsIjtlcjwjMmM4NDJmfiwid2Fybj5gXjwjZjQ1MTFlIiwiP2VyPCNmY2NiYmMiLCI7ZXI8I2VmMzcxMn4sIj9UZXh0PCMwMDAwMDAiLCI~PTwjZmFmYWZhIiwiO1RleHQ8I2ZmZmZmZiIsIjs9PCMxMjEyMTJ$LCJmb250cz5bYEA8KC00fixgQDwoLTN$LGBAPCgtMn4sYEA8KC0xfixgQDxoZWFkbGluZX4sYEA8dGl0bGV$LGBAPHN1YiktMn4sYEA8c3ViKS0xfixgQDxib2R5LTJ$LGBAPGJvZHktMX4sYEA8YnV0dG9ufixgQDxjYXB0aW9ufixgQDxpbnB1dCIsInNpemU$bnVsbH1dLCJpY29uczxSb3VuZGVkIiwiP25lc3M$ZmFsc2UsInZlcnNpb24$MTF9 +*/ + +@import "~@angular/material/theming"; + +// Include the common styles for Angular Material. We include this here so that you only +// have to load a single css file for Angular Material in your app. + +// Fonts +@import "https://fonts.googleapis.com/icon?family=Material+Icons+Round"; +@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap"); + +$fontConfig: ( + display-4: mat-typography-level(112px, 112px, 300, "Roboto", -0.0134em), + display-3: mat-typography-level(56px, 56px, 400, "Roboto", -0.0089em), + display-2: mat-typography-level(45px, 48px, 400, "Roboto", 0em), + display-1: mat-typography-level(34px, 40px, 400, "Roboto", 0.0074em), + headline: mat-typography-level(24px, 32px, 400, "Roboto", 0em), + title: mat-typography-level(20px, 32px, 500, "Roboto", 0.0075em), + subheading-2: mat-typography-level(16px, 28px, 400, "Roboto", 0.0094em), + subheading-1: mat-typography-level(15px, 24px, 500, "Roboto", 0.0067em), + body-2: mat-typography-level(14px, 24px, 500, "Roboto", 0.0179em), + body-1: mat-typography-level(14px, 20px, 400, "Roboto", 0.0179em), + button: mat-typography-level(14px, 14px, 500, "Roboto", 0.0893em), + caption: mat-typography-level(12px, 20px, 400, "Roboto", 0.0333em), + input: mat-typography-level(inherit, 1.125, 400, "Roboto", 1.5px), +); + +// Foreground Elements + +// Light Theme Text +$dark-text: #000000; +$dark-primary-text: rgba($dark-text, 0.87); +$dark-accent-text: rgba($dark-primary-text, 0.54); +$dark-disabled-text: rgba($dark-primary-text, 0.38); +$dark-dividers: rgba($dark-primary-text, 0.12); +$dark-focused: rgba($dark-primary-text, 0.12); + +$mat-light-theme-foreground-palette: ( + base: black, + divider: $dark-dividers, + dividers: $dark-dividers, + disabled: $dark-disabled-text, + disabled-button: rgba($dark-text, 0.26), + disabled-text: $dark-disabled-text, + elevation: black, + secondary-text: $dark-accent-text, + hint-text: $dark-disabled-text, + accent-text: $dark-accent-text, + icon: $dark-accent-text, + icons: $dark-accent-text, + text: $dark-primary-text, + slider-min: $dark-primary-text, + slider-off: rgba($dark-text, 0.26), + slider-off-active: $dark-disabled-text, +); + +// Dark Theme text +$light-text: #ffffff; +$light-primary-text: $light-text; +$light-accent-text: rgba($light-primary-text, 0.7); +$light-disabled-text: rgba($light-primary-text, 0.5); +$light-dividers: rgba($light-primary-text, 0.12); +$light-focused: rgba($light-primary-text, 0.12); + +$mat-dark-theme-foreground-palette: ( + base: $light-text, + divider: $light-dividers, + dividers: $light-dividers, + disabled: $light-disabled-text, + disabled-button: rgba($light-text, 0.3), + disabled-text: $light-disabled-text, + elevation: black, + hint-text: $light-disabled-text, + secondary-text: $light-accent-text, + accent-text: $light-accent-text, + icon: $light-text, + icons: $light-text, + text: $light-text, + slider-min: $light-text, + slider-off: rgba($light-text, 0.3), + slider-off-active: rgba($light-text, 0.3), +); + +// Background config +// Light bg +$light-background: #fafafa; +$light-bg-darker-5: darken($light-background, 5%); +$light-bg-darker-10: darken($light-background, 10%); +$light-bg-darker-20: darken($light-background, 20%); +$light-bg-darker-30: darken($light-background, 30%); +$light-bg-lighter-5: lighten($light-background, 5%); +$dark-bg-tooltip: lighten(#121212, 20%); +$dark-bg-alpha-4: rgba(#121212, 0.04); +$dark-bg-alpha-12: rgba(#121212, 0.12); + +$mat-light-theme-background-palette: ( + background: $light-background, + status-bar: $light-bg-darker-20, + app-bar: $light-bg-darker-5, + hover: $dark-bg-alpha-4, + card: $light-bg-lighter-5, + dialog: $light-bg-lighter-5, + tooltip: $dark-bg-tooltip, + disabled-button: $dark-bg-alpha-12, + raised-button: $light-bg-lighter-5, + focused-button: $dark-focused, + selected-button: $light-bg-darker-20, + selected-disabled-button: $light-bg-darker-30, + disabled-button-toggle: $light-bg-darker-10, + unselected-chip: $light-bg-darker-10, + disabled-list-option: $light-bg-darker-10, +); + +// Dark bg +$dark-background: #121212; +$dark-bg-lighter-5: lighten($dark-background, 5%); +$dark-bg-lighter-10: lighten($dark-background, 10%); +$dark-bg-lighter-20: lighten($dark-background, 20%); +$dark-bg-lighter-30: lighten($dark-background, 30%); +$light-bg-alpha-4: rgba(#fafafa, 0.04); +$light-bg-alpha-12: rgba(#fafafa, 0.12); + +// Background palette for dark themes. +$mat-dark-theme-background-palette: ( + background: $dark-background, + status-bar: $dark-bg-lighter-20, + app-bar: $dark-bg-lighter-5, + hover: $light-bg-alpha-4, + card: $dark-bg-lighter-5, + dialog: $dark-bg-lighter-5, + tooltip: $dark-bg-lighter-20, + disabled-button: $light-bg-alpha-12, + raised-button: $dark-bg-lighter-5, + focused-button: $light-focused, + selected-button: $dark-bg-lighter-20, + selected-disabled-button: $dark-bg-lighter-30, + disabled-button-toggle: $dark-bg-lighter-10, + unselected-chip: $dark-bg-lighter-20, + disabled-list-option: $dark-bg-lighter-10, +); + +// Compute font config +@include mat-core($fontConfig); + +// Theme Config + +body { + --primary-color: #272727; + --primary-lighter-color: #bebebe; + --primary-darker-color: #171717; + --text-primary-color: #{$light-primary-text}; + --text-primary-lighter-color: #{$dark-primary-text}; + --text-primary-darker-color: #{$light-primary-text}; +} +$mat-primary: ( + main: #272727, + lighter: #bebebe, + darker: #171717, + 200: #272727, + // For slide toggle, + contrast: + ( + main: $light-primary-text, + lighter: $dark-primary-text, + darker: $light-primary-text, + ), +); +$theme-primary: mat-palette($mat-primary, main, lighter, darker); + +body { + --accent-color: #43a047; + --accent-lighter-color: #c7e3c8; + --accent-darker-color: #2c842f; + --text-accent-color: #{$light-primary-text}; + --text-accent-lighter-color: #{$dark-primary-text}; + --text-accent-darker-color: #{$light-primary-text}; +} +$mat-accent: ( + main: #43a047, + lighter: #c7e3c8, + darker: #2c842f, + 200: #43a047, + // For slide toggle, + contrast: + ( + main: $light-primary-text, + lighter: $dark-primary-text, + darker: $light-primary-text, + ), +); +$theme-accent: mat-palette($mat-accent, main, lighter, darker); + +body { + --warn-color: #f4511e; + --warn-lighter-color: #fccbbc; + --warn-darker-color: #ef3712; + --text-warn-color: #{$light-primary-text}; + --text-warn-lighter-color: #{$dark-primary-text}; + --text-warn-darker-color: #{$light-primary-text}; +} +$mat-warn: ( + main: #f4511e, + lighter: #fccbbc, + darker: #ef3712, + 200: #f4511e, + // For slide toggle, + contrast: + ( + main: $light-primary-text, + lighter: $dark-primary-text, + darker: $light-primary-text, + ), +); +$theme-warn: mat-palette($mat-warn, main, lighter, darker); +$theme: mat-dark-theme($theme-primary, $theme-accent, $theme-warn); +$altTheme: mat-light-theme($theme-primary, $theme-accent, $theme-warn); + +// Theme Init +@include angular-material-theme($theme); + +.theme-alternate { + @include angular-material-theme($altTheme); +} + +// Specific component overrides, pieces that are not in line with the general theming + +// Handle buttons appropriately, with respect to line-height +.mat-raised-button, +.mat-stroked-button, +.mat-flat-button { + padding: 0 1.15em; + margin: 0 0.65em; + min-width: 3em; + line-height: 36.4px; +} + +.mat-standard-chip { + padding: 0.5em 0.85em; + min-height: 2.5em; +} + +.material-icons { + font-size: 24px; + font-family: "Material Icons Round", "Material Icons"; + .mat-badge-content { + font-family: "Roboto"; + } +} diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index 2477497..a0e23ad 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -1,284 +1 @@ -/** -* Generated theme by Material Theme Generator -* https://materialtheme.arcsine.dev -* Fork at: https://materialtheme.arcsine.dev/?c=YHBhbGV0dGU$YHByaW1hcnk$YF48IzI3MjcyNyIsIj9lcjwjYmViZWJlIiwiO2VyPCMxNzE3MTd$LCIlPmBePCM0M2EwNDciLCI~ZXI8I2M3ZTNjOCIsIjtlcjwjMmM4NDJmfiwid2Fybj5gXjwjZjQ1MTFlIiwiP2VyPCNmY2NiYmMiLCI7ZXI8I2VmMzcxMn4sIj9UZXh0PCMwMDAwMDAiLCI~PTwjZmFmYWZhIiwiO1RleHQ8I2ZmZmZmZiIsIjs9PCMxMjEyMTJ$LCJmb250cz5bYEA8KC00fixgQDwoLTN$LGBAPCgtMn4sYEA8KC0xfixgQDxoZWFkbGluZX4sYEA8dGl0bGV$LGBAPHN1YiktMn4sYEA8c3ViKS0xfixgQDxib2R5LTJ$LGBAPGJvZHktMX4sYEA8YnV0dG9ufixgQDxjYXB0aW9ufixgQDxpbnB1dCIsInNpemU$bnVsbH1dLCJpY29uczxSb3VuZGVkIiwiP25lc3M$ZmFsc2UsInZlcnNpb24$MTF9 -*/ - -@import "~@angular/material/theming"; - -// Include the common styles for Angular Material. We include this here so that you only -// have to load a single css file for Angular Material in your app. - -// Fonts -@import "https://fonts.googleapis.com/icon?family=Material+Icons+Round"; -@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap"); - -$fontConfig: ( - display-4: mat-typography-level(112px, 112px, 300, "Roboto", -0.0134em), - display-3: mat-typography-level(56px, 56px, 400, "Roboto", -0.0089em), - display-2: mat-typography-level(45px, 48px, 400, "Roboto", 0em), - display-1: mat-typography-level(34px, 40px, 400, "Roboto", 0.0074em), - headline: mat-typography-level(24px, 32px, 400, "Roboto", 0em), - title: mat-typography-level(20px, 32px, 500, "Roboto", 0.0075em), - subheading-2: mat-typography-level(16px, 28px, 400, "Roboto", 0.0094em), - subheading-1: mat-typography-level(15px, 24px, 500, "Roboto", 0.0067em), - body-2: mat-typography-level(14px, 24px, 500, "Roboto", 0.0179em), - body-1: mat-typography-level(14px, 20px, 400, "Roboto", 0.0179em), - button: mat-typography-level(14px, 14px, 500, "Roboto", 0.0893em), - caption: mat-typography-level(12px, 20px, 400, "Roboto", 0.0333em), - input: mat-typography-level(inherit, 1.125, 400, "Roboto", 1.5px), -); - -// Foreground Elements - -// Light Theme Text -$dark-text: #000000; -$dark-primary-text: rgba($dark-text, 0.87); -$dark-accent-text: rgba($dark-primary-text, 0.54); -$dark-disabled-text: rgba($dark-primary-text, 0.38); -$dark-dividers: rgba($dark-primary-text, 0.12); -$dark-focused: rgba($dark-primary-text, 0.12); - -$mat-light-theme-foreground-palette: ( - base: black, - divider: $dark-dividers, - dividers: $dark-dividers, - disabled: $dark-disabled-text, - disabled-button: rgba($dark-text, 0.26), - disabled-text: $dark-disabled-text, - elevation: black, - secondary-text: $dark-accent-text, - hint-text: $dark-disabled-text, - accent-text: $dark-accent-text, - icon: $dark-accent-text, - icons: $dark-accent-text, - text: $dark-primary-text, - slider-min: $dark-primary-text, - slider-off: rgba($dark-text, 0.26), - slider-off-active: $dark-disabled-text, -); - -// Dark Theme text -$light-text: #ffffff; -$light-primary-text: $light-text; -$light-accent-text: rgba($light-primary-text, 0.7); -$light-disabled-text: rgba($light-primary-text, 0.5); -$light-dividers: rgba($light-primary-text, 0.12); -$light-focused: rgba($light-primary-text, 0.12); - -$mat-dark-theme-foreground-palette: ( - base: $light-text, - divider: $light-dividers, - dividers: $light-dividers, - disabled: $light-disabled-text, - disabled-button: rgba($light-text, 0.3), - disabled-text: $light-disabled-text, - elevation: black, - hint-text: $light-disabled-text, - secondary-text: $light-accent-text, - accent-text: $light-accent-text, - icon: $light-text, - icons: $light-text, - text: $light-text, - slider-min: $light-text, - slider-off: rgba($light-text, 0.3), - slider-off-active: rgba($light-text, 0.3), -); - -// Background config -// Light bg -$light-background: #fafafa; -$light-bg-darker-5: darken($light-background, 5%); -$light-bg-darker-10: darken($light-background, 10%); -$light-bg-darker-20: darken($light-background, 20%); -$light-bg-darker-30: darken($light-background, 30%); -$light-bg-lighter-5: lighten($light-background, 5%); -$dark-bg-tooltip: lighten(#121212, 20%); -$dark-bg-alpha-4: rgba(#121212, 0.04); -$dark-bg-alpha-12: rgba(#121212, 0.12); - -$mat-light-theme-background-palette: ( - background: $light-background, - status-bar: $light-bg-darker-20, - app-bar: $light-bg-darker-5, - hover: $dark-bg-alpha-4, - card: $light-bg-lighter-5, - dialog: $light-bg-lighter-5, - tooltip: $dark-bg-tooltip, - disabled-button: $dark-bg-alpha-12, - raised-button: $light-bg-lighter-5, - focused-button: $dark-focused, - selected-button: $light-bg-darker-20, - selected-disabled-button: $light-bg-darker-30, - disabled-button-toggle: $light-bg-darker-10, - unselected-chip: $light-bg-darker-10, - disabled-list-option: $light-bg-darker-10, -); - -// Dark bg -$dark-background: #121212; -$dark-bg-lighter-5: lighten($dark-background, 5%); -$dark-bg-lighter-10: lighten($dark-background, 10%); -$dark-bg-lighter-20: lighten($dark-background, 20%); -$dark-bg-lighter-30: lighten($dark-background, 30%); -$light-bg-alpha-4: rgba(#fafafa, 0.04); -$light-bg-alpha-12: rgba(#fafafa, 0.12); - -// Background palette for dark themes. -$mat-dark-theme-background-palette: ( - background: $dark-background, - status-bar: $dark-bg-lighter-20, - app-bar: $dark-bg-lighter-5, - hover: $light-bg-alpha-4, - card: $dark-bg-lighter-5, - dialog: $dark-bg-lighter-5, - tooltip: $dark-bg-lighter-20, - disabled-button: $light-bg-alpha-12, - raised-button: $dark-bg-lighter-5, - focused-button: $light-focused, - selected-button: $dark-bg-lighter-20, - selected-disabled-button: $dark-bg-lighter-30, - disabled-button-toggle: $dark-bg-lighter-10, - unselected-chip: $dark-bg-lighter-20, - disabled-list-option: $dark-bg-lighter-10, -); - -// Compute font config -@include mat-core($fontConfig); - -// Theme Config - -body { - --primary-color: #272727; - --primary-lighter-color: #bebebe; - --primary-darker-color: #171717; - --text-primary-color: #{$light-primary-text}; - --text-primary-lighter-color: #{$dark-primary-text}; - --text-primary-darker-color: #{$light-primary-text}; -} -$mat-primary: ( - main: #272727, - lighter: #bebebe, - darker: #171717, - 200: #272727, - // For slide toggle, - contrast: - ( - main: $light-primary-text, - lighter: $dark-primary-text, - darker: $light-primary-text, - ), -); -$theme-primary: mat-palette($mat-primary, main, lighter, darker); - -body { - --accent-color: #43a047; - --accent-lighter-color: #c7e3c8; - --accent-darker-color: #2c842f; - --text-accent-color: #{$light-primary-text}; - --text-accent-lighter-color: #{$dark-primary-text}; - --text-accent-darker-color: #{$light-primary-text}; -} -$mat-accent: ( - main: #43a047, - lighter: #c7e3c8, - darker: #2c842f, - 200: #43a047, - // For slide toggle, - contrast: - ( - main: $light-primary-text, - lighter: $dark-primary-text, - darker: $light-primary-text, - ), -); -$theme-accent: mat-palette($mat-accent, main, lighter, darker); - -body { - --warn-color: #f4511e; - --warn-lighter-color: #fccbbc; - --warn-darker-color: #ef3712; - --text-warn-color: #{$light-primary-text}; - --text-warn-lighter-color: #{$dark-primary-text}; - --text-warn-darker-color: #{$light-primary-text}; -} -$mat-warn: ( - main: #f4511e, - lighter: #fccbbc, - darker: #ef3712, - 200: #f4511e, - // For slide toggle, - contrast: - ( - main: $light-primary-text, - lighter: $dark-primary-text, - darker: $light-primary-text, - ), -); -$theme-warn: mat-palette($mat-warn, main, lighter, darker); -$theme: mat-dark-theme($theme-primary, $theme-accent, $theme-warn); -$altTheme: mat-light-theme($theme-primary, $theme-accent, $theme-warn); - -// Theme Init -@include angular-material-theme($theme); - -.theme-alternate { - @include angular-material-theme($altTheme); -} - -// Specific component overrides, pieces that are not in line with the general theming - -// Handle buttons appropriately, with respect to line-height -.mat-raised-button, -.mat-stroked-button, -.mat-flat-button { - padding: 0 1.15em; - margin: 0 0.65em; - min-width: 3em; - line-height: 36.4px; -} - -.mat-standard-chip { - padding: 0.5em 0.85em; - min-height: 2.5em; -} - -.material-icons { - font-size: 24px; - font-family: "Material Icons Round", "Material Icons"; - .mat-badge-content { - font-family: "Roboto"; - } -} - - -// Include bootstrap-grid.scss from node_modules -@import "../node_modules/bootstrap/scss/bootstrap-grid.scss"; - -html, -body { - height: 100%; -} - -app-root { - height: 100%; - - display: flex; - flex-direction: column; -} - -html { - box-sizing: border-box; -} -*, -*:before, -*:after { - box-sizing: inherit; - - -webkit-transition: 0.2s; - -moz-transition: 0.2s; - -o-transition: 0.2s; - transition: 0.2s; -} - @import "./scss"; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index cb228c3..5cdb6ea 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -19,7 +19,7 @@ "importHelpers": true }, "files": ["src/main.ts", "src/polyfills.ts"], - "include": ["src/**/*.d.ts", "src/**/*.ts"], + "include": ["src/**/*.d.ts", "src/app/**/*.ts"], "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, "strictInjectionParameters": true,