diff --git a/web/angular.json b/web/angular.json index 4b7c0b9e1..2cd9912a1 100644 --- a/web/angular.json +++ b/web/angular.json @@ -45,7 +45,6 @@ ], "styles": [ "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", - "node_modules/@taiga-ui/styles/taiga-ui-global.less", "projects/shared/styles/taiga.scss", "projects/shared/styles/shared.scss", "projects/ui/src/styles.scss" diff --git a/web/package-lock.json b/web/package-lock.json index 14abe3b1b..e444b830a 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -25,19 +25,18 @@ "@noble/hashes": "^1.4.0", "@start9labs/argon2": "^0.2.2", "@start9labs/start-sdk": "file:../sdk/baseDist", - "@taiga-ui/addon-charts": "4.21.0", - "@taiga-ui/addon-commerce": "4.21.0", - "@taiga-ui/addon-mobile": "4.21.0", - "@taiga-ui/addon-table": "4.21.0", - "@taiga-ui/cdk": "4.21.0", - "@taiga-ui/core": "4.21.0", - "@taiga-ui/event-plugins": "4.3.1", - "@taiga-ui/icons": "4.21.0", - "@taiga-ui/kit": "4.21.0", - "@taiga-ui/layout": "4.21.0", - "@taiga-ui/legacy": "4.21.0", + "@taiga-ui/addon-charts": "4.24.0", + "@taiga-ui/addon-commerce": "4.24.0", + "@taiga-ui/addon-mobile": "4.24.0", + "@taiga-ui/addon-table": "4.24.0", + "@taiga-ui/cdk": "4.24.0", + "@taiga-ui/core": "4.24.0", + "@taiga-ui/event-plugins": "4.4.0", + "@taiga-ui/icons": "4.24.0", + "@taiga-ui/kit": "4.24.0", + "@taiga-ui/layout": "4.24.0", + "@taiga-ui/legacy": "4.24.0", "@taiga-ui/polymorpheus": "4.8.0", - "@taiga-ui/styles": "4.21.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -4416,9 +4415,9 @@ "link": true }, "node_modules/@taiga-ui/addon-charts": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-4.21.0.tgz", - "integrity": "sha512-ai213WTf+VG3hYLrusWJiSj7fY+Z5HjeZLmEJIMvFswzV8+Ekiiqb95+BnBUQaie6bwu3yAhcadwgun7u2Rq3w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-4.24.0.tgz", + "integrity": "sha512-x75l4Dj1l7ForatbIdk4O8NzM6fQlKRp9UsXzMrKSoKj9O3jGHsFyMV67FhBS9oVitU4+3MIgPLuj09qpG1gBg==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4427,15 +4426,15 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@ng-web-apis/common": "^4.11.1", - "@taiga-ui/cdk": "^4.21.0", - "@taiga-ui/core": "^4.21.0", + "@taiga-ui/cdk": "^4.24.0", + "@taiga-ui/core": "^4.24.0", "@taiga-ui/polymorpheus": "^4.8.0" } }, "node_modules/@taiga-ui/addon-commerce": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-4.21.0.tgz", - "integrity": "sha512-CmibFfEsSW2h9k6/NcAiverxiMZDk1e15j10Uupfodn7vpZk3u4j4/c8aS4klV4Hk3lC5UCCvpYVLpx/c9u+/A==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-4.24.0.tgz", + "integrity": "sha512-YAbhTZHXnN5TT9oO+KJX/NAehuHgMZ/QoVIuzQR16HiIoKTQQWznSipThnX2hinXrLNBas0O2Teo4Ij5kGIEOQ==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4448,18 +4447,18 @@ "@maskito/core": "^3.2.1", "@maskito/kit": "^3.2.1", "@ng-web-apis/common": "^4.11.1", - "@taiga-ui/cdk": "^4.21.0", - "@taiga-ui/core": "^4.21.0", - "@taiga-ui/i18n": "^4.21.0", - "@taiga-ui/kit": "^4.21.0", + "@taiga-ui/cdk": "^4.24.0", + "@taiga-ui/core": "^4.24.0", + "@taiga-ui/i18n": "^4.24.0", + "@taiga-ui/kit": "^4.24.0", "@taiga-ui/polymorpheus": "^4.8.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/addon-mobile": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-4.21.0.tgz", - "integrity": "sha512-AIklfOfgiTuCFHvGb9Ok1nNtkelrEZmoeOQsLEH0wIA0+Ou/6XeAG03BkwrIJq4yQ1AI+ZCFeVNtl17bg+EzkA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-4.24.0.tgz", + "integrity": "sha512-YdkhhgWsmtgi85sPbjibqa/BxdqKkETav/6O0KgFmBGvS4MF/Hr2sOXWMDUfskSALee9BJBNPdf8NrV/zNpcXw==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4469,17 +4468,18 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@ng-web-apis/common": "^4.11.1", - "@taiga-ui/cdk": "^4.21.0", - "@taiga-ui/core": "^4.21.0", - "@taiga-ui/kit": "^4.21.0", + "@taiga-ui/cdk": "^4.24.0", + "@taiga-ui/core": "^4.24.0", + "@taiga-ui/kit": "^4.24.0", + "@taiga-ui/layout": "^4.24.0", "@taiga-ui/polymorpheus": "^4.8.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/addon-table": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-table/-/addon-table-4.21.0.tgz", - "integrity": "sha512-A3j4mfsM/S+IRQOEfZwVTFhy0zTSeeM7/ZHgQwuau7Xn8UN6S8X0HvZ2LCg6ZMJaXU1W79XMm2j1uLa/BDFcog==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-table/-/addon-table-4.24.0.tgz", + "integrity": "sha512-da/5FUmyrG6+pS9XgBY7B78EU6O1M9GPh9fxTtYTDjRgEpFdb/4TX0J79v5InSTGQV77ITVkpqbTB1moRgUVfA==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4488,18 +4488,18 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@ng-web-apis/intersection-observer": "^4.11.1", - "@taiga-ui/cdk": "^4.21.0", - "@taiga-ui/core": "^4.21.0", - "@taiga-ui/i18n": "^4.21.0", - "@taiga-ui/kit": "^4.21.0", + "@taiga-ui/cdk": "^4.24.0", + "@taiga-ui/core": "^4.24.0", + "@taiga-ui/i18n": "^4.24.0", + "@taiga-ui/kit": "^4.24.0", "@taiga-ui/polymorpheus": "^4.8.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-4.21.0.tgz", - "integrity": "sha512-PfHMELF2OHO7GNjdyfz1LpyjrsQMEa7oqZoyqz5s4W7W/KWpds3Cm6RP2inFQsZofXrJQNDGtThb1UgNYH5AsQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-4.24.0.tgz", + "integrity": "sha512-vsI+Jyzj4yfMolCg42OOyDvT30g1WFoupfOGlUk8A9R2HTVhMTeFeoA186A7c5KLI3e9fxj/60Rc9LbIbacnDA==", "license": "Apache-2.0", "dependencies": { "tslib": "2.8.1" @@ -4522,15 +4522,15 @@ "@ng-web-apis/platform": "^4.11.1", "@ng-web-apis/resize-observer": "^4.11.1", "@ng-web-apis/screen-orientation": "^4.11.1", - "@taiga-ui/event-plugins": "^4.3.1", + "@taiga-ui/event-plugins": "^4.4.0", "@taiga-ui/polymorpheus": "^4.8.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/core": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-4.21.0.tgz", - "integrity": "sha512-O91kueQldSGCxR+IshcgwAOJukwkV2gEu/MBhw7t5fDEvW6aNbKjFl/RZcDSMguVIzOdRAyTrWm+UyVLYeOphA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-4.24.0.tgz", + "integrity": "sha512-tHHxdwXtvMI8W2Ct1YgLZGg5UEDRPq3j3fYwLV0P/G+17TU1rVeF9/JxVe8ZdZ1Mo55LNLDflTnenC13GK0R/w==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4544,17 +4544,17 @@ "@angular/router": ">=16.0.0", "@ng-web-apis/common": "^4.11.1", "@ng-web-apis/mutation-observer": "^4.11.1", - "@taiga-ui/cdk": "^4.21.0", - "@taiga-ui/event-plugins": "^4.3.1", - "@taiga-ui/i18n": "^4.21.0", + "@taiga-ui/cdk": "^4.24.0", + "@taiga-ui/event-plugins": "^4.4.0", + "@taiga-ui/i18n": "^4.24.0", "@taiga-ui/polymorpheus": "^4.8.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/event-plugins": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/event-plugins/-/event-plugins-4.3.1.tgz", - "integrity": "sha512-DhD1hdOYNidngdkxQQDGKawfn6fuhPcVVsbafZIJNAgw5P1+nN9b+J/3DB+GJJ1X3ODyMDl73Qubz0lPlMdRGw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/event-plugins/-/event-plugins-4.4.0.tgz", + "integrity": "sha512-Tv8C0p5EZXl7s1Vc+MrLbAblbYvyswomY/xvyFcI9NgMj6JyfsStu6jpCiRMfzojz3G70PRFsk0+WwI19lRJCQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.3.0" @@ -4566,9 +4566,9 @@ } }, "node_modules/@taiga-ui/i18n": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-4.23.0.tgz", - "integrity": "sha512-+7AxbAKeQYmS0uK0LqhDqCDwJhuZlNhO4vZ8FTjmgPDWKF/VeRua+v7ei1pp3b6u+n8ADn9wq7Y2oitLjrH2gg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-4.24.0.tgz", + "integrity": "sha512-F3s+SGJ6QkGIWDpTcJvqiE++WHHF95o11tokQvzFq9pCLfMrxehNx38Dv/JnZK3FA2vYlVqdaQc0OsRMfMDRMw==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -4581,18 +4581,18 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-4.21.0.tgz", - "integrity": "sha512-lzUYj/LOIFVJqdhzl0mgFUMASicQb2b+0MG5YELZik69hU+QAAKjCBzqDAaOqIMA/MVnERXiOxl62yWLjBR9+Q==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-4.24.0.tgz", + "integrity": "sha512-VGWKMuVayab+/MJ60JuxRM2zTJG2WelDmUuTMdYqnh+zAWTn7FoPjDgAREiT7m84XryZdKtkUqGK6aLI+J62Sg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.3.0" } }, "node_modules/@taiga-ui/kit": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-4.21.0.tgz", - "integrity": "sha512-7/V6laRXsu+CQA+LnVVQJhb0m6hH1/FbElqictaiIyIKguIELpq64XMcspEPpnkVkEMatn47YA4xPH6PCF5Mng==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-4.24.0.tgz", + "integrity": "sha512-qz+OpsAyHWUT6fcfBPd+RJTv98J5USezh028B7TpSLSSyRE6mbklKIj2gteJQVnwVS0AXwm69WgQDXMVolbJnw==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4610,17 +4610,17 @@ "@ng-web-apis/intersection-observer": "^4.11.1", "@ng-web-apis/mutation-observer": "^4.11.1", "@ng-web-apis/resize-observer": "^4.11.1", - "@taiga-ui/cdk": "^4.21.0", - "@taiga-ui/core": "^4.21.0", - "@taiga-ui/i18n": "^4.21.0", + "@taiga-ui/cdk": "^4.24.0", + "@taiga-ui/core": "^4.24.0", + "@taiga-ui/i18n": "^4.24.0", "@taiga-ui/polymorpheus": "^4.8.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/layout": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/layout/-/layout-4.21.0.tgz", - "integrity": "sha512-st8CEVPZSNCC9a/6pEbzMYO0vdHSWvua/nHoNbE4100AkW593DBQD2442LMF7ENRjFrPS+Ffuv8s5GFGasE/nw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/layout/-/layout-4.24.0.tgz", + "integrity": "sha512-xwWB2iXeQWipzw0jTvqFL6V/20bhyM5lNT2AyAo6EcI8fX1N8x/RThaz9crf1jexajynHm4qirGT1M8tblg+Pw==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4628,17 +4628,17 @@ "peerDependencies": { "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", - "@taiga-ui/cdk": "^4.21.0", - "@taiga-ui/core": "^4.21.0", - "@taiga-ui/kit": "^4.21.0", + "@taiga-ui/cdk": "^4.24.0", + "@taiga-ui/core": "^4.24.0", + "@taiga-ui/kit": "^4.24.0", "@taiga-ui/polymorpheus": "^4.8.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/legacy": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/legacy/-/legacy-4.21.0.tgz", - "integrity": "sha512-B6QeYOyJ5F8WtrL/H3Wa1tiWogH8ruS1aGysASrDSo7wZfS66AzjAdNUuHX3L3HJcqp0xAAVDKL/LNW2S/fckg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/legacy/-/legacy-4.24.0.tgz", + "integrity": "sha512-J3CJwDuaVV1zMUunZWru6Syg1cFPL0uF8qWyAis+tgllfYxFpUstvJfKhqezSauXifFsDqcLJYKGu3/fMLIsmA==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4660,16 +4660,6 @@ "@angular/platform-browser": ">=16.0.0" } }, - "node_modules/@taiga-ui/styles": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-4.21.0.tgz", - "integrity": "sha512-ZFbE1nIz0V3R/4ufXGJxxA+cX17dM7efFT38QKmZpsfSyGJBeASg1FQ5ENqIE3lR8kq+GmNNtro4oo+uCjH/7w==", - "peerDependencies": { - "@taiga-ui/cdk": "^4.21.0", - "@taiga-ui/core": "^4.21.0", - "tslib": ">=2.8.1" - } - }, "node_modules/@tinkoff/ng-dompurify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@tinkoff/ng-dompurify/-/ng-dompurify-4.0.0.tgz", diff --git a/web/package.json b/web/package.json index 253edf38d..ac7946b50 100644 --- a/web/package.json +++ b/web/package.json @@ -47,19 +47,18 @@ "@noble/hashes": "^1.4.0", "@start9labs/argon2": "^0.2.2", "@start9labs/start-sdk": "file:../sdk/baseDist", - "@taiga-ui/addon-charts": "4.21.0", - "@taiga-ui/addon-commerce": "4.21.0", - "@taiga-ui/addon-mobile": "4.21.0", - "@taiga-ui/addon-table": "4.21.0", - "@taiga-ui/cdk": "4.21.0", - "@taiga-ui/core": "4.21.0", - "@taiga-ui/event-plugins": "4.3.1", - "@taiga-ui/icons": "4.21.0", - "@taiga-ui/kit": "4.21.0", - "@taiga-ui/layout": "4.21.0", - "@taiga-ui/legacy": "4.21.0", + "@taiga-ui/addon-charts": "4.24.0", + "@taiga-ui/addon-commerce": "4.24.0", + "@taiga-ui/addon-mobile": "4.24.0", + "@taiga-ui/addon-table": "4.24.0", + "@taiga-ui/cdk": "4.24.0", + "@taiga-ui/core": "4.24.0", + "@taiga-ui/event-plugins": "4.4.0", + "@taiga-ui/icons": "4.24.0", + "@taiga-ui/kit": "4.24.0", + "@taiga-ui/layout": "4.24.0", + "@taiga-ui/legacy": "4.24.0", "@taiga-ui/polymorpheus": "4.8.0", - "@taiga-ui/styles": "4.21.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/web/projects/marketplace/src/pages/list/search/search.component.ts b/web/projects/marketplace/src/pages/list/search/search.component.ts index 835facd9f..274598902 100644 --- a/web/projects/marketplace/src/pages/list/search/search.component.ts +++ b/web/projects/marketplace/src/pages/list/search/search.component.ts @@ -2,12 +2,9 @@ import { ChangeDetectionStrategy, Component, EventEmitter, - inject, Input, Output, } from '@angular/core' -import { Router } from '@angular/router' -import { THEME } from '@start9labs/shared' @Component({ selector: 'marketplace-search', @@ -21,8 +18,6 @@ export class SearchComponent { @Output() readonly queryChange = new EventEmitter() - private readonly router = inject(Router) - readonly theme$ = inject(THEME) onModelChange(query: string) { this.query = query diff --git a/web/projects/marketplace/src/pages/show/about/about.component.html b/web/projects/marketplace/src/pages/show/about/about.component.html index 618ba9a75..fd54747c1 100644 --- a/web/projects/marketplace/src/pages/show/about/about.component.html +++ b/web/projects/marketplace/src/pages/show/about/about.component.html @@ -18,7 +18,7 @@ tuiButton iconEnd="@tui.external-link" size="s" - appearance="glass" + appearance="secondary-grayscale" target="_blank" rel="noreferrer" [href]="url" diff --git a/web/projects/shared/assets/img/background_dark.jpeg b/web/projects/shared/assets/img/background_dark.jpeg index 59ed7d7d7..c59176dfe 100644 Binary files a/web/projects/shared/assets/img/background_dark.jpeg and b/web/projects/shared/assets/img/background_dark.jpeg differ diff --git a/web/projects/shared/src/public-api.ts b/web/projects/shared/src/public-api.ts index e2ab9bff1..0f4b2c84b 100644 --- a/web/projects/shared/src/public-api.ts +++ b/web/projects/shared/src/public-api.ts @@ -46,7 +46,6 @@ export * from './types/url' export * from './types/workspace-config' export * from './tokens/relative-url' -export * from './tokens/theme' export * from './util/base-64' export * from './util/convert-ansi' diff --git a/web/projects/shared/src/tokens/theme.ts b/web/projects/shared/src/tokens/theme.ts deleted file mode 100644 index dc6bbc2da..000000000 --- a/web/projects/shared/src/tokens/theme.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { InjectionToken } from '@angular/core' -import { EMPTY, Observable } from 'rxjs' - -export const THEME = new InjectionToken>('App theme', { - factory: () => EMPTY, -}) diff --git a/web/projects/shared/styles/taiga.scss b/web/projects/shared/styles/taiga.scss index a36186160..2f8f0c899 100644 --- a/web/projects/shared/styles/taiga.scss +++ b/web/projects/shared/styles/taiga.scss @@ -1,184 +1,102 @@ @import '@taiga-ui/core/styles/taiga-ui-local'; -:root { - --tui-background-accent-1: #3880ff; - --tui-background-accent-1-hover: #4c8dff; - --tui-background-accent-1-pressed: #3171e0; +[tuiTheme='dark'] { + --tui-background-base: rgba(23, 23, 23, 1); + --tui-background-base-alt: rgba(23, 24, 29, 1); + --tui-background-neutral-1: rgba(255, 255, 255, 0.06); + --tui-background-neutral-1-hover: rgba(255, 255, 255, 0.12); + --tui-background-neutral-1-pressed: rgba(255, 255, 255, 0.18); + --tui-background-neutral-2: rgba(255, 255, 255, 0.16); + --tui-background-neutral-2-hover: rgba(255, 255, 255, 0.2); + --tui-background-neutral-2-pressed: rgba(255, 255, 255, 0.24); + + --tui-background-accent-1: rgba(53, 96, 240, 1); + --tui-background-accent-1-hover: rgba(50, 92, 227, 1); + --tui-background-accent-1-pressed: rgba(50, 92, 227, 1); /* update */ + --tui-background-accent-2: rgba(180, 59, 201, 1); + --tui-background-accent-2-hover: rgba(166, 0, 191, 1); + --tui-background-accent-2-pressed: rgba(166, 0, 191, 1); /* update */ + + --tui-background-elevation-1: rgba(23, 24, 29, 1); + --tui-background-elevation-2: rgba(33, 33, 33, 1); + --tui-background-elevation-3: rgba(34, 34, 34, 1); + + --tui-border-normal: rgba(255, 255, 255, 0.14); + --tui-border-hover: rgba(255, 255, 255, 0.4); + + --tui-status-negative: rgba(236, 46, 52, 1); + --tui-status-negative-pale: color-mix(in hsl, var(--tui-status-negative) 12%, transparent); + --tui-status-negative-pale-hover: color-mix(in hsl, var(--tui-status-negative) 24%, transparent); + --tui-status-positive: rgba(0, 151, 0, 1); /* update */ + --tui-status-positive-pale: color-mix(in hsl, var(--tui-status-positive) 12%, transparent); + --tui-status-positive-pale-hover: color-mix(in hsl, var(--tui-status-positive) 24%, transparent); + --tui-status-warning: rgba(255, 179, 0, 1); + --tui-status-warning-pale: color-mix(in hsl, var(--tui-status-warning) 12%, transparent); + --tui-status-warning-pale-hover: color-mix(in hsl, var(--tui-status-warning) 24%, transparent); + --tui-status-info: rgba(128, 89, 229, 1); + --tui-status-info-pale: color-mix(in hsl, var(--tui-status-info) 12%, transparent); + --tui-status-info-pale-hover: color-mix(in hsl, var(--tui-status-info) 24%, transparent); + --tui-status-neutral: rgba(137, 137, 137, 1); + + --tui-text-primary: rgba(255, 255, 255, 1); + --tui-text-secondary: rgba(255, 255, 255, 0.7); + --tui-text-tertiary: rgba(255, 255, 255, 0.5); + + --tui-text-action: rgba(53, 96, 240, 1); + --tui-text-action-hover: rgba(50, 92, 227, 1); + --tui-text-positive: rgba(0, 151, 0, 1); /* update */ + --tui-text-positive-hover: rgba(0, 151, 0, 1); /* update */ + --tui-text-negative: rgba(236, 46, 52, 1); + --tui-text-negative-hover: rgba(236, 46, 52, 1); + + --start9-base-1: rgba(34, 36, 40, 1); + --start9-base-2: rgba(46, 47, 52, 1); + --start9-base-3: rgba(50, 51, 53, 1); + --start9-base-4: rgba(52, 54, 58, 1); + --start9-base-5: rgba(60, 62, 64, 1); } -/* stylelint-disable order/order */ -[tuiAppearance][data-appearance='secondary-warning'] { - background: var(--tui-status-warning-pale); - color: var(--tui-text-primary); - - @include appearance-hover { - background: var(--tui-status-warning-pale-hover); - } - - @include appearance-active { - background: var(--tui-status-warning-pale-hover); - } -} - -[tuiAppearance][data-appearance='icon-success'] { - color: var(--tui-status-positive); -} - -[tuiAppearance][data-appearance='icon-warning'] { - color: var(--tui-status-warning); -} - -[tuiAppearance][data-appearance='icon-error'] { - color: var(--tui-status-negative); -} - -[tuiAppearance][data-appearance='primary'] { +[tuiAppearance][data-appearance^='primary'] { @include appearance-disabled { - background: #eaecee; + background: var(--tui-status-neutral); color: #333; } } -[tuiAppearance][data-appearance='secondary-solid'] { - background: #3dc2ff; - color: #fff; - - @include appearance-hover { - background: #50c8ff; - } - - @include appearance-active { - background: #36abe0; - } - - @include appearance-disabled { - background: #eaecee; - color: #333; - } -} - -[tuiAppearance][data-appearance='tertiary-solid'] { - background: #5260ff; - color: #fff; - - @include appearance-hover { - background: #6370ff; - } - - @include appearance-active { - background: #4854e0; - } - - @include appearance-disabled { - background: #eaecee; - color: #333; - } -} - -[tuiAppearance][data-appearance='success-solid'] { - background: #2dd36f; - color: #fff; - - @include appearance-hover { - background: #42d77d; - } - - @include appearance-active { - background: #28ba62; - } - - @include appearance-disabled { - background: #eaecee; - color: #333; - } -} - -[tuiAppearance][data-appearance='warning-solid'] { - background: #ffc409; - color: #fff; - - @include appearance-hover { - background: #ffca22; - } - - @include appearance-active { - background: #e0ac08; - } - - @include appearance-disabled { - background: #eaecee; - color: #333; - } -} - -[tuiAppearance][data-appearance='danger-solid'] { - background: #eb445a; - color: #fff; - - @include appearance-hover { - background: #ed576b; - } - - @include appearance-active { - background: #cf3c4f; - } - - @include appearance-disabled { - background: #eaecee; - color: #333; - } -} - -[tuiAppearance][data-appearance='input-file'] { - &:hover, - &:active { - background: transparent !important; - } - - tui-root._mobile &::after { - display: none; - } -} - -tui-dialog { - transform: translate3d(0, 0, 0); -} - -tui-opt-group[data-label^='⚠️']::before { - color: var(--tui-status-warning); -} - tui-hint[data-appearance='onDark'] { background: white !important; color: #222 !important; } -[tuiLink] { - color: var(--tui-text-action) !important; - - &:hover { - color: var(--tui-text-action-hover) !important; - } -} - -[tuiAppearance][data-appearance='drawer'] { - // TODO: Theme - background: rgb(81 80 83 / 86%); - border-radius: 10rem; - - &._focused::after { - color: var(--tui-background-accent-1); - } -} - tui-dropdown[data-appearance='start-os'][data-appearance='start-os'] { border: 0; - border-top: 1px solid rgba(255, 255, 255, 0.1); backdrop-filter: blur(0.25rem); - box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); border-radius: 0.325rem; // TODO: Replace --tui-background-elevation-2 when Taiga UI is updated - background: rgb(63 63 63 / 80%); + background-color: color-mix( + in hsl, + var(--tui-background-elevation-3) 75%, + transparent + ); + background-image: linear-gradient( + to bottom, + rgba(255, 255, 255, 0.15), + transparent + ), + linear-gradient(to bottom, rgba(255, 255, 255, 0.15), transparent); + background-size: 1px 100%; + background-repeat: no-repeat; + background-position: + top left, + top right; + box-shadow: + 0 0.25rem 0.125rem rgba(0, 0, 0, 0.25), + 0 -0.125rem 0.25rem rgba(55, 155, 255, 0.08), + 0 0 0.5rem rgba(0, 0, 0, 0.3), + inset 0 -0.125rem rgba(255, 255, 255, 0.03), + inset 0 1px rgba(255, 255, 255, 0.15), + inset 0 0 1rem rgba(0, 0, 0, 0.25), + var(--tui-shadow-medium); tui-opt-group { &::before { @@ -215,3 +133,7 @@ a[tuiIconButton]:not([href]) { pointer-events: none; opacity: var(--tui-disabled-opacity); } + +tui-badge-notification { + background: var(--tui-status-negative); +} diff --git a/web/projects/ui/src/app/app.component.html b/web/projects/ui/src/app/app.component.html index 69be6a4f2..fffece163 100644 --- a/web/projects/ui/src/app/app.component.html +++ b/web/projects/ui/src/app/app.component.html @@ -1,4 +1,3 @@ - diff --git a/web/projects/ui/src/app/app.component.ts b/web/projects/ui/src/app/app.component.ts index 522f3c497..3d83b2c79 100644 --- a/web/projects/ui/src/app/app.component.ts +++ b/web/projects/ui/src/app/app.component.ts @@ -1,10 +1,8 @@ import { Component, inject, OnInit } from '@angular/core' import { takeUntilDestroyed } from '@angular/core/rxjs-interop' import { Title } from '@angular/platform-browser' -import { THEME } from '@start9labs/shared' import { PatchDB } from 'patch-db-client' import { combineLatest, map, merge, startWith } from 'rxjs' -import { AuthService } from './services/auth.service' import { ConnectionService } from './services/connection.service' import { PatchDataService } from './services/patch-data.service' import { DataModel } from './services/patch-db/data-model' @@ -19,8 +17,6 @@ export class AppComponent implements OnInit { private readonly title = inject(Title) private readonly patch = inject>(PatchDB) - readonly auth = inject(AuthService) - readonly theme$ = inject(THEME) readonly subscription = merge( inject(PatchDataService), inject(PatchMonitorService), @@ -30,14 +26,13 @@ export class AppComponent implements OnInit { readonly offline$ = combineLatest([ inject(ConnectionService), - this.auth.isVerified$, this.patch .watch$('serverInfo', 'statusInfo') .pipe(startWith({ restarting: false, shuttingDown: false })), ]).pipe( map( - ([connected, verified, status]) => - connected && (!verified || status.restarting || status.shuttingDown), + ([connected, { restarting, shuttingDown }]) => + connected && (restarting || shuttingDown), ), startWith(true), ) diff --git a/web/projects/ui/src/app/app.module.ts b/web/projects/ui/src/app/app.module.ts index 130ebe126..a5b3dbe86 100644 --- a/web/projects/ui/src/app/app.module.ts +++ b/web/projects/ui/src/app/app.module.ts @@ -4,7 +4,6 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { ServiceWorkerModule } from '@angular/service-worker' import { TuiRoot } from '@taiga-ui/core' import { SidebarHostComponent } from 'src/app/components/sidebar-host.component' -import { SvgDefinitionsComponent } from 'src/app/components/svg-definitions.component' import { ToastContainerComponent } from 'src/app/components/toast-container.component' import { environment } from '../environments/environment' import { AppComponent } from './app.component' @@ -26,7 +25,6 @@ import { RoutingModule } from './routing.module' registrationStrategy: 'registerWhenStable:30000', }), SidebarHostComponent, - SvgDefinitionsComponent, ], providers: APP_PROVIDERS, bootstrap: [AppComponent], diff --git a/web/projects/ui/src/app/app.providers.ts b/web/projects/ui/src/app/app.providers.ts index 5fca21e45..f4549492d 100644 --- a/web/projects/ui/src/app/app.providers.ts +++ b/web/projects/ui/src/app/app.providers.ts @@ -5,7 +5,7 @@ import { AbstractCategoryService, FilterPackagesPipe, } from '@start9labs/marketplace' -import { RELATIVE_URL, THEME, WorkspaceConfig } from '@start9labs/shared' +import { RELATIVE_URL, WorkspaceConfig } from '@start9labs/shared' import { TUI_DATE_FORMAT, TUI_DIALOGS_CLOSE, @@ -35,7 +35,6 @@ import { ClientStorageService } from './services/client-storage.service' import { DateTransformerService } from './services/date-transformer.service' import { DatetimeTransformerService } from './services/datetime-transformer.service' import { StorageService } from './services/storage.service' -import { ThemeSwitcherService } from './services/theme-switcher.service' const { useMocks, @@ -84,10 +83,6 @@ export const APP_PROVIDERS: Provider[] = [ provide: RELATIVE_URL, useValue: `/${api.url}/${api.version}`, }, - { - provide: THEME, - useExisting: ThemeSwitcherService, - }, { provide: AbstractCategoryService, useClass: CategoryService, diff --git a/web/projects/ui/src/app/components/svg-definitions.component.ts b/web/projects/ui/src/app/components/svg-definitions.component.ts deleted file mode 100644 index b73909485..000000000 --- a/web/projects/ui/src/app/components/svg-definitions.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -@Component({ - standalone: true, - selector: 'svg-definitions', - template: ` - - - - - - - - - - - - - - - - - - - - - - - - `, - styles: ` - :host { - position: absolute; - width: 0; - height: 0; - visibility: hidden; - } - `, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class SvgDefinitionsComponent {} diff --git a/web/projects/ui/src/app/routes/login/ca-wizard/ca-wizard.component.html b/web/projects/ui/src/app/routes/login/ca-wizard/ca-wizard.component.html index 3bcc305de..2e2dab50e 100644 --- a/web/projects/ui/src/app/routes/login/ca-wizard/ca-wizard.component.html +++ b/web/projects/ui/src/app/routes/login/ca-wizard/ca-wizard.component.html @@ -28,7 +28,6 @@ @@ -61,7 +60,7 @@ tuiButton size="s" class="refresh" - appearance="success-solid" + appearance="positive" iconEnd="@tui.refresh-cw" (click)="refresh()" > @@ -84,22 +83,13 @@
- +

Root CA Trusted!

You have successfully trusted your server's Root CA and may now log in securely.

-
diff --git a/web/projects/ui/src/app/routes/login/ca-wizard/ca-wizard.component.ts b/web/projects/ui/src/app/routes/login/ca-wizard/ca-wizard.component.ts index f206d071e..179215f2e 100644 --- a/web/projects/ui/src/app/routes/login/ca-wizard/ca-wizard.component.ts +++ b/web/projects/ui/src/app/routes/login/ca-wizard/ca-wizard.component.ts @@ -1,7 +1,7 @@ import { CommonModule, DOCUMENT } from '@angular/common' import { Component, inject } from '@angular/core' import { RELATIVE_URL } from '@start9labs/shared' -import { TuiAppearance, TuiButton, TuiIcon, TuiSurface } from '@taiga-ui/core' +import { TuiButton, TuiIcon, TuiSurface } from '@taiga-ui/core' import { TuiCardLarge } from '@taiga-ui/layout' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ConfigService } from 'src/app/services/config.service' @@ -11,14 +11,7 @@ import { ConfigService } from 'src/app/services/config.service' selector: 'ca-wizard', templateUrl: './ca-wizard.component.html', styleUrls: ['./ca-wizard.component.scss'], - imports: [ - CommonModule, - TuiIcon, - TuiButton, - TuiAppearance, - TuiCardLarge, - TuiSurface, - ], + imports: [CommonModule, TuiIcon, TuiButton, TuiCardLarge, TuiSurface], }) export class CAWizardComponent { private readonly api = inject(ApiService) diff --git a/web/projects/ui/src/app/routes/login/login.page.html b/web/projects/ui/src/app/routes/login/login.page.html index 497063ba4..d373d169b 100644 --- a/web/projects/ui/src/app/routes/login/login.page.html +++ b/web/projects/ui/src/app/routes/login/login.page.html @@ -16,9 +16,7 @@ Password - +
diff --git a/web/projects/ui/src/app/routes/login/login.page.scss b/web/projects/ui/src/app/routes/login/login.page.scss index 979fa98ab..004866824 100644 --- a/web/projects/ui/src/app/routes/login/login.page.scss +++ b/web/projects/ui/src/app/routes/login/login.page.scss @@ -6,7 +6,7 @@ align-items: center; text-align: center; width: max(33%, 20rem); - background: var(--tui-background-base-alt); + background: var(--start9-base-1); box-shadow: var(--tui-shadow-small); } diff --git a/web/projects/ui/src/app/routes/portal/components/form/form-object/form-object.component.html b/web/projects/ui/src/app/routes/portal/components/form/form-object/form-object.component.html index 54c9a59e2..445f6022d 100644 --- a/web/projects/ui/src/app/routes/portal/components/form/form-object/form-object.component.html +++ b/web/projects/ui/src/app/routes/portal/components/form/form-object/form-object.component.html @@ -7,7 +7,7 @@ class="button" [class.button_open]="open" [style.border-radius.%]="100" - [appearance]="invalid ? 'danger-solid' : 'secondary'" + [appearance]="invalid ? 'primary-destructive' : 'secondary'" > {{ spec.name }} diff --git a/web/projects/ui/src/app/routes/portal/components/header/header.component.ts b/web/projects/ui/src/app/routes/portal/components/header/header.component.ts index 714516156..7c76bb03c 100644 --- a/web/projects/ui/src/app/routes/portal/components/header/header.component.ts +++ b/web/projects/ui/src/app/routes/portal/components/header/header.component.ts @@ -54,7 +54,11 @@ import { HeaderStatusComponent } from './status.component' border-radius: inherit; backdrop-filter: blur(1rem); transform: skewX(30deg); - background: rgb(75 75 75 / 65%); + background: color-mix( + in hsl, + var(--start9-base-2) 75%, + transparent + ); box-shadow: inset 0 1px rgb(255 255 255 / 25%); z-index: -1; } diff --git a/web/projects/ui/src/app/routes/portal/components/header/menu.component.ts b/web/projects/ui/src/app/routes/portal/components/header/menu.component.ts index 831cb144a..263048d26 100644 --- a/web/projects/ui/src/app/routes/portal/components/header/menu.component.ts +++ b/web/projects/ui/src/app/routes/portal/components/header/menu.component.ts @@ -52,7 +52,7 @@ import { ABOUT } from './about.component'
System Settings diff --git a/web/projects/ui/src/app/routes/portal/components/header/navigation.component.ts b/web/projects/ui/src/app/routes/portal/components/header/navigation.component.ts index f6c6cecfb..bf541e1f3 100644 --- a/web/projects/ui/src/app/routes/portal/components/header/navigation.component.ts +++ b/web/projects/ui/src/app/routes/portal/components/header/navigation.component.ts @@ -94,7 +94,7 @@ import { getMenu } from 'src/app/utils/system-utilities' position: absolute; inset: 0; transform: skewX(30deg); - background: rgb(75 75 75 / 65%); + background: color-mix(in hsl, var(--start9-base-2) 75%, transparent); box-shadow: inset 0 1px rgb(255 255 255 / 25%); z-index: -1; } @@ -129,7 +129,7 @@ import { getMenu } from 'src/app/utils/system-utilities' &::before { border-radius: var(--bumper); - filter: brightness(0.65); + filter: brightness(0.5); } span { diff --git a/web/projects/ui/src/app/routes/portal/components/interfaces/directives/clearnet.directive.ts b/web/projects/ui/src/app/routes/portal/components/interfaces/directives/clearnet.directive.ts index 05ccbf696..417fbe944 100644 --- a/web/projects/ui/src/app/routes/portal/components/interfaces/directives/clearnet.directive.ts +++ b/web/projects/ui/src/app/routes/portal/components/interfaces/directives/clearnet.directive.ts @@ -42,7 +42,7 @@ export class ClearnetAddressesDirective implements AddressesService { buttons: [ { text: 'Manage domains', - link: 'portal/system/settings/domains', + link: 'portal/settings/domains', }, { text: 'Save', diff --git a/web/projects/ui/src/app/routes/portal/components/tabs.component.ts b/web/projects/ui/src/app/routes/portal/components/tabs.component.ts index 3e8fbcbfc..bf8b3cac3 100644 --- a/web/projects/ui/src/app/routes/portal/components/tabs.component.ts +++ b/web/projects/ui/src/app/routes/portal/components/tabs.component.ts @@ -15,11 +15,7 @@ import { BadgeService } from 'src/app/services/badge.service' import { RESOURCES } from 'src/app/utils/resources' import { getMenu } from 'src/app/utils/system-utilities' -const FILTER = [ - '/portal/services', - '/portal/system/settings', - '/portal/system/marketplace', -] +const FILTER = ['/portal/services', '/portal/settings', '/portal/marketplace'] @Component({ standalone: true, @@ -38,7 +34,7 @@ const FILTER = [ @@ -47,7 +43,7 @@ const FILTER = [ !FILTER.includes(item.routerLink)) - readonly badge = toSignal( - inject(BadgeService).getCount('/portal/system/settings'), - { initialValue: 0 }, - ) + readonly badge = toSignal(inject(BadgeService).getCount('/portal/settings'), { + initialValue: 0, + }) readonly all = computed(() => this.menu.reduce((acc, item) => acc + item.badge(), 0), diff --git a/web/projects/ui/src/app/routes/portal/portal.routes.ts b/web/projects/ui/src/app/routes/portal/portal.routes.ts index df5a86a90..dfc72178c 100644 --- a/web/projects/ui/src/app/routes/portal/portal.routes.ts +++ b/web/projects/ui/src/app/routes/portal/portal.routes.ts @@ -1,4 +1,8 @@ -import { Routes } from '@angular/router' +import { ActivatedRouteSnapshot, Routes } from '@angular/router' +import { PackageDataEntry } from '../../services/patch-db/data-model' +import { getManifest } from '../../utils/get-package-data' +import { SYSTEM_UTILITIES } from '../../utils/system-utilities' +import { toRouterLink } from '../../utils/to-router-link' import { PortalComponent } from './portal.component' const ROUTES: Routes = [ @@ -14,15 +18,85 @@ const ROUTES: Routes = [ { path: 'services', loadChildren: () => - import('./routes/service/service.module').then(m => m.ServiceModule), + import('./routes/services/services.module').then( + m => m.ServicesModule, + ), }, { - path: 'system', - loadChildren: () => - import('./routes/system/system.module').then(m => m.SystemModule), + title: systemTabResolver, + path: 'backups', + loadComponent: () => import('./routes/backups/backups.component'), + data: toNavigationItem('/portal/backups'), + }, + { + title: systemTabResolver, + path: 'logs', + loadComponent: () => import('./routes/logs/logs.component'), + data: toNavigationItem('/portal/logs'), + }, + { + title: systemTabResolver, + path: 'marketplace', + loadChildren: () => import('./routes/marketplace/marketplace.routes'), + data: toNavigationItem('/portal/marketplace'), + }, + { + title: systemTabResolver, + path: 'settings', + loadChildren: () => import('./routes/settings/settings.routes'), + data: toNavigationItem('/portal/settings'), + }, + { + title: systemTabResolver, + path: 'notifications', + loadComponent: () => + import('./routes/notifications/notifications.component'), + data: toNavigationItem('/portal/notifications'), + }, + { + title: systemTabResolver, + path: 'sideload', + loadComponent: () => import('./routes/sideload/sideload.component'), + data: toNavigationItem('/portal/sideload'), + }, + // { + // title: systemTabResolver, + // path: 'updates', + // loadComponent: () => import('./routes/updates/updates.component'), + // data: toNavigationItem('/portal/updates'), + // }, + { + title: systemTabResolver, + path: 'metrics', + loadComponent: () => import('./routes/metrics/metrics.component'), + data: toNavigationItem('/portal/metrics'), }, ], }, ] export default ROUTES + +function systemTabResolver({ data }: ActivatedRouteSnapshot): string { + return data['title'] +} + +function toNavigationItem( + id: string, + packages: Record = {}, +) { + const item = SYSTEM_UTILITIES[id] + const routerLink = toRouterLink(id) + + return SYSTEM_UTILITIES[id] + ? { + icon: item.icon, + title: item.title, + routerLink, + } + : { + icon: packages[id]?.icon, + title: getManifest(packages[id]).title, + routerLink, + } +} diff --git a/web/projects/ui/src/app/routes/portal/routes/system/backups/backups.component.ts b/web/projects/ui/src/app/routes/portal/routes/backups/backups.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/backups/backups.component.ts rename to web/projects/ui/src/app/routes/portal/routes/backups/backups.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/backups/components/physical.component.ts b/web/projects/ui/src/app/routes/portal/routes/backups/components/physical.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/backups/components/physical.component.ts rename to web/projects/ui/src/app/routes/portal/routes/backups/components/physical.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/backups/components/status.component.ts b/web/projects/ui/src/app/routes/portal/routes/backups/components/status.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/backups/components/status.component.ts rename to web/projects/ui/src/app/routes/portal/routes/backups/components/status.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/backups/components/targets.component.ts b/web/projects/ui/src/app/routes/portal/routes/backups/components/targets.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/backups/components/targets.component.ts rename to web/projects/ui/src/app/routes/portal/routes/backups/components/targets.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/backups/components/upcoming.component.ts b/web/projects/ui/src/app/routes/portal/routes/backups/components/upcoming.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/backups/components/upcoming.component.ts rename to web/projects/ui/src/app/routes/portal/routes/backups/components/upcoming.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/backups/modals/backup.component.ts b/web/projects/ui/src/app/routes/portal/routes/backups/modals/backup.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/backups/modals/backup.component.ts rename to web/projects/ui/src/app/routes/portal/routes/backups/modals/backup.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/backups/modals/edit.component.ts b/web/projects/ui/src/app/routes/portal/routes/backups/modals/edit.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/backups/modals/edit.component.ts rename to web/projects/ui/src/app/routes/portal/routes/backups/modals/edit.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/backups/modals/history.component.ts b/web/projects/ui/src/app/routes/portal/routes/backups/modals/history.component.ts similarity index 99% rename from web/projects/ui/src/app/routes/portal/routes/system/backups/modals/history.component.ts rename to web/projects/ui/src/app/routes/portal/routes/backups/modals/history.component.ts index 797cbcb06..26f79a499 100644 --- a/web/projects/ui/src/app/routes/portal/routes/system/backups/modals/history.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/backups/modals/history.component.ts @@ -26,7 +26,7 @@ import { HasErrorPipe } from '../pipes/has-error.pipe' Past Events diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/backups.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/backups.component.ts similarity index 95% rename from web/projects/ui/src/app/routes/portal/routes/service/components/backups.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/backups.component.ts index 815b884cf..ee006b1f1 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/components/backups.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/components/backups.component.ts @@ -24,9 +24,9 @@ import { T } from '@start9labs/start-sdk' Manage diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/dependencies.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/dependencies.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/dependencies.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/dependencies.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/dependency.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/dependency.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/dependency.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/dependency.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/error.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/error.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/error.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/error.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/health-check.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/health-check.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/health-check.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/health-check.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/health-checks.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/health-checks.component.ts similarity index 94% rename from web/projects/ui/src/app/routes/portal/routes/service/components/health-checks.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/health-checks.component.ts index f0ba56aa5..2561b4241 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/components/health-checks.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/components/health-checks.component.ts @@ -6,7 +6,7 @@ import { Input, } from '@angular/core' import { T } from '@start9labs/start-sdk' -import { ServiceHealthCheckComponent } from 'src/app/routes/portal/routes/service/components/health-check.component' +import { ServiceHealthCheckComponent } from 'src/app/routes/portal/routes/services/components/health-check.component' import { ConnectionService } from 'src/app/services/connection.service' @Component({ diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/interface-list-item.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/interface-list-item.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/interface-list-item.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/interface-list-item.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/interface-list.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/interface-list.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/interface-list.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/interface-list.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/menu-item.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/menu-item.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/menu-item.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/menu-item.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/menu.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/menu.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/menu.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/menu.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/progress.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/progress.component.ts similarity index 95% rename from web/projects/ui/src/app/routes/portal/routes/service/components/progress.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/progress.component.ts index 927c87f2c..6a7ef7ad2 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/components/progress.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/components/progress.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core' import { T } from '@start9labs/start-sdk' import { TuiProgress } from '@taiga-ui/kit' -import { InstallingProgressPipe } from 'src/app/routes/portal/routes/service/pipes/install-progress.pipe' +import { InstallingProgressPipe } from 'src/app/routes/portal/routes/services/pipes/install-progress.pipe' @Component({ selector: '[progress]', diff --git a/web/projects/ui/src/app/routes/portal/routes/service/components/status.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/status.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/components/status.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/components/status.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/dashboard/controls.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/dashboard/controls.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/dashboard/controls.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/dashboard/controls.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/dashboard/dashboard.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/dashboard/dashboard.component.ts similarity index 93% rename from web/projects/ui/src/app/routes/portal/routes/service/dashboard/dashboard.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/dashboard/dashboard.component.ts index a08dfc5a6..546f7bc62 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/dashboard/dashboard.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/dashboard/dashboard.component.ts @@ -18,6 +18,7 @@ import { ServicesService } from './services.service' Name Version + Uptime } @empty { - + {{ services() ? 'No services installed' : 'Loading...' }} @@ -98,5 +99,8 @@ export class DashboardComponent { readonly status: TuiComparator = (a, b) => getInstalledPrimaryStatus(b) > getInstalledPrimaryStatus(a) ? -1 : 1 + readonly uptime: TuiComparator = (a, b) => + a.startedAt || '' > b.startedAt || '' ? -1 : 1 + sorter = this.name } diff --git a/web/projects/ui/src/app/routes/portal/routes/service/dashboard/service.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/dashboard/service.component.ts similarity index 93% rename from web/projects/ui/src/app/routes/portal/routes/service/dashboard/service.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/dashboard/service.component.ts index d567afc8c..ec01e98c9 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/dashboard/service.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/dashboard/service.component.ts @@ -12,6 +12,7 @@ import { ConnectionService } from 'src/app/services/connection.service' import { PkgDependencyErrors } from 'src/app/services/dep-error.service' import { PackageDataEntry } from 'src/app/services/patch-db/data-model' import { getManifest } from 'src/app/utils/get-package-data' +import { UptimeComponent } from './uptime.component' import { ControlsComponent } from './controls.component' import { StatusComponent } from './status.component' @@ -26,6 +27,7 @@ import { StatusComponent } from './status.component' {{ manifest.title }} {{ manifest.version }} + { + this.el.textContent = uptime(new Date(this.appUptime)) + }, 60 * 1000) + } + } + + ngOnDestroy() { + clearInterval(this.interval) + } +} + +function uptime(date: Date): string { + const delta = Date.now() - date.getTime() + const days = Math.floor(delta / (1000 * 60 * 60 * 24)) + const hours = Math.floor((delta / (1000 * 60 * 60)) % 24) + const minutes = Math.floor((delta / (1000 * 60)) % 60) + + if (days > 0) return `${days}d ${hours}h ${minutes}m` + + if (hours > 0) return `${hours}h ${minutes}m` + + return `${minutes}m` +} diff --git a/web/projects/ui/src/app/routes/portal/routes/service/modals/action-input.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/modals/action-input.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/modals/action-input.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/modals/action-input.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/action-success-group.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/action-success-group.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/action-success-group.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/action-success-group.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/action-success-member.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/action-success-member.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/action-success-member.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/action-success-member.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/action-success-single.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/action-success-single.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/action-success-single.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/action-success-single.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/action-success.page.ts b/web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/action-success.page.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/action-success.page.ts rename to web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/action-success.page.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/types.ts b/web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/types.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/modals/action-success/types.ts rename to web/projects/ui/src/app/routes/portal/routes/services/modals/action-success/types.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/modals/additional-item.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/modals/additional-item.component.ts similarity index 94% rename from web/projects/ui/src/app/routes/portal/routes/service/modals/additional-item.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/modals/additional-item.component.ts index c5258bc3e..3d1992441 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/modals/additional-item.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/modals/additional-item.component.ts @@ -3,7 +3,7 @@ import { TuiIcon } from '@taiga-ui/core' import { AdditionalItem, FALLBACK_URL, -} from 'src/app/routes/portal/routes/service/pipes/to-additional.pipe' +} from 'src/app/routes/portal/routes/services/pipes/to-additional.pipe' @Component({ selector: '[additionalItem]', diff --git a/web/projects/ui/src/app/routes/portal/routes/service/modals/additional.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/modals/additional.component.ts similarity index 97% rename from web/projects/ui/src/app/routes/portal/routes/service/modals/additional.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/modals/additional.component.ts index add96ef3e..d8d6bb86f 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/modals/additional.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/modals/additional.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' import { TuiDialogOptions } from '@taiga-ui/core' import { injectContext } from '@taiga-ui/polymorpheus' -import { ToAdditionalPipe } from 'src/app/routes/portal/routes/service/pipes/to-additional.pipe' +import { ToAdditionalPipe } from 'src/app/routes/portal/routes/services/pipes/to-additional.pipe' import { PackageDataEntry } from 'src/app/services/patch-db/data-model' import { ServiceAdditionalItemComponent } from './additional-item.component' diff --git a/web/projects/ui/src/app/routes/portal/routes/service/pipes/install-progress.pipe.ts b/web/projects/ui/src/app/routes/portal/routes/services/pipes/install-progress.pipe.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/pipes/install-progress.pipe.ts rename to web/projects/ui/src/app/routes/portal/routes/services/pipes/install-progress.pipe.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/pipes/interface-info.pipe.ts b/web/projects/ui/src/app/routes/portal/routes/services/pipes/interface-info.pipe.ts similarity index 92% rename from web/projects/ui/src/app/routes/portal/routes/service/pipes/interface-info.pipe.ts rename to web/projects/ui/src/app/routes/portal/routes/services/pipes/interface-info.pipe.ts index 2f1604732..973f9f675 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/pipes/interface-info.pipe.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/pipes/interface-info.pipe.ts @@ -23,17 +23,17 @@ export class InterfaceInfoPipe implements PipeTransform { switch (val.type) { case 'ui': - color = 'var(--tui-background-accent-1)' + color = 'var(--tui-text-action)' icon = '@tui.monitor' typeDetail = 'User Interface (UI)' break case 'p2p': - color = 'var(--tui-status-info)' + color = 'var(--tui-background-accent-2)' icon = '@tui.users' typeDetail = 'Peer-To-Peer Interface (P2P)' break case 'api': - color = 'var(--tui-chart-categorical-09)' + color = 'var(--tui-status-info)' icon = '@tui.terminal' typeDetail = 'Application Program Interface (API)' break diff --git a/web/projects/ui/src/app/routes/portal/routes/service/pipes/to-action-requests.pipe.ts b/web/projects/ui/src/app/routes/portal/routes/services/pipes/to-action-requests.pipe.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/pipes/to-action-requests.pipe.ts rename to web/projects/ui/src/app/routes/portal/routes/services/pipes/to-action-requests.pipe.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/pipes/to-additional.pipe.ts b/web/projects/ui/src/app/routes/portal/routes/services/pipes/to-additional.pipe.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/pipes/to-additional.pipe.ts rename to web/projects/ui/src/app/routes/portal/routes/services/pipes/to-additional.pipe.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/pipes/to-menu.pipe.ts b/web/projects/ui/src/app/routes/portal/routes/services/pipes/to-menu.pipe.ts similarity index 97% rename from web/projects/ui/src/app/routes/portal/routes/service/pipes/to-menu.pipe.ts rename to web/projects/ui/src/app/routes/portal/routes/services/pipes/to-menu.pipe.ts index af0998a0f..6dd9245b7 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/pipes/to-menu.pipe.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/pipes/to-menu.pipe.ts @@ -5,7 +5,7 @@ import { T } from '@start9labs/start-sdk' import { TuiDialogService } from '@taiga-ui/core' import { PolymorpheusComponent } from '@taiga-ui/polymorpheus' import { from } from 'rxjs' -import { ServiceAdditionalModal } from 'src/app/routes/portal/routes/service/modals/additional.component' +import { ServiceAdditionalModal } from 'src/app/routes/portal/routes/services/modals/additional.component' import { ApiService } from 'src/app/services/api/embassy-api.service' import { FormDialogService } from 'src/app/services/form-dialog.service' import { PackageDataEntry } from 'src/app/services/patch-db/data-model' @@ -80,7 +80,7 @@ export class ToMenuPipe implements PipeTransform { icon: '@tui.shopping-bag', name: 'Marketplace Listing', description: `View ${manifest.title} on the Marketplace`, - routerLink: `/portal/system/marketplace`, + routerLink: `/portal/marketplace`, params: { url: pkg.registry, id: manifest.id }, } : { diff --git a/web/projects/ui/src/app/routes/portal/routes/service/routes/actions.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/routes/actions.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/routes/actions.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/routes/actions.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/routes/interface.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/routes/interface.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/routes/interface.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/routes/interface.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/routes/logs.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/routes/logs.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/routes/logs.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/routes/logs.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/routes/outlet.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/routes/outlet.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/routes/outlet.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/routes/outlet.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/service/routes/service.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/routes/service.component.ts similarity index 98% rename from web/projects/ui/src/app/routes/portal/routes/service/routes/service.component.ts rename to web/projects/ui/src/app/routes/portal/routes/services/routes/service.component.ts index 1c102265d..092dab46f 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/routes/service.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/routes/service.component.ts @@ -5,8 +5,8 @@ import { isEmptyObject } from '@start9labs/shared' import { T } from '@start9labs/start-sdk' import { PatchDB } from 'patch-db-client' import { combineLatest, map, switchMap } from 'rxjs' -import { ServiceBackupsComponent } from 'src/app/routes/portal/routes/service/components/backups.component' -import { InstallingProgressPipe } from 'src/app/routes/portal/routes/service/pipes/install-progress.pipe' +import { ServiceBackupsComponent } from 'src/app/routes/portal/routes/services/components/backups.component' +import { InstallingProgressPipe } from 'src/app/routes/portal/routes/services/pipes/install-progress.pipe' import { ConnectionService } from 'src/app/services/connection.service' import { DepErrorService, @@ -378,10 +378,7 @@ export class ServiceRoute { queryParams: { id: depId }, } - await this.router.navigate( - ['portal', 'system', 'marketplace'], - navigationExtras, - ) + await this.router.navigate(['portal', 'marketplace'], navigationExtras) } } diff --git a/web/projects/ui/src/app/routes/portal/routes/service/service.module.ts b/web/projects/ui/src/app/routes/portal/routes/services/services.module.ts similarity index 97% rename from web/projects/ui/src/app/routes/portal/routes/service/service.module.ts rename to web/projects/ui/src/app/routes/portal/routes/services/services.module.ts index 885576718..b795f237a 100644 --- a/web/projects/ui/src/app/routes/portal/routes/service/service.module.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/services.module.ts @@ -43,4 +43,4 @@ const ROUTES: Routes = [ ] @NgModule({ imports: [RouterModule.forChild(ROUTES)] }) -export class ServiceModule {} +export class ServicesModule {} diff --git a/web/projects/ui/src/app/routes/portal/routes/service/types/dependency-info.ts b/web/projects/ui/src/app/routes/portal/routes/services/types/dependency-info.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/service/types/dependency-info.ts rename to web/projects/ui/src/app/routes/portal/routes/services/types/dependency-info.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/settings/components/button.component.ts b/web/projects/ui/src/app/routes/portal/routes/settings/components/button.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/settings/components/button.component.ts rename to web/projects/ui/src/app/routes/portal/routes/settings/components/button.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/settings/components/menu.component.ts b/web/projects/ui/src/app/routes/portal/routes/settings/components/menu.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/settings/components/menu.component.ts rename to web/projects/ui/src/app/routes/portal/routes/settings/components/menu.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/settings/components/sync.component.ts b/web/projects/ui/src/app/routes/portal/routes/settings/components/sync.component.ts similarity index 95% rename from web/projects/ui/src/app/routes/portal/routes/system/settings/components/sync.component.ts rename to web/projects/ui/src/app/routes/portal/routes/settings/components/sync.component.ts index 732c2ffb9..e8fb73e3a 100644 --- a/web/projects/ui/src/app/routes/portal/routes/system/settings/components/sync.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/settings/components/sync.component.ts @@ -16,7 +16,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' diff --git a/web/projects/ui/src/app/routes/portal/routes/system/settings/settings.routes.ts b/web/projects/ui/src/app/routes/portal/routes/settings/settings.routes.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/settings/settings.routes.ts rename to web/projects/ui/src/app/routes/portal/routes/settings/settings.routes.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/settings/settings.service.ts b/web/projects/ui/src/app/routes/portal/routes/settings/settings.service.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/settings/settings.service.ts rename to web/projects/ui/src/app/routes/portal/routes/settings/settings.service.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/settings/settings.types.ts b/web/projects/ui/src/app/routes/portal/routes/settings/settings.types.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/settings/settings.types.ts rename to web/projects/ui/src/app/routes/portal/routes/settings/settings.types.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/sideload/package.component.ts b/web/projects/ui/src/app/routes/portal/routes/sideload/package.component.ts similarity index 96% rename from web/projects/ui/src/app/routes/portal/routes/system/sideload/package.component.ts rename to web/projects/ui/src/app/routes/portal/routes/sideload/package.component.ts index a5adb10b8..f043baa18 100644 --- a/web/projects/ui/src/app/routes/portal/routes/system/sideload/package.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/sideload/package.component.ts @@ -23,7 +23,7 @@ import { ApiService } from 'src/app/services/api/embassy-api.service' import { ClientStorageService } from 'src/app/services/client-storage.service' import { DataModel } from 'src/app/services/patch-db/data-model' import { getManifest } from 'src/app/utils/get-package-data' -import { InstallingProgressPipe } from 'src/app/routes/portal/routes/service/pipes/install-progress.pipe' +import { InstallingProgressPipe } from 'src/app/routes/portal/routes/services/pipes/install-progress.pipe' import { SideloadService } from './sideload.service' @Component({ @@ -57,11 +57,7 @@ import { SideloadService } from './sideload.service' >
@if (button !== null && button !== 'Install') { - + View installed } diff --git a/web/projects/ui/src/app/routes/portal/routes/system/sideload/sideload.component.ts b/web/projects/ui/src/app/routes/portal/routes/sideload/sideload.component.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/sideload/sideload.component.ts rename to web/projects/ui/src/app/routes/portal/routes/sideload/sideload.component.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/sideload/sideload.service.ts b/web/projects/ui/src/app/routes/portal/routes/sideload/sideload.service.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/sideload/sideload.service.ts rename to web/projects/ui/src/app/routes/portal/routes/sideload/sideload.service.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/sideload/sideload.utils.ts b/web/projects/ui/src/app/routes/portal/routes/sideload/sideload.utils.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/sideload/sideload.utils.ts rename to web/projects/ui/src/app/routes/portal/routes/sideload/sideload.utils.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/system.module.ts b/web/projects/ui/src/app/routes/portal/routes/system/system.module.ts deleted file mode 100644 index 65681ada2..000000000 --- a/web/projects/ui/src/app/routes/portal/routes/system/system.module.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { NgModule } from '@angular/core' -import { ActivatedRouteSnapshot, RouterModule, Routes } from '@angular/router' -import { toRouterLink } from 'src/app/utils/to-router-link' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' -import { getManifest } from 'src/app/utils/get-package-data' -import { SYSTEM_UTILITIES } from 'src/app/utils/system-utilities' - -const ROUTES: Routes = [ - { - title: systemTabResolver, - path: 'backups', - loadComponent: () => import('./backups/backups.component'), - data: toNavigationItem('/portal/system/backups'), - }, - { - title: systemTabResolver, - path: 'logs', - loadComponent: () => import('./logs/logs.component'), - data: toNavigationItem('/portal/system/logs'), - }, - { - title: systemTabResolver, - path: 'marketplace', - loadChildren: () => import('./marketplace/marketplace.routes'), - data: toNavigationItem('/portal/system/marketplace'), - }, - { - title: systemTabResolver, - path: 'settings', - loadChildren: () => import('./settings/settings.routes'), - data: toNavigationItem('/portal/system/settings'), - }, - { - title: systemTabResolver, - path: 'notifications', - loadComponent: () => import('./notifications/notifications.component'), - data: toNavigationItem('/portal/system/notifications'), - }, - { - title: systemTabResolver, - path: 'sideload', - loadComponent: () => import('./sideload/sideload.component'), - data: toNavigationItem('/portal/system/sideload'), - }, - // { - // title: systemTabResolver, - // path: 'updates', - // loadComponent: () => import('./updates/updates.component'), - // data: toNavigationItem('/portal/system/updates'), - // }, - { - title: systemTabResolver, - path: 'metrics', - loadComponent: () => import('./metrics/metrics.component'), - data: toNavigationItem('/portal/system/metrics'), - }, -] - -@NgModule({ imports: [RouterModule.forChild(ROUTES)] }) -export class SystemModule {} - -function systemTabResolver({ data }: ActivatedRouteSnapshot): string { - return data['title'] -} - -function toNavigationItem( - id: string, - packages: Record = {}, -) { - const item = SYSTEM_UTILITIES[id] - const routerLink = toRouterLink(id) - - return SYSTEM_UTILITIES[id] - ? { - icon: item.icon, - title: item.title, - routerLink, - } - : { - icon: packages[id]?.icon, - title: getManifest(packages[id]).title, - routerLink, - } -} diff --git a/web/projects/ui/src/app/routes/portal/routes/system/updates/filter-updates.pipe.ts b/web/projects/ui/src/app/routes/portal/routes/updates/filter-updates.pipe.ts similarity index 100% rename from web/projects/ui/src/app/routes/portal/routes/system/updates/filter-updates.pipe.ts rename to web/projects/ui/src/app/routes/portal/routes/updates/filter-updates.pipe.ts diff --git a/web/projects/ui/src/app/routes/portal/routes/system/updates/item.component.ts b/web/projects/ui/src/app/routes/portal/routes/updates/item.component.ts similarity index 99% rename from web/projects/ui/src/app/routes/portal/routes/system/updates/item.component.ts rename to web/projects/ui/src/app/routes/portal/routes/updates/item.component.ts index 296cf7a14..3bf4b9e11 100644 --- a/web/projects/ui/src/app/routes/portal/routes/system/updates/item.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/updates/item.component.ts @@ -23,7 +23,7 @@ // } from '@taiga-ui/kit' // import { NgDompurifyModule } from '@tinkoff/ng-dompurify' // import { PatchDB } from 'patch-db-client' -// import { InstallingProgressPipe } from 'src/app/routes/portal/routes/service/pipes/install-progress.pipe' +// import { InstallingProgressPipe } from 'src/app/routes/portal/routes/services/pipes/install-progress.pipe' // import { MarketplaceService } from 'src/app/services/marketplace.service' // import { // DataModel, diff --git a/web/projects/ui/src/app/routes/portal/routes/system/updates/updates.component.ts b/web/projects/ui/src/app/routes/portal/routes/updates/updates.component.ts similarity index 97% rename from web/projects/ui/src/app/routes/portal/routes/system/updates/updates.component.ts rename to web/projects/ui/src/app/routes/portal/routes/updates/updates.component.ts index 1303824c0..3583ebad3 100644 --- a/web/projects/ui/src/app/routes/portal/routes/system/updates/updates.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/updates/updates.component.ts @@ -7,8 +7,8 @@ // import { TuiCell } from '@taiga-ui/layout' // import { PatchDB } from 'patch-db-client' // import { combineLatest, map } from 'rxjs' -// import { FilterUpdatesPipe } from 'src/app/routes/portal/routes/system/updates/filter-updates.pipe' -// import { UpdatesItemComponent } from 'src/app/routes/portal/routes/system/updates/item.component' +// import { FilterUpdatesPipe } from 'src/app/routes/portal/routes/updates/filter-updates.pipe' +// import { UpdatesItemComponent } from 'src/app/routes/portal/routes/updates/item.component' // import { ConfigService } from 'src/app/services/config.service' // import { MarketplaceService } from 'src/app/services/marketplace.service' // import { diff --git a/web/projects/ui/src/app/services/action.service.ts b/web/projects/ui/src/app/services/action.service.ts index e3b3dcb7e..0b416e6de 100644 --- a/web/projects/ui/src/app/services/action.service.ts +++ b/web/projects/ui/src/app/services/action.service.ts @@ -7,8 +7,8 @@ import { filter } from 'rxjs' import { ActionInputModal, PackageActionData, -} from 'src/app/routes/portal/routes/service/modals/action-input.component' -import { ActionSuccessPage } from 'src/app/routes/portal/routes/service/modals/action-success/action-success.page' +} from 'src/app/routes/portal/routes/services/modals/action-input.component' +import { ActionSuccessPage } from 'src/app/routes/portal/routes/services/modals/action-success/action-success.page' import { ApiService } from 'src/app/services/api/embassy-api.service' import { FormDialogService } from 'src/app/services/form-dialog.service' diff --git a/web/projects/ui/src/app/services/badge.service.ts b/web/projects/ui/src/app/services/badge.service.ts index d1b8ab062..90670dcd5 100644 --- a/web/projects/ui/src/app/services/badge.service.ts +++ b/web/projects/ui/src/app/services/badge.service.ts @@ -81,11 +81,11 @@ export class BadgeService { getCount(id: string): Observable { switch (id) { - // case '/portal/system/updates': + // case '/portal/updates': // return this.updates$ - case '/portal/system/settings': + case '/portal/settings': return this.settings$ - case '/portal/system/notifications': + case '/portal/notifications': return this.notifications.unreadCount$ default: return EMPTY diff --git a/web/projects/ui/src/app/services/breadcrumbs.service.ts b/web/projects/ui/src/app/services/breadcrumbs.service.ts index d499ea158..79a51d133 100644 --- a/web/projects/ui/src/app/services/breadcrumbs.service.ts +++ b/web/projects/ui/src/app/services/breadcrumbs.service.ts @@ -41,9 +41,9 @@ function toBreadcrumbs( id: string, packages: Record = {}, ): Breadcrumb[] { - if (id.startsWith('/portal/system/')) { - const [page, ...path] = id.replace('/portal/system/', '').split('/') - const service = `/portal/system/${page}` + if (id.startsWith('/portal/') && !id.startsWith('/portal/services/')) { + const [page, ...path] = id.replace('/portal/', '').split('/') + const service = `/portal/${page}` const { icon, title } = SYSTEM_UTILITIES[service] const breadcrumbs: Breadcrumb[] = [ { diff --git a/web/projects/ui/src/app/services/proxy.service.ts b/web/projects/ui/src/app/services/proxy.service.ts index 2f3f487f4..72ac7c9d9 100644 --- a/web/projects/ui/src/app/services/proxy.service.ts +++ b/web/projects/ui/src/app/services/proxy.service.ts @@ -56,7 +56,7 @@ export class ProxyService { buttons: [ { text: 'Manage proxies', - link: '/portal/system/settings/proxies', + link: '/portal/settings/proxies', }, { text: 'Save', diff --git a/web/projects/ui/src/app/services/theme-switcher.service.ts b/web/projects/ui/src/app/services/theme-switcher.service.ts deleted file mode 100644 index 30cc3e16f..000000000 --- a/web/projects/ui/src/app/services/theme-switcher.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Inject, Injectable } from '@angular/core' -import { WA_WINDOW } from '@ng-web-apis/common' -import { PatchDB } from 'patch-db-client' -import { filter, take, BehaviorSubject } from 'rxjs' -import { ApiService } from './api/embassy-api.service' -import { DataModel } from './patch-db/data-model' - -@Injectable({ - providedIn: 'root', -}) -export class ThemeSwitcherService extends BehaviorSubject { - constructor( - private readonly patch: PatchDB, - private readonly embassyApi: ApiService, - @Inject(WA_WINDOW) private readonly windowRef: Window, - ) { - super('Dark') - - this.patch - .watch$('ui', 'theme') - .pipe(take(1), filter(Boolean)) - .subscribe(theme => { - this.updateTheme(theme) - }) - } - - override next(theme: string): void { - this.embassyApi.setDbValue(['theme'], theme) - this.updateTheme(theme) - } - - private updateTheme(theme: string): void { - this.windowRef.document.body.setAttribute('data-theme', theme) - super.next(theme) - } -} diff --git a/web/projects/ui/src/app/utils/system-utilities.ts b/web/projects/ui/src/app/utils/system-utilities.ts index b75918eaf..805b743a6 100644 --- a/web/projects/ui/src/app/utils/system-utilities.ts +++ b/web/projects/ui/src/app/utils/system-utilities.ts @@ -8,35 +8,35 @@ export const SYSTEM_UTILITIES: Record = icon: '@tui.layout-grid', title: 'Services', }, - '/portal/system/marketplace': { + '/portal/marketplace': { icon: '@tui.shopping-cart', title: 'Marketplace', }, - '/portal/system/sideload': { + '/portal/sideload': { icon: '@tui.upload', title: 'Sideload', }, - // '/portal/system/updates': { + // '/portal/updates': { // icon: '@tui.globe', // title: 'Updates', // }, - '/portal/system/backups': { + '/portal/backups': { icon: '@tui.save', title: 'Backups', }, - '/portal/system/metrics': { + '/portal/metrics': { icon: '@tui.activity', title: 'Metrics', }, - '/portal/system/logs': { + '/portal/logs': { icon: '@tui.file-text', title: 'Logs', }, - '/portal/system/settings': { + '/portal/settings': { icon: '@tui.wrench', title: 'Settings', }, - '/portal/system/notifications': { + '/portal/notifications': { icon: '@tui.bell', title: 'Notifications', }, diff --git a/web/projects/ui/src/styles.scss b/web/projects/ui/src/styles.scss index b6f081bb3..07ff8504d 100644 --- a/web/projects/ui/src/styles.scss +++ b/web/projects/ui/src/styles.scss @@ -14,9 +14,9 @@ ul { } hr { - height: 0; - background: transparent; - border-bottom: 1px solid var(--tui-background-neutral-1); + height: 1px; + background: var(--tui-background-neutral-1); + border: none; } :root { @@ -34,10 +34,29 @@ hr { isolation: isolate; backdrop-filter: blur(2rem); border-radius: 0.375rem; + background-size: 1px 100%; + background-repeat: no-repeat; + background-position: + top left, + top right; // TODO: Theme - background: rgb(55 58 63 / 90%); - box-shadow: inset 0 1px rgb(255 255 255 / 10%); + background-color: color-mix( + in hsl, + var(--tui-background-base) 90%, + transparent + ); + background-image: linear-gradient( + to bottom, + rgba(255, 255, 255, 0.1), + transparent + ), + linear-gradient(to bottom, rgba(255, 255, 255, 0.1), transparent); + box-shadow: + 0 0.25rem 0.125rem rgba(0, 0, 0, 0.25), + 0 0 0.5rem rgba(0, 0, 0, 0.3), + inset 0 -1px rgba(0, 0, 0, 0.5), + inset 0 1px rgba(255, 255, 255, 0.1); tui-root._mobile & { // For tui-tab-bar @@ -46,29 +65,10 @@ hr { } } -.g-plaque { - @include transition(opacity); - position: absolute; - inset: 0; - z-index: -1; - filter: url(#round-corners) url(#bevel-light) url(#bevel-dark); - font-size: 0; - opacity: 0.75; - - &::before { - @include transition(clip-path); - content: ''; - position: absolute; - inset: 0; - clip-path: var(--clip-path); - // TODO: Theme - background: #333; - } -} - .g-table { width: 100%; min-width: 40rem; + border-spacing: 0; td, th { @@ -85,44 +85,44 @@ hr { background: var(--tui-background-neutral-1); font-weight: bold; } -} -tui-root._mobile .g-table { - min-width: 0; + tui-root._mobile & { + min-width: 0; - thead { - display: none; - } + thead { + display: none; + } - tbody { - display: flex; - flex-direction: column; - gap: 0.5rem; - } + tbody { + display: flex; + flex-direction: column; + gap: 0.5rem; + } - tr { - position: relative; - display: grid; - border-radius: var(--tui-radius-l); - padding: 0.375rem 0.5rem; - // TODO: Theme - background: rgba(0, 0, 0, 0.2); - } + tr { + position: relative; + display: grid; + border-radius: var(--tui-radius-l); + padding: 0.375rem 0.5rem; + // TODO: Theme + background: rgba(0, 0, 0, 0.2); + } - tr:has(:checked) { - box-shadow: inset 0 0 0 0.125rem var(--tui-background-accent-1); - } + tr:has(:checked) { + box-shadow: inset 0 0 0 0.125rem var(--tui-background-accent-1); + } - td, - th { - position: static; - height: auto; - min-height: 1.5rem; - align-content: center; - box-shadow: none; + td, + th { + position: static; + height: auto; + min-height: 1.5rem; + align-content: center; + box-shadow: none; - &:not([tuiFade]) { - overflow: hidden; + &:not([tuiFade]) { + overflow: hidden; + } } } } @@ -177,7 +177,7 @@ button.g-action { } &:not(:last-child) { - box-shadow: 0 0.51rem 0 -0.5rem; + box-shadow: 0 calc(0.5rem + 1px) 0 -0.5rem var(--tui-background-neutral-1); } } @@ -196,11 +196,6 @@ button.g-action { } } -.g-hidden-scrollbar { - @include scrollbar-hidden; - overflow: auto !important; -} - .g-success { color: var(--tui-status-positive) !important; } @@ -225,10 +220,6 @@ svg:not(:root) { overflow: auto; } -.small-caps { - font-variant: all-small-caps; -} - .g-external-link { color: #50c8ff; }