Update Angular (#2952)

* fix Tor logs actually fetching od logs

* chore: update to Angular 18

* chore: update to Angular 19

* bump patchDB

* chore: update Angular

* chore: fix setup-wizard success page

* chore: fix

* chore: fix

* chore: fix

* chore: fix

---------

Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
This commit is contained in:
Alex Inkin
2025-05-30 21:34:24 +07:00
committed by GitHub
parent 05b8dd9ad8
commit 02413a4fac
257 changed files with 5921 additions and 9539 deletions

View File

@@ -11,12 +11,15 @@
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"builder": "@angular/build:application",
"options": {
"preserveSymlinks": true,
"outputPath": "dist/raw/ui",
"outputPath": {
"base": "dist/raw/ui",
"browser": ""
},
"index": "projects/ui/src/index.html",
"main": "projects/ui/src/main.ts",
"browser": "projects/ui/src/main.ts",
"polyfills": ["zone.js", "projects/ui/src/polyfills.ts"],
"tsConfig": "projects/ui/tsconfig.json",
"inlineStyleLanguage": "scss",
@@ -26,6 +29,11 @@
"input": "projects/shared/assets",
"output": "assets"
},
{
"glob": "**/*.wasm",
"input": "node_modules/@start9labs/argon2",
"output": "assets"
},
{
"glob": "**/*",
"input": "node_modules/monaco-editor",
@@ -36,12 +44,7 @@
"input": "node_modules/@taiga-ui/icons/src",
"output": "assets/taiga-ui/icons"
},
"projects/ui/src/manifest.webmanifest",
{
"glob": "ngsw.json",
"input": "dist/raw/ui",
"output": "projects/ui/src"
}
"projects/ui/src/manifest.webmanifest"
],
"styles": [
"node_modules/@taiga-ui/core/styles/taiga-ui-theme.less",
@@ -50,11 +53,14 @@
"projects/ui/src/styles.scss"
],
"scripts": [],
"ngswConfigPath": "projects/ui/ngsw-config.json"
"loader": {
".md": "text"
},
"serviceWorker": "projects/ui/ngsw-config.json"
},
"configurations": {
"production": {
"serviceWorker": true,
"serviceWorker": "projects/ui/ngsw-config.json",
"budgets": [
{
"type": "initial",
@@ -72,9 +78,7 @@
"extractLicenses": false
},
"development": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
@@ -86,7 +90,7 @@
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"builder": "@angular/build:dev-server",
"configurations": {
"production": {
"buildTarget": "ui:build:production"
@@ -101,7 +105,7 @@
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"builder": "@angular/build:extract-i18n",
"options": {
"buildTarget": "ui:build"
}
@@ -125,11 +129,14 @@
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"builder": "@angular/build:application",
"options": {
"outputPath": "dist/raw/install-wizard",
"outputPath": {
"base": "dist/raw/install-wizard",
"browser": ""
},
"index": "projects/install-wizard/src/index.html",
"main": "projects/install-wizard/src/main.ts",
"browser": "projects/install-wizard/src/main.ts",
"polyfills": ["zone.js"],
"tsConfig": "projects/install-wizard/tsconfig.json",
"inlineStyleLanguage": "scss",
@@ -169,8 +176,6 @@
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
@@ -183,9 +188,7 @@
"progress": false
},
"development": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
@@ -194,7 +197,7 @@
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"builder": "@angular/build:dev-server",
"options": {
"buildTarget": "install-wizard:build",
"port": 8100
@@ -210,7 +213,7 @@
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"builder": "@angular/build:extract-i18n",
"options": {
"buildTarget": "install-wizard:build"
}
@@ -234,11 +237,14 @@
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"builder": "@angular/build:application",
"options": {
"outputPath": "dist/raw/setup-wizard",
"outputPath": {
"base": "dist/raw/setup-wizard",
"browser": ""
},
"index": "projects/setup-wizard/src/index.html",
"main": "projects/setup-wizard/src/main.ts",
"browser": "projects/setup-wizard/src/main.ts",
"polyfills": ["zone.js"],
"tsConfig": "projects/setup-wizard/tsconfig.json",
"inlineStyleLanguage": "scss",
@@ -249,9 +255,9 @@
"output": "assets"
},
{
"glob": "**/*.svg",
"input": "node_modules/ionicons/dist/ionicons/svg",
"output": "./svg"
"glob": "**/*.wasm",
"input": "node_modules/@start9labs/argon2",
"output": "assets"
},
{
"glob": "**/*",
@@ -285,9 +291,7 @@
"outputHashing": "all"
},
"development": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
@@ -299,7 +303,7 @@
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"builder": "@angular/build:dev-server",
"configurations": {
"production": {
"buildTarget": "setup-wizard:build:production"
@@ -314,7 +318,7 @@
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"builder": "@angular/build:extract-i18n",
"options": {
"buildTarget": "setup-wizard:build"
}
@@ -337,7 +341,7 @@
"prefix": "lib",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:ng-packagr",
"builder": "@angular/build:ng-packagr",
"options": {
"project": "projects/marketplace/ng-package.json"
},
@@ -357,7 +361,7 @@
"prefix": "lib",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:ng-packagr",
"builder": "@angular/build:ng-packagr",
"options": {
"project": "projects/shared/ng-package.json"
},

12018
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -17,11 +17,10 @@
"build:setup": "ng run setup-wizard:build",
"build:ui": "ng run ui:build",
"build:ui:dev": "ng run ui:build:development",
"build:ui:stats": "ng run ui:build --stats-json",
"build:all": "npm run build:deps && npm run build:setup && npm run build:ui && npm run build:install",
"build:shared": "ng build shared",
"build:marketplace": "npm run build:shared && ng build marketplace",
"analyze:ui": "webpack-bundle-analyzer dist/raw/ui/stats.json",
"analyze:ui": "ng build ui --stats-json --named-chunks && npx -y @angular-experts/hawkeye dist/raw/ui/stats.json",
"publish:shared": "npm run build:shared && npm publish ./dist/shared --access public",
"publish:marketplace": "npm run build:marketplace && npm publish ./dist/marketplace --access public",
"start:install": "npm run-script build-config && ng serve --project install-wizard --host 0.0.0.0",
@@ -31,45 +30,45 @@
"build-config": "node build-config.js"
},
"dependencies": {
"@angular/animations": "^17.3.1",
"@angular/cdk": "^17.3.1",
"@angular/common": "^17.3.1",
"@angular/compiler": "^17.3.1",
"@angular/core": "^17.3.1",
"@angular/forms": "^17.3.1",
"@angular/platform-browser": "^17.3.1",
"@angular/platform-browser-dynamic": "^17.3.1",
"@angular/pwa": "^17.3.1",
"@angular/router": "^17.3.1",
"@angular/service-worker": "^17.3.1",
"@angular/animations": "^19.2.11",
"@angular/cdk": "^19.2.16",
"@angular/common": "^19.2.11",
"@angular/compiler": "^19.2.11",
"@angular/core": "^19.2.11",
"@angular/forms": "^19.2.11",
"@angular/platform-browser": "^19.2.11",
"@angular/platform-browser-dynamic": "^19.2.11",
"@angular/pwa": "^19.2.12",
"@angular/router": "^19.2.11",
"@angular/service-worker": "^19.2.11",
"@materia-ui/ngx-monaco-editor": "^6.0.0",
"@noble/curves": "^1.4.0",
"@noble/hashes": "^1.4.0",
"@start9labs/argon2": "^0.2.2",
"@start9labs/argon2": "^0.3.0",
"@start9labs/start-sdk": "file:../sdk/baseDist",
"@taiga-ui/addon-charts": "4.36.0",
"@taiga-ui/addon-commerce": "4.36.0",
"@taiga-ui/addon-mobile": "4.36.0",
"@taiga-ui/addon-table": "4.36.0",
"@taiga-ui/cdk": "4.36.0",
"@taiga-ui/core": "4.36.0",
"@taiga-ui/addon-charts": "4.38.0",
"@taiga-ui/addon-commerce": "4.38.0",
"@taiga-ui/addon-mobile": "4.38.0",
"@taiga-ui/addon-table": "4.38.0",
"@taiga-ui/cdk": "4.38.0",
"@taiga-ui/core": "4.38.0",
"@taiga-ui/event-plugins": "4.5.1",
"@taiga-ui/experimental": "4.36.0",
"@taiga-ui/icons": "4.36.0",
"@taiga-ui/kit": "4.36.0",
"@taiga-ui/layout": "4.36.0",
"@taiga-ui/legacy": "4.36.0",
"@taiga-ui/experimental": "4.38.0",
"@taiga-ui/icons": "4.38.0",
"@taiga-ui/kit": "4.38.0",
"@taiga-ui/layout": "4.38.0",
"@taiga-ui/legacy": "4.38.0",
"@taiga-ui/polymorpheus": "4.9.0",
"@tinkoff/ng-dompurify": "4.0.0",
"@taiga-ui/dompurify": "4.1.11",
"ansi-to-html": "^0.7.2",
"base64-js": "^1.5.1",
"buffer": "^6.0.3",
"cbor": "npm:@jprochazk/cbor@^0.4.9",
"cbor-web": "^8.1.0",
"core-js": "^3.21.1",
"core-js": "^3.42.0",
"cron": "^2.2.0",
"cronstrue": "^2.21.0",
"dompurify": "^2.3.6",
"dompurify": "^3.1.7",
"deep-equality-data-structures": "1.5.1",
"fast-json-patch": "^3.1.1",
"fuse.js": "^6.4.6",
@@ -79,44 +78,41 @@
"mime": "^4.0.3",
"monaco-editor": "^0.33.0",
"mustache": "^4.2.0",
"ng-qrcode": "^17.0.0",
"ng-qrcode": "^19.0.1",
"node-jose": "^2.2.0",
"patch-db-client": "file:../patch-db/client",
"path-browserify": "^1.0.1",
"pbkdf2": "^3.1.2",
"rxjs": "^7.5.6",
"swiper": "^8.2.4",
"ts-matches": "^6.1.0",
"rxjs": "^7.8.2",
"ts-matches": "^6.3.2",
"tslib": "^2.8.1",
"uuid": "^8.3.2",
"zone.js": "^0.14.2"
"zone.js": "^0.15.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "^17.3.1",
"@angular/cli": "^17.3.1",
"@angular/compiler-cli": "^17.3.1",
"@angular/language-service": "^17.3.1",
"@types/dompurify": "^2.3.3",
"@angular/build": "^19.2.12",
"@angular/cli": "^19.2.12",
"@angular/compiler-cli": "^19.2.11",
"@angular/language-service": "^19.2.11",
"@angular-experts/hawkeye": "^1.7.2",
"@types/dompurify": "3.0.5",
"@types/estree": "^0.0.51",
"@types/js-yaml": "^4.0.5",
"@types/marked": "^4.0.3",
"@types/mustache": "^4.1.2",
"@types/node": "^18.15.0",
"@types/mustache": "^4.2.6",
"@types/node": "^22.15.19",
"@types/node-jose": "^1.1.10",
"@types/pbkdf2": "^3.1.0",
"@types/uuid": "^8.3.1",
"autoprefixer": "^10.4.14",
"husky": "^4.3.8",
"lint-staged": "^13.2.0",
"ng-packagr": "^17.0.2",
"ng-packagr": "^19.2.2",
"node-html-parser": "^5.3.3",
"postcss": "^8.4.21",
"prettier": "^3.2.5",
"raw-loader": "^4.0.2",
"prettier": "^3.5.3",
"rimraf": "^6.0.1",
"ts-node": "^10.7.0",
"tslint": "^6.1.3",
"typescript": "^5.2.2",
"webpack-bundle-analyzer": "^4.8.0"
"typescript": "^5.8.3"
},
"husky": {
"hooks": {

View File

@@ -1,4 +1,4 @@
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
::ng-deep html,
::ng-deep body,
@@ -48,7 +48,7 @@ main {
}
.options {
@include transition(margin);
@include taiga.transition(margin);
min-width: 100%;
display: flex;

View File

@@ -10,6 +10,7 @@ import { ApiService } from 'src/app/services/api.service'
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.scss'],
standalone: false,
})
export class AppComponent {
private readonly loader = inject(LoadingService)

View File

@@ -1,4 +1,4 @@
import { HttpClientModule } from '@angular/common/http'
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'
import { NgModule } from '@angular/core'
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
import {
@@ -29,7 +29,6 @@ const {
@NgModule({
declarations: [AppComponent],
imports: [
HttpClientModule,
BrowserAnimationsModule,
TuiRoot,
DriveComponent,
@@ -51,6 +50,7 @@ const {
provide: RELATIVE_URL,
useValue: `/${api.url}/${api.version}`,
},
provideHttpClient(withInterceptorsFromDi()),
],
bootstrap: [AppComponent],
})

View File

@@ -1,4 +1,4 @@
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
:host {
margin: 0;
@@ -12,7 +12,7 @@ tui-drawer {
}
header {
@include scrollbar-hidden();
@include taiga.scrollbar-hidden();
// @TODO Theme
background: #2b2b2f;

View File

@@ -15,6 +15,7 @@ import { StoreDataWithUrl } from '../../types'
templateUrl: './menu.component.html',
styleUrls: ['./menu.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class MenuComponent implements OnDestroy {
@Input({ required: true })

View File

@@ -3,7 +3,6 @@ import { TuiIcon, TuiTitle } from '@taiga-ui/core'
import { StoreIconComponentModule } from './store-icon/store-icon.component.module'
@Component({
standalone: true,
selector: '[registry]',
template: `
<store-icon [url]="registry.url" size="40px" />

View File

@@ -21,6 +21,7 @@ import { knownRegistries, sameUrl } from '@start9labs/shared'
`,
styles: ':host { overflow: hidden; }',
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class StoreIconComponent {
@Input()

View File

@@ -1,27 +1,27 @@
import { CommonModule } from '@angular/common'
import { ChangeDetectionStrategy, Component, inject } from '@angular/core'
import { Exver, MarkdownPipe } from '@start9labs/shared'
import { TuiButton, TuiDialogContext, TuiLoader } from '@taiga-ui/core'
import { TuiDialogContext } from '@taiga-ui/core'
import { NgDompurifyPipe } from '@taiga-ui/dompurify'
import { TuiAccordion } from '@taiga-ui/kit'
import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus'
import { MarketplacePkg } from '../../src/types'
@Component({
standalone: true,
template: `
<tui-accordion>
@for (note of notes | keyvalue: asIsOrder; track $index) {
<tui-accordion-item>
{{ note.key }}
<ng-template tuiAccordionItemContent>
<div [innerHTML]="note.value | markdown"></div>
<div [innerHTML]="note.value | markdown | dompurify"></div>
</ng-template>
</tui-accordion-item>
}
</tui-accordion>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [CommonModule, TuiButton, TuiLoader, TuiAccordion, MarkdownPipe],
imports: [CommonModule, TuiAccordion, MarkdownPipe, NgDompurifyPipe],
})
export class ReleaseNotesComponent {
private readonly exver = inject(Exver)

View File

@@ -27,6 +27,7 @@ const ICONS: Record<string, string> = {
templateUrl: 'categories.component.html',
styleUrls: ['categories.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class CategoriesComponent {
@Input()

View File

@@ -6,6 +6,7 @@ import { MarketplacePkg } from '../../../types'
templateUrl: 'item.component.html',
styleUrls: ['item.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class ItemComponent {
@Input({ required: true })

View File

@@ -11,6 +11,7 @@ import {
templateUrl: 'search.component.html',
styleUrls: ['search.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class SearchComponent {
@Input()

View File

@@ -1,7 +1,7 @@
<div class="background-border box-shadow-lg shadow-color-light">
<div class="box-container">
<h2 class="additional-detail-title">New in {{ pkg.version }}</h2>
<p [innerHTML]="pkg.releaseNotes | markdown"></p>
<p [innerHTML]="pkg.releaseNotes | markdown | dompurify"></p>
<button
tuiButton
size="s"

View File

@@ -13,6 +13,7 @@ import { MarketplacePkgBase } from '../../../types'
templateUrl: 'about.component.html',
styleUrls: ['about.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class AboutComponent {
private readonly dialogs = inject(TuiDialogService)

View File

@@ -1,18 +1,18 @@
import { TuiButton } from '@taiga-ui/core'
import { TuiTagModule } from '@taiga-ui/legacy'
import { CommonModule } from '@angular/common'
import { NgModule } from '@angular/core'
import { RouterModule } from '@angular/router'
import { AboutComponent } from './about.component'
import { NgDompurifyModule } from '@tinkoff/ng-dompurify'
import { MarkdownPipe, SafeLinksDirective } from '@start9labs/shared'
import { TuiButton } from '@taiga-ui/core'
import { NgDompurifyPipe } from '@taiga-ui/dompurify'
import { TuiTagModule } from '@taiga-ui/legacy'
import { AboutComponent } from './about.component'
@NgModule({
imports: [
CommonModule,
RouterModule,
TuiTagModule,
NgDompurifyModule,
NgDompurifyPipe,
SafeLinksDirective,
MarkdownPipe,
TuiButton,

View File

@@ -12,8 +12,7 @@ import { TuiFade } from '@taiga-ui/kit'
</label>
<tui-icon [icon]="icon" />
`,
styles: [
`
styles: `
:host {
display: flex;
justify-content: space-between;
@@ -35,9 +34,7 @@ import { TuiFade } from '@taiga-ui/kit'
}
}
`,
],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [CommonModule, TuiIcon, TuiTitle, TuiFade],
})
export class MarketplaceAdditionalItemComponent {

View File

@@ -14,7 +14,6 @@ import { MarketplaceAdditionalItemComponent } from './additional-item.component'
</a>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [CommonModule, MarketplaceAdditionalItemComponent],
})
export class MarketplaceAdditionalLinkComponent {

View File

@@ -14,6 +14,7 @@ import { MarketplacePkgBase } from '../../../types'
templateUrl: 'additional.component.html',
styleUrls: ['additional.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class AdditionalComponent {
@Input({ required: true })

View File

@@ -27,8 +27,7 @@ import { MarketplaceDepItemComponent } from './dependency-item.component'
</div>
</div>
`,
styles: [
`
styles: `
.dependencies-container {
background-color: rgb(39 39 42);
border-radius: 0.75rem;
@@ -48,9 +47,7 @@ import { MarketplaceDepItemComponent } from './dependency-item.component'
gap: 0.75rem;
}
`,
],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [CommonModule, MarketplaceDepItemComponent],
})
export class MarketplaceDependenciesComponent {

View File

@@ -37,8 +37,7 @@ import { MarketplacePkgBase } from '../../../types'
</div>
</div>
`,
styles: [
`
styles: `
.outer-container {
display: flex;
align-items: center;
@@ -87,9 +86,7 @@ import { MarketplacePkgBase } from '../../../types'
drop-shadow(0 4px 3px rgb(0 0 0 / 0.1));
}
`,
],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [
CommonModule,
RouterModule,

View File

@@ -7,7 +7,6 @@ import { TuiCell } from '@taiga-ui/layout'
import { MarketplacePkg } from '../../../types'
@Component({
standalone: true,
selector: 'marketplace-flavors',
template: `
<div class="background-border box-shadow-lg shadow-color-light">

View File

@@ -25,8 +25,7 @@ import { SharedPipesModule, TickerComponent } from '@start9labs/shared'
</div>
</div>
`,
styles: [
`
styles: `
.outer-container {
display: flex;
justify-content: center;
@@ -138,9 +137,7 @@ import { SharedPipesModule, TickerComponent } from '@start9labs/shared'
}
}
`,
],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [CommonModule, SharedPipesModule, TickerComponent],
})
export class MarketplacePackageHeroComponent {

View File

@@ -68,8 +68,7 @@ import { PolymorpheusContent } from '@taiga-ui/polymorpheus'
></button>
</div>
`,
styles: [
`
styles: `
.outer-container {
display: flex;
align-items: center;
@@ -118,14 +117,12 @@ import { PolymorpheusContent } from '@taiga-ui/polymorpheus'
}
.screenshot-item-img-enlarged {
border-radius: 0px;
border-radius: 0;
}
}
}
`,
],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [CommonModule, TuiCarousel, TuiButton],
})
export class MarketplacePackageScreenshotComponent {

View File

@@ -4,6 +4,7 @@ import Fuse from 'fuse.js'
@Pipe({
name: 'filterPackages',
standalone: false,
})
export class FilterPackagesPipe implements PipeTransform {
transform(

View File

@@ -8,6 +8,7 @@ import { DOCUMENT } from '@angular/common'
@Component({
selector: 'app-root',
template: '<tui-root tuiTheme="dark"><router-outlet /></tui-root>',
standalone: false,
})
export class AppComponent {
private readonly api = inject(ApiService)

View File

@@ -1,7 +1,9 @@
import { HttpClientModule } from '@angular/common/http'
import { NgModule } from '@angular/core'
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'
import { inject, NgModule, provideAppInitializer } from '@angular/core'
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
import { PreloadAllModules, RouterModule } from '@angular/router'
import { WA_LOCATION } from '@ng-web-apis/common'
import initArgon from '@start9labs/argon2'
import {
provideSetupLogsService,
RELATIVE_URL,
@@ -27,7 +29,6 @@ const version = require('../../../../package.json').version
declarations: [AppComponent],
imports: [
BrowserAnimationsModule,
HttpClientModule,
RouterModule.forRoot(ROUTES, {
preloadingStrategy: PreloadAllModules,
initialNavigation: 'disabled',
@@ -50,6 +51,13 @@ const version = require('../../../../package.json').version
provide: VERSION,
useValue: version,
},
provideHttpClient(withInterceptorsFromDi()),
provideAppInitializer(() => {
const origin = inject(WA_LOCATION).origin
const module_or_path = new URL('/assets/argon2_bg.wasm', origin)
initArgon({ module_or_path })
}),
],
bootstrap: [AppComponent],
})

View File

@@ -28,7 +28,6 @@ export interface CifsResponse {
}
@Component({
standalone: true,
template: `
<form [formGroup]="form" (ngSubmit)="submit()">
<tui-input formControlName="hostname">
@@ -78,10 +77,17 @@ export interface CifsResponse {
</footer>
</form>
`,
styles: [
'.input { margin-top: 1rem }',
'footer { display: flex; gap: 1rem; margin-top: 1rem }',
],
styles: `
.input {
margin-top: 1rem;
}
footer {
display: flex;
gap: 1rem;
margin-top: 1rem;
}
`,
imports: [
CommonModule,
FormsModule,

View File

@@ -2,7 +2,6 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
import { DocsLinkDirective } from '@start9labs/shared'
@Component({
standalone: true,
selector: 'app-documentation',
template: `
<!doctype html>

View File

@@ -5,7 +5,6 @@ import { WA_WINDOW } from '@ng-web-apis/common'
const FADE_FACTOR = 0.07
@Component({
standalone: true,
selector: 'canvas[matrix]',
template: 'Your browser does not support the canvas element.',
styles: ':host { position: fixed; top: 0 }',

View File

@@ -7,7 +7,7 @@ import {
ReactiveFormsModule,
Validators,
} from '@angular/forms'
import * as argon2 from '@start9labs/argon2'
import { verify } from '@start9labs/argon2'
import { ErrorService } from '@start9labs/shared'
import { TuiAutoFocus, TuiMapperPipe, TuiValidator } from '@taiga-ui/cdk'
import {
@@ -30,7 +30,6 @@ interface DialogData {
}
@Component({
standalone: true,
template: `
@if (storageDrive) {
Choose a password for your server.
@@ -142,7 +141,7 @@ export class PasswordComponent {
}
try {
argon2.verify(this.context.data.passwordHash || '', password)
verify(this.context.data.passwordHash || '', password)
this.context.completeWith(password)
} catch (e) {
this.errorService.handleError('Incorrect password provided')

View File

@@ -5,7 +5,6 @@ import { filter, fromEvent, switchMap } from 'rxjs'
import { PASSWORD } from 'src/app/components/password.component'
@Directive({
standalone: true,
selector: 'button[server][password]',
})
export class PasswordDirective {

View File

@@ -4,7 +4,6 @@ import { Component, Input } from '@angular/core'
import { RouterModule } from '@angular/router'
@Component({
standalone: true,
selector: 'app-recover',
template: `
<a tuiCell [routerLink]="disabled ? null : '/attach'">

View File

@@ -15,7 +15,6 @@ export interface ServersResponse {
}
@Component({
standalone: true,
template: `
@for (server of context.data.servers; track $index) {
<button [server]="server" (password)="select($event, server.id)"></button>

View File

@@ -15,7 +15,6 @@ import { ApiService } from 'src/app/services/api.service'
import { StateService } from 'src/app/services/state.service'
@Component({
standalone: true,
template: `
<section tuiCardLarge="compact">
<header>Use existing drive</header>

View File

@@ -9,7 +9,6 @@ import { ApiService } from 'src/app/services/api.service'
import { StateService } from 'src/app/services/state.service'
@Component({
standalone: true,
template: `
<img class="logo" src="assets/img/icon.png" alt="Start9" />
@if (!loading) {
@@ -59,7 +58,7 @@ import { StateService } from 'src/app/services/state.service'
}
`,
styles: `
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
.logo {
width: 6rem;
@@ -88,7 +87,7 @@ import { StateService } from 'src/app/services/state.service'
}
.options {
@include transition(margin);
@include taiga.transition(margin);
min-width: 100%;
display: flex;

View File

@@ -23,9 +23,13 @@ import { ApiService } from 'src/app/services/api.service'
import { StateService } from 'src/app/services/state.service'
@Component({
standalone: true,
template: '<app-initializing [setupType]="type" [progress]="progress()" />',
styles: ':host { max-width: unset; align-items: stretch; }',
styles: `
:host {
max-width: unset;
align-items: stretch;
}
`,
imports: [InitializingComponent],
changeDetection: ChangeDetectionStrategy.OnPush,
})

View File

@@ -15,7 +15,6 @@ import { ApiService, StartOSDiskInfoFull } from 'src/app/services/api.service'
import { StateService } from 'src/app/services/state.service'
@Component({
standalone: true,
template: `
<section tuiCardLarge="compact">
<header>Restore from Backup</header>

View File

@@ -17,7 +17,6 @@ import { ApiService } from 'src/app/services/api.service'
import { StateService } from 'src/app/services/state.service'
@Component({
standalone: true,
template: `
<section tuiCardLarge="compact">
@if (loading || drives.length) {

View File

@@ -15,7 +15,6 @@ import { ApiService } from 'src/app/services/api.service'
import { StateService } from 'src/app/services/state.service'
@Component({
standalone: true,
template: `
<canvas matrix></canvas>
@if (stateService.kiosk) {
@@ -90,6 +89,14 @@ import { StateService } from 'src/app/services/state.service'
color: var(--tui-text-primary);
text-decoration: none;
text-align: center;
&[data-appearance='floating'] {
background: var(--tui-background-neutral-1);
&:hover {
background: var(--tui-background-neutral-1-hover) !important;
}
}
}
a[tuiCardLarge]:not([href]) {

View File

@@ -19,7 +19,6 @@ import { ApiService } from 'src/app/services/api.service'
import { StateService } from 'src/app/services/state.service'
@Component({
standalone: true,
template: `
<section tuiCardLarge="compact">
<header>Transfer</header>

View File

@@ -3,7 +3,6 @@ import { Component, Input } from '@angular/core'
import { UnitConversionPipesModule } from '../pipes/unit-conversion/unit-conversion.module'
@Component({
standalone: true,
selector: 'button[drive]',
template: `
<tui-icon icon="@tui.save" />

View File

@@ -5,7 +5,6 @@ import { LogsWindowComponent } from './logs-window.component'
import { i18nPipe } from '../i18n/i18n.pipe'
@Component({
standalone: true,
selector: 'app-initializing',
template: `
<section>

View File

@@ -1,16 +1,15 @@
import { TuiScrollbar } from '@taiga-ui/core'
import { AsyncPipe } from '@angular/common'
import { Component, ElementRef, inject } from '@angular/core'
import {
WaIntersectionObserver,
INTERSECTION_ROOT,
WaIntersectionObserver,
} from '@ng-web-apis/intersection-observer'
import { WaMutationObserver } from '@ng-web-apis/mutation-observer'
import { NgDompurifyModule } from '@tinkoff/ng-dompurify'
import { TuiScrollbar } from '@taiga-ui/core'
import { NgDompurifyPipe } from '@taiga-ui/dompurify'
import { SetupLogsService } from '../services/setup-logs.service'
@Component({
standalone: true,
selector: 'logs-window',
template: `
<tui-scrollbar childList subtree (waMutationObserver)="scrollTo(bottom)">
@@ -25,11 +24,16 @@ import { SetupLogsService } from '../services/setup-logs.service'
></section>
</tui-scrollbar>
`,
styles: `
pre {
white-space: normal;
}
`,
imports: [
AsyncPipe,
WaMutationObserver,
WaIntersectionObserver,
NgDompurifyModule,
NgDompurifyPipe,
TuiScrollbar,
],
providers: [

View File

@@ -2,8 +2,8 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core'
import { toSignal } from '@angular/core/rxjs-interop'
import { ActivatedRoute } from '@angular/router'
import { TuiDialogContext, TuiLoader, TuiNotification } from '@taiga-ui/core'
import { NgDompurifyPipe } from '@taiga-ui/dompurify'
import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus'
import { NgDompurifyModule } from '@tinkoff/ng-dompurify'
import { catchError, ignoreElements, Observable, of } from 'rxjs'
import { SafeLinksDirective } from '../directives/safe-links.directive'
import { MarkdownPipe } from '../pipes/markdown.pipe'
@@ -24,12 +24,11 @@ import { getErrorMessage } from '../services/error.service'
}
`,
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
host: { class: 'g-subpage' },
imports: [
TuiNotification,
TuiLoader,
NgDompurifyModule,
NgDompurifyPipe,
MarkdownPipe,
SafeLinksDirective,
],

View File

@@ -12,7 +12,6 @@ import { i18nPipe } from '../i18n/i18n.pipe'
import { i18nKey } from '../i18n/i18n.providers'
@Component({
standalone: true,
template: `
<p>{{ options.message }}</p>
<p *ngIf="options.warning" class="warning">{{ options.warning }}</p>
@@ -60,8 +59,7 @@ import { i18nKey } from '../i18n/i18n.providers'
></button>
</ng-template>
`,
styles: [
`
styles: `
.warning {
color: var(--tui-status-warning);
}
@@ -75,7 +73,6 @@ import { i18nKey } from '../i18n/i18n.providers'
-webkit-text-security: disc;
}
`,
],
imports: [
CommonModule,
FormsModule,

View File

@@ -5,7 +5,6 @@ import { TuiCell } from '@taiga-ui/layout'
import { StartOSDiskInfo } from '../types/api'
@Component({
standalone: true,
selector: 'button[server]',
template: `
<tui-icon icon="@tui.save" />
@@ -21,7 +20,12 @@ import { StartOSDiskInfo } from '../types/api'
</span>
</span>
`,
styles: ':host { width: stretch; border-radius: var(--tui-radius-l); }',
styles: `
:host {
border-radius: var(--tui-radius-l);
}
`,
host: { class: 'g-stretch' },
hostDirectives: [TuiCell],
imports: [DatePipe, TuiIcon, TuiTitle],
})

View File

@@ -7,7 +7,6 @@ import {
} from '@angular/core'
@Component({
standalone: true,
selector: '[ticker]',
template: '<ng-content />',
styles: `

View File

@@ -10,7 +10,6 @@ export const VERSION = new InjectionToken<string>('VERSION')
@Directive({
selector: '[docsLink]',
standalone: true,
host: {
target: '_blank',
rel: 'noreferrer',

View File

@@ -1,59 +0,0 @@
import {
Directive,
ElementRef,
HostListener,
inject,
NgZone,
} from '@angular/core'
import { ANIMATION_FRAME } from '@ng-web-apis/common'
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'
import { tuiZonefree } from '@taiga-ui/cdk'
import { filter } from 'rxjs'
const SIZE = 100
const SPEED = 15
@Directive({
selector: '[dragScroller]',
standalone: true,
})
export class DragScrollerDirective {
private readonly element: HTMLElement = inject(ElementRef).nativeElement
private dragging = false
private x = 0
private y = 0
private readonly sub = inject(ANIMATION_FRAME)
.pipe(
filter(() => this.dragging),
tuiZonefree(inject(NgZone)),
takeUntilDestroyed(),
)
.subscribe(() => {
this.element.scrollTop += this.y * SPEED
this.element.scrollLeft += this.x * SPEED
})
@HostListener('document:pointerdown.silent', ['true'])
@HostListener('document:pointerup.silent', ['false'])
onPointer(dragging: boolean) {
this.dragging = dragging
this.x = 0
this.y = 0
}
@HostListener('pointermove.silent', ['$event'])
onPointerMove(event: PointerEvent) {
if (!this.dragging) {
return
}
const { clientX, clientY } = event
const { top, left, right, bottom } = this.element.getBoundingClientRect()
const x = Math.min(clientX - left, SIZE) - Math.min(right - clientX, SIZE)
const y = Math.min(clientY - top, SIZE) - Math.min(bottom - clientY, SIZE)
this.x = x / SIZE
this.y = y / SIZE
}
}

View File

@@ -16,7 +16,6 @@ import { tuiInjectElement } from '@taiga-ui/cdk'
subtree: true,
}),
],
standalone: true,
})
export class SafeLinksDirective {
private readonly doc = inject(DOCUMENT)

View File

@@ -519,4 +519,5 @@ export default {
517: 'Möchten Sie diese Aufgabe wirklich verwerfen?',
518: 'Verwerfen',
519: 'Um Clearnet-Domains zu veröffentlichen, musst du oben auf „Öffentlich machen“ klicken.',
520: 'Update verfügbar',
} satisfies i18n

View File

@@ -518,4 +518,5 @@ export const ENGLISH = {
'Are you sure you want to dismiss this task?': 517,
'Dismiss': 518, // as in, dismiss or delete a task
'To publish clearnet domains, you must click "Make Public", above.': 519,
'Update available': 520,
} as const

View File

@@ -519,4 +519,5 @@ export default {
517: '¿Estás seguro de que deseas descartar esta tarea?',
518: 'Descartar',
519: 'Para publicar dominios en clearnet, debes hacer clic en "Hacer público" arriba.',
520: 'Actualización disponible',
} satisfies i18n

View File

@@ -519,4 +519,5 @@ export default {
517: 'Êtes-vous sûr de vouloir ignorer cette tâche ?',
518: 'Ignorer',
519: 'Pour publier des domaines clearnet, vous devez cliquer sur « Rendre public » ci-dessus.',
520: 'Mise à jour disponible',
} satisfies i18n

View File

@@ -519,4 +519,5 @@ export default {
517: 'Czy na pewno chcesz odrzucić to zadanie?',
518: 'Odrzuć',
519: 'Aby opublikować domeny w clearnet, kliknij „Upublicznij” powyżej.',
520: 'Aktualizacja dostępna',
} satisfies i18n

View File

@@ -3,7 +3,6 @@ import { ENGLISH } from './dictionaries/en'
import { I18N, i18nKey } from './i18n.providers'
@Pipe({
standalone: true,
name: 'i18n',
pure: false,
})

View File

@@ -3,6 +3,7 @@ import { Exver } from '../../services/exver.service'
@Pipe({
name: 'satisfiesExver',
standalone: false,
})
export class ExverSatisfiesPipe implements PipeTransform {
constructor(private readonly exver: Exver) {}
@@ -18,6 +19,7 @@ export class ExverSatisfiesPipe implements PipeTransform {
@Pipe({
name: 'compareExver',
standalone: false,
})
export class ExverComparesPipe implements PipeTransform {
constructor(private readonly exver: Exver) {}

View File

@@ -2,7 +2,6 @@ import { Pipe, PipeTransform } from '@angular/core'
import { marked } from 'marked'
@Pipe({
standalone: true,
name: 'markdown',
})
export class MarkdownPipe implements PipeTransform {

View File

@@ -3,6 +3,7 @@ import { isEmptyObject } from '../../util/misc.util'
@Pipe({
name: 'empty',
standalone: false,
})
export class EmptyPipe implements PipeTransform {
transform(val: object | [] = {}): boolean {

View File

@@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'
@Pipe({
name: 'includes',
standalone: false,
})
export class IncludesPipe implements PipeTransform {
transform<T>(list: T[], val: T): boolean {

View File

@@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'
@Pipe({
name: 'sort',
standalone: false,
})
export class SortPipe implements PipeTransform {
transform(

View File

@@ -3,6 +3,7 @@ import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'
@Pipe({
name: 'trustUrl',
standalone: false,
})
export class TrustUrlPipe implements PipeTransform {
constructor(private readonly sanitizer: DomSanitizer) {}

View File

@@ -3,6 +3,7 @@ import { Pipe, PipeTransform } from '@angular/core'
// converts bytes to gigabytes
@Pipe({
name: 'convertBytes',
standalone: false,
})
export class ConvertBytesPipe implements PipeTransform {
transform(bytes: number): string {
@@ -21,6 +22,7 @@ export function convertBytes(bytes: number): string {
@Pipe({
name: 'durationToSeconds',
standalone: false,
})
export class DurationToSecondsPipe implements PipeTransform {
transform(duration?: string | null): number {

View File

@@ -14,7 +14,6 @@ export * from './components/prompt.component'
export * from './components/server.component'
export * from './directives/docs-link.directive'
export * from './directives/drag-scroller.directive'
export * from './directives/safe-links.directive'
export * from './i18n/i18n.pipe'

View File

@@ -6,7 +6,6 @@ import { i18nPipe } from '../i18n/i18n.pipe'
import { i18nKey } from '../i18n/i18n.providers'
@Component({
standalone: true,
template: '<tui-loader [textContent]="content | i18n" />',
styles: `
:host {

View File

@@ -1,4 +1,4 @@
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
[tuiTheme='dark'] {
--tui-background-base: rgba(23, 23, 23, 1);
@@ -89,7 +89,7 @@
}
[tuiAppearance][data-appearance^='primary'] {
@include appearance-disabled {
@include taiga.appearance-disabled {
background: var(--tui-status-neutral);
color: #333;
}
@@ -99,15 +99,15 @@
color: var(--tui-text-primary-on-accent-1);
background: var(--tui-status-positive);
@include appearance-hover {
@include taiga.appearance-hover {
filter: brightness(1.2);
}
@include appearance-active {
@include taiga.appearance-active {
filter: brightness(0.9);
}
@include appearance-disabled {
@include taiga.appearance-disabled {
background: var(--tui-status-neutral);
color: #333;
}

View File

@@ -26,6 +26,7 @@ import { PatchMonitorService } from './services/patch-monitor.service'
font-family: 'Proxima Nova', sans-serif;
}
`,
standalone: false,
})
export class AppComponent {
private readonly i18n = inject(i18nService)

View File

@@ -1,4 +1,4 @@
import { HttpClientModule } from '@angular/common/http'
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'
import { NgModule } from '@angular/core'
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
import { ServiceWorkerModule } from '@angular/service-worker'
@@ -12,7 +12,6 @@ import { RoutingModule } from './routing.module'
@NgModule({
declarations: [AppComponent],
imports: [
HttpClientModule,
BrowserAnimationsModule,
RoutingModule,
ToastContainerComponent,
@@ -24,7 +23,7 @@ import { RoutingModule } from './routing.module'
registrationStrategy: 'registerWhenStable:30000',
}),
],
providers: APP_PROVIDERS,
providers: [APP_PROVIDERS, provideHttpClient(withInterceptorsFromDi())],
bootstrap: [AppComponent],
})
export class AppModule {}

View File

@@ -1,6 +1,8 @@
import { APP_INITIALIZER, inject, Provider } from '@angular/core'
import { inject, provideAppInitializer } from '@angular/core'
import { UntypedFormBuilder } from '@angular/forms'
import { Router } from '@angular/router'
import { WA_LOCATION } from '@ng-web-apis/common'
import initArgon from '@start9labs/argon2'
import {
AbstractCategoryService,
FilterPackagesPipe,
@@ -50,7 +52,7 @@ const {
ui: { api },
} = require('../../../../config.json') as WorkspaceConfig
export const APP_PROVIDERS: Provider[] = [
export const APP_PROVIDERS = [
provideEventPlugins(),
I18N_PROVIDERS,
FilterPackagesPipe,
@@ -86,11 +88,18 @@ export const APP_PROVIDERS: Provider[] = [
deps: [PatchDbSource, PATCH_CACHE],
useClass: PatchDB,
},
{
provide: APP_INITIALIZER,
useFactory: appInitializer,
multi: true,
},
provideAppInitializer(() => {
const i18n = inject(i18nService)
const origin = inject(WA_LOCATION).origin
const module_or_path = new URL('/assets/argon2_bg.wasm', origin)
initArgon({ module_or_path })
inject(StorageService).migrate036()
inject(AuthService).init()
inject(ClientStorageService).init()
inject(Router).initialNavigation()
i18n.setLanguage(i18n.language || 'english')
}),
{
provide: RELATIVE_URL,
useValue: `/${api.url}/${api.version}`,
@@ -123,19 +132,3 @@ export const APP_PROVIDERS: Provider[] = [
useFactory: () => inject(ConfigService).version,
},
]
export function appInitializer(): () => void {
const storage = inject(StorageService)
const auth = inject(AuthService)
const localStorage = inject(ClientStorageService)
const router = inject(Router)
const i18n = inject(i18nService)
return () => {
storage.migrate036()
auth.init()
localStorage.init()
router.initialNavigation()
i18n.setLanguage(i18n.language || 'english')
}
}

View File

@@ -45,7 +45,6 @@ import { BackupReport } from 'src/app/services/api/api.types'
}
`,
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [CommonModule, TuiIcon, TuiCell, TuiTitle, i18nPipe],
})
export class BackupsReportModal {

View File

@@ -8,7 +8,6 @@ import { endWith, map, merge, Observable, pairwise, Subject } from 'rxjs'
import { DataModel } from 'src/app/services/patch-db/data-model'
@Component({
standalone: true,
selector: 'notifications-toast',
template: `
<ng-template

View File

@@ -13,7 +13,6 @@ import { ConfigService } from 'src/app/services/config.service'
import { DataModel } from 'src/app/services/patch-db/data-model'
@Component({
standalone: true,
selector: 'refresh-alert',
template: `
<ng-template

View File

@@ -3,7 +3,6 @@ import { NotificationsToastComponent } from './notifications-toast.component'
import { RefreshAlertComponent } from './refresh-alert.component'
@Component({
standalone: true,
selector: 'toast-container',
template: `
<notifications-toast />

View File

@@ -9,6 +9,7 @@ import { ConfigService } from 'src/app/services/config.service'
selector: 'diagnostic-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
standalone: false,
})
export class HomePage {
restarted = false

View File

@@ -8,11 +8,10 @@ import { WaMutationObserver } from '@ng-web-apis/mutation-observer'
import { convertAnsi, ErrorService } from '@start9labs/shared'
import { tuiProvide } from '@taiga-ui/cdk'
import { TuiButton, TuiLoader, TuiScrollbar } from '@taiga-ui/core'
import { NgDompurifyModule } from '@tinkoff/ng-dompurify'
import { NgDompurifyPipe } from '@taiga-ui/dompurify'
import { ApiService } from 'src/app/services/api/embassy-api.service'
@Component({
standalone: true,
template: `
<a
routerLink="../"
@@ -48,12 +47,16 @@ import { ApiService } from 'src/app/services/api/embassy-api.service'
gap: 1rem;
background: var(--tui-background-base);
}
pre {
white-space: normal;
}
`,
imports: [
RouterLink,
WaIntersectionObserver,
WaMutationObserver,
NgDompurifyModule,
NgDompurifyPipe,
TuiButton,
TuiLoader,
TuiScrollbar,

View File

@@ -11,7 +11,6 @@ import { ApiService } from 'src/app/services/api/embassy-api.service'
import { StateService } from 'src/app/services/state.service'
@Component({
standalone: true,
template: `
<app-initializing [progress]="progress()" />
`,

View File

@@ -7,7 +7,6 @@ import { ApiService } from 'src/app/services/api/embassy-api.service'
import { ConfigService } from 'src/app/services/config.service'
@Component({
standalone: true,
selector: 'ca-wizard',
templateUrl: './ca-wizard.component.html',
styleUrls: ['./ca-wizard.component.scss'],

View File

@@ -1,7 +1,7 @@
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
.card {
@include center-all();
@include taiga.center-all();
overflow: visible;
align-items: center;
text-align: center;
@@ -11,7 +11,7 @@
}
.logo {
@include center-left();
@include taiga.center-left();
top: -17%;
width: 6rem;
}

View File

@@ -12,6 +12,7 @@ import { DOCUMENT } from '@angular/common'
templateUrl: './login.page.html',
styleUrls: ['./login.page.scss'],
providers: [],
standalone: false,
})
export class LoginPage {
password = ''

View File

@@ -35,7 +35,6 @@ export interface FormContext<T> {
}
@Component({
standalone: true,
selector: 'app-form',
template: `
<form
@@ -71,8 +70,7 @@ export interface FormContext<T> {
</footer>
</form>
`,
styles: [
`
styles: `
footer {
position: sticky;
bottom: 0;
@@ -86,7 +84,6 @@ export interface FormContext<T> {
border-top: 1px solid var(--tui-background-base-alt);
}
`,
],
imports: [
CommonModule,
ReactiveFormsModule,

View File

@@ -4,6 +4,7 @@ import { InvalidService } from './invalid.service'
@Directive({
selector: 'form-control, form-array, form-object',
standalone: false,
})
export class ControlDirective implements OnInit, OnDestroy {
private readonly invalidService = inject(InvalidService, { optional: true })

View File

@@ -4,6 +4,7 @@ import { KeyValue } from '@angular/common'
@Pipe({
name: 'filterHidden',
standalone: false,
})
export class FilterHiddenPipe implements PipeTransform {
transform(value: KeyValue<string, IST.ValueSpec>[]) {

View File

@@ -1,4 +1,4 @@
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
:host {
display: block;
@@ -27,7 +27,7 @@
}
&::after {
@include transition(opacity);
@include taiga.transition(opacity);
content: '';
position: absolute;

View File

@@ -25,6 +25,7 @@ import { DialogService, i18nKey } from '@start9labs/shared'
templateUrl: './form-array.component.html',
styleUrls: ['./form-array.component.scss'],
animations: [tuiFadeIn, tuiHeightCollapse, tuiParentStop],
standalone: false,
})
export class FormArrayComponent {
@Input({ required: true })

View File

@@ -1,4 +1,4 @@
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
.wrapper {
position: relative;
@@ -19,12 +19,12 @@
}
.color {
@include fullsize();
@include taiga.fullsize();
opacity: 0;
}
.icon {
@include fullsize();
@include taiga.fullsize();
pointer-events: none;
input:hover + & {

View File

@@ -7,6 +7,7 @@ import { MaskitoOptions } from '@maskito/core'
selector: 'form-color',
templateUrl: './form-color.component.html',
styleUrls: ['./form-color.component.scss'],
standalone: false,
})
export class FormColorComponent extends Control<IST.ValueSpecColor, string> {
readonly mask: MaskitoOptions = {

View File

@@ -21,6 +21,7 @@ import { DialogService, i18nKey, i18nPipe } from '@start9labs/shared'
styleUrls: ['./form-control.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: FORM_CONTROL_PROVIDERS,
standalone: false,
})
export class FormControlComponent<
T extends Exclude<IST.ValueSpec, IST.ValueSpecHidden>,

View File

@@ -12,6 +12,7 @@ import { Control } from '../control'
@Component({
selector: 'form-datetime',
templateUrl: './form-datetime.component.html',
standalone: false,
})
export class FormDatetimeComponent extends Control<
IST.ValueSpecDatetime,

View File

@@ -1,7 +1,7 @@
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
.template {
@include transition(opacity);
@include taiga.transition(opacity);
width: 100%;
display: flex;
@@ -16,8 +16,8 @@
}
.drop {
@include fullsize();
@include transition(opacity);
@include taiga.fullsize();
@include taiga.transition(opacity);
display: flex;
align-items: center;
justify-content: space-around;

View File

@@ -7,6 +7,7 @@ import { Control } from '../control'
selector: 'form-file',
templateUrl: './form-file.component.html',
styleUrls: ['./form-file.component.scss'],
standalone: false,
})
export class FormFileComponent extends Control<
IST.ValueSpecFile,

View File

@@ -25,6 +25,7 @@ export const ERRORS = [
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
viewProviders: [FORM_GROUP_PROVIDERS],
standalone: false,
})
export class FormGroupComponent {
@Input() spec: IST.InputSpec = {}

View File

@@ -7,6 +7,7 @@ import { invert } from '@start9labs/shared'
@Component({
selector: 'form-multiselect',
templateUrl: './form-multiselect.component.html',
standalone: false,
})
export class FormMultiselectComponent extends Control<
IST.ValueSpecMultiselect,

View File

@@ -5,6 +5,7 @@ import { Control } from '../control'
@Component({
selector: 'form-number',
templateUrl: './form-number.component.html',
standalone: false,
})
export class FormNumberComponent extends Control<IST.ValueSpecNumber, number> {
protected readonly Infinity = Infinity

View File

@@ -1,4 +1,4 @@
@import '@taiga-ui/core/styles/taiga-ui-local';
@use '@taiga-ui/core/styles/taiga-ui-local' as taiga;
:host {
display: flex;
@@ -18,7 +18,7 @@
}
.button {
@include transition(transform);
@include taiga.transition(transform);
margin-right: 1rem;

View File

@@ -14,6 +14,7 @@ import { IST } from '@start9labs/start-sdk'
templateUrl: './form-object.component.html',
styleUrls: ['./form-object.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class FormObjectComponent {
@Input({ required: true })

View File

@@ -6,6 +6,7 @@ import { Control } from '../control'
@Component({
selector: 'form-select',
templateUrl: './form-select.component.html',
standalone: false,
})
export class FormSelectComponent extends Control<IST.ValueSpecSelect, string> {
private readonly inverted = invert(this.spec.values)

View File

@@ -6,6 +6,7 @@ import { Control } from '../control'
selector: 'form-text',
templateUrl: './form-text.component.html',
styleUrls: ['./form-text.component.scss'],
standalone: false,
})
export class FormTextComponent extends Control<IST.ValueSpecText, string> {
masked = true

Some files were not shown because too many files have changed in this diff Show More