From a90b96cddd8dcedae3eee6768aa1f05996cd1732 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Sun, 15 Mar 2026 19:51:50 +0400 Subject: [PATCH] chore: update Taiga to 5 (#3136) * chore: update Taiga to 5 * chore: fix --- web/CLAUDE.md | 3 +- web/angular.json | 8 +- web/package-lock.json | 489 +++++++++--------- web/package.json | 30 +- .../src/components/menu/menu.component.scss | 2 +- .../dependencies/dependency-item.component.ts | 15 +- .../src/pages/show/flavors.component.ts | 10 +- .../src/pages/show/screenshots.component.ts | 4 +- .../setup-wizard/src/app/app.component.ts | 2 +- .../setup-wizard/src/app/app.config.ts | 10 +- .../src/app/components/cifs.component.ts | 47 +- .../components/preserve-overwrite.dialog.ts | 39 +- .../select-network-backup.dialog.ts | 47 +- .../app/components/unlock-password.dialog.ts | 35 +- .../setup-wizard/src/app/pages/drives.page.ts | 112 ++-- .../setup-wizard/src/app/pages/home.page.ts | 20 +- .../src/app/pages/keyboard.page.ts | 13 +- .../src/app/pages/language.page.ts | 46 +- .../src/app/pages/loading.page.ts | 4 +- .../src/app/pages/password.page.ts | 162 +++--- .../src/app/pages/restore.page.ts | 116 ++--- .../src/app/pages/success.page.ts | 17 +- .../src/app/pages/transfer.page.ts | 91 ++-- web/projects/setup-wizard/src/styles.scss | 55 +- .../src/components/markdown.component.ts | 7 +- .../shared/src/components/prompt.component.ts | 6 +- .../shared/src/components/server.component.ts | 3 +- .../src/directives/docs-link.directive.ts | 4 +- web/projects/shared/src/public-api.ts | 1 - .../shared/src/services/copy.service.ts | 4 +- .../shared/src/services/error.service.ts | 4 +- .../shared/src/services/loading.service.ts | 44 -- web/projects/shared/styles/shared.scss | 3 - web/projects/shared/styles/taiga.scss | 27 +- .../start-tunnel/src/app/app.config.ts | 12 +- .../src/app/routes/home/components/header.ts | 2 +- .../src/app/routes/home/components/nav.ts | 11 +- .../src/app/routes/home/routes/devices/add.ts | 54 +- .../app/routes/home/routes/devices/config.ts | 9 +- .../app/routes/home/routes/devices/index.ts | 30 +- .../routes/home/routes/port-forwards/add.ts | 51 +- .../routes/home/routes/port-forwards/index.ts | 12 +- .../home/routes/settings/change-password.ts | 32 +- .../app/routes/home/routes/settings/index.ts | 33 +- .../src/app/routes/home/routes/subnets/add.ts | 30 +- .../app/routes/home/routes/subnets/index.ts | 26 +- .../src/app/routes/login/index.ts | 6 +- .../src/app/services/update.service.ts | 4 +- web/projects/start-tunnel/src/index.html | 2 +- web/projects/start-tunnel/src/styles.scss | 19 +- web/projects/ui/src/app/app.component.ts | 2 +- web/projects/ui/src/app/app.config.ts | 44 +- .../app/components/backup-report.component.ts | 3 +- .../notifications-toast.component.ts | 10 +- .../app/components/refresh-alert.component.ts | 5 +- .../app/routes/diagnostic/home/home.page.ts | 10 +- .../login/ca-wizard/ca-wizard.component.ts | 4 +- .../src/app/routes/login/login.component.html | 2 +- .../ui/src/app/routes/login/login.page.scss | 2 +- .../ui/src/app/routes/login/login.page.ts | 10 +- .../portal/components/form.component.ts | 11 +- .../form/containers/array.component.ts | 29 +- .../form/containers/control.component.ts | 16 +- .../form/containers/group.component.ts | 5 +- .../form/containers/object.component.ts | 7 +- .../form/containers/union.component.ts | 2 +- .../form/controls/color.component.ts | 4 +- .../form/controls/datetime.component.ts | 77 +-- .../form/controls/file.component.ts | 8 +- .../form/controls/multiselect.component.ts | 6 - .../form/controls/number.component.ts | 4 +- .../form/controls/select.component.ts | 12 +- .../form/controls/text.component.ts | 6 +- .../form/controls/textarea.component.ts | 11 +- .../components/header/about.component.ts | 3 +- .../components/header/header.component.ts | 4 +- .../components/header/menu.component.ts | 123 ++--- .../components/header/navigation.component.ts | 2 +- .../components/header/status.component.ts | 2 +- .../interfaces/addresses/actions.component.ts | 33 +- .../addresses/addresses.component.ts | 20 +- .../interfaces/addresses/dns.component.ts | 2 +- .../interfaces/addresses/item.component.ts | 21 +- .../interfaces/addresses/plugin.component.ts | 30 +- .../addresses/port-forward.component.ts | 2 +- .../addresses/private-dns.component.ts | 2 +- .../interfaces/interface.component.ts | 2 +- .../logs/logs-download.directive.ts | 4 +- .../components/logs/logs-fetch.directive.ts | 4 +- .../components/placeholder.component.ts | 2 +- .../portal/components/tabs.component.ts | 2 +- .../portal/modals/config-dep.component.ts | 4 +- .../src/app/routes/portal/portal.component.ts | 23 +- .../routes/backups/backups.component.ts | 3 +- .../routes/backups/modals/backup.component.ts | 12 +- .../routes/backups/modals/edit.component.ts | 32 +- .../backups/modals/history.component.ts | 20 +- .../routes/backups/modals/jobs.component.ts | 21 +- .../backups/modals/recover.component.ts | 15 +- .../routes/backups/modals/target.component.ts | 2 +- .../backups/modals/targets.component.ts | 23 +- .../routes/backups/services/create.service.ts | 10 +- .../backups/services/restore.service.ts | 11 +- .../routes/logs/routes/outlet.component.ts | 23 +- .../components/controls.component.ts | 4 +- .../components/notification.component.ts | 5 +- .../marketplace/components/tile.component.ts | 9 +- .../marketplace/modals/registry.component.ts | 13 +- .../marketplace/services/sidebar.service.ts | 5 - .../portal/routes/metrics/cpu.component.ts | 4 +- .../portal/routes/metrics/data.component.ts | 5 +- .../routes/metrics/temperature.component.ts | 2 +- .../portal/routes/metrics/time.component.ts | 7 +- .../portal/routes/metrics/uptime.component.ts | 4 +- .../routes/notifications/item.component.ts | 2 +- .../notifications/notifications.component.ts | 12 +- .../routes/notifications/table.component.ts | 9 +- .../services/components/controls.component.ts | 3 +- .../components/dependencies.component.ts | 7 +- .../services/components/error.component.ts | 2 +- .../components/health-checks.component.ts | 15 +- .../components/interface-item.component.ts | 4 +- .../components/interfaces.component.ts | 12 +- .../services/components/progress.component.ts | 8 +- .../services/components/status.component.ts | 4 +- .../services/components/task.component.ts | 17 +- .../services/components/tasks.component.ts | 15 +- .../services/components/uptime.component.ts | 4 +- .../services/dashboard/service.component.ts | 6 +- .../modals/action-confirm.component.ts | 4 +- .../services/modals/action-input.component.ts | 8 +- .../action-success-group.component.ts | 12 +- .../action-success-member.component.ts | 12 +- .../action-success-single.component.ts | 8 +- .../action-success/action-success.page.ts | 8 +- .../routes/services/routes/about.component.ts | 2 +- .../services/routes/actions.component.ts | 22 +- .../services/routes/interface.component.ts | 4 +- .../services/routes/outlet.component.ts | 17 +- .../services/routes/service.component.ts | 2 +- .../routes/sideload/sideload.component.ts | 4 +- .../routes/authorities/authority.service.ts | 12 +- .../routes/authorities/item.component.ts | 67 +-- .../system/routes/backups/backup.component.ts | 21 +- .../routes/backups/backups.component.ts | 5 +- .../routes/backups/network.component.ts | 15 +- .../routes/backups/physical.component.ts | 4 +- .../routes/backups/progress.component.ts | 7 +- .../routes/backups/recover.component.ts | 19 +- .../routes/backups/restore.component.ts | 7 +- .../routes/system/routes/dns/dns.component.ts | 12 +- .../routes/gateways/gateways.component.ts | 30 +- .../system/routes/gateways/item.component.ts | 51 +- .../gateways/port-forwards.component.ts | 2 +- .../routes/general/general.component.ts | 29 +- .../general/keyboard-select.component.ts | 10 +- .../routes/general/server-name.dialog.ts | 8 +- .../system/routes/general/snake.directive.ts | 12 +- .../system/routes/general/update.component.ts | 30 +- .../routes/password/password.component.ts | 14 +- .../routes/sessions/sessions.component.ts | 5 +- .../system/routes/sessions/table.component.ts | 4 +- .../system/routes/smtp/smtp.component.ts | 10 +- .../routes/system/routes/ssh/ssh.component.ts | 7 +- .../system/routes/ssh/table.component.ts | 3 +- .../system/routes/wifi/table.component.ts | 35 +- .../system/routes/wifi/wifi.component.ts | 27 +- .../portal/routes/system/system.component.ts | 20 +- .../portal/routes/system/system.routes.ts | 4 +- .../portal/routes/updates/item.component.ts | 13 +- .../routes/updates/updates.component.ts | 16 +- .../ui/src/app/services/action.service.ts | 10 +- .../app/services/api/embassy-api.service.ts | 4 +- .../services/api/embassy-mock-api.service.ts | 4 +- .../ui/src/app/services/controls.service.ts | 4 +- .../app/services/date-transformer.service.ts | 16 - .../src/app/services/form-dialog.service.ts | 6 +- .../ui/src/app/services/proxy.service.ts | 5 +- .../app/services/standard-actions.service.ts | 4 +- .../ui/src/app/services/state.service.ts | 12 +- .../ui/src/app/services/storage.service.ts | 8 +- .../value-transformers.ts} | 22 +- web/projects/ui/src/polyfills.ts | 7 +- web/projects/ui/src/styles.scss | 24 +- 184 files changed, 1508 insertions(+), 1958 deletions(-) delete mode 100644 web/projects/shared/src/services/loading.service.ts delete mode 100644 web/projects/ui/src/app/routes/portal/routes/marketplace/services/sidebar.service.ts delete mode 100644 web/projects/ui/src/app/services/date-transformer.service.ts rename web/projects/ui/src/app/{services/datetime-transformer.service.ts => utils/value-transformers.ts} (54%) diff --git a/web/CLAUDE.md b/web/CLAUDE.md index 0e33fb3ee..b6b7f2a67 100644 --- a/web/CLAUDE.md +++ b/web/CLAUDE.md @@ -98,7 +98,8 @@ this.dialog.openComponent(new PolymorpheusComponent(MyComponent, injector), { la ### Errors & Tooltips ```html - + + ``` diff --git a/web/angular.json b/web/angular.json index 4d3c0060c..d1aca5abb 100644 --- a/web/angular.json +++ b/web/angular.json @@ -47,7 +47,7 @@ "projects/ui/src/manifest.webmanifest" ], "styles": [ - "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", + "node_modules/@taiga-ui/styles/taiga-ui-theme.less", "projects/shared/styles/taiga.scss", "projects/shared/styles/shared.scss", "projects/ui/src/styles.scss" @@ -158,7 +158,7 @@ } ], "styles": [ - "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", + "node_modules/@taiga-ui/styles/taiga-ui-theme.less", "projects/shared/styles/taiga.scss", "projects/shared/styles/shared.scss", "projects/setup-wizard/src/styles.scss" @@ -258,8 +258,8 @@ } ], "styles": [ - "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", - "node_modules/@taiga-ui/core/styles/taiga-ui-fonts.less", + "node_modules/@taiga-ui/styles/taiga-ui-theme.less", + "node_modules/@taiga-ui/styles/taiga-ui-fonts.less", "projects/shared/styles/shared.scss", "projects/start-tunnel/src/styles.scss" ], diff --git a/web/package-lock.json b/web/package-lock.json index eab2b5519..ec86a389c 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -9,7 +9,6 @@ "version": "0.4.0-alpha.20", "license": "MIT", "dependencies": { - "@angular/animations": "^21.2.1", "@angular/cdk": "^21.2.1", "@angular/common": "^21.2.1", "@angular/compiler": "^21.2.1", @@ -24,19 +23,19 @@ "@noble/hashes": "^1.4.0", "@start9labs/argon2": "^0.3.0", "@start9labs/start-sdk": "file:../sdk/baseDist", - "@taiga-ui/addon-charts": "4.73.0", - "@taiga-ui/addon-commerce": "4.73.0", - "@taiga-ui/addon-mobile": "4.73.0", - "@taiga-ui/addon-table": "4.73.0", - "@taiga-ui/cdk": "4.73.0", - "@taiga-ui/core": "4.73.0", - "@taiga-ui/dompurify": "4.1.11", - "@taiga-ui/event-plugins": "4.7.0", - "@taiga-ui/experimental": "4.73.0", - "@taiga-ui/icons": "4.73.0", - "@taiga-ui/kit": "4.73.0", - "@taiga-ui/layout": "4.73.0", - "@taiga-ui/polymorpheus": "4.9.0", + "@taiga-ui/addon-charts": "5.0.0-rc.4", + "@taiga-ui/addon-commerce": "5.0.0-rc.4", + "@taiga-ui/addon-mobile": "5.0.0-rc.4", + "@taiga-ui/addon-table": "5.0.0-rc.4", + "@taiga-ui/cdk": "5.0.0-rc.4", + "@taiga-ui/core": "5.0.0-rc.4", + "@taiga-ui/dompurify": "5.0.1", + "@taiga-ui/event-plugins": "5.0.0", + "@taiga-ui/experimental": "5.0.0-rc.4", + "@taiga-ui/icons": "5.0.0-rc.4", + "@taiga-ui/kit": "5.0.0-rc.4", + "@taiga-ui/layout": "5.0.0-rc.4", + "@taiga-ui/polymorpheus": "5.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", "buffer": "^6.0.3", @@ -46,7 +45,7 @@ "cron": "^2.2.0", "cronstrue": "^2.21.0", "deep-equality-data-structures": "1.5.1", - "dompurify": "^3.1.7", + "dompurify": "^3.3.2", "fast-json-patch": "^3.1.1", "fuse.js": "^6.4.6", "jose": "^4.9.0", @@ -71,7 +70,6 @@ "@angular/cli": "^21.2.1", "@angular/compiler-cli": "^21.2.1", "@angular/language-service": "^21.2.1", - "@types/dompurify": "3.0.5", "@types/estree": "^0.0.51", "@types/js-yaml": "^4.0.5", "@types/marked": "^4.0.3", @@ -448,22 +446,6 @@ "hawkeye": "index.mjs" } }, - "node_modules/@angular/animations": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.1.tgz", - "integrity": "sha512-zT/S29pUTbziCLvZ2itBdNWd5i8tsXexofH7KA4n2yvYmK1EhNpE7TlHRjghmsHgtDt4VnGiMW4zXEyrl05Dwg==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/core": "21.2.1" - } - }, "node_modules/@angular/build": { "version": "21.2.1", "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.1.tgz", @@ -2200,46 +2182,46 @@ ] }, "node_modules/@maskito/angular": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-3.11.1.tgz", - "integrity": "sha512-+OZzbRJj/9fOGhgPr0xYctSHe/Ngahip3VdNWBslRTpt7g+UTBYcB8vU9J4cHfpdXYeLM3tM0tnKksc3Eis0+Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-5.1.1.tgz", + "integrity": "sha512-NCKvUpIF3KCJDRpDWcI0DAeVQaYgsJmGAycq7h/LVu6h7P0nSd5xanYpoM2/F1MdXvGh/aEAF37KooTsfwUqog==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "2.8.1" }, "peerDependencies": { - "@angular/core": ">=16.0.0", - "@angular/forms": ">=16.0.0", - "@maskito/core": "^3.11.1" + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@maskito/core": "^5.1.1" } }, "node_modules/@maskito/core": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-3.11.1.tgz", - "integrity": "sha512-zN5k/BiZXblo8mEFhsGnnXBCqKMkjEGArorOOcpB1/ymZyqF12Dk6IipEsSE6abMnWw4YF2tukzfq73BFZKz8A==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-5.1.1.tgz", + "integrity": "sha512-grxipbOGKBs++kgAM/5K/lCghY/AfkSKNcRDSp8Nspf9dngxWiraMiPQVFsS8E0sab1wHEWlMXBdqEa3WyQXPA==", "license": "Apache-2.0", "peer": true }, "node_modules/@maskito/kit": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-3.11.1.tgz", - "integrity": "sha512-KOBUqxRz383xJWCoe+Emwxv2oAzUrZobIN+Gntmi5Py2S10XbqYnGX/6W7QHN8CUK2Nx11d3HsxbEQaq5Hinjg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-5.1.1.tgz", + "integrity": "sha512-YlMPGzyX/zuYaAxWRFTwBYoP3bV1WzMhrW8D+7Tn6nUfCBUTogvnJrVhVyOi6dZzXGX8qP1yRVT6W/IVt79F5g==", "license": "Apache-2.0", "peer": true, "peerDependencies": { - "@maskito/core": "^3.11.1" + "@maskito/core": "^5.1.1" } }, "node_modules/@maskito/phone": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@maskito/phone/-/phone-3.11.1.tgz", - "integrity": "sha512-ptNDPIZQs/v598qydBa9cnvoCE8+k2Sv07kKKVx3vG0V40DQnIlEL+LYKrJJbMIiPOB6CH90hB9eaA9KKReZ6w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@maskito/phone/-/phone-5.1.1.tgz", + "integrity": "sha512-yBb42/7FZpEjlAvvT5SabWX8jZdMjhGv4g7G6McarVM1RcG6vcV+kZd0xjAdDvOv8s5zGww+pN39Scn0tt+QMg==", "license": "Apache-2.0", "peer": true, "peerDependencies": { - "@maskito/core": "^3.11.1", - "@maskito/kit": "^3.11.1", + "@maskito/core": "^5.1.1", + "@maskito/kit": "^5.1.1", "libphonenumber-js": ">=1.0.0" } }, @@ -2732,52 +2714,53 @@ } }, "node_modules/@ng-web-apis/common": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-4.14.0.tgz", - "integrity": "sha512-eLrpy9e8R+eJKRUWv06jauaDCJ/6/9llmHPTvmWH3yTS9HIn+twk5ZmyfNwFqA/r8g9Kt4Ap48YuaydQy00nuw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-5.1.0.tgz", + "integrity": "sha512-omhjrojnwgJXIPT4H4sLruqCSGlWeLLuIAUkDB+fIARd1shT0vYmA9qugaNd54XmLOnL7Hu97FYkXnULFyT85w==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@types/dom-speech-recognition": "^0.0.7", "rxjs": ">=7.0.0" } }, "node_modules/@ng-web-apis/intersection-observer": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-4.14.0.tgz", - "integrity": "sha512-VDuak0+jDPwPttqQbgIYCD1tM2F7wKSXZWWUjFdNfkV47GspEPzzf12lY1eiltIiCB4cv6asZNs5ijnsxpnb9A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-5.1.0.tgz", + "integrity": "sha512-Fonur9MS3bxDyCbGX3gcuEsvIRPA/0PrkpOe2EohVJMdrVjs8eB6SbQR4DSKVv5We1maMSzt3jhd1u5KEMp2xA==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/core": ">=16.0.0", - "@ng-web-apis/common": ">=4.12.0" + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0" } }, "node_modules/@ng-web-apis/mutation-observer": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-4.14.0.tgz", - "integrity": "sha512-AUZDtVWN1rUSZoaB5AWhRYZ8DNSPoPQ2Ld8G8q9ocxfpslDHvjQQjUj5r0zHjAwKe1f9cNuow2nU+n6k3hF6ew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-5.1.0.tgz", + "integrity": "sha512-X8DepT55KG/xY/WnQ05pnSxpyzv76CWiDrKanzOeUy9SUckrfpjCWkGvyz9fSzUv27mOC4t/ry6Fnu+em28Tzg==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/core": ">=16.0.0", - "@ng-web-apis/common": ">=4.12.0" + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0" } }, "node_modules/@ng-web-apis/platform": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/platform/-/platform-4.14.0.tgz", - "integrity": "sha512-zmsbg0cEumppG6VlxIpM+ghJXBJ6G2mlTm+XmC9HYCnRJxYJjqIVRDZbYUQ4pGQHz4iJxRbp2C3VOndre72+3g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/platform/-/platform-5.1.0.tgz", + "integrity": "sha512-Jp6BqEDQ0C7/NpQ2TqTvy2ddjcOt1nON9KlCOaIR7L+YY88KToeQLD3dsFRFbxwWB1G1okgpxysMoFunatltYQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2785,31 +2768,31 @@ } }, "node_modules/@ng-web-apis/resize-observer": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-4.14.0.tgz", - "integrity": "sha512-W5VXT/y0Vv68Gx/2urgu/JmIQfv0jPtzfvGtyulgGALfBrnei4oVXvJe2aZmLb0/VkxH65qlYOKVEOGqBrwSwQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-5.1.0.tgz", + "integrity": "sha512-cuEPAaZJ2UDOA283S/Ehz7tdDLuCY6tLmdcYHlXTdnMcXiyrqUsu0dKQ04ZoZ0KXfoSjT95jPUTabot5psVPkw==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/core": ">=16.0.0", - "@ng-web-apis/common": ">=4.12.0" + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0" } }, "node_modules/@ng-web-apis/screen-orientation": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/screen-orientation/-/screen-orientation-4.14.0.tgz", - "integrity": "sha512-XlXjxhYT7QKW0WKQE4BIJ2OZ7c1EFRXUQ4eXQ41Jwl8ukG0zkixOTrxGlnfy7ijX5df3sX/+0kKCXwsyj/n5BA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/screen-orientation/-/screen-orientation-5.1.0.tgz", + "integrity": "sha512-x6W2C45EAcaHk/0QR5hcWg6bByyPD+E/xPlQjR8sQwLN+AE8ag1hrhmIbkQOyEP2K2kvU81M0ndbre0o4dRo9Q==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/core": ">=16.0.0", - "@ng-web-apis/common": ">=4.12.0", + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0", "rxjs": ">=7.0.0" } }, @@ -4182,118 +4165,118 @@ "link": true }, "node_modules/@taiga-ui/addon-charts": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-4.73.0.tgz", - "integrity": "sha512-BZhmupFnngsGICumSvaA7b8jf5lprQ5PD5Nqduq6iQ/pa02qv4VdR7HE2OM07kg4pBm4OX3OtJ0H9V0N/buchQ==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-5.0.0-rc.4.tgz", + "integrity": "sha512-goStkREzlt2vgK0gRI2o2BEud8YNqMxXAG3NW1YxyAO/P13OwzuxWxGBW013ykzxfpEVynUlswpUPWHyowNa8g==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@ng-web-apis/common": "^4.14.0", - "@taiga-ui/cdk": "^4.73.0", - "@taiga-ui/core": "^4.73.0", - "@taiga-ui/polymorpheus": "^4.9.0" + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0", + "@taiga-ui/cdk": "^5.0.0-rc.4", + "@taiga-ui/core": "^5.0.0-rc.4", + "@taiga-ui/polymorpheus": "^5.0.0" } }, "node_modules/@taiga-ui/addon-commerce": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-4.73.0.tgz", - "integrity": "sha512-jLNGPZgAnqhrLp5jJ2LNaDVuQs7SX1pUitDm4xpt26GnO7GuQmjY2E0SmZtEbBf/9ykROAnPzgWJbaIj6e5V0A==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-5.0.0-rc.4.tgz", + "integrity": "sha512-5Z/QbxC4NQKJ0F7Y7oJG86o1Ek+4XiBeV61F42/syHmD1/3Y2KEll+1GBvlx++xFHJvjfa0+xFUx3omLJjIGzA==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@angular/forms": ">=16.0.0", - "@maskito/angular": "^3.11.1", - "@maskito/core": "^3.11.1", - "@maskito/kit": "^3.11.1", - "@ng-web-apis/common": "^4.14.0", - "@taiga-ui/cdk": "^4.73.0", - "@taiga-ui/core": "^4.73.0", - "@taiga-ui/i18n": "^4.73.0", - "@taiga-ui/kit": "^4.73.0", - "@taiga-ui/polymorpheus": "^4.9.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@maskito/angular": "^5.1.1", + "@maskito/core": "^5.1.1", + "@maskito/kit": "^5.1.1", + "@ng-web-apis/common": "^5.1.0", + "@taiga-ui/cdk": "^5.0.0-rc.4", + "@taiga-ui/core": "^5.0.0-rc.4", + "@taiga-ui/i18n": "^5.0.0-rc.4", + "@taiga-ui/kit": "^5.0.0-rc.4", + "@taiga-ui/polymorpheus": "^5.0.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/addon-mobile": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-4.73.0.tgz", - "integrity": "sha512-5ohDbwkE2ur57eMYmM6Tl7IOvVNxzPiHnZRB5ZcntmDkFp7UBgSOFptelqraL9DP8w5LEmvrshT6ObygRQNe+Q==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-5.0.0-rc.4.tgz", + "integrity": "sha512-EkPCgOSnj7+SmgcQu4HVsmTNsBYiJ5SpuoktgxtZPmfeK4GXEmO1z6Pizotb3EHmyuyNBN69jeS4IPkdplvzsw==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/cdk": ">=16.0.0", - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@ng-web-apis/common": "^4.14.0", - "@taiga-ui/cdk": "^4.73.0", - "@taiga-ui/core": "^4.73.0", - "@taiga-ui/kit": "^4.73.0", - "@taiga-ui/layout": "^4.73.0", - "@taiga-ui/polymorpheus": "^4.9.0", + "@angular/cdk": ">=19.0.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0", + "@ng-web-apis/platform": "^5.1.0", + "@taiga-ui/cdk": "^5.0.0-rc.4", + "@taiga-ui/core": "^5.0.0-rc.4", + "@taiga-ui/kit": "^5.0.0-rc.4", + "@taiga-ui/layout": "^5.0.0-rc.4", + "@taiga-ui/polymorpheus": "^5.0.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/addon-table": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-table/-/addon-table-4.73.0.tgz", - "integrity": "sha512-fRxnCopvanInTdrVtNNXclY6T5u3fU87De564sngAcV9Y8Q1O44bZCyyDE/+jsoz3IIDZUD+2OEZjOGHMWLFOA==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-table/-/addon-table-5.0.0-rc.4.tgz", + "integrity": "sha512-j3ICBUoj4XKKvzzIbTQyLdif32+lHSlBozFDQcXhtL1x9C1mWOvidgU9kcsjygs0lEnjoIUTVza59sYMv3UKMQ==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@ng-web-apis/intersection-observer": "^4.14.0", - "@taiga-ui/cdk": "^4.73.0", - "@taiga-ui/core": "^4.73.0", - "@taiga-ui/i18n": "^4.73.0", - "@taiga-ui/kit": "^4.73.0", - "@taiga-ui/polymorpheus": "^4.9.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@ng-web-apis/intersection-observer": "^5.1.0", + "@taiga-ui/cdk": "^5.0.0-rc.4", + "@taiga-ui/core": "^5.0.0-rc.4", + "@taiga-ui/i18n": "^5.0.0-rc.4", + "@taiga-ui/kit": "^5.0.0-rc.4", + "@taiga-ui/polymorpheus": "^5.0.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-4.73.0.tgz", - "integrity": "sha512-bNRr5ORof60KevnMINNhbLbj8U9xgEMNvagzTtrtjVfEvCOJE1/+ufCnWjjkEdT/V0fDnbuhKsu16ngctbOhXQ==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-5.0.0-rc.4.tgz", + "integrity": "sha512-eZhqZvK8OE+alI5zJ3z0bQdufj77HCtREOC+Wsv5Fjz1mRZz4X19V3hpISfb6arp1m7kBfIscaPcZi0MuTcbUg==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "2.8.1" }, "optionalDependencies": { - "@angular-devkit/core": ">=16.0.0", - "@angular-devkit/schematics": ">=16.0.0", - "@schematics/angular": ">=16.0.0", + "@angular-devkit/core": ">=19.0.0", + "@angular-devkit/schematics": ">=19.0.0", + "@schematics/angular": ">=19.0.0", "ng-morph": "^4.8.4", "parse5": "^7.3.0" }, "peerDependencies": { - "@angular/animations": ">=16.0.0", - "@angular/cdk": ">=16.0.0", - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@angular/forms": ">=16.0.0", - "@ng-web-apis/common": "^4.14.0", - "@ng-web-apis/mutation-observer": "^4.14.0", - "@ng-web-apis/platform": "^4.14.0", - "@ng-web-apis/resize-observer": "^4.14.0", - "@ng-web-apis/screen-orientation": "^4.14.0", - "@taiga-ui/event-plugins": "^4.7.0", - "@taiga-ui/font-watcher": "~0.3.0", - "@taiga-ui/polymorpheus": "^4.9.0", + "@angular/cdk": ">=19.0.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0", + "@ng-web-apis/mutation-observer": "^5.1.0", + "@ng-web-apis/platform": "^5.1.0", + "@ng-web-apis/resize-observer": "^5.1.0", + "@ng-web-apis/screen-orientation": "^5.1.0", + "@taiga-ui/event-plugins": "^5.0.0", + "@taiga-ui/font-watcher": "~0.5.0", + "@taiga-ui/polymorpheus": "^5.0.0", "rxjs": ">=7.0.0" } }, @@ -4324,49 +4307,59 @@ } }, "node_modules/@taiga-ui/core": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-4.73.0.tgz", - "integrity": "sha512-8EyHWgenkWxdfRP1LtqkE/bV/9a3mK8MtVmFxauEjcbeyafnE6MJ7K2KgD+iU9TZsOdH7nuWiA44Sv14t1wcUA==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-5.0.0-rc.4.tgz", + "integrity": "sha512-mO1W/4Y743pk3dDg539J3rbAJ5CzNDU+EBCAxYV4wOftpFeSJuCFYvATt6p8XGHtTRCDk6dNXQ1+fkR7PqQ9Yg==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/animations": ">=16.0.0", - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@angular/forms": ">=16.0.0", - "@angular/platform-browser": ">=16.0.0", - "@angular/router": ">=16.0.0", - "@ng-web-apis/common": "^4.14.0", - "@ng-web-apis/mutation-observer": "^4.14.0", - "@taiga-ui/cdk": "^4.73.0", - "@taiga-ui/event-plugins": "^4.7.0", - "@taiga-ui/i18n": "^4.73.0", - "@taiga-ui/polymorpheus": "^4.9.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@angular/platform-browser": ">=19.0.0", + "@angular/router": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0", + "@ng-web-apis/mutation-observer": "^5.1.0", + "@ng-web-apis/platform": "^5.1.0", + "@taiga-ui/cdk": "^5.0.0-rc.4", + "@taiga-ui/event-plugins": "^5.0.0", + "@taiga-ui/i18n": "^5.0.0-rc.4", + "@taiga-ui/polymorpheus": "^5.0.0", + "@taiga-ui/styles": "^5.0.0-rc.4", "rxjs": ">=7.0.0" } }, + "node_modules/@taiga-ui/design-tokens": { + "version": "0.283.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/design-tokens/-/design-tokens-0.283.0.tgz", + "integrity": "sha512-fuLJYwY5a499hh4Cw+ABcO5bEdhcVP8l/1t6GQZApV6L1NfFQgmnf16vbtvGe/0TFCALpoydUGnELtZuwnrRiA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + } + }, "node_modules/@taiga-ui/dompurify": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@taiga-ui/dompurify/-/dompurify-4.1.11.tgz", - "integrity": "sha512-nwskeI/wFe+spuLQdkhVCn/GJBHJamxZ5deZuyto7C4I3O+pF8GaCNJdKM1YG5TZyGz932Qm8uNtBVZ/fZX8sQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/dompurify/-/dompurify-5.0.1.tgz", + "integrity": "sha512-5OdVzGRMEiy1g/WZUtbPbBt3f7A1lGDWFOm9a4MZGZrGhONv2++uIKLDBkOQchY8ur09vo+QC/pBSRGCIgeQ+g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.1" }, "peerDependencies": { - "@angular/core": ">=16.0.0", - "@angular/platform-browser": ">=16.0.0", - "@types/dompurify": "3.0.5", - "dompurify": "3.1.7" + "@angular/core": ">=19.0.0", + "@angular/platform-browser": ">=19.0.0", + "dompurify": "^3.2.7" } }, "node_modules/@taiga-ui/event-plugins": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/event-plugins/-/event-plugins-4.7.0.tgz", - "integrity": "sha512-j3HPRPR7XxKxgMeytb+r/CNUoLBMVrfdfL8KJr1XiFO9jyEvoC4chFXDXWlkGyUHJIC6wy5VIXlIlI/kpqOiGg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/event-plugins/-/event-plugins-5.0.0.tgz", + "integrity": "sha512-8AxIUn/lX4kwuDlIFmhElgBNtGDgQVC9/F+3O2A29IcMSt9693KRi8qKwToe9p3UuUsT9nnj5YeE11BtJMG0wA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -4379,116 +4372,128 @@ } }, "node_modules/@taiga-ui/experimental": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-4.73.0.tgz", - "integrity": "sha512-OFRO4rhWY780gf/iMip7sJJ1BBT2rWG5663Qqu/+6SAF4pyzcgKq5uIAkULQYFBQwqBNyB0zAx3fZAqdQ8m34A==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-5.0.0-rc.4.tgz", + "integrity": "sha512-/kw2uLivfeaNse8DkBABPNpTu3GiZ2R7JB0exBK0Flv0xZ3zZLRuIOMK2uHQqoc3v1zgQaFukXTz6CWuzUJYDA==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@taiga-ui/addon-commerce": "^4.73.0", - "@taiga-ui/cdk": "^4.73.0", - "@taiga-ui/core": "^4.73.0", - "@taiga-ui/kit": "^4.73.0", - "@taiga-ui/layout": "^4.73.0", - "@taiga-ui/polymorpheus": "^4.9.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@taiga-ui/addon-commerce": "^5.0.0-rc.4", + "@taiga-ui/cdk": "^5.0.0-rc.4", + "@taiga-ui/core": "^5.0.0-rc.4", + "@taiga-ui/kit": "^5.0.0-rc.4", + "@taiga-ui/layout": "^5.0.0-rc.4", + "@taiga-ui/polymorpheus": "^5.0.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/font-watcher": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/font-watcher/-/font-watcher-0.3.0.tgz", - "integrity": "sha512-ldI8XMvpVQEfxtcCzbLKs02QbqyB+qJKHIV/x19Q5mxs+kqrS3Pzm3j4mt8tPnuWhgi4+PHvAk3QLN9zmwcoJg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/font-watcher/-/font-watcher-0.5.0.tgz", + "integrity": "sha512-9QBUh3XT6KOS+pKVy4ggr0CxgiZtbDYlterUNcfXw8cswkIkiUl5VGDQdvmta60iPHqOrOd/Z/7aAUom35vX/g==", "license": "Apache-2.0", "peer": true }, "node_modules/@taiga-ui/i18n": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-4.73.0.tgz", - "integrity": "sha512-nU7pXeH3+mwQdWZCnXILDAZhRcQ4L/Gl+Y/G/yFpvkEfoCljhVsY0HZZgMSAEGfOSeS7R0ZhZX+9be6uHUvn4w==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-5.0.0-rc.4.tgz", + "integrity": "sha512-3hxhfewlY+5vsLPPl47rtlt47iVqnhDI2uD6waUm0ZqL/0YLhTEowkY2/DHhXoFp4+ZVcyTVRCWGf0G7BnJG+Q==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/core": ">=16.0.0", - "@ng-web-apis/common": "^4.14.0", + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.1.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/icons": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-4.73.0.tgz", - "integrity": "sha512-Ae8qTTf18OlAyFgv04aDkQ6T81J0c8NtFtGWMbNnNc2/CtVt2s0e7z6dcAvs0LODNidzXU6jn/OQT4w4PeAe+w==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-5.0.0-rc.4.tgz", + "integrity": "sha512-2MZLcSf8x2+5yizWVdW9Ual6++zdzU64MXWeBx8zlNVyeedxTww5AFbVFs16ItaeT4YdZM0uZmRY59TmnCP9Rg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.3.0" } }, "node_modules/@taiga-ui/kit": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-4.73.0.tgz", - "integrity": "sha512-8dypi4hZLi0GEFuraQERLNyKbR56BqQjU7c6p9x7X7iiMt4LpHUVH9+kd+e9irGWMr09SWLx4PFNV+q+T1c8TQ==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-5.0.0-rc.4.tgz", + "integrity": "sha512-MzK8tSzEl0dkhWcuKxmem/DSF+NnPvsNWJyGEx7hJO3IH0Ukcu806YfsSUld392U/7PZePAFRWKgMADdkQY29g==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@angular/forms": ">=16.0.0", - "@angular/router": ">=16.0.0", - "@maskito/angular": "^3.11.1", - "@maskito/core": "^3.11.1", - "@maskito/kit": "^3.11.1", - "@maskito/phone": "^3.11.1", - "@ng-web-apis/common": "^4.14.0", - "@ng-web-apis/intersection-observer": "^4.14.0", - "@ng-web-apis/mutation-observer": "^4.14.0", - "@ng-web-apis/resize-observer": "^4.14.0", - "@taiga-ui/cdk": "^4.73.0", - "@taiga-ui/core": "^4.73.0", - "@taiga-ui/i18n": "^4.73.0", - "@taiga-ui/polymorpheus": "^4.9.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@angular/router": ">=19.0.0", + "@maskito/angular": "^5.1.1", + "@maskito/core": "^5.1.1", + "@maskito/kit": "^5.1.1", + "@maskito/phone": "^5.1.1", + "@ng-web-apis/common": "^5.1.0", + "@ng-web-apis/intersection-observer": "^5.1.0", + "@ng-web-apis/mutation-observer": "^5.1.0", + "@ng-web-apis/platform": "^5.1.0", + "@ng-web-apis/resize-observer": "^5.1.0", + "@taiga-ui/cdk": "^5.0.0-rc.4", + "@taiga-ui/core": "^5.0.0-rc.4", + "@taiga-ui/i18n": "^5.0.0-rc.4", + "@taiga-ui/polymorpheus": "^5.0.0", + "@taiga-ui/styles": "^5.0.0-rc.4", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/layout": { - "version": "4.73.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/layout/-/layout-4.73.0.tgz", - "integrity": "sha512-JX2DRCdGw3ayvW07RtI7MjrceO7m7/0wj2RfkjT2Pa93elWooS85lDVy88tlVfcfm/bV2ZGwbemyecAwNjk/yQ==", + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/layout/-/layout-5.0.0-rc.4.tgz", + "integrity": "sha512-sKuksa89xxeIHgx3QchpTorySsjz+XMhcYi5ix/Mh/u+vgDxrcLCYGWAx9fcG/3mGTaCIIEMfaEQDs28jb9Ptw==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": ">=2.8.1" }, "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@taiga-ui/cdk": "^4.73.0", - "@taiga-ui/core": "^4.73.0", - "@taiga-ui/kit": "^4.73.0", - "@taiga-ui/polymorpheus": "^4.9.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@taiga-ui/cdk": "^5.0.0-rc.4", + "@taiga-ui/core": "^5.0.0-rc.4", + "@taiga-ui/kit": "^5.0.0-rc.4", + "@taiga-ui/polymorpheus": "^5.0.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/polymorpheus": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/polymorpheus/-/polymorpheus-4.9.0.tgz", - "integrity": "sha512-TbIIwslbEnxunKuL9OyPZdmefrvJEK6HYiADEKQHUMUs4Pk2UbhMckUieURo83yPDamk/Mww+Nu/g60J/4uh2w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/polymorpheus/-/polymorpheus-5.0.0.tgz", + "integrity": "sha512-FRus7OgxYyRuETB17g1/YXYs8PAeF4x8+K4ZDfD3Ede8Vxv/XslAYZvf/Ro0wag6Uiy0kAP4bvSaIGPS1Y8Fyg==", "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.8.1" }, "peerDependencies": { - "@angular/core": ">=16.0.0", - "@angular/platform-browser": ">=16.0.0" + "@angular/core": ">=19.0.0", + "@angular/platform-browser": ">=19.0.0" + } + }, + "node_modules/@taiga-ui/styles": { + "version": "5.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-5.0.0-rc.4.tgz", + "integrity": "sha512-xAiHSlVFIv6Ti5BEE3AIkjt0zUW5jibeWnB+P7I9D7+E3vV0n/XlpX0SBHKK6DMdrVaPgURzNQnjSrwwtmkWxQ==", + "license": "Apache-2.0", + "peer": true, + "peerDependencies": { + "@taiga-ui/design-tokens": "~0.283.0" } }, "node_modules/@ts-morph/common": { @@ -4622,15 +4627,12 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/dompurify": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", - "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "node_modules/@types/dom-speech-recognition": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.7.tgz", + "integrity": "sha512-NjiUoJbBlKhyufNsMZLSp+pbPNtPAFnR738RCJvtZy/HVQ2TZjmqpMyaeOSMXgxdfZM60nt8QGbtfmQrJAH2sw==", "license": "MIT", - "peer": true, - "dependencies": { - "@types/trusted-types": "*" - } + "peer": true }, "node_modules/@types/estree": { "version": "0.0.51", @@ -4715,7 +4717,8 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/@types/uuid": { "version": "8.3.4", @@ -6089,11 +6092,17 @@ } }, "node_modules/dompurify": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", - "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz", + "integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==", "license": "(MPL-2.0 OR Apache-2.0)", - "peer": true + "peer": true, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/domutils": { "version": "3.2.2", @@ -8025,9 +8034,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.12.36", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.36.tgz", - "integrity": "sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==", + "version": "1.12.38", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.38.tgz", + "integrity": "sha512-vwzxmasAy9hZigxtqTbFEwp8ZdZ975TiqVDwj5bKx5sR+zi5ucUQy9mbVTkKM9GzqdLdxux/hTw2nmN5J7POMA==", "license": "MIT", "peer": true }, diff --git a/web/package.json b/web/package.json index 3b22c4817..a4f9635ca 100644 --- a/web/package.json +++ b/web/package.json @@ -33,7 +33,6 @@ "format:check": "prettier --check projects/" }, "dependencies": { - "@angular/animations": "^21.2.1", "@angular/cdk": "^21.2.1", "@angular/common": "^21.2.1", "@angular/compiler": "^21.2.1", @@ -48,19 +47,19 @@ "@noble/hashes": "^1.4.0", "@start9labs/argon2": "^0.3.0", "@start9labs/start-sdk": "file:../sdk/baseDist", - "@taiga-ui/addon-charts": "4.73.0", - "@taiga-ui/addon-commerce": "4.73.0", - "@taiga-ui/addon-mobile": "4.73.0", - "@taiga-ui/addon-table": "4.73.0", - "@taiga-ui/cdk": "4.73.0", - "@taiga-ui/core": "4.73.0", - "@taiga-ui/dompurify": "4.1.11", - "@taiga-ui/event-plugins": "4.7.0", - "@taiga-ui/experimental": "4.73.0", - "@taiga-ui/icons": "4.73.0", - "@taiga-ui/kit": "4.73.0", - "@taiga-ui/layout": "4.73.0", - "@taiga-ui/polymorpheus": "4.9.0", + "@taiga-ui/addon-charts": "5.0.0-rc.4", + "@taiga-ui/addon-commerce": "5.0.0-rc.4", + "@taiga-ui/addon-mobile": "5.0.0-rc.4", + "@taiga-ui/addon-table": "5.0.0-rc.4", + "@taiga-ui/cdk": "5.0.0-rc.4", + "@taiga-ui/core": "5.0.0-rc.4", + "@taiga-ui/dompurify": "5.0.1", + "@taiga-ui/event-plugins": "5.0.0", + "@taiga-ui/experimental": "5.0.0-rc.4", + "@taiga-ui/icons": "5.0.0-rc.4", + "@taiga-ui/kit": "5.0.0-rc.4", + "@taiga-ui/layout": "5.0.0-rc.4", + "@taiga-ui/polymorpheus": "5.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", "buffer": "^6.0.3", @@ -70,7 +69,7 @@ "cron": "^2.2.0", "cronstrue": "^2.21.0", "deep-equality-data-structures": "1.5.1", - "dompurify": "^3.1.7", + "dompurify": "^3.3.2", "fast-json-patch": "^3.1.1", "fuse.js": "^6.4.6", "jose": "^4.9.0", @@ -95,7 +94,6 @@ "@angular/cli": "^21.2.1", "@angular/compiler-cli": "^21.2.1", "@angular/language-service": "^21.2.1", - "@types/dompurify": "3.0.5", "@types/estree": "^0.0.51", "@types/js-yaml": "^4.0.5", "@types/marked": "^4.0.3", diff --git a/web/projects/marketplace/src/components/menu/menu.component.scss b/web/projects/marketplace/src/components/menu/menu.component.scss index e35ff0f08..2304f9686 100644 --- a/web/projects/marketplace/src/components/menu/menu.component.scss +++ b/web/projects/marketplace/src/components/menu/menu.component.scss @@ -1,4 +1,4 @@ -@use '@taiga-ui/core/styles/taiga-ui-local' as taiga; +@use '@taiga-ui/styles/utils' as taiga; :host { margin: 0; diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts b/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts index 102de14db..685f7b016 100644 --- a/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts +++ b/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts @@ -15,12 +15,9 @@ import { MarketplacePkgBase } from '../../../types' selector: 'marketplace-dep-item', template: `
- + + +
@@ -107,8 +104,10 @@ export class MarketplaceDepItemComponent { dep!: KeyValue getImage(key: string) { - const icon = this.pkg.dependencyMetadata[key]?.icon - return icon ? icon : 'assets/img/service-icons/fallback.png' + return ( + this.pkg.dependencyMetadata[key]?.icon || + 'assets/img/service-icons/fallback.png' + ) } getTitle(key: string): string { diff --git a/web/projects/marketplace/src/pages/show/flavors.component.ts b/web/projects/marketplace/src/pages/show/flavors.component.ts index acec8c3d1..bea8286e3 100644 --- a/web/projects/marketplace/src/pages/show/flavors.component.ts +++ b/web/projects/marketplace/src/pages/show/flavors.component.ts @@ -1,9 +1,8 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core' import { RouterLink } from '@angular/router' import { i18nPipe, TrustUrlPipe } from '@start9labs/shared' -import { TuiTitle } from '@taiga-ui/core' +import { TuiTitle, TuiCell } from '@taiga-ui/core' import { TuiAvatar } from '@taiga-ui/kit' -import { TuiCell } from '@taiga-ui/layout' import { MarketplacePkg } from '../../types' @Component({ @@ -21,10 +20,9 @@ import { MarketplacePkg } from '../../types' [queryParams]="{ id: pkg.id, flavor: pkg.flavor }" queryParamsHandling="merge" > - + + + {{ pkg.title }} {{ pkg.version }} diff --git a/web/projects/marketplace/src/pages/show/screenshots.component.ts b/web/projects/marketplace/src/pages/show/screenshots.component.ts index 1b980ea04..d56f0cbc6 100644 --- a/web/projects/marketplace/src/pages/show/screenshots.component.ts +++ b/web/projects/marketplace/src/pages/show/screenshots.component.ts @@ -4,7 +4,7 @@ import { inject, Input, } from '@angular/core' -import { TUI_IS_MOBILE } from '@taiga-ui/cdk' +import { WA_IS_MOBILE } from '@ng-web-apis/platform' import { TuiButton, TuiDialogContext, TuiDialogService } from '@taiga-ui/core' import { TuiCarousel } from '@taiga-ui/kit' import { PolymorpheusContent } from '@taiga-ui/polymorpheus' @@ -130,7 +130,7 @@ export class MarketplacePackageScreenshotComponent { index = 0 - isMobile = inject(TUI_IS_MOBILE) + isMobile = inject(WA_IS_MOBILE) presentModalImg(content: PolymorpheusContent) { this.dialogs diff --git a/web/projects/setup-wizard/src/app/app.component.ts b/web/projects/setup-wizard/src/app/app.component.ts index 7139496b7..7a9a3ecee 100644 --- a/web/projects/setup-wizard/src/app/app.component.ts +++ b/web/projects/setup-wizard/src/app/app.component.ts @@ -8,7 +8,7 @@ import { StateService } from './services/state.service' @Component({ selector: 'app-root', - template: '', + template: '', imports: [TuiRoot, RouterOutlet], }) export class AppComponent implements OnInit { diff --git a/web/projects/setup-wizard/src/app/app.config.ts b/web/projects/setup-wizard/src/app/app.config.ts index ac29d8862..7425d0892 100644 --- a/web/projects/setup-wizard/src/app/app.config.ts +++ b/web/projects/setup-wizard/src/app/app.config.ts @@ -10,7 +10,6 @@ import { provideZoneChangeDetection, signal, } from '@angular/core' -import { provideAnimations } from '@angular/platform-browser/animations' import { PreloadAllModules, provideRouter, @@ -29,8 +28,10 @@ import { import { tuiButtonOptionsProvider, tuiTextfieldOptionsProvider, + provideTaiga, + tuiHintOptionsProvider, + tuiDialogOptionsProvider, } from '@taiga-ui/core' -import { provideEventPlugins } from '@taiga-ui/event-plugins' import { ROUTES } from './app.routes' import { ApiService } from './services/api.service' @@ -47,8 +48,9 @@ const version = require('../../../../package.json').version export const APP_CONFIG: ApplicationConfig = { providers: [ provideZoneChangeDetection(), - provideAnimations(), - provideEventPlugins(), + provideTaiga({ mode: 'dark' }), + tuiHintOptionsProvider({ appearance: 'primary-grayscale' }), + tuiDialogOptionsProvider({ size: 's' }), provideRouter( ROUTES, withDisabledInitialNavigation(), diff --git a/web/projects/setup-wizard/src/app/components/cifs.component.ts b/web/projects/setup-wizard/src/app/components/cifs.component.ts index ccd97ea49..779e12465 100644 --- a/web/projects/setup-wizard/src/app/components/cifs.component.ts +++ b/web/projects/setup-wizard/src/app/components/cifs.component.ts @@ -13,14 +13,10 @@ import { TuiDialogContext, TuiError, TuiIcon, - TuiTextfield, + TuiInput, + tuiValidationErrorsProvider, } from '@taiga-ui/core' -import { - TUI_VALIDATION_ERRORS, - TuiButtonLoading, - TuiFieldErrorPipe, - TuiPassword, -} from '@taiga-ui/kit' +import { TuiButtonLoading, TuiPassword } from '@taiga-ui/kit' import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus' import { ApiService } from '../services/api.service' import { StartOSDiskInfoWithId } from '../types' @@ -36,42 +32,36 @@ export interface CifsResult { - + - + - + - + @@ -107,20 +97,16 @@ export interface CifsResult { ReactiveFormsModule, TuiButton, TuiButtonLoading, - TuiTextfield, + TuiInput, TuiPassword, TuiError, - TuiFieldErrorPipe, TuiIcon, i18nPipe, ], providers: [ - { - provide: TUI_VALIDATION_ERRORS, - useValue: { - required: 'This field is required', - }, - }, + tuiValidationErrorsProvider({ + required: 'This field is required', + }), ], }) export class CifsComponent { @@ -183,10 +169,7 @@ export class CifsComponent { this.dialogs .openAlert( 'Unable to connect to network folder. Ensure (1) target computer is connected to LAN, (2) target folder is being shared, and (3) hostname, path, and credentials are accurate.', - { - label: 'Connection Failed', - size: 's', - }, + { label: 'Connection Failed' }, ) .subscribe() } diff --git a/web/projects/setup-wizard/src/app/components/preserve-overwrite.dialog.ts b/web/projects/setup-wizard/src/app/components/preserve-overwrite.dialog.ts index fdb111456..0cd4dace2 100644 --- a/web/projects/setup-wizard/src/app/components/preserve-overwrite.dialog.ts +++ b/web/projects/setup-wizard/src/app/components/preserve-overwrite.dialog.ts @@ -1,13 +1,19 @@ -import { Component, inject } from '@angular/core' +import { Component } from '@angular/core' import { i18nPipe } from '@start9labs/shared' -import { TuiButton } from '@taiga-ui/core' +import { TuiButton, TuiTitle } from '@taiga-ui/core' import { TuiDialogContext } from '@taiga-ui/core' -import { injectContext } from '@taiga-ui/polymorpheus' +import { TuiHeader } from '@taiga-ui/layout' +import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus' @Component({ - imports: [TuiButton, i18nPipe], + imports: [TuiButton, TuiHeader, TuiTitle, i18nPipe], template: ` -

{{ 'This drive contains existing StartOS data.' | i18n }}

+
+
+

{{ 'StartOS Data Detected' | i18n }}

+

{{ 'This drive contains existing StartOS data.' | i18n }}

+
+
  • {{ 'Preserve' | i18n }} @@ -28,30 +34,19 @@ import { injectContext } from '@taiga-ui/polymorpheus' `, - styles: ` - p { - margin: 0 0 0.75rem; - } - - footer { - display: flex; - margin-top: 2rem; - gap: 0.5rem; - flex-direction: column-reverse; - } - - .preserve-btn { - background: var(--tui-status-positive) !important; - } - `, }) export class PreserveOverwriteDialog { protected readonly context = injectContext>() } + +export const PRESERVE_OVERWRITE = new PolymorpheusComponent( + PreserveOverwriteDialog, +) diff --git a/web/projects/setup-wizard/src/app/components/select-network-backup.dialog.ts b/web/projects/setup-wizard/src/app/components/select-network-backup.dialog.ts index 6cddadde7..86eef2894 100644 --- a/web/projects/setup-wizard/src/app/components/select-network-backup.dialog.ts +++ b/web/projects/setup-wizard/src/app/components/select-network-backup.dialog.ts @@ -1,8 +1,9 @@ -import { Component, inject } from '@angular/core' +import { Component } from '@angular/core' import { FormsModule } from '@angular/forms' import { i18nPipe } from '@start9labs/shared' -import { TuiDialogContext, TuiTextfield } from '@taiga-ui/core' +import { TuiDialogContext, TuiTitle } from '@taiga-ui/core' import { TuiDataListWrapper, TuiSelect } from '@taiga-ui/kit' +import { TuiHeader } from '@taiga-ui/layout' import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus' import { StartOSDiskInfoWithId } from '../types' @@ -11,36 +12,48 @@ interface Data { } @Component({ - imports: [FormsModule, TuiTextfield, TuiSelect, TuiDataListWrapper, i18nPipe], + imports: [ + FormsModule, + TuiSelect, + TuiDataListWrapper, + i18nPipe, + TuiHeader, + TuiTitle, + ], template: ` -

    {{ 'Multiple backups found. Select which one to restore.' | i18n }}

    +
    +
    +

    {{ 'Select Network Backup' | i18n }}

    +

    + {{ 'Multiple backups found. Select which one to restore.' | i18n }} +

    +
    +
    -
    - {{ server.id }} + + {{ server.id }} - {{ server['eos-version'] }} -
    + @if (server['eos-version']) { + + {{ server['eos-version'] }} + + } +
    `, styles: ` - .server-item { - display: flex; - flex-direction: column; - - small { - opacity: 0.7; - } + div { + margin-block-end: 1rem; } `, }) diff --git a/web/projects/setup-wizard/src/app/components/unlock-password.dialog.ts b/web/projects/setup-wizard/src/app/components/unlock-password.dialog.ts index 2a536efb2..a02fdbf33 100644 --- a/web/projects/setup-wizard/src/app/components/unlock-password.dialog.ts +++ b/web/projects/setup-wizard/src/app/components/unlock-password.dialog.ts @@ -1,32 +1,27 @@ import { Component } from '@angular/core' import { FormsModule } from '@angular/forms' import { i18nPipe } from '@start9labs/shared' -import { - TuiButton, - TuiDialogContext, - TuiIcon, - TuiTextfield, -} from '@taiga-ui/core' +import { TuiButton, TuiDialogContext, TuiIcon, TuiInput } from '@taiga-ui/core' import { TuiPassword } from '@taiga-ui/kit' -import { injectContext } from '@taiga-ui/polymorpheus' +import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus' @Component({ - imports: [ - FormsModule, - TuiButton, - TuiTextfield, - TuiPassword, - TuiIcon, - i18nPipe, - ], + imports: [FormsModule, TuiButton, TuiInput, TuiPassword, TuiIcon, i18nPipe], template: ` -

    - {{ 'Enter the password that was used to encrypt this backup.' | i18n }} -

    +
    +
    +

    {{ 'Unlock Backup' | i18n }}

    +

    + {{ + 'Enter the password that was used to encrypt this backup.' | i18n + }} +

    +
    +
    } @else if (drives.length === 0) { -

    +

    {{ 'No drives found. Please connect a drive and click Refresh.' | i18n @@ -70,8 +75,7 @@ import { PreserveOverwriteDialog } from '../components/preserve-overwrite.dialog } @if (!mobile) { @@ -100,36 +104,27 @@ import { PreserveOverwriteDialog } from '../components/preserve-overwrite.dialog } @if (!mobile) { } @if (preserveData === true) { - + } @if (preserveData === false) { - + } -

    - - {{ driveName(drive) }} - - + + {{ driveName(drive) }} + {{ formatCapacity(drive.capacity) }} · {{ drive.logicalname }} - -
    + + } @@ -152,19 +147,8 @@ import { PreserveOverwriteDialog } from '../components/preserve-overwrite.dialog } `, styles: ` - .no-drives { - text-align: center; - color: var(--tui-text-secondary); - padding: 2rem; - } - - .drive-item { - display: flex; - flex-direction: column; - - small { - opacity: 0.7; - } + tui-icon:not([tuiTooltip]) { + pointer-events: none; } `, imports: [ @@ -173,7 +157,8 @@ import { PreserveOverwriteDialog } from '../components/preserve-overwrite.dialog TuiButton, TuiIcon, TuiLoader, - TuiTextfield, + TuiInput, + TuiNotification, TuiSelect, TuiDataListWrapper, TuiTooltip, @@ -186,13 +171,13 @@ export default class DrivesPage { private readonly api = inject(ApiService) private readonly router = inject(Router) private readonly dialogs = inject(DialogService) - private readonly loader = inject(LoadingService) + private readonly loader = inject(TuiNotificationMiddleService) private readonly errorService = inject(ErrorService) private readonly stateService = inject(StateService) private readonly cdr = inject(ChangeDetectorRef) private readonly i18n = inject(i18nPipe) - protected readonly mobile = inject(TUI_IS_MOBILE) + protected readonly mobile = inject(WA_IS_MOBILE) @HostListener('document:keydown', ['$event']) onKeydown(event: KeyboardEvent) { @@ -308,38 +293,27 @@ export default class DrivesPage { private showPreserveOverwriteDialog() { let selectionMade = false - this.dialogs - .openComponent( - new PolymorpheusComponent(PreserveOverwriteDialog), - { - label: 'StartOS Data Detected', - size: 's', - dismissible: true, - closeable: true, - }, - ) - .subscribe({ - next: preserve => { - selectionMade = true - this.preserveData = preserve + this.dialogs.openComponent(PRESERVE_OVERWRITE).subscribe({ + next: preserve => { + selectionMade = true + this.preserveData = preserve + this.cdr.markForCheck() + }, + complete: () => { + if (!selectionMade) { + // Dialog was dismissed without selection - clear the data drive + this.selectedDataDrive = null + this.preserveData = null this.cdr.markForCheck() - }, - complete: () => { - if (!selectionMade) { - // Dialog was dismissed without selection - clear the data drive - this.selectedDataDrive = null - this.preserveData = null - this.cdr.markForCheck() - } - }, - }) + } + }, + }) } private showOsDriveWarning() { this.dialogs .openConfirm({ label: 'Warning', - size: 's', data: { content: `
    • ${this.i18n.transform('Data on the OS drive may be overwritten.')}
    • @@ -363,7 +337,6 @@ export default class DrivesPage { this.dialogs .openConfirm({ label: 'Warning', - size: 's', data: { content: message as i18nKey, yes: 'Continue', @@ -397,10 +370,9 @@ export default class DrivesPage { this.dialogSub = this.dialogs .openAlert('StartOS has been installed successfully.', { label: 'Installation Complete!', - size: 's', dismissible: false, - closeable: true, - data: { button: this.i18n.transform('Continue to Setup') }, + closable: true, + data: this.i18n.transform('Continue to Setup'), }) .subscribe({ complete: () => { diff --git a/web/projects/setup-wizard/src/app/pages/home.page.ts b/web/projects/setup-wizard/src/app/pages/home.page.ts index 43cc1ed21..578b9c641 100644 --- a/web/projects/setup-wizard/src/app/pages/home.page.ts +++ b/web/projects/setup-wizard/src/app/pages/home.page.ts @@ -1,9 +1,9 @@ import { Component, inject } from '@angular/core' import { Router } from '@angular/router' import { i18nPipe } from '@start9labs/shared' -import { TuiAppearance, TuiTitle } from '@taiga-ui/core' +import { TuiTitle, TuiCell } from '@taiga-ui/core' import { TuiAvatar } from '@taiga-ui/kit' -import { TuiCardLarge, TuiCell, TuiHeader } from '@taiga-ui/layout' +import { TuiCardLarge, TuiHeader } from '@taiga-ui/layout' import { StateService } from '../services/state.service' @Component({ @@ -14,7 +14,7 @@ import { StateService } from '../services/state.service'
`, - imports: [ - TuiAppearance, - TuiCardLarge, - TuiHeader, - TuiCell, - TuiTitle, - TuiAvatar, - i18nPipe, - ], + imports: [TuiCardLarge, TuiHeader, TuiCell, TuiTitle, TuiAvatar, i18nPipe], }) export default class HomePage { private readonly router = inject(Router) diff --git a/web/projects/setup-wizard/src/app/pages/keyboard.page.ts b/web/projects/setup-wizard/src/app/pages/keyboard.page.ts index 082edc3dc..2a9b4fca5 100644 --- a/web/projects/setup-wizard/src/app/pages/keyboard.page.ts +++ b/web/projects/setup-wizard/src/app/pages/keyboard.page.ts @@ -6,8 +6,8 @@ import { Keyboard, LanguageCode, } from '@start9labs/shared' -import { TUI_IS_MOBILE } from '@taiga-ui/cdk' -import { TuiButton, TuiTextfield, TuiTitle } from '@taiga-ui/core' +import { WA_IS_MOBILE } from '@ng-web-apis/platform' +import { TuiButton, TuiTitle } from '@taiga-ui/core' import { TuiButtonLoading, TuiChevron, @@ -36,11 +36,7 @@ import { StateService } from '../services/state.service' } @if (!mobile) { - + } @@ -61,7 +57,6 @@ import { StateService } from '../services/state.service' TuiCardLarge, TuiButton, TuiButtonLoading, - TuiTextfield, TuiChevron, TuiSelect, TuiDataListWrapper, @@ -74,7 +69,7 @@ export default class KeyboardPage { private readonly api = inject(ApiService) private readonly stateService = inject(StateService) - protected readonly mobile = inject(TUI_IS_MOBILE) + protected readonly mobile = inject(WA_IS_MOBILE) // All keyboards, with language-specific keyboards at the top readonly keyboards = getAllKeyboardsSorted( this.stateService.language as LanguageCode, diff --git a/web/projects/setup-wizard/src/app/pages/language.page.ts b/web/projects/setup-wizard/src/app/pages/language.page.ts index 066a48787..297dceb8c 100644 --- a/web/projects/setup-wizard/src/app/pages/language.page.ts +++ b/web/projects/setup-wizard/src/app/pages/language.page.ts @@ -2,9 +2,10 @@ import { Component, computed, inject, signal } from '@angular/core' import { Router } from '@angular/router' import { FormsModule } from '@angular/forms' import { i18nPipe, i18nService, Language, LANGUAGES } from '@start9labs/shared' -import { TUI_IS_MOBILE } from '@taiga-ui/cdk' -import { TuiButton, TuiTextfield, TuiTitle } from '@taiga-ui/core' +import { WA_IS_MOBILE } from '@ng-web-apis/platform' +import { TuiButton, TuiCell, TuiTitle } from '@taiga-ui/core' import { + TuiAvatar, TuiButtonLoading, TuiChevron, TuiDataListWrapper, @@ -18,13 +19,15 @@ import { StateService } from '../services/state.service' template: `
-

- - Start9 +
+

+ + Start9 + {{ 'Welcome to' | i18n }} StartOS - - {{ 'Select your language' | i18n }} -

+

+

{{ 'Select your language' | i18n }}

+
@@ -57,11 +59,10 @@ import { StateService } from '../services/state.service' - @let lang = asLanguage(item); -
- {{ lang.nativeName }} - {{ lang.name | i18n }} -
+ + {{ asLanguage(item).nativeName }} + {{ asLanguage(item).name | i18n }} +
@@ -76,22 +77,13 @@ import { StateService } from '../services/state.service'
`, - styles: ` - .language-item { - display: flex; - flex-direction: column; - - small { - opacity: 0.7; - } - } - `, imports: [ FormsModule, TuiCardLarge, TuiButton, TuiButtonLoading, - TuiTextfield, + TuiAvatar, + TuiCell, TuiChevron, TuiSelect, TuiDataListWrapper, @@ -106,7 +98,7 @@ export default class LanguagePage { private readonly stateService = inject(StateService) private readonly i18nService = inject(i18nService) - protected readonly mobile = inject(TUI_IS_MOBILE) + protected readonly mobile = inject(WA_IS_MOBILE) readonly languages = LANGUAGES selected = diff --git a/web/projects/setup-wizard/src/app/pages/loading.page.ts b/web/projects/setup-wizard/src/app/pages/loading.page.ts index a00355776..e9213507b 100644 --- a/web/projects/setup-wizard/src/app/pages/loading.page.ts +++ b/web/projects/setup-wizard/src/app/pages/loading.page.ts @@ -12,10 +12,10 @@ import { getErrorMessage, i18nPipe, InitializingComponent, - LoadingService, } from '@start9labs/shared' import { T } from '@start9labs/start-sdk' import { TuiButton } from '@taiga-ui/core' +import { TuiNotificationMiddleService } from '@taiga-ui/kit' import { catchError, filter, @@ -64,7 +64,7 @@ import { StateService } from '../services/state.service' }) export default class LoadingPage { private readonly api = inject(ApiService) - private readonly loader = inject(LoadingService) + private readonly loader = inject(TuiNotificationMiddleService) private readonly dialog = inject(DialogService) private readonly router = inject(Router) diff --git a/web/projects/setup-wizard/src/app/pages/password.page.ts b/web/projects/setup-wizard/src/app/pages/password.page.ts index 6e8e7fcd7..fe8ca2072 100644 --- a/web/projects/setup-wizard/src/app/pages/password.page.ts +++ b/web/projects/setup-wizard/src/app/pages/password.page.ts @@ -1,4 +1,3 @@ -import { AsyncPipe } from '@angular/common' import { Component, inject } from '@angular/core' import { Router } from '@angular/router' import { @@ -8,31 +7,28 @@ import { ReactiveFormsModule, Validators, } from '@angular/forms' -import { - ErrorService, - i18nPipe, - LoadingService, - normalizeHostname, -} from '@start9labs/shared' +import { ErrorService, i18nPipe, normalizeHostname } from '@start9labs/shared' import { TuiAutoFocus, TuiMapperPipe, TuiValidator } from '@taiga-ui/cdk' import { TuiButton, TuiError, TuiIcon, - TuiTextfield, TuiTitle, -} from '@taiga-ui/core' -import { - TuiFieldErrorPipe, - TuiPassword, + TuiInput, tuiValidationErrorsProvider, -} from '@taiga-ui/kit' -import { TuiCardLarge, TuiHeader } from '@taiga-ui/layout' +} from '@taiga-ui/core' +import { TuiNotificationMiddleService, TuiPassword } from '@taiga-ui/kit' +import { TuiCardLarge, TuiForm, TuiHeader } from '@taiga-ui/layout' import { StateService } from '../services/state.service' @Component({ template: ` -
+

{{ @@ -43,104 +39,80 @@ import { StateService } from '../services/state.service'

- - @if (isFresh) { - - - - - - @if (form.controls.name.value?.trim()) { -

{{ derivedHostname }}.local

- } + @if (isFresh) { + + + + + + @if (form.controls.name.value?.trim()) { + } + } - - - - - - + + + + + - - - - - - + + + + + -
+
+ + @if (!isFresh) { - @if (!isFresh) { - - } -
- -
- `, - styles: ` - .hostname-preview { - color: var(--tui-text-secondary); - font: var(--tui-font-text-s); - margin-top: 0.25rem; - } - - footer { - display: flex; - flex-direction: column; - gap: 1rem; - margin-top: 1.5rem; - } + } + + `, imports: [ - AsyncPipe, ReactiveFormsModule, TuiCardLarge, TuiButton, TuiError, TuiAutoFocus, - TuiFieldErrorPipe, - TuiTextfield, + TuiInput, + TuiForm, TuiPassword, TuiValidator, TuiIcon, @@ -160,7 +132,7 @@ import { StateService } from '../services/state.service' }) export default class PasswordPage { private readonly router = inject(Router) - private readonly loader = inject(LoadingService) + private readonly loader = inject(TuiNotificationMiddleService) private readonly errorService = inject(ErrorService) private readonly stateService = inject(StateService) private readonly i18n = inject(i18nPipe) diff --git a/web/projects/setup-wizard/src/app/pages/restore.page.ts b/web/projects/setup-wizard/src/app/pages/restore.page.ts index 616d13487..0557a2b65 100644 --- a/web/projects/setup-wizard/src/app/pages/restore.page.ts +++ b/web/projects/setup-wizard/src/app/pages/restore.page.ts @@ -6,11 +6,11 @@ import { TuiButton, TuiDataList, TuiDropdown, - TuiIcon, + TuiLink, TuiLoader, - TuiOptGroup, TuiTitle, } from '@taiga-ui/core' +import { TuiChevron } from '@taiga-ui/kit' import { TuiCardLarge, TuiHeader } from '@taiga-ui/layout' import { PolymorpheusComponent } from '@taiga-ui/polymorpheus' import { ApiService } from '../services/api.service' @@ -18,22 +18,25 @@ import { StateService } from '../services/state.service' import { StartOSDiskInfoFull, StartOSDiskInfoWithId } from '../types' import { CIFS, CifsResult } from '../components/cifs.component' import { SELECT_NETWORK_BACKUP } from '../components/select-network-backup.dialog' -import { UnlockPasswordDialog } from '../components/unlock-password.dialog' +import { UNLOCK_PASSWORD } from '../components/unlock-password.dialog' @Component({ template: `
-

- {{ 'Select Backup' | i18n }} - +
+

{{ 'Select Backup' | i18n }}

+

{{ 'Select the StartOS backup you want to restore' | i18n }} - - - {{ 'Refresh' | i18n }} - - -

+ +

+
@if (loading) { @@ -41,82 +44,50 @@ import { UnlockPasswordDialog } from '../components/unlock-password.dialog' } @else { - - - - - - + + +
@for (server of physicalServers; track server.id) { -
+ + } @empty { -
{{ 'No physical backups' | i18n }}
+ } - + } `, - styles: ` - .refresh { - display: inline-flex; - align-items: center; - gap: 0.25rem; - cursor: pointer; - color: var(--tui-text-action); - - tui-icon { - font-size: 0.875rem; - } - } - - .server-item { - display: flex; - flex-direction: column; - - small { - opacity: 0.7; - } - } - - .no-items { - padding: 0.5rem 0.75rem; - color: var(--tui-text-secondary); - font-style: italic; - } - `, imports: [ TuiButton, TuiCardLarge, TuiDataList, TuiDropdown, TuiLoader, - TuiIcon, - TuiOptGroup, TuiTitle, TuiHeader, i18nPipe, + TuiLink, + TuiChevron, ], }) export default class RestorePage { @@ -142,10 +113,7 @@ export default class RestorePage { openCifs() { this.open = false this.dialogs - .openComponent(CIFS, { - label: 'Connect Network Folder', - size: 's', - }) + .openComponent(CIFS, { label: 'Connect Network Folder' }) .subscribe(result => { if (result) { this.handleCifsResult(result) @@ -167,7 +135,7 @@ export default class RestorePage { type: 'cifs', ...result.cifs, }) - } else if (result.servers.length > 1) { + } else { this.showSelectNetworkBackupDialog(result.cifs, result.servers) } } @@ -178,8 +146,6 @@ export default class RestorePage { ) { this.dialogs .openComponent(SELECT_NETWORK_BACKUP, { - label: 'Select Network Backup', - size: 's', data: { servers }, }) .subscribe(server => { @@ -194,13 +160,7 @@ export default class RestorePage { target: { type: 'disk'; logicalname: string } | ({ type: 'cifs' } & T.Cifs), ) { this.dialogs - .openComponent( - new PolymorpheusComponent(UnlockPasswordDialog), - { - label: 'Unlock Backup', - size: 's', - }, - ) + .openComponent(UNLOCK_PASSWORD) .subscribe(password => { if (password) { this.stateService.recoverySource = { diff --git a/web/projects/setup-wizard/src/app/pages/success.page.ts b/web/projects/setup-wizard/src/app/pages/success.page.ts index c27a539ed..010c8bb05 100644 --- a/web/projects/setup-wizard/src/app/pages/success.page.ts +++ b/web/projects/setup-wizard/src/app/pages/success.page.ts @@ -12,9 +12,9 @@ import { ErrorService, i18nPipe, } from '@start9labs/shared' -import { TuiIcon, TuiLoader, TuiTitle } from '@taiga-ui/core' +import { TuiIcon, TuiLoader, TuiTitle, TuiCell } from '@taiga-ui/core' import { TuiAvatar } from '@taiga-ui/kit' -import { TuiCardLarge, TuiCell, TuiHeader } from '@taiga-ui/layout' +import { TuiCardLarge, TuiHeader } from '@taiga-ui/layout' import { ApiService } from '../services/api.service' import { StateService } from '../services/state.service' import { DocumentationComponent } from '../components/documentation.component' @@ -50,7 +50,7 @@ import { PolymorpheusComponent } from '@taiga-ui/polymorpheus' @if (!stateService.kiosk) { +

+ @if (loading) { @@ -43,75 +47,43 @@ import { StateService } from '../services/state.service' } @else { - - - + @for (drive of drives; track drive.logicalname) { - - } @empty { -
- {{ 'No StartOS data drives found' | i18n }} -
}
-
+ } `, - styles: ` - .refresh { - display: inline-flex; - align-items: center; - gap: 0.25rem; - cursor: pointer; - color: var(--tui-text-action); - - tui-icon { - font-size: 0.875rem; - } - } - - .drive-item { - display: flex; - flex-direction: column; - - small { - opacity: 0.7; - } - } - - .no-items { - padding: 0.5rem 0.75rem; - color: var(--tui-text-secondary); - font-style: italic; - } - `, imports: [ TuiButton, TuiCardLarge, TuiDataList, TuiDropdown, - TuiIcon, + TuiLink, + TuiChevron, TuiLoader, TuiTitle, TuiHeader, i18nPipe, ], }) -export default class TransferPage { +export default class TransferPage implements OnInit { private readonly api = inject(ApiService) private readonly router = inject(Router) private readonly dialogs = inject(DialogService) @@ -137,7 +109,6 @@ export default class TransferPage { this.dialogs .openConfirm({ label: 'Warning', - size: 's', data: { content: 'After transferring data from this drive, do not attempt to boot into it again as a Start9 Server. This may result in services malfunctioning, data corruption, or loss of funds.', diff --git a/web/projects/setup-wizard/src/styles.scss b/web/projects/setup-wizard/src/styles.scss index 1e1d12cb2..24743eccd 100644 --- a/web/projects/setup-wizard/src/styles.scss +++ b/web/projects/setup-wizard/src/styles.scss @@ -12,6 +12,10 @@ tui-root { height: 100%; } +ul { + padding-inline-start: 1rem; +} + router-outlet + * { height: 100%; max-width: min(35rem, 100vw); @@ -30,41 +34,11 @@ router-outlet + * { } } -.inline-title { - display: inline-flex; - align-items: center; - gap: 0.5rem; - - :first-child { - width: 2rem; - height: 2rem; - } - -} - button:disabled { opacity: var(--tui-disabled-opacity); pointer-events: none; } -header { - position: relative; - display: flex; - flex-direction: column; - text-align: center; - font: var(--tui-font-heading-4); - - p { - font: var(--tui-font-text-m); - color: var(--tui-text-secondary); - } -} - -h2 { - margin: 0; - font: var(--tui-font-heading-6); -} - .g-positive { color: var(--tui-status-positive); } @@ -77,14 +51,27 @@ h2 { color: var(--tui-status-negative); } +.g-secondary { + color: var(--tui-text-secondary) !important; +} + .g-info { color: var(--tui-status-info); } -[tuiCardLarge] footer button { - width: 100%; +[tuiCardLarge] footer { + display: flex; + + button { + flex: 1; + } } -[tuiCell]:not(:last-of-type) { +[tuiCell]:not([tuiOption]):not(:last-of-type) { box-shadow: 0 calc(0.5rem + 1px) 0 -0.5rem var(--tui-border-normal); -} \ No newline at end of file +} + +// TODO: Remove in Taiga v5.0 +[tuiButton] { + min-block-size: var(--t-size); +} diff --git a/web/projects/shared/src/components/markdown.component.ts b/web/projects/shared/src/components/markdown.component.ts index ca260e562..af340006f 100644 --- a/web/projects/shared/src/components/markdown.component.ts +++ b/web/projects/shared/src/components/markdown.component.ts @@ -11,7 +11,12 @@ import { getErrorMessage } from '../services/error.service' @Component({ template: ` @if (error()) { - +
} @if (content(); as result) { diff --git a/web/projects/shared/src/components/prompt.component.ts b/web/projects/shared/src/components/prompt.component.ts index 0f7d4cb9a..b266bcfa0 100644 --- a/web/projects/shared/src/components/prompt.component.ts +++ b/web/projects/shared/src/components/prompt.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' import { FormsModule } from '@angular/forms' import { TuiAutoFocus } from '@taiga-ui/cdk' -import { TuiButton, TuiDialogContext, TuiTextfield } from '@taiga-ui/core' +import { TuiButton, TuiDialogContext, TuiInput } from '@taiga-ui/core' import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus' import { i18nPipe } from '../i18n/i18n.pipe' import { i18nKey } from '../i18n/i18n.providers' @@ -23,7 +23,7 @@ import { i18nKey } from '../i18n/i18n.providers' } ', - styles: ` - :host { - display: flex; - align-items: center; - max-width: 80%; - margin: auto; - padding: 1.5rem; - background: var(--tui-background-elevation-1); - border-radius: var(--tui-radius-m); - box-shadow: var(--tui-shadow-popup); - - --tui-background-accent-1: var(--tui-status-warning); - } - - tui-loader { - flex-shrink: 0; - min-width: 2rem; - } - `, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [TuiLoader, i18nPipe], -}) -class LoadingComponent { - readonly content = injectContext<{ content: i18nKey }>().content -} - -@Injectable({ - providedIn: `root`, - useFactory: () => new LoadingService(TUI_DIALOGS, LoadingComponent), -}) -export class LoadingService extends TuiPopoverService { - override open(textContent: i18nKey | '' = '') { - return super.open(textContent) - } -} diff --git a/web/projects/shared/styles/shared.scss b/web/projects/shared/styles/shared.scss index fb1deebac..3c4d391b4 100644 --- a/web/projects/shared/styles/shared.scss +++ b/web/projects/shared/styles/shared.scss @@ -95,9 +95,6 @@ $wide-modal: 900px; --tw-color-zinc-800: 39 39 42; --tw-color-zinc-900: 24 24 27; --tw-color-zinc-950: 9 9 11; - - --tui-font-text: 'Proxima Nova', system-ui; - --tui-font-heading: 'Proxima Nova', system-ui; } body { diff --git a/web/projects/shared/styles/taiga.scss b/web/projects/shared/styles/taiga.scss index 615d9a165..385a0184d 100644 --- a/web/projects/shared/styles/taiga.scss +++ b/web/projects/shared/styles/taiga.scss @@ -1,4 +1,4 @@ -@use '@taiga-ui/core/styles/taiga-ui-local' as taiga; +@use '@taiga-ui/styles/utils' as taiga; [tuiTheme='dark'] { --tui-background-base: rgba(23, 23, 23, 1); @@ -135,13 +135,13 @@ tui-dropdown[data-appearance='start-os'][data-appearance='start-os'] { inset 0 0 1rem rgba(0, 0, 0, 0.25), var(--tui-shadow-medium); - [tuiOption] { - justify-content: flex-start; - gap: 0.5rem; + input { + // Checkmark + --tui-text-action: var(--tui-text-primary); } } -// @TODO Alex: Move to Taiga UI +// TODO: Remove in Taiga v5.0 a[tuiIconButton]:not([href]) { pointer-events: none; opacity: var(--tui-disabled-opacity); @@ -160,7 +160,7 @@ tui-textfield [tuiTooltip] { padding-block: 0.75rem; [tuiTitle] { - font: var(--tui-font-text-l); + font: var(--tui-typography-body-l); } } @@ -169,7 +169,16 @@ tui-textfield [tuiTooltip] { } } -// TODO: Remove after migrating to v5 -[tuiOption] { - word-break: break-word; +:root { + --tui-typography-family-text: 'Proxima Nova', system-ui; + --tui-typography-family-display: 'Proxima Nova', system-ui; +} + +tui-notification-middle { + --tui-background-accent-1: var(--tui-status-warning); +} + +// TODO: Remove in Taiga v5.0 +[tuiButton] { + min-block-size: var(--t-size); } diff --git a/web/projects/start-tunnel/src/app/app.config.ts b/web/projects/start-tunnel/src/app/app.config.ts index 3539019af..ce1b94b8e 100644 --- a/web/projects/start-tunnel/src/app/app.config.ts +++ b/web/projects/start-tunnel/src/app/app.config.ts @@ -1,13 +1,14 @@ -import { tuiDropdownOptionsProvider } from '@taiga-ui/core' -import { provideEventPlugins } from '@taiga-ui/event-plugins' -import { provideAnimations } from '@angular/platform-browser/animations' +import { + tuiDropdownOptionsProvider, + tuiDialogOptionsProvider, + provideTaiga, +} from '@taiga-ui/core' import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZonelessChangeDetection, } from '@angular/core' import { provideRouter, withRouterConfig } from '@angular/router' -import { tuiDialogOptionsProvider } from '@taiga-ui/experimental' import { PatchDB } from 'patch-db-client' import { PATCH_CACHE, @@ -31,11 +32,10 @@ const { export const appConfig: ApplicationConfig = { providers: [ - provideAnimations(), provideBrowserGlobalErrorListeners(), provideZonelessChangeDetection(), provideRouter(routes, withRouterConfig({ onSameUrlNavigation: 'reload' })), - provideEventPlugins(), + provideTaiga({ mode: 'dark' }), tuiDropdownOptionsProvider({ appearance: 'start-9' }), tuiDialogOptionsProvider({ appearance: 'start-9 taiga' }), { diff --git a/web/projects/start-tunnel/src/app/routes/home/components/header.ts b/web/projects/start-tunnel/src/app/routes/home/components/header.ts index 92cb0540c..3eabaaf40 100644 --- a/web/projects/start-tunnel/src/app/routes/home/components/header.ts +++ b/web/projects/start-tunnel/src/app/routes/home/components/header.ts @@ -29,7 +29,7 @@ import { SidebarService } from 'src/app/services/sidebar.service' } h1 { - font: var(--tui-font-heading-6); + font: var(--tui-typography-heading-h6); margin-inline-end: auto; } diff --git a/web/projects/start-tunnel/src/app/routes/home/components/nav.ts b/web/projects/start-tunnel/src/app/routes/home/components/nav.ts index 0473d0b63..cb6f38ee3 100644 --- a/web/projects/start-tunnel/src/app/routes/home/components/nav.ts +++ b/web/projects/start-tunnel/src/app/routes/home/components/nav.ts @@ -1,8 +1,11 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { Router, RouterLink, RouterLinkActive } from '@angular/router' -import { ErrorService, LoadingService } from '@start9labs/shared' +import { ErrorService } from '@start9labs/shared' import { TuiButton } from '@taiga-ui/core' -import { TuiBadgeNotification } from '@taiga-ui/kit' +import { + TuiBadgeNotification, + TuiNotificationMiddleService, +} from '@taiga-ui/kit' import { ApiService } from 'src/app/services/api/api.service' import { AuthService } from 'src/app/services/auth.service' import { SidebarService } from 'src/app/services/sidebar.service' @@ -110,7 +113,7 @@ export class Nav { private readonly router = inject(Router) protected readonly sidebars = inject(SidebarService) protected readonly api = inject(ApiService) - private readonly loader = inject(LoadingService) + private readonly loader = inject(TuiNotificationMiddleService) private readonly errorService = inject(ErrorService) protected readonly update = inject(UpdateService) @@ -133,7 +136,7 @@ export class Nav { ] as const protected async logout() { - const loader = this.loader.open().subscribe() + const loader = this.loader.open('').subscribe() try { await this.api.logout() this.service.authenticated.set(false) diff --git a/web/projects/start-tunnel/src/app/routes/home/routes/devices/add.ts b/web/projects/start-tunnel/src/app/routes/home/routes/devices/add.ts index 990ddf10d..4ae171590 100644 --- a/web/projects/start-tunnel/src/app/routes/home/routes/devices/add.ts +++ b/web/projects/start-tunnel/src/app/routes/home/routes/devices/add.ts @@ -1,32 +1,26 @@ -import { AsyncPipe } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { NonNullableFormBuilder, ReactiveFormsModule, Validators, } from '@angular/forms' -import { ErrorService, LoadingService } from '@start9labs/shared' +import { ErrorService } from '@start9labs/shared' import { utils } from '@start9labs/start-sdk' +import { WA_IS_MOBILE } from '@ng-web-apis/platform' +import { TuiResponsiveDialogService } from '@taiga-ui/addon-mobile' import { - TUI_IS_MOBILE, + TuiAnimated, TuiAutoFocus, tuiMarkControlAsTouchedAndValidate, } from '@taiga-ui/cdk' -import { - TuiButton, - TuiDialogContext, - TuiError, - TuiTextfield, -} from '@taiga-ui/core' -import { TuiDialogService } from '@taiga-ui/experimental' +import { TuiButton, TuiDialogContext, TuiError, TuiInput } from '@taiga-ui/core' import { TuiChevron, TuiDataListWrapper, - TuiElasticContainer, - TuiFieldErrorPipe, + TuiNotificationMiddleService, TuiSelect, } from '@taiga-ui/kit' -import { TuiForm } from '@taiga-ui/layout' +import { TuiForm, TuiElasticContainer } from '@taiga-ui/layout' import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus' import { ApiService } from 'src/app/services/api/api.service' @@ -44,9 +38,9 @@ import {
- + - + @if (!context.data.device) { @@ -63,31 +57,24 @@ import { } @if (!mobile) { } - + @if (form.controls.subnet.value?.range) { - + - + } @if (form.controls.subnet.value?.range) { - + } }