diff --git a/.prettierrc.json b/.prettierrc.json index dbb1f7f0..c57d1119 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,5 +2,8 @@ "semi": true, "printWidth": 100, "tabWidth": 2, - "trailingComma": "all" -} + "trailingComma": "all", + "plugins": [ + "prettier-plugin-tailwindcss" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 69ece11f..da891108 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,14 @@ "angular-*": { "externalTemplate": true } + }, + "files.associations": { + "*.css": "tailwindcss" + }, + "symbols.files.associations": { + "*.css": "tailwindcss" + }, + "editor.quickSuggestions": { + "strings": "on" } } diff --git a/README.md b/README.md index cb6972cd..ab8fecdd 100644 --- a/README.md +++ b/README.md @@ -63,4 +63,4 @@ After that you can start the frontend by running `docker compose up -d` and the # DISCLAIMER -Spectra-Client isn't endorsed by Riot Games and doesn't reflect the views or opinions of Riot Games or anyone officially involved in producing or managing Riot Games properties. Riot Games, and all associated properties are trademarks or registered trademarks of Riot Games, Inc. +Spectra-Frontend isn't endorsed by Riot Games and doesn't reflect the views or opinions of Riot Games or anyone officially involved in producing or managing Riot Games properties. Riot Games, and all associated properties are trademarks or registered trademarks of Riot Games, Inc. diff --git a/package.json b/package.json index 0099ff2c..b04ac804 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "spectra-frontend", - "version": "0.2.43", + "version": "0.3.0", "author": { "name": "Purple Shark UG (haftungsbeschränkt)", "url": "https://valospectra.com" @@ -18,19 +18,20 @@ }, "private": true, "dependencies": { - "@angular/animations": "^20.0.3", - "@angular/common": "^20.0.3", - "@angular/compiler": "^20.0.3", - "@angular/core": "^20.0.3", - "@angular/forms": "^20.0.3", - "@angular/platform-browser": "^20.0.3", - "@angular/platform-browser-dynamic": "^20.0.3", - "@angular/router": "^20.0.3", + "@angular/animations": "^20.2.1", + "@angular/common": "^20.2.1", + "@angular/compiler": "^20.2.1", + "@angular/core": "^20.2.1", + "@angular/forms": "^20.2.1", + "@angular/platform-browser": "^20.2.1", + "@angular/platform-browser-dynamic": "^20.2.1", + "@angular/router": "^20.2.1", "@ngx-translate/core": "^17.0.0", "@ngx-translate/http-loader": "^17.0.0", "@tailwindcss/postcss": "^4.1.10", "animejs": "^4.0.2", "express": "^4.21.2", + "lodash": "^4.17.21", "rxjs": "~7.8.2", "socket.io-client": "4.8.1", "tailwindcss": "^4.1.10", @@ -38,11 +39,12 @@ "zone.js": "^0.15.0" }, "devDependencies": { - "@angular/build": "^20.0.2", - "@angular/cli": "^20.0.2", - "@angular/compiler-cli": "^20.0.3", + "@angular/build": "^20.2.0", + "@angular/cli": "^20.2.0", + "@angular/compiler-cli": "^20.2.1", "@types/jasmine": "~5.1.7", - "angular-eslint": "20.0.0", + "@types/lodash": "^4", + "angular-eslint": "20.2.0", "eslint": "^9.28.0", "eslint-config-prettier": "^9.1.0", "jasmine-core": "^5.6.0", @@ -52,6 +54,7 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", "prettier": "3.5.3", + "prettier-plugin-tailwindcss": "^0.6.14", "typescript": "~5.8.3", "typescript-eslint": "^8.33.1" }, diff --git a/public/assets/config/config.json b/public/assets/config/config.json index 6efae097..b2b131b2 100644 --- a/public/assets/config/config.json +++ b/public/assets/config/config.json @@ -1,9 +1,7 @@ { "serverEndpoint": "http://localhost:5200", "redirectUrl": "https://valospectra.com", - "sponsorImageUrls": [ - "/assets/misc/logo.webp" - ], + "sponsorImageUrls": ["/assets/misc/logo.webp"], "sponsorImageRotateSpeed": 5000, "attackerColorPrimary": "#b82e3c", "attackerColorSecondary": "#ff4557", diff --git a/public/assets/misc/crosshair.svg b/public/assets/misc/crosshair.svg new file mode 100644 index 00000000..f2d47ed4 --- /dev/null +++ b/public/assets/misc/crosshair.svg @@ -0,0 +1,9 @@ + + + + + crosshair + + + \ No newline at end of file diff --git a/public/assets/misc/swapIcon.svg b/public/assets/misc/swapIcon.svg new file mode 100644 index 00000000..721509e9 --- /dev/null +++ b/public/assets/misc/swapIcon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/misc/ultimate-pip.svg b/public/assets/misc/ultimate-pip.svg index 8c78f88e..a756aaae 100644 --- a/public/assets/misc/ultimate-pip.svg +++ b/public/assets/misc/ultimate-pip.svg @@ -1,3 +1,4 @@ - + \ No newline at end of file diff --git a/public/langs/de.json b/public/langs/de.json index 61ffb412..c835d750 100644 --- a/public/langs/de.json +++ b/public/langs/de.json @@ -10,8 +10,9 @@ "mapinfo.live": "Jetzt: {{map}}", "mapinfo.decider": "Entscheider: {{map}}", "mapinfo.next": "Nächste: {{map}}", - "topinfo.watermark": "Overlay von Spectra", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "RUNDE {{rounds}}", + "topscore.overtime": "VLG. {{otNumber}}", "team.attacker": "ANGREIFER", "team.defender": "VERTEIDIGER", "scoreboard.spent": "DIESE RUNDE AUSGEGEBEN", diff --git a/public/langs/en.json b/public/langs/en.json index 8dc6570c..39347b85 100644 --- a/public/langs/en.json +++ b/public/langs/en.json @@ -10,8 +10,9 @@ "mapinfo.live": "Live: {{map}}", "mapinfo.decider": "Decider: {{map}}", "mapinfo.next": "Next: {{map}}", - "topinfo.watermark": "Overlay by Spectra", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "ROUND {{rounds}}", + "topscore.overtime": "OVERTIME {{otNumber}}", "team.attacker": "ATTACKER", "team.defender": "DEFENDER", "scoreboard.spent": "SPENT THIS ROUND", diff --git a/public/langs/es.json b/public/langs/es.json index 6096b3cc..a1bdc4ae 100644 --- a/public/langs/es.json +++ b/public/langs/es.json @@ -10,7 +10,7 @@ "mapinfo.live": "En vivo: {{map}}", "mapinfo.decider": "Desempate: {{map}}", "mapinfo.next": "Siguiente: {{map}}", - "topinfo.watermark": "Overlay por Spectra", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "RONDAS {{rounds}}", "team.attacker": "ATACANTES", "team.defender": "DEFENSORES", diff --git a/public/langs/fr.json b/public/langs/fr.json index f758ef10..7348a971 100644 --- a/public/langs/fr.json +++ b/public/langs/fr.json @@ -10,7 +10,7 @@ "mapinfo.live": "En cours: {{map}}", "mapinfo.decider": "Décisive: {{map}}", "mapinfo.next": "Prochaine: {{map}}", - "topinfo.watermark": "Overlay par Spectra", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "Manches {{rounds}}", "team.attacker": "Attaquant", "team.defender": "Défenseur", diff --git a/public/langs/ja.json b/public/langs/ja.json index a86dfa9e..e1f98f23 100644 --- a/public/langs/ja.json +++ b/public/langs/ja.json @@ -10,7 +10,7 @@ "mapinfo.live": "Now: {{map}}", "mapinfo.decider": "Decider: {{map}}", "mapinfo.next": "Next: {{map}}", - "topinfo.watermark": "Spectra Overlay", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "ラウンド {{rounds}}", "team.attacker": "アタッカー", "team.defender": "ディフェンダー", diff --git a/public/langs/ms.json b/public/langs/ms.json index 88e8e53a..a3ac4b03 100644 --- a/public/langs/ms.json +++ b/public/langs/ms.json @@ -1,7 +1,7 @@ { - "playercard.kills": "Kills", - "playercard.deaths": "Deaths", - "playercard.assists": "Assists", + "playercard.kills": "Kills", + "playercard.deaths": "Deaths", + "playercard.assists": "Assists", "endround.round_win": "PEMENANG PUSINGAN", "endround.win": "PASUKAN {{team}} MENANG", "endround.attacker": "PENYERANG", @@ -10,14 +10,14 @@ "mapinfo.live": "Sedang Berlaku: {{map}}", "mapinfo.decider": "Penentu: {{map}}", "mapinfo.next": "Seterusnya: {{map}}", - "topinfo.watermark": "Overlay oleh Spectra", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "PUSINGAN {{rounds}}", "team.attacker": "PENYERANG", "team.defender": "PERTAHAN", "scoreboard.spent": "DIBELANJAKAN PUSINGAN INI", - "scoreboard.kills": "Kills", - "scoreboard.deaths": "Deaths", - "scoreboard.assists": "Assists", + "scoreboard.kills": "Kills", + "scoreboard.deaths": "Deaths", + "scoreboard.assists": "Assists", "timeout.technical_pause": "JEDA TEKNIKAL", "timeout.tactical_timeout": "Jeda Taktikal {{teamName}}" -} +} \ No newline at end of file diff --git a/public/langs/tr.json b/public/langs/tr.json index 3366eff5..778fc677 100644 --- a/public/langs/tr.json +++ b/public/langs/tr.json @@ -10,7 +10,7 @@ "mapinfo.live": "Oynanan: {{map}}", "mapinfo.decider": "Decider: {{map}}", "mapinfo.next": "Sonraki: {{map}}", - "topinfo.watermark": "Overlay by Spectra", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "TUR {{rounds}}", "team.attacker": "SALDIRI", "team.defender": "SAVUNMA", @@ -20,4 +20,4 @@ "scoreboard.assists": "Asist", "timeout.technical_pause": "TEKNİK DURAKLATMA", "timeout.tactical_timeout": "{{teamName}} Taktik Duraklatma" -} +} \ No newline at end of file diff --git a/public/langs/vn.json b/public/langs/vn.json index ea90e23f..4fe426d6 100644 --- a/public/langs/vn.json +++ b/public/langs/vn.json @@ -10,7 +10,7 @@ "mapinfo.live": "Hiện tại: {{map}}", "mapinfo.decider": "Quyết định: {{map}}", "mapinfo.next": "Kế tiếp: {{map}}", - "topinfo.watermark": "HUD Phát Triển Bởi Spectra", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "HIỆP {{rounds}}", "team.attacker": "PHE TẤN CÔNG", "team.defender": "PHE PHÒNG THỦ", diff --git a/public/langs/zh_HANS.json b/public/langs/zh_HANS.json index e957697c..24150d8b 100644 --- a/public/langs/zh_HANS.json +++ b/public/langs/zh_HANS.json @@ -10,7 +10,7 @@ "mapinfo.live": "当前场次: {{map}}", "mapinfo.decider": "决胜场次: {{map}}", "mapinfo.next": "下一场: {{map}}", - "topinfo.watermark": "由 Spectra 提供技术支持", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "第 {{rounds}} 回合", "team.attacker": "攻方", "team.defender": "守方", diff --git a/public/langs/zh_HANT.json b/public/langs/zh_HANT.json index 5bdefdc1..af43359e 100644 --- a/public/langs/zh_HANT.json +++ b/public/langs/zh_HANT.json @@ -10,7 +10,7 @@ "mapinfo.live": "進行中: {{map}}", "mapinfo.decider": "決勝圖: {{map}}", "mapinfo.next": "下張地圖: {{map}}", - "topinfo.watermark": "由 Spectra 提供技術支援", + "topinfo.watermark": "Powered by Spectra", "topscore.round": "第 {{rounds}} 回合", "team.attacker": "進攻方", "team.defender": "防守方", diff --git a/src/animations.css b/src/animations.css new file mode 100644 index 00000000..b14cf79c --- /dev/null +++ b/src/animations.css @@ -0,0 +1,44 @@ +@theme { + --animate-fade-in: fade-in 0.5s ease-in; + --animate-fade-out: fade-in 0.5s ease-in reverse; + @keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + + --animate-collapse-center-in: collapse-center 0.15s reverse; + --animate-collapse-center-out: collapse-center 0.15s; + @keyframes collapse-center { + 0% { + opacity: 1; + transform: scale(1, 1); + } + 100% { + opacity: 0; + transform: scale(0, 1.5); + } + } +} + +@utility animate-duration-* { + animation-duration: calc(--value(integer) * 1ms) !important; +} + +@utility animate-delay-* { + animation-delay: calc(--value(integer) * 1ms) !important; +} +@source inline("animate-delay-{0..2000..50}"); + +@utility animate-style-keep { + animation-fill-mode: forwards !important; +} +@utility animate-style-early { + animation-fill-mode: backwards !important; +} +@utility animate-style-both { + animation-fill-mode: both !important; +} diff --git a/src/app/abilities/abilities.component.html b/src/app/abilities/abilities.component.html deleted file mode 100644 index 7b3d81fa..00000000 --- a/src/app/abilities/abilities.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
- - - -
- -
- -
diff --git a/src/app/abilities/abilities.component.scss b/src/app/abilities/abilities.component.scss deleted file mode 100644 index 2dec50e1..00000000 --- a/src/app/abilities/abilities.component.scss +++ /dev/null @@ -1,50 +0,0 @@ -.container { - width: 100%; - display: inline-flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 2px; -} - -.regular-container { - display: inline-flex; - flex-direction: row; - flex: auto; - align-items: center; - justify-content: center; - gap: 15px; - - &.right { - @extend .regular-container; - transform: rotateY(180deg); - } -} - -.ability-icon { - width: 22px; - - &.available { - @extend .ability-icon; - filter: brightness(1); - } - - &.unavailable { - @extend .ability-icon; - filter: brightness(0.35); - } -} - -.ultimate-icon { - width: 30px; - - &.available { - @extend .ultimate-icon; - filter: brightness(1); - } - - &.unavailable { - @extend .ultimate-icon; - filter: brightness(0.35); - } -} diff --git a/src/app/abilities/abilities.component.ts b/src/app/abilities/abilities.component.ts deleted file mode 100644 index 6e9d9256..00000000 --- a/src/app/abilities/abilities.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Component, inject, Input } from "@angular/core"; -import { Config } from "../shared/config"; -import { trigger, transition, style, animate } from "@angular/animations"; -import { NgIf } from "@angular/common"; - -@Component({ - selector: "app-abilities", - templateUrl: "./abilities.component.html", - styleUrl: "./abilities.component.scss", - animations: [ - trigger("deathAnimation", [ - transition("true => false, true => void", [ - style({ filter: "grayscale(50%)" }), - animate("100ms ease-in", style({ width: "0", opacity: 0.5, filter: "grayscale(100%)" })), - ]), - transition("false => true, void => true", [ - style({ filter: "grayscale(50%)", width: "0", opacity: 0.5 }), - animate("250ms ease-out", style({ width: "*", opacity: 1, filter: "grayscale(0%)" })), - ]), - ]), - trigger("availableWhileDead", [ - transition("false => true, void => true", [ - style({ opacity: "0" }), - animate("200ms linear", style({ opacity: 1 })), - ]), - ]), - ], - imports: [NgIf], -}) -export class AbilitiesComponent { - private config = inject(Config); - - public readonly assets: string = "../../../assets"; - @Input({ required: true }) player!: any; - @Input({ required: true }) side!: "left" | "right"; - @Input({ required: false }) phase: "combat" | "shopping" = "combat"; - @Input() hideAuxiliary = false; - - getAvailability(availablility: number): string { - availablility = this.clamp(availablility, 0, 1); - return availablility == 1 ? "available" : "unavailable"; - } - - clamp(value: number, min: number, max: number): number { - return Math.min(Math.max(value, min), max); - } -} diff --git a/src/app/agent-select/agent-select.component.html b/src/app/agent-select/agent-select.component.html deleted file mode 100644 index 0117db43..00000000 --- a/src/app/agent-select/agent-select.component.html +++ /dev/null @@ -1,36 +0,0 @@ -
-
-
- -
-
-
-
- -
-
- -
-
-
-
- -
-
-
diff --git a/src/app/agent-select/agent-select.component.scss b/src/app/agent-select/agent-select.component.scss deleted file mode 100644 index 35773ffb..00000000 --- a/src/app/agent-select/agent-select.component.scss +++ /dev/null @@ -1,79 +0,0 @@ -.body { - position: absolute; - width: 98%; - height: 40%; - bottom: 1%; - left: 1%; - background-color: #0f1923cc; - border-radius: 25px; - overflow: hidden; -} - -.left-team { - position: absolute; - left: 0; - width: 45%; - height: 100%; -} - -.right-team { - position: absolute; - right: 0; - width: 45%; - height: 100%; -} - -.team-info { - position: absolute; - left: 45%; - width: 10%; - height: 100%; - background: linear-gradient( - 180deg, - rgba(15, 25, 35, 0.65) 0%, - rgba(15, 25, 35, 0.53) 53%, - rgba(15, 25, 35, 0) 75%, - rgba(15, 25, 35, 0) 100% - ); -} - -.defender-team { - position: absolute; - width: 100%; - height: 50%; - top: 0; - background: linear-gradient( - 180deg, - rgba(var(--defender-color-rgb), 0.9) 0%, - rgba(var(--defender-color-secondary-rgb), 0) 90% - ); -} - -.attacker-team { - position: absolute; - width: 100%; - height: 50%; - bottom: 0; - background: linear-gradient( - 0deg, - rgba(var(--attacker-color-rgb), 0.9) 0%, - rgba(var(--attacker-color-secondary-rgb), 0) 90% - ); -} - -.team-wrapper { - display: flex; - flex-direction: row; - &-left { - @extend .team-wrapper; - } - - &-right { - @extend .team-wrapper; - } -} - -app-select-player-info { - width: 20%; - height: 100%; -} diff --git a/src/app/agent-select/agent-select.component.ts b/src/app/agent-select/agent-select.component.ts deleted file mode 100644 index d834b1ca..00000000 --- a/src/app/agent-select/agent-select.component.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { AfterViewInit, Component, inject, OnInit, ViewChild } from "@angular/core"; -import { TrackerComponent } from "../tracker/tracker.component"; -import { ActivatedRoute } from "@angular/router"; -import { SocketService } from "../services/SocketService"; -import { Config } from "../shared/config"; -import { trigger, transition, style, animate } from "@angular/animations"; -import { NgIf, NgFor } from "@angular/common"; -import { SelectPlayerInfoComponent } from "./select-player-info/select-player-info.component"; -import { SelectTeamInfoComponent } from "./select-team-info/select-team-info.component"; -import { TranslateService } from "@ngx-translate/core"; -import { LanguageAliasService } from "../services/languageAlias.service"; - -@Component({ - selector: "app-agent-select", - templateUrl: "./agent-select.component.html", - styleUrls: ["./agent-select.component.scss"], - animations: [ - trigger("fade", [ - transition(":enter", [style({ opacity: "0" }), animate("0.5s", style({ opacity: "1" }))]), - transition(":leave", animate("0.5s", style({ opacity: "0" }))), - ]), - ], - imports: [NgIf, NgFor, SelectPlayerInfoComponent, SelectTeamInfoComponent], -}) -export class AgentSelectComponent implements OnInit, AfterViewInit { - private route = inject(ActivatedRoute); - private config = inject(Config); - private translate = inject(TranslateService); - - @ViewChild(TrackerComponent) trackerComponent!: TrackerComponent; - groupCode = "UNKNOWN"; - lang = "en"; - socketService!: SocketService; - - match: any; - teamLeft: any; - teamRight: any; - - constructor() { - this.route.queryParams.subscribe((params) => { - this.groupCode = params["groupCode"]?.toUpperCase() || "UNKNOWN"; - const paramLang = params["lang"]?.toLowerCase() || "en"; - this.lang = LanguageAliasService.resolveLanguageAlias(paramLang); - }); - } - - ngOnInit(): void { - this.match = { - groupCode: "A", - isRanked: false, - isRunning: true, - roundNumber: 0, - roundPhase: "combat", - teams: [{ players: [] }, { players: [] }], - spikeState: { planted: false }, - map: "Ascent", - tools: { - seriesInfo: { - needed: 1, - wonLeft: 0, - wonRight: 0, - mapInfo: [], - }, - }, - }; - - this.teamLeft = this.match.teams[0]; - this.teamRight = this.match.teams[1]; - - this.socketService = SocketService.getInstance().connectMatch( - this.config.serverEndpoint, - this.groupCode, - ); - - this.translate.use(this.lang); - } - - ngAfterViewInit(): void { - this.socketService.subscribeMatch((data: any) => { - this.updateMatch(data); - }); - } - - isAutoswitch(): boolean { - return this.route.snapshot.parent?.routeConfig?.path == "autoswitch"; - } - - shouldDisplay(): boolean { - if (this.isAutoswitch()) { - if (this.match.roundPhase === "LOBBY") { - return true; - } else { - return false; - } - } else { - return true; - } - } - - public updateMatch(data: any) { - delete data.eventNumber; - delete data.replayLog; - this.match = data; - - this.teamLeft = this.match.teams[0]; - this.teamRight = this.match.teams[1]; - - // Construct map for name overrides if it's a string (from JSON). The server might keep it as JSON to avoid issues. - const tempOverrides = this.match?.tools?.nameOverrides?.overrides || null; - if (typeof tempOverrides === "string") { - this.match.tools.nameOverrides.overrides = this.jsonToMap(tempOverrides); - } - } - - trackByPlayerId(index: number, player: any) { - return player.playerId; - } - - private jsonToMap(json: string): Map { - try { - const obj = JSON.parse(json); - if (Array.isArray(obj)) { - return new Map(obj); - } else { - throw new Error("Invalid JSON format for Map"); - } - } catch (error) { - console.error("Failed to parse JSON to Map:", error); - return new Map(); - } - } -} diff --git a/src/app/agent-select/select-player-info/select-player-info.component.html b/src/app/agent-select/select-player-info/select-player-info.component.html deleted file mode 100644 index 61b9c6d6..00000000 --- a/src/app/agent-select/select-player-info/select-player-info.component.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
- -
- -
-
- {{ player.fullName | nameOverride: player.name : getOverrideNames() }} -
-
-
-
diff --git a/src/app/agent-select/select-player-info/select-player-info.component.scss b/src/app/agent-select/select-player-info/select-player-info.component.scss deleted file mode 100644 index 662fc32e..00000000 --- a/src/app/agent-select/select-player-info/select-player-info.component.scss +++ /dev/null @@ -1,76 +0,0 @@ -@import url("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=Unbounded:wght@200..900&display=swap"); - -.container { - height: 100%; - width: 100%; - overflow: hidden; -} - -.player-gradient { - position: absolute; - width: 20%; - height: 100%; - top: 0; - z-index: -200; - - &.attacker { - @extend .player-gradient; - background: linear-gradient( - 0deg, - rgba(var(--attacker-color-rgb), 1) 0%, - rgba(var(--attacker-color-rgb), 0.4) 75%, - rgba(var(--attacker-color-secondary-rgb), 0) 100% - ); - } - &.defender { - @extend .player-gradient; - background: linear-gradient( - 180deg, - rgba(var(--defender-color-rgb), 1) 0%, - rgba(var(--defender-color-rgb), 0.4) 75%, - rgba(var(--defender-color-secondary-rgb), 0) 100% - ); - } -} - -.agent-image { - display: block; - margin-top: -35%; - margin-left: -150%; - max-width: 400%; - z-index: 200; - filter: grayscale(1); - - &.locked { - filter: grayscale(0); - } -} - -.player-name { - position: absolute; - width: 20%; - bottom: 15%; - text-align: center; - font-size: 1.25rem; - font-weight: 800; - color: white; - font-family: "Montserrat", Helvetica; - text-shadow: 2px 2px 5px black; - line-break: auto; - overflow: hidden; - line-height: 90%; -} - -.player-role { - position: absolute; - width: 20%; - bottom: 3%; - z-index: 100; -} - -.role-image { - display: block; - margin: auto; - max-width: 25%; -} diff --git a/src/app/agent-select/select-player-info/select-player-info.component.ts b/src/app/agent-select/select-player-info/select-player-info.component.ts deleted file mode 100644 index 41ab5277..00000000 --- a/src/app/agent-select/select-player-info/select-player-info.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component, Input } from "@angular/core"; -import { AgentRoleService } from "../../services/agentRole.service"; -import { trigger, transition, style, animate } from "@angular/animations"; -import { NgClass } from "@angular/common"; -import { NameoverridePipe } from "../../pipes/nameoverride.pipe"; - -@Component({ - selector: "app-select-player-info", - templateUrl: "./select-player-info.component.html", - styleUrl: "./select-player-info.component.scss", - animations: [ - trigger("lockAnimation", [ - transition("false => true, void => true", [ - style({ filter: "grayscale(1) brightness(200%)" }), - animate("350ms", style({ filter: "grayscale(0) brightness(100%)" })), - ]), - ]), - trigger("characterSwitch", [ - transition("* <=> *", [style({ opacity: "0" }), animate("100ms", style({ opacity: "1" }))]), - ]), - ], - imports: [NgClass, NameoverridePipe], -}) -export class SelectPlayerInfoComponent { - @Input() player: any; - @Input() color: "attacker" | "defender" = "attacker"; - @Input() overrideNames = new Map(); - - getAgentRole(agent: string) { - return AgentRoleService.getAgentRole(agent); - } - - getOverrideNames(): Map { - let toReturn = this.overrideNames; - if (!toReturn) { - toReturn = new Map(); - } - return toReturn; - } -} diff --git a/src/app/agent-select/select-team-info/select-team-info.component.html b/src/app/agent-select/select-team-info/select-team-info.component.html deleted file mode 100644 index 543fefff..00000000 --- a/src/app/agent-select/select-team-info/select-team-info.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
-
{{ team.teamTricode }}
- -
{{ team.teamTricode }}
-
-
diff --git a/src/app/agent-select/select-team-info/select-team-info.component.scss b/src/app/agent-select/select-team-info/select-team-info.component.scss deleted file mode 100644 index 6b027e67..00000000 --- a/src/app/agent-select/select-team-info/select-team-info.component.scss +++ /dev/null @@ -1,46 +0,0 @@ -@import url("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=Unbounded:wght@200..900&display=swap"); - -.container { - height: 100%; - width: 100%; -} - -.team-tricode { - width: 100%; - height: 20%; - font-size: 2em; - font-weight: 800; - color: white; - font-family: "Unbounded", Helvetica; - text-align: center; -} - -.team-logo { - width: 100%; - height: 80%; - display: flex; - justify-content: center; - align-items: center; -} - -.logo { - max-width: 90%; - max-height: 90%; - display: block; - padding: 5% 5%; -} - -.defender-gradient { - position: absolute; - width: 100%; - height: 100%; - top: 0; -} - -.attacker-gradient { - position: absolute; - bottom: 0; - width: 100%; - height: 100%; -} diff --git a/src/app/agent-select/select-team-info/select-team-info.component.ts b/src/app/agent-select/select-team-info/select-team-info.component.ts deleted file mode 100644 index 91425710..00000000 --- a/src/app/agent-select/select-team-info/select-team-info.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component, Input } from "@angular/core"; -import { NgIf } from "@angular/common"; - -@Component({ - selector: "app-select-team-info", - templateUrl: "./select-team-info.component.html", - styleUrl: "./select-team-info.component.scss", - imports: [NgIf], -}) -export class SelectTeamInfoComponent { - @Input() team: any; - @Input() isAttack = false; -} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 37fb5a20..6052a0cc 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,13 +1,6 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; -import { TestingComponent } from "./testing/testing.component"; -import { OverlayComponent } from "./overlay/overlay.component"; -import { AgentSelectComponent } from "./agent-select/agent-select.component"; -import { AutoswitchComponent } from "./autoswitch/autoswitch.component"; -import { RedirectComponent } from "./redirect/redirect.component"; -import { TimeoutComponent } from "./timeout/timeout.component"; -import { MapbanUiComponent } from "./mapban-ui/mapban-ui.component"; -import { PlayercamsComponent } from "./playercams/playercams.component"; +import { RedirectComponent } from "./components/common/redirect/redirect.component"; const routes: Routes = [ { @@ -19,11 +12,17 @@ const routes: Routes = [ children: [ { path: "", - component: OverlayComponent, + loadComponent: () => + import("./overlays/match-overlay/match-overlay.component").then( + (m) => m.MatchOverlayComponent, + ), }, { path: "minimal", - component: OverlayComponent, + loadComponent: () => + import("./overlays/match-overlay/match-overlay.component").then( + (m) => m.MatchOverlayComponent, + ), data: { minimal: true, }, @@ -35,31 +34,45 @@ const routes: Routes = [ children: [ { path: "", - component: TestingComponent, + loadComponent: () => + import("./overlays/testing/testing.component").then((m) => m.TestingComponent), }, { path: "minimal", - component: TestingComponent, + loadComponent: () => + import("./overlays/testing/testing.component").then((m) => m.TestingComponent), data: { minimal: true, }, }, + { + path: "agent-select", + loadComponent: () => + import("./overlays/testing-agent-select/testing-agent-select.component").then( + (m) => m.TestingAgentSelectComponent, + ), + }, ], }, { path: "agent-select", - component: AgentSelectComponent, + loadComponent: () => + import("./overlays/agent-select-overlay/agent-select-overlay.component").then( + (m) => m.AgentSelectOverlayComponent, + ), }, { path: "autoswitch", children: [ { path: "", - component: AutoswitchComponent, + loadComponent: () => + import("./autoswitch/autoswitch.component").then((m) => m.AutoswitchComponent), }, { path: "minimal", - component: AutoswitchComponent, + loadComponent: () => + import("./autoswitch/autoswitch.component").then((m) => m.AutoswitchComponent), data: { minimal: true, }, @@ -68,15 +81,27 @@ const routes: Routes = [ }, { path: "timeout", - component: TimeoutComponent, + loadComponent: () => + import("./components/common/timeout/timeout.component").then((m) => m.TimeoutComponent), }, { path: "mapban", - component: MapbanUiComponent, + loadComponent: () => + import("./overlays/mapban-overlay/mapban-overlay.component").then((m) => m.MapbanUiComponent), + }, + { + path: "playercams", + loadComponent: () => + import("./components/combat/playercams/playercams.component").then( + (m) => m.PlayercamsComponent, + ), }, { path: "playercams", - component: PlayercamsComponent, + loadComponent: () => + import("./components/combat/playercams/playercams.component").then( + (m) => m.PlayercamsComponent, + ), }, ]; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index fbe04880..fc71c642 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -2,44 +2,13 @@ import { NgModule } from "@angular/core"; import { BrowserModule } from "@angular/platform-browser"; import { AppRoutingModule } from "./app-routing.module"; -import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { provideHttpClient, withInterceptorsFromDi } from "@angular/common/http"; import { AppComponent } from "./app.component"; -import { TestingComponent } from "./testing/testing.component"; -import { FormsModule } from "@angular/forms"; -import { TrackerComponent } from "./tracker/tracker.component"; -import { TopscoreComponent } from "./topscore/topscore.component"; -import { ScoreboardComponent, ScoreboardOrderPipe } from "./scoreboard/scoreboard.component"; -import { CombatComponent } from "./combat/combat.component"; -import { TopinfoComponent } from "./topscore/topinfo/topinfo.component"; -import { - PlayerscoreComponent, - PlayerscoreMinimalComponent, -} from "./scoreboard/playerscore/playerscore.component"; -import { RoundreasonsComponent } from "./scoreboard/roundreasons/roundreasons.component"; -import { - InhouseTrackerPlayercardComponent, - InhouseTrackerPlayercardMinimalComponent, -} from "./combat/playercard/playercard.component"; -import { OverlayComponent } from "./overlay/overlay.component"; -import { PlayerControllerComponent } from "./testing/player-controller/player-controller.component"; -import { TeamControllerComponent } from "./testing/team-controller/team-controller.component"; -import { EndroundComponent } from "./endround/endround.component"; -import { ShieldIconComponent } from "./combat/playercard/shield-icon/shield-icon.component"; -import { MapinfoComponent } from "./topscore/topinfo/mapinfo/mapinfo.component"; import { JsonPipe } from "@angular/common"; -import { AgentSelectComponent } from "./agent-select/agent-select.component"; -import { SelectTeamInfoComponent } from "./agent-select/select-team-info/select-team-info.component"; -import { SelectPlayerInfoComponent } from "./agent-select/select-player-info/select-player-info.component"; import { AutoswitchComponent } from "./autoswitch/autoswitch.component"; -import { RedirectComponent } from "./redirect/redirect.component"; -import { TimeoutComponent } from "./timeout/timeout.component"; -import { AbilitiesComponent } from "./abilities/abilities.component"; -import { MapbanUiComponent } from "./mapban-ui/mapban-ui.component"; -import { MapbanMapComponent } from "./mapban-ui/mapban-map/mapban-map.component"; +import { MapbanUiComponent } from "./overlays/mapban-overlay/mapban-overlay.component"; import { provideTranslateHttpLoader } from "@ngx-translate/http-loader"; import { TranslateModule } from "@ngx-translate/core"; -import { PlayercamsComponent } from "./playercams/playercams.component"; @NgModule({ declarations: [AppComponent], @@ -48,37 +17,9 @@ import { PlayercamsComponent } from "./playercams/playercams.component"; imports: [ BrowserModule, AppRoutingModule, - FormsModule, - BrowserAnimationsModule, JsonPipe, - TestingComponent, - TrackerComponent, - TopscoreComponent, - ScoreboardComponent, - CombatComponent, - TopinfoComponent, - PlayerscoreComponent, - RoundreasonsComponent, - InhouseTrackerPlayercardComponent, - OverlayComponent, - PlayerControllerComponent, - TeamControllerComponent, - EndroundComponent, - ShieldIconComponent, - MapinfoComponent, - AgentSelectComponent, - SelectTeamInfoComponent, - SelectPlayerInfoComponent, AutoswitchComponent, - RedirectComponent, - TimeoutComponent, - AbilitiesComponent, - InhouseTrackerPlayercardMinimalComponent, - PlayerscoreMinimalComponent, - ScoreboardOrderPipe, MapbanUiComponent, - MapbanMapComponent, - PlayercamsComponent, TranslateModule.forRoot({ loader: provideTranslateHttpLoader({ prefix: "./langs/", suffix: ".json" }), fallbackLang: "en", diff --git a/src/app/autoswitch/autoswitch.component.scss b/src/app/autoswitch/autoswitch.component.css similarity index 100% rename from src/app/autoswitch/autoswitch.component.scss rename to src/app/autoswitch/autoswitch.component.css diff --git a/src/app/autoswitch/autoswitch.component.html b/src/app/autoswitch/autoswitch.component.html index 050f2154..f51c70ce 100644 --- a/src/app/autoswitch/autoswitch.component.html +++ b/src/app/autoswitch/autoswitch.component.html @@ -1,4 +1,7 @@
- - + @if (dataModel.match().roundPhase === "LOBBY") { + + } @else { + + }
diff --git a/src/app/autoswitch/autoswitch.component.ts b/src/app/autoswitch/autoswitch.component.ts index 14ddcbad..e767d4b6 100644 --- a/src/app/autoswitch/autoswitch.component.ts +++ b/src/app/autoswitch/autoswitch.component.ts @@ -1,11 +1,14 @@ -import { Component } from "@angular/core"; -import { AgentSelectComponent } from "../agent-select/agent-select.component"; -import { OverlayComponent } from "../overlay/overlay.component"; +import { Component, inject } from "@angular/core"; +import { MatchOverlayComponent } from "../overlays/match-overlay/match-overlay.component"; +import { AgentSelectOverlayComponent } from "../overlays/agent-select-overlay/agent-select-overlay.component"; +import { DataModelService } from "../services/dataModel.service"; @Component({ selector: "app-autoswitch", templateUrl: "./autoswitch.component.html", - styleUrl: "./autoswitch.component.scss", - imports: [AgentSelectComponent, OverlayComponent], + styleUrl: "./autoswitch.component.css", + imports: [MatchOverlayComponent, AgentSelectOverlayComponent], }) -export class AutoswitchComponent {} +export class AutoswitchComponent { + readonly dataModel = inject(DataModelService); +} diff --git a/src/app/combat/combat.component.html b/src/app/combat/combat.component.html deleted file mode 100644 index ceee118c..00000000 --- a/src/app/combat/combat.component.html +++ /dev/null @@ -1,45 +0,0 @@ - -
-
- -
-
- -
-
- - -
-
- -
-
- -
-
diff --git a/src/app/combat/combat.component.scss b/src/app/combat/combat.component.scss deleted file mode 100644 index 43745805..00000000 --- a/src/app/combat/combat.component.scss +++ /dev/null @@ -1,39 +0,0 @@ -.flip { - transform: rotateY(180deg); -} - -.frame-2 { - position: absolute; - width: 1802px; - height: 434px; - top: 623px; - left: 59px; -} - -.playercards { - display: inline-flex; - flex-direction: column; - align-items: flex-end; - gap: 14px; - position: absolute; - top: 0; - right: 0; -} - -.playercards-leftteam { - display: inline-flex; - flex-direction: column; - align-items: flex-start; - gap: 14px; - position: absolute; - top: 0; - left: 0; -} - -.fill-green { - fill: #61eab6; -} - -.fill-red { - fill: #ff4557; -} diff --git a/src/app/combat/combat.component.ts b/src/app/combat/combat.component.ts deleted file mode 100644 index dcc62d9f..00000000 --- a/src/app/combat/combat.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Component, Input, inject } from "@angular/core"; -import { ActivatedRoute } from "@angular/router"; -import { NgIf, NgFor } from "@angular/common"; -import { - InhouseTrackerPlayercardComponent, - InhouseTrackerPlayercardMinimalComponent, -} from "./playercard/playercard.component"; - -@Component({ - selector: "app-combat", - templateUrl: "./combat.component.html", - styleUrls: ["./combat.component.scss"], - imports: [ - NgIf, - NgFor, - InhouseTrackerPlayercardComponent, - InhouseTrackerPlayercardMinimalComponent, - ], -}) -export class CombatComponent { - private route = inject(ActivatedRoute); - - @Input() match!: any; - @Input() hideAuxiliary = false; - - isMinimal(): boolean { - if (this.route.snapshot.data["minimal"]) { - return this.route.snapshot.data["minimal"]; - } else { - return false; - } - } - - trackByPlayerId(index: number, player: any) { - return player.playerId; - } - - numSequence(n: number): number[] { - return Array(n); - } -} diff --git a/src/app/combat/playercard/playercard-minimal.component.html b/src/app/combat/playercard/playercard-minimal.component.html deleted file mode 100644 index c0fc2125..00000000 --- a/src/app/combat/playercard/playercard-minimal.component.html +++ /dev/null @@ -1,81 +0,0 @@ -
- -
- -
-
-
-
- -
-
-
-
-
- {{ getAgentName(player.agentInternal) }} -
-
-
-
-
- {{ player.fullName | nameOverride: player.name : getOverrideNames() }} -
- -
-
-
-
-
-
-
{{ "playercard.kills" | translate }}
-
{{ player.kills }}
-
-
-
{{ "playercard.deaths" | translate }}
-
{{ player.deaths }}
-
-
-
{{ "playercard.assists" | translate }}
-
{{ player.assists }}
-
-
-
{{ "playercard.deaths" | translate }}
-
{{ player.deaths }}
-
-
-
{{ "playercard.kills" | translate }}
-
{{ player.kills }}
-
-
-
-
diff --git a/src/app/combat/playercard/playercard.component.html b/src/app/combat/playercard/playercard.component.html deleted file mode 100644 index 94c4ba44..00000000 --- a/src/app/combat/playercard/playercard.component.html +++ /dev/null @@ -1,159 +0,0 @@ -
- -
- -
-
-
-
- -
-
- -
- -
- -
- {{ player.health }} -
- -
-
-
- - - -
- {{ player.money }} -
-
-
-
-
- {{ player.kills }}/{{ player.deaths }}/{{ player.assists }} -
-
-
-
-
-
-
- {{ player.fullName | nameOverride: player.name : getOverrideNames() }} -
- -
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
- -
-
-
-
-
diff --git a/src/app/combat/playercard/playercard.component.scss b/src/app/combat/playercard/playercard.component.scss deleted file mode 100644 index 84b98b42..00000000 --- a/src/app/combat/playercard/playercard.component.scss +++ /dev/null @@ -1,434 +0,0 @@ -.flip { - transform: rotateY(180deg); -} - -.right { - @extend .flip; -} - -.player-container { - display: inline-flex; - align-items: flex-start; - position: relative; - flex: 0 0 auto; -} - -.agent-icon { - z-index: 1; - background-size: cover; - background-position: 50% 50%; - position: absolute; - aspect-ratio: 1; - height: 100%; - top: 0; - max-width: unset; - - &.dead { - @extend .agent-icon; - filter: grayscale(1); - } -} - -.player-card { - display: inline-flex; - align-items: flex-start; - position: relative; - flex: 0 0 auto; - z-index: 0; -} - -.utility-container { - align-items: flex-start; - padding: 0px 0px 4px 18px; - display: flex; - flex-direction: column; - width: 186px; - height: 74px; - justify-content: flex-end; - gap: 4px; - position: relative; - border: 0px none; - - &.attacker { - @extend .utility-container; - background: linear-gradient( - 90deg, - rgba(var(--attacker-color-secondary-rgb), 0.5) 0%, - rgba(var(--attacker-color-rgb), 0.3) 58.5%, - rgba(var(--attacker-color-rgb), 0.01) 90.5%, - rgba(0, 0, 0, 0) 100% - ); - } - - &.defender { - @extend .utility-container; - background: linear-gradient( - 90deg, - rgba(var(--defender-color-shield-currency-rgb), 0.5) 0%, - rgba(var(--defender-color-rgb), 0.2) 58.5%, - rgba(var(--defender-color-rgb), 0.01) 90.5%, - rgba(0, 0, 0, 0) 100% - ); - } - - &.minimal { - @extend .utility-container; - flex-direction: row; - gap: 6px; - padding-left: 12px; - align-items: center; - justify-content: flex-start; - } -} - -.weapon-icon-wrapper { - display: inline-flex; - flex-direction: column; - align-items: center; - gap: 20px; - position: relative; - flex: 0 0 auto; -} - -.weapon-icon { - position: relative; - height: 32px; - object-fit: cover; - transform: rotateY(180deg); -} - -.ultimate-tracker-container { - display: inline-flex; - height: 21.33px; - width: 67%; - align-items: center; - gap: 20px; - position: relative; - // justify-content: center; -} - -.spike-icon-wrapper { - position: relative; - align-items: center; - display: inline-flex; - justify-content: end; - flex: 0 0 auto; - justify-self: end; -} - -.spike-icon { - position: relative; - width: 30px; - aspect-ratio: 1; -} - -.ultimate-tracker { - width: 60%; - display: inline-flex; - align-items: center; - gap: 1px; - position: relative; - flex: 0 0 auto; - justify-content: center; -} - -.pip-ultimate { - position: relative; - width: 10px; - height: 10px; - margin-right: -2px; - background-image: url(/assets/misc/ultimate-pip.svg); - background-size: 100% 100%; - - &-full { - @extend .pip-ultimate; - background-image: url(/assets/misc/ultimate-pip-full.svg); - } -} - -.ultimate-full-image { - width: 25px; - margin-left: auto; - margin-right: auto; -} - -.rank-icon-container { - position: absolute; - width: 30px; - height: 30px; - left: -48px; - bottom: 0px; - z-index: 2; - background-size: cover; - background-position: 50% 50%; -} - -.rank-icon { - height: 100%; - aspect-ratio: 1; -} - -.agent-icon-container { - left: -44px; - z-index: 1; - position: absolute; - height: 100%; - top: 0; -} - -.player-info { - display: flex; - flex-direction: column; - width: 160px; - height: 76px; - align-items: flex-start; - justify-content: flex-end; - gap: 4px; - padding: 0px 0px 2px 32px; - position: relative; - - &.defender { - @extend .player-info; - background: - linear-gradient( - 90deg, - rgba(var(--defender-color-rgb), 0.3) 0%, - rgba(var(--defender-color-rgb), 0) 100% - ), - rgba(15, 25, 35, 0.6); - } - - &.attacker { - @extend .player-info; - background: - linear-gradient( - 90deg, - rgba(var(--attacker-color-rgb), 0.5) 0%, - rgba(var(--attacker-color-rgb), 0) 100% - ), - rgba(15, 25, 35, 0.6); - } - - &.observed { - @extend .player-info; - background: - linear-gradient(90deg, rgba(225, 181, 22, 0.3) 0%, rgba(225, 181, 22, 0) 100%), - rgba(15, 25, 35, 0.7); - } - - &.dead { - @extend .player-info; - background: rgba(15, 25, 35, 0.6); - } - - &.minimal { - @extend .player-info; - width: 180px; - } -} - -.spectator-icon-container { - position: absolute; - top: 0; - width: 18px; - height: 20px; - right: 3px; -} - -.spectator-icon { - width: 18px; - aspect-ratio: 1; -} - -.info-container { - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: flex-end; - gap: 4px; - position: relative; - align-self: stretch; - width: 100%; - flex: 0 0 auto; - top: -4px; - left: 5px; - - &.minimal { - @extend .info-container; - top: -22px; - } -} - -.shields-currency { - display: inline-flex; - height: 20px; - align-items: flex-end; - gap: 6px; - position: relative; -} - -.captain-icon { - height: 17px; - width: 17px; - position: relative; - flex: 0 0 auto; -} - -.currency-container { - display: inline-flex; - align-items: center; - gap: 2px; - position: relative; - flex: 0 0 auto; -} - -.valorant-credits { - position: relative; - width: 8px; - height: 8px; - - &.attacker { - @extend .valorant-credits; - fill: var(--attacker-color-shield-currency); - } - - &.defender { - @extend .valorant-credits; - fill: var(--defender-color-shield-currency); - } -} - -.currency-title { - position: relative; - width: fit-content; - margin-top: -1px; - opacity: 0.8; - font-family: "Montserrat", Helvetica; - font-weight: 700; - font-size: 11px; - text-align: center; - letter-spacing: 0; - line-height: normal; - white-space: nowrap; - - &.attacker { - @extend .currency-title; - color: var(--attacker-color-shield-currency); - } - - &.defender { - @extend .currency-title; - color: var(--defender-color-shield-currency); - } -} - -.username-container { - display: inline-flex; - height: 15px; - align-items: center; - gap: 4px; - position: relative; -} - -.username-title { - position: relative; - width: fit-content; - font-family: "Montserrat", Helvetica; - font-weight: 600; - color: #ffffff; - font-size: 16px; - letter-spacing: 0; - line-height: normal; - white-space: nowrap; - - &.minimal { - @extend .username-title; - font-size: 18px; - } -} - -.stats-container { - display: flex; - flex-direction: column; - align-items: center; - width: 41px; -} - -.stats-title { - @extend .currency-title; - color: white; -} - -.stats-content { - @extend .username-title; - font-size: 18px; -} - -app-shield-icon { - position: relative; - width: 22px; - height: 22px; - flex: 0 0 auto; -} - -.health-container { - display: inline-flex; - height: 20px; - width: 62px; - align-items: center; - gap: 4px; - position: relative; - overflow: hidden; - - &.right { - @extend .health-container; - justify-content: flex-end; - } -} - -.health-amount { - position: relative; - width: fit-content; - opacity: 0.8; - font-family: "Montserrat", Helvetica; - font-weight: 800; - font-size: 20px; - text-align: center; - letter-spacing: 0; - line-height: normal; - white-space: nowrap; - - &.attacker { - @extend .health-amount; - color: var(--attacker-color-shield-currency); - } - - &.defender { - @extend .health-amount; - color: var(--defender-color-shield-currency); - } -} - -.health-bar { - position: absolute; - height: 3px; - left: 0; - bottom: 0; - transition: width 0.2s ease-out; - - &.attacker { - @extend .health-bar; - background-color: var(--attacker-color-shield-currency); - } - - &.defender { - @extend .health-bar; - background-color: var(--defender-color-shield-currency); - } -} - -.abilities { - display: inline-flex; - align-items: center; - justify-content: center; -} diff --git a/src/app/combat/playercard/playercard.component.ts b/src/app/combat/playercard/playercard.component.ts deleted file mode 100644 index cbdf7607..00000000 --- a/src/app/combat/playercard/playercard.component.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { trigger, transition, style, animate } from "@angular/animations"; -import { Component, Input, inject } from "@angular/core"; -import { Config } from "../../shared/config"; -import { AgentNameService } from "../../services/agentName.service"; -import { NgIf, NgFor } from "@angular/common"; -import { AbilitiesComponent } from "../../abilities/abilities.component"; -import { ShieldIconComponent } from "./shield-icon/shield-icon.component"; -import { TranslateModule } from "@ngx-translate/core"; -import { NameoverridePipe } from "../../pipes/nameoverride.pipe"; - -const componentAnimations = [ - trigger("deathAnimation", [ - transition("true => false, true => void", [ - style({ filter: "grayscale(50%)" }), - animate("100ms ease-in", style({ width: "0", opacity: 0.5, filter: "grayscale(100%)" })), - ]), - transition("false => true, void => true", [ - style({ filter: "grayscale(50%)", width: "0", opacity: 0.5 }), - animate("250ms ease-out", style({ width: "*", opacity: 1, filter: "grayscale(0%)" })), - ]), - ]), - trigger("ultPipAnimation", [ - transition(":leave", [ - style({ opacity: 1 }), - animate("150ms", style({ opacity: 0, transform: "scale(0, 1.5)" })), - ]), - transition(":enter", [ - style({ opacity: 0, transform: "scale(0, 1.5)" }), - animate("150ms", style({ opacity: 1, transform: "scale(1, 1)" })), - ]), - ]), - trigger("ultImageAnimation", [ - transition(":enter", [ - style({ opacity: 0, position: "absolute" }), - animate("150ms", style({ opacity: 1 })), - ]), - transition(":leave", [ - style({ opacity: 1, position: "absolute" }), - animate("150ms", style({ opacity: 0 })), - ]), - ]), - trigger("healthChange", [ - transition("* <=> *", [ - style({ opacity: "0", filter: "brightness(80%)" }), - animate("200ms", style({ opacity: "1" })), - ]), - ]), -]; - -@Component({ - selector: "app-playercard", - templateUrl: "./playercard.component.html", - styleUrls: ["./playercard.component.scss"], - animations: componentAnimations, - imports: [NgIf, AbilitiesComponent, ShieldIconComponent, NgFor, NameoverridePipe], -}) -export class InhouseTrackerPlayercardComponent { - private config = inject(Config); - - public readonly assets: string = "../../../assets"; - - @Input() match!: any; - @Input() color!: "attacker" | "defender"; - @Input() side!: "left" | "right"; - @Input() hideAuxiliary = false; - - private _player: any; - - @Input() - set player(player: any) { - this._player = player; - } - - get player() { - return this._player; - } - - get showAssistCounts() { - return this.match.teams.findIndex((e: any) => e.hasDuplicateAgents) == -1; - } - - get colorHex() { - return this.color == "attacker" - ? this.config.attackerColorShieldCurrency - : this.config.defenderColorShieldCurrency; - } - - numSequence(n: number): number[] { - return Array(n); - } - - capitalizeColor(s: string) { - return s[0].toUpperCase() + s.substring(1); - } - - getAgentName(agent: string) { - return AgentNameService.getAgentName(agent); - } - - clamp(value: number, min: number, max: number): number { - return Math.max(min, Math.min(max, value)); - } - - getOverrideNames(): Map { - let toReturn = this.match?.tools?.nameOverrides?.overrides; - if (!toReturn) { - toReturn = new Map(); - } - return toReturn; - } -} - -@Component({ - selector: "app-playercard-minimal", - templateUrl: "./playercard-minimal.component.html", - styleUrls: ["./playercard.component.scss"], - animations: componentAnimations, - imports: [TranslateModule, NgIf, NameoverridePipe], -}) -export class InhouseTrackerPlayercardMinimalComponent extends InhouseTrackerPlayercardComponent {} diff --git a/src/app/combat/playercard/shield-icon/shield-icon.component.html b/src/app/combat/playercard/shield-icon/shield-icon.component.html deleted file mode 100644 index 6bf8e03f..00000000 --- a/src/app/combat/playercard/shield-icon/shield-icon.component.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/app/components/agent-select/agent-select.component.css b/src/app/components/agent-select/agent-select.component.css new file mode 100644 index 00000000..0178e058 --- /dev/null +++ b/src/app/components/agent-select/agent-select.component.css @@ -0,0 +1,57 @@ +.bg-agent-select-defender { + background: linear-gradient( + 180deg, + rgba(var(--defender-color-rgb), 0.9) 0%, + rgba(var(--defender-color-secondary-rgb), 0) 90% + ); +} + +.bg-agent-select-attacker { + background: linear-gradient( + 180deg, + rgba(var(--attacker-color-rgb), 0.9) 0%, + rgba(var(--attacker-color-secondary-rgb), 0) 90% + ); +} + +.down.bg-agent-select-defender { + background: linear-gradient( + 0deg, + rgba(var(--defender-color-rgb), 0.9) 0%, + rgba(var(--defender-color-secondary-rgb), 0) 90% + ); +} + +.down.bg-agent-select-attacker { + background: linear-gradient( + 0deg, + rgba(var(--attacker-color-rgb), 0.9) 0%, + rgba(var(--attacker-color-secondary-rgb), 0) 90% + ); +} + +.bg-agent-select-team-info { + background: linear-gradient( + 180deg, + rgba(15, 25, 35, 0.65) 0%, + rgba(15, 25, 35, 0.53) 53%, + rgba(15, 25, 35, 0) 75%, + rgba(15, 25, 35, 0) 100% + ); +} + +.bg-agent-select-defender-skew { + background: linear-gradient( + 165deg, + rgba(var(--defender-color-rgb), 0.9) 0%, + rgba(var(--defender-color-secondary-rgb), 0) 60% + ); +} + +.bg-agent-select-attacker-skew { + background: linear-gradient( + -15deg, + rgba(var(--attacker-color-rgb), 0.9) 0%, + rgba(var(--attacker-color-secondary-rgb), 0) 60% + ); +} diff --git a/src/app/components/agent-select/agent-select.component.html b/src/app/components/agent-select/agent-select.component.html new file mode 100644 index 00000000..3d6c6ff3 --- /dev/null +++ b/src/app/components/agent-select/agent-select.component.html @@ -0,0 +1,39 @@ +
+ @for (team of dataModel.teams(); track $index; let teamIndex = $index) { +
+
+
+ {{ team.teamName }} +
+
+ @for (player of team.players; track $index) { + + } +
+ +
+
+ } +
diff --git a/src/app/components/agent-select/agent-select.component.ts b/src/app/components/agent-select/agent-select.component.ts new file mode 100644 index 00000000..b897ed9e --- /dev/null +++ b/src/app/components/agent-select/agent-select.component.ts @@ -0,0 +1,13 @@ +import { Component, inject } from "@angular/core"; +import { DataModelService } from "../../services/dataModel.service"; +import { AgentSelectPlayerInfoComponent } from "./player-info/player-info.component"; + +@Component({ + selector: "app-agent-select", + imports: [AgentSelectPlayerInfoComponent], + templateUrl: "./agent-select.component.html", + styleUrl: "./agent-select.component.css", +}) +export class AgentSelectComponent { + readonly dataModel = inject(DataModelService); +} diff --git a/src/app/components/agent-select/player-info/player-info.component.css b/src/app/components/agent-select/player-info/player-info.component.css new file mode 100644 index 00000000..26f9298e --- /dev/null +++ b/src/app/components/agent-select/player-info/player-info.component.css @@ -0,0 +1,64 @@ +.bg-agentselect-player-attacker { + background: linear-gradient( + 180deg, + rgba(var(--attacker-color-rgb), 1) 0%, + rgba(var(--attacker-color-rgb), 0.4) 25%, + rgba(var(--attacker-color-secondary-rgb), 0) 100% + ); +} + +.bg-agentselect-player-defender { + background: linear-gradient( + 180deg, + rgba(var(--defender-color-rgb), 1) 0%, + rgba(var(--defender-color-rgb), 0.4) 25%, + rgba(var(--defender-color-secondary-rgb), 0) 100% + ); +} + +.down.bg-agentselect-player-attacker { + background: linear-gradient( + 0deg, + rgba(var(--attacker-color-rgb), 1) 0%, + rgba(var(--attacker-color-rgb), 0.4) 25%, + rgba(var(--attacker-color-secondary-rgb), 0) 100% + ); +} + +.down.bg-agentselect-player-defender { + background: linear-gradient( + 0deg, + rgba(var(--defender-color-rgb), 1) 0%, + rgba(var(--defender-color-rgb), 0.4) 25%, + rgba(var(--defender-color-secondary-rgb), 0) 100% + ); +} + +@keyframes switchAnimation { + 0% { + opacity: 0; + } + 80% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +.animate-switch { + animation: switchAnimation 100ms ease-out; + will-change: opacity; +} + +@keyframes lockAnimation { + from { + filter: grayscale(1) brightness(200%); + } + to { + filter: grayscale(0) brightness(100%); + } +} +.animate-lock { + animation: lockAnimation 300ms ease-out; + will-change: filter; +} diff --git a/src/app/components/agent-select/player-info/player-info.component.html b/src/app/components/agent-select/player-info/player-info.component.html new file mode 100644 index 00000000..c2539d27 --- /dev/null +++ b/src/app/components/agent-select/player-info/player-info.component.html @@ -0,0 +1,24 @@ +
+ + +
+ +
+
+ {{ playerName() }} +
+
diff --git a/src/app/components/agent-select/player-info/player-info.component.ts b/src/app/components/agent-select/player-info/player-info.component.ts new file mode 100644 index 00000000..ab6f3353 --- /dev/null +++ b/src/app/components/agent-select/player-info/player-info.component.ts @@ -0,0 +1,37 @@ +import { Component, effect, input } from "@angular/core"; +import { AgentRoleService } from "../../../services/agentRole.service"; + +@Component({ + selector: "app-agent-select-player-info", + imports: [], + templateUrl: "./player-info.component.html", + styleUrl: "./player-info.component.css", +}) +export class AgentSelectPlayerInfoComponent { + agent = input(""); + locked = input(false); + playerName = input(); + + color = input(); + down = input(false); + + previousAgent = ""; + previousLock = false; + animateSwitch = false; + animateLock = false; + + switchEffect = effect(() => { + if (this.agent() !== this.previousAgent) { + this.previousAgent = this.agent(); + this.animateSwitch = true; + + setTimeout(() => { + this.animateSwitch = false; + }, 100); + } + }); + + getAgentRole(name: string): string { + return AgentRoleService.getAgentRole(name); + } +} diff --git a/src/app/components/combat/endround-banner/endround-banner.component.css b/src/app/components/combat/endround-banner/endround-banner.component.css new file mode 100644 index 00000000..7de7c768 --- /dev/null +++ b/src/app/components/combat/endround-banner/endround-banner.component.css @@ -0,0 +1,119 @@ +@keyframes swish { + from { + width: 0px; + } + to { + width: 100%; + } +} + +@keyframes phase-out { + from { + transform: translateY(0%); + opacity: 1; + } + to { + transform: translateY(-50%); + opacity: 0; + } +} +.animate-swish { + animation: swish; + will-change: width; +} +.animate-phase-out { + animation: phase-out; + will-change: height; +} + +@keyframes translate-to-right { + from { + transform: translateX(-100%) scaleX(0.7); + } + to { + transform: translateX(0%) scaleX(1); + } +} + +@keyframes translate-to-left { + from { + transform: translateX(100%) scaleX(0.7); + } + to { + transform: translateX(0%) scaleX(1); + } +} + +.animate-translate-to-right { + animation: translate-to-right; + will-change: transform; +} + +.animate-translate-to-left { + animation: translate-to-left; + will-change: transform; +} + +.gradient-head-to-head-attacker { + background: + linear-gradient( + to right, + rgba(var(--attacker-color-rgb), 0.75) 0%, + rgba(var(--attacker-color-rgb), 0) 40%, + rgba(var(--defender-color-rgb), 0) 60%, + rgba(var(--defender-color-rgb), 0.75) 100% + ), + rgba(15, 25, 35, 1); +} + +.gradient-head-to-head-defender { + background: + linear-gradient( + to left, + rgba(var(--attacker-color-rgb), 0.75) 0%, + rgba(var(--attacker-color-rgb), 0) 40%, + rgba(var(--defender-color-rgb), 0) 60%, + rgba(var(--defender-color-rgb), 0.75) 100% + ), + rgba(15, 25, 35, 1); +} + +.gradient-left-attacker { + background: + linear-gradient( + to right, + rgba(var(--attacker-color-rgb), 0.75) 0%, + rgba(var(--attacker-color-rgb), 0) 90% + ), + rgba(15, 25, 35, 1); +} + +.gradient-right-attacker { + background: + linear-gradient( + to left, + rgba(var(--attacker-color-rgb), 0.75) 0%, + rgba(var(--attacker-color-rgb), 0) 90% + ), + rgba(15, 25, 35, 1); +} + +.gradient-left-defender { + background: + linear-gradient( + to right, + rgba(var(--defender-color-rgb), 0.75) 0%, + rgba(var(--defender-color-rgb), 0) 90% + ), + rgba(15, 25, 35, 1); +} + +.gradient-right-defender { + background: + linear-gradient( + to left, + rgba(var(--defender-color-rgb), 0.75) 0%, + rgba(var(--defender-color-rgb), 0) 90% + ), + rgba(15, 25, 35, 1); +} diff --git a/src/app/components/combat/endround-banner/endround-banner.component.html b/src/app/components/combat/endround-banner/endround-banner.component.html new file mode 100644 index 00000000..85e83b74 --- /dev/null +++ b/src/app/components/combat/endround-banner/endround-banner.component.html @@ -0,0 +1,104 @@ +@if (dataModel.tournamentInfo().enabled) { +
+
+ @if (tournamentBackgroundUrl()) { + + } @else { +
+ } + + +

+ {{ TranslateKeys.Endround_RoundWin | translate }} +

+ +
+ +
+
+ @if (tournamentBackgroundUrl()) { + + } @else { +
+ } + + @if (leftWon()) { +
+ +

+ {{ + TranslateKeys.Endround_Winner + | translate + : { + team: dataModel.match().attackersWon + ? (TranslateKeys.Endround_Attacker | translate) + : (TranslateKeys.Endround_Defender | translate), + } + }} +

+
+ } +
+ +

+ {{ + TranslateKeys.Endround_Round | translate: { rounds: dataModel.match().roundNumber } + }} +

+
+ @if (!leftWon()) { +
+ +

+ {{ + TranslateKeys.Endround_Winner + | translate + : { + team: dataModel.match().attackersWon + ? (TranslateKeys.Endround_Attacker | translate) + : (TranslateKeys.Endround_Defender | translate), + } + }} +

+
+ } +
+
+
+} diff --git a/src/app/components/combat/endround-banner/endround-banner.component.ts b/src/app/components/combat/endround-banner/endround-banner.component.ts new file mode 100644 index 00000000..185a9099 --- /dev/null +++ b/src/app/components/combat/endround-banner/endround-banner.component.ts @@ -0,0 +1,83 @@ +import { Component, computed, effect, inject } from "@angular/core"; +import { TranslatePipe } from "@ngx-translate/core"; +import { TranslateKeys } from "../../../services/i18nHelper"; +import { DataModelService } from "../../../services/dataModel.service"; + +@Component({ + selector: "app-endround", + imports: [TranslatePipe], + templateUrl: "./endround-banner.component.html", + styleUrl: "./endround-banner.component.css", +}) +export class EndroundBannerComponent { + dataModel = inject(DataModelService); + + runAnimation = false; + hide = true; + animateOut = false; + preload = true; + + lastInRoundNumber = -1; + lastOutRoundNumber = -1; + + TranslateKeys = TranslateKeys; + + tournamentBackgroundUrl = computed(() => { + const backdrop = this.dataModel.tournamentInfo().backdropUrl; + if (backdrop && backdrop !== "") return backdrop; + else return false; + }); + + tournamentIconUrl = computed(() => { + const logo = this.dataModel.tournamentInfo().logoUrl; + if (logo && logo !== "") return logo; + else return "assets/misc/logo.webp"; + }); + + teamWon = computed(() => { + if (this.dataModel.match().attackersWon) { + return this.dataModel.teams()[0].isAttacking ? 0 : 1; + } else { + return this.dataModel.teams()[0].isAttacking ? 1 : 0; + } + }); + + leftWon = computed(() => { + return this.teamWon() === 0; + }); + + readonly waitingBackgroundClass = computed(() => { + const test = `gradient-head-to-head-${this.dataModel.teams()[0].isAttacking ? "attacker" : "defender"}`; + return test; + }); + + readonly winningTeamBackgroundClass = computed(() => { + return `gradient-${this.leftWon() ? "left" : "right"}-${this.dataModel.match().attackersWon ? "attacker" : "defender"}`; + }); + + ref = effect(() => { + const roundPhase = this.dataModel.match().roundPhase; + const roundNumber = this.dataModel.match().roundNumber; + if (roundPhase === "end") { + if (roundNumber === this.lastInRoundNumber) return; + this.lastInRoundNumber = roundNumber; + + this.runAnimation = true; + this.hide = false; + this.animateOut = false; + setTimeout(() => { + this.runAnimation = false; + }, 2600); + } else if (roundPhase === "shopping") { + if (roundNumber === this.lastOutRoundNumber) return; + this.lastOutRoundNumber = roundNumber; + + this.runAnimation = false; + this.animateOut = true; + setTimeout(() => { + this.hide = true; + this.animateOut = false; + }, 300); + } + }); +} diff --git a/src/app/components/combat/player-combat-card/player-combat-card-minimal.component.html b/src/app/components/combat/player-combat-card/player-combat-card-minimal.component.html new file mode 100644 index 00000000..a907e38b --- /dev/null +++ b/src/app/components/combat/player-combat-card/player-combat-card-minimal.component.html @@ -0,0 +1,118 @@ +
+
+ +
+ + +
+
+
+ {{ getDisplayName(player.fullName, player.name) }} + @if (player.isCaptain) { + + } +
+
+ @if (!player.isAlive) { +
+
+

{{ player.kills }}/{{ player.deaths }}/{{ player.assists }}

+
+
+ } +
+ + + @if (player.isAlive) { +
+ @if (isObserved()) { + + } + +
+
+
+

Kills

+

+ {{ player.kills }} +

+
+
+

Deaths

+

+ {{ player.deaths }} +

+
+
+

Assists

+

+ {{ player.assists }} +

+
+
+
+
+ {{ getAgentName(player.agentInternal) }} +
+
+ @if (player.isAlive) { +
+ } + } +
diff --git a/src/app/components/combat/player-combat-card/player-combat-card.component.css b/src/app/components/combat/player-combat-card/player-combat-card.component.css new file mode 100644 index 00000000..3e404d55 --- /dev/null +++ b/src/app/components/combat/player-combat-card/player-combat-card.component.css @@ -0,0 +1,256 @@ +.bg-playerinfo-defender-left { + background: + linear-gradient( + to right, + rgba(var(--defender-color-rgb), 0.3) 0%, + rgba(var(--defender-color-rgb), 0.1) 100% + ), + rgba(15, 25, 35, 0.9); +} + +.bg-playerinfo-attacker-left { + background: + linear-gradient( + to right, + rgba(var(--attacker-color-rgb), 0.3) 0%, + rgba(var(--attacker-color-rgb), 0.1) 100% + ), + rgba(15, 25, 35, 0.9); +} + +.bg-playerinfo-defender-right { + background: + linear-gradient( + to left, + rgba(var(--defender-color-rgb), 0.3) 0%, + rgba(var(--defender-color-rgb), 0.1) 100% + ), + rgba(15, 25, 35, 0.9); +} + +.bg-playerinfo-attacker-right { + background: + linear-gradient( + to left, + rgba(var(--attacker-color-rgb), 0.3) 0%, + rgba(var(--attacker-color-rgb), 0.1) 100% + ), + rgba(15, 25, 35, 0.9); +} + +.bg-playerinfo-observed-left { + background: + linear-gradient(to right, rgba(240, 200, 85, 0.5) 0%, rgba(225, 181, 22, 0.15) 100%), + rgba(15, 25, 35, 0.9); +} + +.bg-playerinfo-observed-right { + background: + linear-gradient(to left, rgba(240, 200, 85, 0.5) 0%, rgba(225, 181, 22, 0.15) 100%), + rgba(15, 25, 35, 0.9); +} + +.bg-playerinfo-dead-left { + background: linear-gradient( + to right, + rgba(15, 25, 35, 0.7) 0%, + rgba(15, 25, 35, 0.5) 70%, + rgba(15, 25, 35, 0) 100% + ); +} + +.bg-playerinfo-dead-right { + background: linear-gradient( + to left, + rgba(15, 25, 35, 0.9) 0%, + rgba(15, 25, 35, 0.6) 80%, + rgba(15, 25, 35, 0) 100% + ); +} + +/* Weapon info container */ + +.bg-weaponinfo-defender-left { + background: + linear-gradient( + to right, + rgba(var(--defender-color-rgb), 0.1) 0%, + rgba(var(--defender-color-rgb), 0) 100% + ), + rgba(15, 25, 35, 0.9); +} + +.bg-weaponinfo-attacker-left { + background: + linear-gradient( + to right, + rgba(var(--attacker-color-rgb), 0.1) 0%, + rgba(var(--attacker-color-rgb), 0) 100% + ), + rgba(15, 25, 35, 0.9); +} + +.bg-weaponinfo-defender-right { + background: + linear-gradient( + to left, + rgba(var(--defender-color-rgb), 0.1) 0%, + rgba(var(--defender-color-rgb), 0) 100% + ), + rgba(15, 25, 35, 0.9); +} + +.bg-weaponinfo-attacker-right { + background: + linear-gradient( + to left, + rgba(var(--attacker-color-rgb), 0.1) 0%, + rgba(var(--attacker-color-rgb), 0) 100% + ), + rgba(15, 25, 35, 0.9); +} + +.bg-weaponinfo-observed-left { + background: + linear-gradient(to right, rgba(225, 181, 22, 0.15) 0%, rgba(225, 181, 22, 0) 100%), + rgba(15, 25, 35, 0.9); +} + +.bg-weaponinfo-observed-right { + background: + linear-gradient(to left, rgba(225, 181, 22, 0.15) 0%, rgba(225, 181, 22, 0) 100%), + rgba(15, 25, 35, 0.9); +} + +.playercard-hp-shadow.defender { + box-shadow: 0px 4px 8px 1px rgba(var(--defender-color-secondary-rgb), 0.6); +} + +.playercard-hp-shadow.attacker { + box-shadow: 0px 4px 8px 1px rgba(var(--attacker-color-secondary-rgb), 0.6); +} + +@keyframes weapon-collapse-side-in-left { + 0% { + background: rgba(15, 25, 35, 0.6); + opacity: 0; + } + 40% { + transform: scaleX(0) translateX(-50%); + opacity: 0; + } + 90% { + background: rgba(15, 25, 35, 0.6); + } + 100% { + transform: scaleX(1) translateX(0%); + opacity: 1; + } +} + +@keyframes weapon-collapse-side-in-right { + 0% { + background: rgba(15, 25, 35, 0.6); + opacity: 0; + } + 40% { + transform: scaleX(0) translateX(50%); + opacity: 0; + } + 90% { + background: rgba(15, 25, 35, 0.6); + } + 100% { + transform: scaleX(1) translateX(0%); + opacity: 1; + } +} + +.animate-weapon-collapse-in { + transform-origin: left; + animation-name: weapon-collapse-side-in-left; +} + +.animate-weapon-collapse-in.right { + transform-origin: right; + animation-name: weapon-collapse-side-in-right; +} + +.animate-weapon-collapse-out { + transform-origin: left; + animation-name: weapon-collapse-side-in-left; + animation-direction: reverse; +} + +.animate-weapon-collapse-out.right { + transform-origin: right; + animation-name: weapon-collapse-side-in-right; + animation-direction: reverse; +} + +@keyframes hpbar-in { + 0% { + width: 0%; + opacity: 0.3; + } + 100% { + opacity: 1; + } +} + +@keyframes hpbar-out { + 0% { + opacity: 1; + } + 100% { + width: 0%; + opacity: 0.6; + filter: grayscale(100%); + } +} + +.animate-hpbar-in { + animation-name: hpbar-in; +} + +.animate-hpbar-out { + animation-name: hpbar-out; +} + +.spike-in.left { + animation: spike-in-left 0.3s ease-in-out; +} + +.spike-out.left { + animation: spike-in-left 0.3s ease-in-out reverse; +} + +.spike-in.right { + animation: spike-in-right 0.3s ease-in-out; +} + +.spike-out.right { + animation: spike-in-right 0.3s ease-in-out reverse; +} + +@keyframes spike-in-left { + 0% { + transform: translateX(-25%); + opacity: 0; + } + 100% { + transform: translateX(0%); + opacity: 1; + } +} + +@keyframes spike-in-right { + 0% { + transform: translateX(25%); + opacity: 0; + } + 100% { + transform: translateX(0%); + opacity: 1; + } +} diff --git a/src/app/components/combat/player-combat-card/player-combat-card.component.html b/src/app/components/combat/player-combat-card/player-combat-card.component.html new file mode 100644 index 00000000..fbe97071 --- /dev/null +++ b/src/app/components/combat/player-combat-card/player-combat-card.component.html @@ -0,0 +1,155 @@ +
+
+ +
+ + +
+
+
+ @if (isAlive()) { + @if (!dataModel.hideAuxiliary() && player.auxiliaryAvailable.abilities) { + + } + } @else { +
+
+ +

{{ player.money }}

+
+
+

{{ player.kills }}/{{ player.deaths }}/{{ player.assists }}

+
+
+ } + +
+ +
+ {{ getDisplayName(player.fullName, player.name) }} + @if (player.isCaptain) { + + } +
+
+
+ + + @if (player.isAlive) { +
+ @if (isObserved()) { + + } + +
+ +
+ +
+ + + @if (!dataModel.hideAuxiliary() && player.auxiliaryAvailable.health) { +

+ {{ player.health }} +

+ } +
+
+ @if (dataModel.match().showAliveKDA || !player.isAlive) { +

{{ player.kills }}/{{ player.deaths }}/{{ player.assists }}

+ } @else { + +

{{ player.money }}

+ } +
+
+ @if (player.isAlive) { +
+ } + } + @if (player.hasSpike) { +
+ +
+ } +
diff --git a/src/app/components/combat/player-combat-card/player-combat-card.component.ts b/src/app/components/combat/player-combat-card/player-combat-card.component.ts new file mode 100644 index 00000000..4eb54f24 --- /dev/null +++ b/src/app/components/combat/player-combat-card/player-combat-card.component.ts @@ -0,0 +1,86 @@ +import { Component, computed, inject, input, Input, OnChanges, SimpleChanges } from "@angular/core"; +import { DataModelService } from "../../../services/dataModel.service"; +import { AbilitiesComponent } from "../../common/abilities/abilities.component"; +import { UltimateTrackerComponent } from "../../common/ultimate-tracker/ultimate-tracker.component"; +import { ShieldIconComponent } from "../../common/shield-icon/shield-icon.component"; +import { AgentNameService } from "../../../services/agentName.service"; +import { DisplayNameService } from "../../../services/displayName.service"; +import { AgentRoleService } from "../../../services/agentRole.service"; + +@Component({ + selector: "app-player-combat-card", + imports: [AbilitiesComponent, UltimateTrackerComponent, ShieldIconComponent], + templateUrl: "./player-combat-card.component.html", + styleUrl: "./player-combat-card.component.css", +}) +export class PlayerCombatCardComponent implements OnChanges { + dataModel = inject(DataModelService); + + @Input() player!: any; + @Input() playerHealth!: number; //only needed so change detection can give us an event for health change + + readonly isObserved = input(); //only needed so change detection can correctly trigger the color switch + readonly isAlive = input(); + + getDisplayName = inject(DisplayNameService).getDisplayName; + + right = input(false); + readonly color = input<"attacker" | "defender">(); + // @Input() color: "attacker" | "defender" = "defender"; + + readonly playerinfoBackgroundClass = computed(() => { + return `bg-playerinfo-${this.isAlive() == false ? "dead" : this.isObserved() ? "observed" : this.color()}-${this.right() ? "right" : "left"}`; + }); + readonly weaponInfoBackgroundClass = computed(() => { + return `bg-weaponinfo-${this.isObserved() ? "observed" : this.color()}-${this.right() ? "right" : "left"}`; + }); + readonly textColor = computed(() => + this.color() == "attacker" ? "text-attacker-shield/80" : "text-defender-shield/80", + ); + readonly backgroundColor = computed(() => + this.color() == "attacker" ? "bg-attacker-shield" : "bg-defender-shield", + ); + readonly creditsIcon = computed(() => + this.color() == "attacker" + ? "assets/misc/ValorantCreditsRed.svg" + : "assets/misc/ValorantCreditsGreen.svg", + ); + + clamp(value: number, min: number, max: number): number { + return Math.max(min, Math.min(max, value)); + } + + ngOnChanges(changes: SimpleChanges): void { + const healthChanges = changes["playerHealth"]; + if ( + healthChanges && + healthChanges.previousValue !== undefined && + healthChanges.previousValue !== 0 + ) { + this.onPlayerHealthChanged(); + } + } + + protected healthAnimationRunning = false; + onPlayerHealthChanged() { + this.healthAnimationRunning = true; + setTimeout(() => { + this.healthAnimationRunning = false; + }, 200); + } +} + +@Component({ + selector: "app-player-combat-card-minimal", + imports: [], + templateUrl: "./player-combat-card-minimal.component.html", + styleUrl: "./player-combat-card.component.css", +}) +export class PlayerCombatCardMinimalComponent extends PlayerCombatCardComponent { + getAgentName(agent: string) { + return AgentNameService.getAgentName(agent); + } + getAgentRole(name: string): string { + return AgentRoleService.getAgentRole(name); + } +} diff --git a/src/app/components/combat/player-list/player-list.component.css b/src/app/components/combat/player-list/player-list.component.css new file mode 100644 index 00000000..d8df3f90 --- /dev/null +++ b/src/app/components/combat/player-list/player-list.component.css @@ -0,0 +1,37 @@ +@keyframes slide-in-left { + 0% { + transform: translateX(-55%); + opacity: 0; + } + 70% { + opacity: 0.6; + } + 100% { + transform: translateX(0); + opacity: 1; + } +} + +.animate-slide-in.left { + animation: slide-in-left cubic-bezier(0.33, 1, 0.68, 1); + will-change: opacity; +} + +@keyframes slide-in-right { + 0% { + transform: translateX(55%); + opacity: 0; + } + 70% { + opacity: 0.6; + } + 100% { + transform: translateX(0); + opacity: 1; + } +} + +.animate-slide-in.right { + animation: slide-in-right cubic-bezier(0.33, 1, 0.68, 1); + will-change: opacity; +} diff --git a/src/app/components/combat/player-list/player-list.component.html b/src/app/components/combat/player-list/player-list.component.html new file mode 100644 index 00000000..6642d691 --- /dev/null +++ b/src/app/components/combat/player-list/player-list.component.html @@ -0,0 +1,37 @@ +@if (isShown()) { +
+ @for (team of dataModel.teams(); track $index; let tIdx = $index) { +
+ @for (player of team.players; track player.playerId) { + @if (!dataModel.minimalMode() && player.maxUltPoints !== 0) { + + } @else { + + + } + } +
+ } +
+} diff --git a/src/app/components/combat/player-list/player-list.component.ts b/src/app/components/combat/player-list/player-list.component.ts new file mode 100644 index 00000000..b8a075e9 --- /dev/null +++ b/src/app/components/combat/player-list/player-list.component.ts @@ -0,0 +1,23 @@ +import { Component, computed, inject } from "@angular/core"; +import { + PlayerCombatCardComponent, + PlayerCombatCardMinimalComponent, +} from "../player-combat-card/player-combat-card.component"; +import { DataModelService } from "../../../services/dataModel.service"; + +@Component({ + selector: "app-combat-player-list", + imports: [PlayerCombatCardComponent, PlayerCombatCardMinimalComponent], + templateUrl: "./player-list.component.html", + styleUrl: "./player-list.component.css", +}) +export class CombatPlayerListComponent { + dataModel = inject(DataModelService); + + isShown = computed(() => this.dataModel.match().roundPhase !== "shopping"); + + delayClass(index: number): string { + const ret = `animate-delay-${(4 - index) * 50 + 100}`; + return ret; + } +} diff --git a/src/app/playercams/playercams.component.scss b/src/app/components/combat/playercams/playercams.component.css similarity index 50% rename from src/app/playercams/playercams.component.scss rename to src/app/components/combat/playercams/playercams.component.css index 70a5a082..aeb252e5 100644 --- a/src/app/playercams/playercams.component.scss +++ b/src/app/components/combat/playercams/playercams.component.css @@ -3,7 +3,6 @@ width: 100%; &.defender { - @extend .gradient; background: linear-gradient( 0deg, @@ -14,7 +13,6 @@ } &.attacker { - @extend .gradient; background: linear-gradient( 0deg, @@ -24,3 +22,25 @@ rgba(15, 25, 35, 0); } } + +.killbox-gradient { + &.defender { + background: + linear-gradient( + to left, + rgba(var(--defender-color-rgb), 0.5) 0%, + rgba(var(--defender-color-rgb), 0.2) 100% + ), + rgba(15, 25, 35, 0); + } + + &.attacker { + background: + linear-gradient( + to left, + rgba(var(--attacker-color-rgb), 0.7) 0%, + rgba(var(--attacker-color-rgb), 0.4) 100% + ), + rgba(15, 25, 35, 0); + } +} diff --git a/src/app/components/combat/playercams/playercams.component.html b/src/app/components/combat/playercams/playercams.component.html new file mode 100644 index 00000000..c82c6aab --- /dev/null +++ b/src/app/components/combat/playercams/playercams.component.html @@ -0,0 +1,47 @@ +@if (dataModel.playercamsInfo().enable) { +
+ @for (team of dataModel.teams(); track $index; let teamIndex = $index) { + @for (player of team.players; track $index) { + @if (this.enabledPlayers().includes(player.fullName)) { +
+
+ +
+ @if (player.killsThisRound > 0) { +
+ +

+ {{ player.killsThisRound }} +

+
+ } +
+
+
+ {{ getDisplayName(player.fullName, player.name) }} +
+
+ {{ player.kills }} / {{ player.deaths }} / {{ player.assists }} +
+
+
+ } + } + } +
+} diff --git a/src/app/components/combat/playercams/playercams.component.ts b/src/app/components/combat/playercams/playercams.component.ts new file mode 100644 index 00000000..e4617d26 --- /dev/null +++ b/src/app/components/combat/playercams/playercams.component.ts @@ -0,0 +1,57 @@ +import { Component, computed, effect, inject, OnInit } from "@angular/core"; +import { DomSanitizer, SafeResourceUrl } from "@angular/platform-browser"; +import { DataModelService } from "../../../services/dataModel.service"; +import { DisplayNameService } from "../../../services/displayName.service"; + +@Component({ + selector: "app-playercams", + imports: [], + templateUrl: "./playercams.component.html", + styleUrl: "./playercams.component.css", +}) +export class PlayercamsComponent implements OnInit { + readonly dataModel = inject(DataModelService); + private sanitizer = inject(DomSanitizer); + getDisplayName = inject(DisplayNameService).getDisplayName; + + streams = new Map(); + + enabledPlayers = computed(() => { + let toReturn = this.dataModel.playercamsInfo().enabledPlayers; + if (!toReturn || toReturn.length === 0) { + toReturn = []; + } + return toReturn; + }); + + ngOnInit() { + for (const player of this.enabledPlayers()) { + this.streams.set(player, this.getStreamUrl(player.split("#")[0], player.split("#")[1])); + } + } + + effectRef = effect(() => { + const teams = this.dataModel.teams(); + for (const team of teams) { + for (const player of team.players) { + if (!this.streams.has(player.fullName)) { + this.streams.set( + player.fullName, + this.getStreamUrl(player.fullName.split("#")[0], player.fullName.split("#")[1]), + ); + } + } + } + if (this.streams.size >= 10) { + this.effectRef.destroy(); + } + }); + + public getStreamUrl(name: string, tagline: string): SafeResourceUrl { + const identifier = this.dataModel.playercamsInfo().identifier; + if (!identifier) return this.sanitizer.bypassSecurityTrustResourceUrl(""); + name = name.replaceAll(" ", "_"); + const streamVdoUrl = `https://vdo.ninja/?room=${identifier}&view=${name + "_H_" + tagline}&scene=0&cleanoutput&vb=5000&transparent&waitmessage=Loading&disablehotkeys&codec=h265,av1,h264,vp8`; + return this.sanitizer.bypassSecurityTrustResourceUrl(streamVdoUrl); + } +} diff --git a/src/app/components/common/abilities/abilities.component.css b/src/app/components/common/abilities/abilities.component.css new file mode 100644 index 00000000..cca29b30 --- /dev/null +++ b/src/app/components/common/abilities/abilities.component.css @@ -0,0 +1,31 @@ +@keyframes translate-to-right { + from { + transform: translateX(-100%) scaleX(0.7); + } + to { + transform: translateX(0%) scaleX(1); + } +} + +@keyframes translate-to-left { + from { + transform: translateX(100%) scaleX(0.7); + } + to { + transform: translateX(0%) scaleX(1); + } +} + +.animate-translate { + animation: translate-to-right; + will-change: transform; +} + +.animate-translate.right { + animation: translate-to-left; + will-change: transform; +} + +.animate-reverse { + animation-direction: reverse !important; +} diff --git a/src/app/components/common/abilities/abilities.component.html b/src/app/components/common/abilities/abilities.component.html new file mode 100644 index 00000000..53083e4f --- /dev/null +++ b/src/app/components/common/abilities/abilities.component.html @@ -0,0 +1,46 @@ +@if (player.auxiliaryAvailable.abilities) { +
+ @if (player.isAlive) { +
+ + + +
+ } @else if (player.agentInternal === "Smonk") { + +
+
+
+ +
+ } +
+} diff --git a/src/app/components/common/abilities/abilities.component.ts b/src/app/components/common/abilities/abilities.component.ts new file mode 100644 index 00000000..30c90835 --- /dev/null +++ b/src/app/components/common/abilities/abilities.component.ts @@ -0,0 +1,21 @@ +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "app-abilities", + imports: [], + templateUrl: "./abilities.component.html", + styleUrl: "./abilities.component.css", +}) +export class AbilitiesComponent { + @Input() player!: any; + @Input() right = false; + + isAvailable(availablility: number): boolean { + availablility = this.clamp(availablility, 0, 1); + return availablility == 1; + } + + clamp(value: number, min: number, max: number): number { + return Math.min(Math.max(value, min), max); + } +} diff --git a/src/app/redirect/redirect.component.ts b/src/app/components/common/redirect/redirect.component.ts similarity index 72% rename from src/app/redirect/redirect.component.ts rename to src/app/components/common/redirect/redirect.component.ts index 7c8c7481..70a77d33 100644 --- a/src/app/redirect/redirect.component.ts +++ b/src/app/components/common/redirect/redirect.component.ts @@ -1,12 +1,12 @@ import { Component, OnInit, inject } from "@angular/core"; -import { Config } from "../shared/config"; +import { Config } from "../../../shared/config"; @Component({ selector: "app-redirect", template: ``, }) export class RedirectComponent implements OnInit { - private config = inject(Config); + private config = inject(Config); ngOnInit() { window.location.href = this.config.redirectUrl; diff --git a/src/app/combat/playercard/shield-icon/shield-icon.component.scss b/src/app/components/common/shield-icon/shield-icon.component.css similarity index 100% rename from src/app/combat/playercard/shield-icon/shield-icon.component.scss rename to src/app/components/common/shield-icon/shield-icon.component.css diff --git a/src/app/components/common/shield-icon/shield-icon.component.html b/src/app/components/common/shield-icon/shield-icon.component.html new file mode 100644 index 00000000..638499ab --- /dev/null +++ b/src/app/components/common/shield-icon/shield-icon.component.html @@ -0,0 +1,65 @@ +@if (type === "Heavy") { + + + +} + +@if (type === "Light") { + + + +} + +@if (type === "Regen") { + + + +} + +@if (type === "None") { + + + +} diff --git a/src/app/combat/playercard/shield-icon/shield-icon.component.ts b/src/app/components/common/shield-icon/shield-icon.component.ts similarity index 61% rename from src/app/combat/playercard/shield-icon/shield-icon.component.ts rename to src/app/components/common/shield-icon/shield-icon.component.ts index 8a6e5d71..1087e394 100644 --- a/src/app/combat/playercard/shield-icon/shield-icon.component.ts +++ b/src/app/components/common/shield-icon/shield-icon.component.ts @@ -1,21 +1,20 @@ -import { Component, Input, inject } from "@angular/core"; +import { Component, Input, inject, input } from "@angular/core"; import { Config } from "../../../shared/config"; -import { NgIf } from "@angular/common"; @Component({ selector: "app-shield-icon", templateUrl: "./shield-icon.component.html", - styleUrl: "./shield-icon.component.scss", - imports: [NgIf], + styleUrl: "./shield-icon.component.css", + imports: [], }) export class ShieldIconComponent { private config = inject(Config); @Input({ required: true }) type!: "Heavy" | "Regen" | "Light" | "None"; - @Input({ required: true }) side!: "attacker" | "defender"; + readonly side = input(); get color() { - return this.side == "attacker" + return this.side() == "attacker" ? this.config.attackerColorShieldCurrency : this.config.defenderColorShieldCurrency; } diff --git a/src/app/components/common/timeout/timeout.component.css b/src/app/components/common/timeout/timeout.component.css new file mode 100644 index 00000000..57a86c00 --- /dev/null +++ b/src/app/components/common/timeout/timeout.component.css @@ -0,0 +1,20 @@ +.timer-transition { + transition: width 1s linear; +} + +@keyframes swish { + from { + width: 0px; + } + to { + width: 100%; + } +} +.animate-swish { + animation: swish; + will-change: width; +} +.animate-swish-out { + animation: swish reverse; + will-change: width; +} diff --git a/src/app/components/common/timeout/timeout.component.html b/src/app/components/common/timeout/timeout.component.html new file mode 100644 index 00000000..2d04181a --- /dev/null +++ b/src/app/components/common/timeout/timeout.component.html @@ -0,0 +1,32 @@ +
+
+ + + @if (timeoutInfo().techPause) { +

+ {{ TranslateKeys.Timeout_Techpause | translate }} +

+ } @else { + +

+ {{ TranslateKeys.Timeout_Tactical | translate: { teamName: timeoutTeam().teamName } }} +

+
+
+

+ {{ timeoutInfo().timeRemaining }}s +

+
+ } +
+
diff --git a/src/app/components/common/timeout/timeout.component.ts b/src/app/components/common/timeout/timeout.component.ts new file mode 100644 index 00000000..4219fdbc --- /dev/null +++ b/src/app/components/common/timeout/timeout.component.ts @@ -0,0 +1,77 @@ +import { Component, computed, effect, inject, signal } from "@angular/core"; +import { TranslatePipe } from "@ngx-translate/core"; +import { TranslateKeys } from "../../../services/i18nHelper"; +import { DataModelService } from "../../../services/dataModel.service"; + +@Component({ + selector: "app-timeout", + imports: [TranslatePipe], + templateUrl: "./timeout.component.html", + styleUrl: "./timeout.component.css", +}) +export class TimeoutComponent { + dataModel = inject(DataModelService); + TranslateKeys = TranslateKeys; + + tournamentBackgroundUrl = computed(() => { + const backdrop = this.dataModel.tournamentInfo().backdropUrl; + if (backdrop && backdrop !== "") return backdrop; + else return "assets/misc/backdrop.webp"; + }); + + tournamentIconUrl = computed(() => { + const logo = this.dataModel.tournamentInfo().logoUrl; + if (logo && logo !== "") return logo; + else return "assets/misc/logo.webp"; + }); + + timeoutTeam = computed(() => { + const index = this.timeoutInfo().leftTeam ? 0 : 1; + return this.dataModel.teams()[index]; + }); + + timerWidth = computed(() => { + return `${(this.dataModel.timeoutState().timeRemaining / (this.dataModel.match().tools.timeoutDuration || 60)) * 100}%`; + }); + + //only needed to have some control over our own update timing so the out-animation goes smoothly + timeoutInfo = signal(Object.assign({}, this.dataModel.timeoutState())); + + shouldHide = computed(() => { + return ( + !this.dataModel.timeoutState().techPause && + !this.dataModel.timeoutState().leftTeam && + !this.dataModel.timeoutState().rightTeam + ); + }); + + hide = true; + inAnimation = false; + outAnimation = false; + + hideAnimationEffect = effect(() => { + if (this.shouldHide()) { + this.outAnimation = true; + setTimeout(() => { + this.outAnimation = false; + this.hide = true; + }, 300); + } else { + this.hide = false; + this.inAnimation = true; + setTimeout(() => { + this.inAnimation = false; + }, 300); + } + }); + + delayEndTimeoutEffect = effect(() => { + if (this.shouldHide()) { + setTimeout(() => { + this.timeoutInfo.set(Object.assign({}, this.dataModel.timeoutState())); + }, 350); + } else { + this.timeoutInfo.set(Object.assign({}, this.dataModel.timeoutState())); + } + }); +} diff --git a/src/app/components/common/ultimate-tracker/ultimate-tracker.component.css b/src/app/components/common/ultimate-tracker/ultimate-tracker.component.css new file mode 100644 index 00000000..ed291803 --- /dev/null +++ b/src/app/components/common/ultimate-tracker/ultimate-tracker.component.css @@ -0,0 +1,12 @@ +.ult-glow { + box-shadow: 0 0 10px 5px rgba(255, 255, 255, 0.8); + animation: ult-bg-ping 3.75s infinite alternate-reverse; +} + +@keyframes ult-bg-ping { + 80%, + 100% { + transform: scale(2); + opacity: 0; + } +} diff --git a/src/app/components/common/ultimate-tracker/ultimate-tracker.component.html b/src/app/components/common/ultimate-tracker/ultimate-tracker.component.html new file mode 100644 index 00000000..60989827 --- /dev/null +++ b/src/app/components/common/ultimate-tracker/ultimate-tracker.component.html @@ -0,0 +1,26 @@ +@if (max !== 0) { +
+ @if (full !== max) { +
+ @for (i of numSequence(full); track $index) { + + } + @for (i of numSequence(max - full); track $index) { + + } +
+ } @else { + +
+ } +
+} diff --git a/src/app/components/common/ultimate-tracker/ultimate-tracker.component.ts b/src/app/components/common/ultimate-tracker/ultimate-tracker.component.ts new file mode 100644 index 00000000..a619d7f0 --- /dev/null +++ b/src/app/components/common/ultimate-tracker/ultimate-tracker.component.ts @@ -0,0 +1,17 @@ +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "app-ultimate-tracker", + imports: [], + templateUrl: "./ultimate-tracker.component.html", + styleUrl: "./ultimate-tracker.component.css", +}) +export class UltimateTrackerComponent { + @Input() max!: number; + @Input() full!: number; + @Input() image!: string; + + numSequence(n: number): number[] { + return Array(n); + } +} diff --git a/src/app/mapban-ui/mapban-map/mapban-ban-icon/mapban-ban-icon.component.css b/src/app/components/mapban/mapban-map/mapban-ban-icon/mapban-ban-icon.component.css similarity index 100% rename from src/app/mapban-ui/mapban-map/mapban-ban-icon/mapban-ban-icon.component.css rename to src/app/components/mapban/mapban-map/mapban-ban-icon/mapban-ban-icon.component.css diff --git a/src/app/mapban-ui/mapban-map/mapban-ban-icon/mapban-ban-icon.component.html b/src/app/components/mapban/mapban-map/mapban-ban-icon/mapban-ban-icon.component.html similarity index 100% rename from src/app/mapban-ui/mapban-map/mapban-ban-icon/mapban-ban-icon.component.html rename to src/app/components/mapban/mapban-map/mapban-ban-icon/mapban-ban-icon.component.html diff --git a/src/app/mapban-ui/mapban-map/mapban-ban-icon/mapban-ban-icon.component.ts b/src/app/components/mapban/mapban-map/mapban-ban-icon/mapban-ban-icon.component.ts similarity index 100% rename from src/app/mapban-ui/mapban-map/mapban-ban-icon/mapban-ban-icon.component.ts rename to src/app/components/mapban/mapban-map/mapban-ban-icon/mapban-ban-icon.component.ts diff --git a/src/app/mapban-ui/mapban-map/mapban-map.component.css b/src/app/components/mapban/mapban-map/mapban-map.component.css similarity index 100% rename from src/app/mapban-ui/mapban-map/mapban-map.component.css rename to src/app/components/mapban/mapban-map/mapban-map.component.css diff --git a/src/app/mapban-ui/mapban-map/mapban-map.component.html b/src/app/components/mapban/mapban-map/mapban-map.component.html similarity index 66% rename from src/app/mapban-ui/mapban-map/mapban-map.component.html rename to src/app/components/mapban/mapban-map/mapban-map.component.html index ffa4418f..0d175b7e 100644 --- a/src/app/mapban-ui/mapban-map/mapban-map.component.html +++ b/src/app/components/mapban/mapban-map/mapban-map.component.html @@ -1,29 +1,29 @@ -
-
+
+
- -

+ +

{{ stage === "ban" ? "Banning" : "Picking" }}

@@ -31,66 +31,66 @@ @if (map.name !== "" && !isRotating) { @if (map.bannedBy !== undefined) { -

+

{{ map.name }}

- + } @else if (map.pickedBy !== undefined) { @if (map.score[0] != undefined && map.score[1] != undefined) { -
+
@if (map.score[0] > map.score[1]) { - + } @else if (map.score[0] < map.score[1]) { - + }

{{ map.score[0] }} - {{ map.score[1] }}

{{ map.name }}

} @else { -
- -

+

+ +

{{ map.name }}

} } @else { @if (map.score[0] != undefined && map.score[1] != undefined) { -
+
@if (map.score[0] > map.score[1] && map.score[0] >= 13) { - + } @else if (map.score[0] < map.score[1] && map.score[1] >= 13) { - + }

{{ map.score[0] }} - {{ map.score[1] }}

{{ map.name }}

} @else {

Decider:
{{ map.name }}

@@ -99,7 +99,7 @@ }
@if (map.bannedBy !== undefined) {

@@ -109,14 +109,14 @@ } @else if (map.pickedBy !== undefined) { @if (map.pickedAttack !== undefined) { @if (map.score[0] != undefined && map.score[1] != undefined) { -

+

{{ teams[map.pickedBy].tricode }}

-

Map

+

Map

{{ teams[map.sidePickedBy!].tricode }}

-

{{ map.pickedAttack ? "Attack" : "Defense" }}

+

{{ map.pickedAttack ? "Attack" : "Defense" }}

} @else { @@ -134,14 +134,14 @@ } @else if (map.bannedBy === undefined && map.pickedBy === undefined) { @if (map.pickedAttack !== undefined) { @if (map.score[0] != undefined && map.score[1] != undefined) { -
+

Decider

-

Map

+

Map

{{ teams[map.sidePickedBy!].tricode }}

-

{{ map.pickedAttack ? "Attack" : "Defense" }}

+

{{ map.pickedAttack ? "Attack" : "Defense" }}

} @else { @@ -151,7 +151,7 @@

} } @else if (isRotating) { -

+

Still in pool:
{{ rotateNameCurrent }}

diff --git a/src/app/mapban-ui/mapban-map/mapban-map.component.ts b/src/app/components/mapban/mapban-map/mapban-map.component.ts similarity index 98% rename from src/app/mapban-ui/mapban-map/mapban-map.component.ts rename to src/app/components/mapban/mapban-map/mapban-map.component.ts index 49f30bce..19a31b84 100644 --- a/src/app/mapban-ui/mapban-map/mapban-map.component.ts +++ b/src/app/components/mapban/mapban-map/mapban-map.component.ts @@ -7,9 +7,9 @@ import { OnChanges, SimpleChanges, } from "@angular/core"; -import { ISessionTeam, SessionMap, Stage } from "../mapban-ui.component"; import { MapbanBanIconComponent } from "./mapban-ban-icon/mapban-ban-icon.component"; import { createTimeline, Timeline } from "animejs"; +import { SessionMap, ISessionTeam, Stage } from "../../../services/Types"; @Component({ standalone: true, diff --git a/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card-minimal.component.html b/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card-minimal.component.html new file mode 100644 index 00000000..387a6b4e --- /dev/null +++ b/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card-minimal.component.html @@ -0,0 +1,42 @@ +
+
+ +
+

+ {{ getAgentName(player.agentInternal) }} +

+

+ {{ getDisplayName(player.fullName, player.name) }} +

+
+
+ +
+
+
Kills
+
{{ player.kills }}
+
+
+
Deaths
+
{{ player.deaths }}
+
+
+
Assists
+
{{ player.assists }}
+
+
+
diff --git a/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.css b/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.css new file mode 100644 index 00000000..d6bd3698 --- /dev/null +++ b/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.css @@ -0,0 +1,84 @@ +.bg-fade-defender-left { + background: linear-gradient( + to right, + transparent 10%, + rgba(var(--defender-color-rgb), 0.6) 20%, + rgba(var(--defender-color-rgb), 0.3) 40%, + transparent + ); +} + +.bg-fade-attacker-left { + background: linear-gradient( + to right, + transparent 10%, + rgba(var(--attacker-color-rgb), 0.6) 20%, + rgba(var(--attacker-color-rgb), 0.3) 40%, + transparent + ); +} + +.bg-fade-defender-right { + background: linear-gradient( + to left, + transparent 10%, + rgba(var(--defender-color-rgb), 0.6) 20%, + rgba(var(--defender-color-rgb), 0.3) 40%, + transparent + ); +} + +.bg-fade-attacker-right { + background: linear-gradient( + to left, + transparent 10%, + rgba(var(--attacker-color-rgb), 0.6) 20%, + rgba(var(--attacker-color-rgb), 0.3) 40%, + transparent + ); +} + +/* minimal backgrounds */ +.minimal.bg-fade-defender-left { + background: linear-gradient( + to right, + transparent 10%, + rgba(var(--defender-color-rgb), 0.6) 20%, + rgba(var(--defender-color-rgb), 0.3) 40%, + transparent 95% + ); +} + +.minimal.bg-fade-attacker-left { + background: linear-gradient( + to right, + transparent 10%, + rgba(var(--attacker-color-rgb), 0.6) 20%, + rgba(var(--attacker-color-rgb), 0.3) 40%, + transparent 95% + ); +} + +.minimal.bg-fade-defender-right { + background: linear-gradient( + to left, + transparent 10%, + rgba(var(--defender-color-rgb), 0.6) 20%, + rgba(var(--defender-color-rgb), 0.3) 40%, + transparent 95% + ); +} + +.minimal.bg-fade-attacker-right { + background: linear-gradient( + to left, + transparent 10%, + rgba(var(--attacker-color-rgb), 0.6) 20%, + rgba(var(--attacker-color-rgb), 0.3) 40%, + transparent 95% + ); +} + +.flip { + transform: rotateY(180deg); +} diff --git a/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.html b/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.html new file mode 100644 index 00000000..fc22a83d --- /dev/null +++ b/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.html @@ -0,0 +1,76 @@ +
+
+ +
+

+ + {{ getAgentName(player.agentInternal) }} +

+

+ {{ getDisplayName(player.fullName, player.name) }} + @if (player.hasSpike) { + + } +

+
+
+
+

{{ player.kills }}

+

/

+

{{ player.deaths }}

+

/

+

{{ player.assists }}

+
+
+ @if (!dataModel.hideAuxiliary() && player.auxiliaryAvailable.abilities) { + + } + +
+
+ +
+ +
+
+
+
+

-

+ +

{{ player.moneySpent }}

+
+
+ +

{{ player.money }}

+
+
+
diff --git a/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.ts b/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.ts new file mode 100644 index 00000000..146d9e4f --- /dev/null +++ b/src/app/components/shopping/player-scoreboard-card/player-scoreboard-card.component.ts @@ -0,0 +1,48 @@ +import { Component, computed, inject, input, Input } from "@angular/core"; +import { AgentNameService } from "../../../services/agentName.service"; +import { AgentRoleService } from "../../../services/agentRole.service"; +import { DataModelService } from "../../../services/dataModel.service"; +import { DisplayNameService } from "../../../services/displayName.service"; +import { UltimateTrackerComponent } from "../../common/ultimate-tracker/ultimate-tracker.component"; +import { AbilitiesComponent } from "../../common/abilities/abilities.component"; + +@Component({ + selector: "app-scoreboard-card", + imports: [UltimateTrackerComponent, AbilitiesComponent], + templateUrl: "./player-scoreboard-card.component.html", + styleUrl: "./player-scoreboard-card.component.css", +}) +export class PlayerScoreboardCardComponent { + dataModel = inject(DataModelService); + getDisplayName = inject(DisplayNameService).getDisplayName; + + @Input() player!: any; + + @Input() right = false; + // @Input() color: "attacker" | "defender" = "defender"; + color = input(); + + readonly backgroundClass = computed(() => { + return `bg-fade-${this.color()}-${this.right ? "right" : "left"}`; + }); + + readonly textColor = computed(() => + this.color() == "attacker" ? "text-attacker-shield/80" : "text-defender-shield/80", + ); + + getAgentName(agent: string) { + return AgentNameService.getAgentName(agent); + } + + getAgentRole(agent: string): string { + return AgentRoleService.getAgentRole(agent); + } +} + +@Component({ + selector: "app-scoreboard-card-minimal", + imports: [], + templateUrl: "./player-scoreboard-card-minimal.component.html", + styleUrl: "./player-scoreboard-card.component.css", +}) +export class PlayerScoreboardCardMinimalComponent extends PlayerScoreboardCardComponent {} diff --git a/src/app/components/shopping/roundreasons/roundreasons.component.css b/src/app/components/shopping/roundreasons/roundreasons.component.css new file mode 100644 index 00000000..39c3fe06 --- /dev/null +++ b/src/app/components/shopping/roundreasons/roundreasons.component.css @@ -0,0 +1,64 @@ +.bg-roundwin-defender-top { + border-top: 2px solid; + border-color: var(--defender-color-shield-currency); + background: linear-gradient( + 180deg, + rgba(var(--defender-color-shield-currency-rgb), 0.5) 0%, + rgba(var(--defender-color-shield-currency-rgb), 0) 100% + ); +} + +.bg-roundwin-defender-bottom { + border-bottom: 2px solid; + border-color: var(--defender-color-shield-currency); + background: linear-gradient( + 0deg, + rgba(var(--defender-color-shield-currency-rgb), 0.5) 0%, + rgba(var(--defender-color-shield-currency-rgb), 0) 100% + ); +} + +.bg-roundwin-attacker-top { + border-top: 2px solid; + border-color: var(--attacker-color-shield-currency); + background: linear-gradient( + 180deg, + rgba(var(--attacker-color-secondary-rgb), 0.5) 0%, + rgba(var(--attacker-color-secondary-rgb), 0) 100% + ); +} + +.bg-roundwin-attacker-bottom { + border-bottom: 2px solid; + border-color: var(--attacker-color-shield-currency); + background: linear-gradient( + 0deg, + rgba(var(--attacker-color-secondary-rgb), 0.5) 0%, + rgba(var(--attacker-color-secondary-rgb), 0) 100% + ); +} + +@keyframes animations-reasons { + 0% { + opacity: 1; + transform: translateY(0%); + } + 100% { + opacity: 0; + transform: translateY(-100%); + } +} + +.animate-reasons-in { + animation: animations-reasons 0.15s reverse ease-in-out; + will-change: opacity, transform; +} + +.animate-reasons-out { + animation: animations-reasons 0.15s ease-in-out; + will-change: opacity, transform; +} + +.bg-overtime { + background: linear-gradient(to right, #ffffff22 0%, transparent 40%); +} diff --git a/src/app/components/shopping/roundreasons/roundreasons.component.html b/src/app/components/shopping/roundreasons/roundreasons.component.html new file mode 100644 index 00000000..86588940 --- /dev/null +++ b/src/app/components/shopping/roundreasons/roundreasons.component.html @@ -0,0 +1,65 @@ +@if (isShown()) { +
+
+ @for (team of dataModel.match().teams; track $index; let teamIndex = $index) { +

{{ team.teamTricode }}

+ } +
+
+ @for (r of dataModel.teams()[0].roundRecord; track $index; let recordIndex = $index) { + @if ($index < dataModel.match().roundNumber || $index < 10) { + @if (r.round === dataModel.match().switchRound) { +
+
+ +
+ } + @let otRoundNumber = r.round - dataModel.match().firstOtRound; + @if (otRoundNumber >= 0 && otRoundNumber % 2 === 0) { +
+
+
O
+
T
+
{{ otRoundNumber / 2 + 1 }}
+
+ } + @if (r.type !== "upcoming") { +
+ @for (team of dataModel.teams(); track $index) { + @let record = team.roundRecord![recordIndex]; +
+ @if (record.type === "lost") { +

+ {{ record.round }} +

+ } @else { + + } +
+ } +
+ } @else { +
+

+ {{ r.round }} +

+
+ } + } + } +
+
+} diff --git a/src/app/components/shopping/roundreasons/roundreasons.component.ts b/src/app/components/shopping/roundreasons/roundreasons.component.ts new file mode 100644 index 00000000..76488203 --- /dev/null +++ b/src/app/components/shopping/roundreasons/roundreasons.component.ts @@ -0,0 +1,21 @@ +import { Component, computed, inject } from "@angular/core"; +import { DataModelService } from "../../../services/dataModel.service"; + +@Component({ + selector: "app-roundreasons", + imports: [], + templateUrl: "./roundreasons.component.html", + styleUrl: "./roundreasons.component.css", +}) +export class RoundreasonsComponent { + dataModel = inject(DataModelService); + + isShown = computed(() => this.dataModel.match().roundPhase === "shopping"); + + getBackgroundClass(record: any, team: any): string { + if (record.type === "lost" || record.type === "upcoming") { + return ""; + } + return `bg-roundwin-${record.wasAttack ? "attacker" : "defender"}-${team == this.dataModel.teams()[0] ? "top" : "bottom"}`; + } +} diff --git a/src/app/components/shopping/scoreboard/scoreboard.component.css b/src/app/components/shopping/scoreboard/scoreboard.component.css new file mode 100644 index 00000000..686eb028 --- /dev/null +++ b/src/app/components/shopping/scoreboard/scoreboard.component.css @@ -0,0 +1,111 @@ +.bg-header-fade-left { + background: linear-gradient( + 90deg, + rgba(15, 25, 35, 0.65) 0%, + rgba(15, 25, 35, 0.53) 53%, + rgba(15, 25, 35, 0) 75%, + rgba(15, 25, 35, 0) 100% + ); +} + +.bg-header-fade-right { + background: linear-gradient( + 270deg, + rgba(15, 25, 35, 0.65) 0%, + rgba(15, 25, 35, 0.53) 53%, + rgba(15, 25, 35, 0) 75%, + rgba(15, 25, 35, 0) 100% + ); +} + +@keyframes animations-scoreboard { + 0% { + opacity: 1; + transform: translateY(0%); + } + 100% { + opacity: 0; + transform: translateY(15rem); + } +} + +.animate-scoreboard-in { + animation: animations-scoreboard 0.15s reverse ease-in-out; + will-change: opacity, transform; +} + +.animate-scoreboard-out { + animation: animations-scoreboard 0.15s ease-in-out; + will-change: opacity, transform; +} + +@keyframes animations-teamnames { + 0% { + opacity: 1; + transform: translateY(0%); + } + 100% { + opacity: 0; + transform: translateY(15rem); + } +} + +.animate-teamnames-in { + animation: animations-teamnames 0.15s reverse ease-in-out; + will-change: opacity, transform; +} + +.animate-teamnames-out { + animation: animations-teamnames 0.15s ease-in-out; + will-change: opacity, transform; +} + +.teamname-underline.defender { + background: linear-gradient( + to right, + transparent, + rgba(var(--defender-color-rgb), 0.8), + transparent + ); +} + +.teamname-underline.attacker { + background: linear-gradient( + to right, + transparent, + rgba(var(--attacker-color-secondary-rgb), 0.8), + transparent + ); +} + +.score-name-gradient.defender.left { + background: radial-gradient( + ellipse 45% 100% at 45% top, + rgba(var(--defender-color-rgb), 0.25) 0%, + transparent + ); +} + +.score-name-gradient.attacker.left { + background: radial-gradient( + ellipse 45% 100% at 45% top, + rgba(var(--attacker-color-rgb), 0.4) 0%, + transparent + ); +} + +.score-name-gradient.defender.right { + background: radial-gradient( + ellipse 45% 100% at 55% top, + rgba(var(--defender-color-rgb), 0.25) 0%, + transparent + ); +} + +.score-name-gradient.attacker.right { + background: radial-gradient( + ellipse 45% 100% at 55% top, + rgba(var(--attacker-color-rgb), 0.4) 0%, + transparent + ); +} diff --git a/src/app/components/shopping/scoreboard/scoreboard.component.html b/src/app/components/shopping/scoreboard/scoreboard.component.html new file mode 100644 index 00000000..769e1496 --- /dev/null +++ b/src/app/components/shopping/scoreboard/scoreboard.component.html @@ -0,0 +1,76 @@ +@if (isShown()) { +
+ @for (team of dataModel.teams(); track $index; let teamIndex = $index) { +
+
+
+
+

-

+ +

{{ teamSpent(teamIndex) }}

+
+
+ +

{{ teamMoney(teamIndex) }}

+
+
+
+
+ {{ team.teamName }} +
+
+
+ +
+ +
+ @for (player of team.players | appScoreboardOrder; track player.playerId) { + @if (!dataModel.minimalMode() && player.maxUltPoints !== 0) { + + } @else { + + } + } +
+
+ +
+
+ } +
+} diff --git a/src/app/components/shopping/scoreboard/scoreboard.component.ts b/src/app/components/shopping/scoreboard/scoreboard.component.ts new file mode 100644 index 00000000..ad7ae2c0 --- /dev/null +++ b/src/app/components/shopping/scoreboard/scoreboard.component.ts @@ -0,0 +1,35 @@ +import { Component, computed, inject } from "@angular/core"; +import { DataModelService } from "../../../services/dataModel.service"; +import { TranslateKeys } from "../../../services/i18nHelper"; +import { + PlayerScoreboardCardComponent, + PlayerScoreboardCardMinimalComponent, +} from "../player-scoreboard-card/player-scoreboard-card.component"; +import { ScoreboardOrderPipe } from "../../../pipes/scoreboardorder.pipe"; + +@Component({ + selector: "app-scoreboard", + imports: [ + PlayerScoreboardCardComponent, + PlayerScoreboardCardMinimalComponent, + ScoreboardOrderPipe, + ], + templateUrl: "./scoreboard.component.html", + styleUrl: "./scoreboard.component.css", +}) +export class ScoreboardComponent { + dataModel = inject(DataModelService); + TranslateKeys = TranslateKeys; + + isShown = computed(() => this.dataModel.match().roundPhase === "shopping"); + + teamMoney(teamIndex: number): number { + return this.dataModel.teams()[teamIndex].players.reduce((sum, player) => sum + player.money, 0); + } + + teamSpent(teamIndex: number): number { + return this.dataModel + .teams() + [teamIndex].players.reduce((sum, player) => sum + player.moneySpent, 0); + } +} diff --git a/src/app/mapban-ui/mapban-ui.component.css b/src/app/components/top/auxiliary/series-maps/series-maps.component.css similarity index 100% rename from src/app/mapban-ui/mapban-ui.component.css rename to src/app/components/top/auxiliary/series-maps/series-maps.component.css diff --git a/src/app/components/top/auxiliary/series-maps/series-maps.component.html b/src/app/components/top/auxiliary/series-maps/series-maps.component.html new file mode 100644 index 00000000..bca9241a --- /dev/null +++ b/src/app/components/top/auxiliary/series-maps/series-maps.component.html @@ -0,0 +1,30 @@ +@if (dataModel.seriesInfo().mapInfo.length > 0) { +
+ @for (mapInfo of dataModel.seriesInfo().mapInfo; track $index) { +
+ @switch (mapInfo.type) { + @case ("past") { +

{{ mapInfo.map }}

+ +

{{ mapInfo.left.score }} - {{ mapInfo.right.score }}

+ + } + @case ("present") { + {{ TranslateKeys.Mapinfo_Live | translate: { map: dataModel.match().map } }} + + } + @case ("future") { + @if (mapInfo.logo !== "") { + {{ TranslateKeys.Mapinfo_Next | translate: { map: mapInfo.map } }} + + } @else { + {{ TranslateKeys.Mapinfo_Decider | translate: { map: mapInfo.map } }} + } + } + } +
+ } +
+} diff --git a/src/app/components/top/auxiliary/series-maps/series-maps.component.ts b/src/app/components/top/auxiliary/series-maps/series-maps.component.ts new file mode 100644 index 00000000..f1f5d170 --- /dev/null +++ b/src/app/components/top/auxiliary/series-maps/series-maps.component.ts @@ -0,0 +1,15 @@ +import { Component, inject } from "@angular/core"; +import { TranslatePipe } from "@ngx-translate/core"; +import { TranslateKeys } from "../../../../services/i18nHelper"; +import { DataModelService } from "../../../../services/dataModel.service"; + +@Component({ + selector: "app-series-maps", + imports: [TranslatePipe], + templateUrl: "./series-maps.component.html", + styleUrl: "./series-maps.component.css", +}) +export class SeriesMapsComponent { + dataModel = inject(DataModelService); + TranslateKeys = TranslateKeys; +} diff --git a/src/app/components/top/auxiliary/series-wins/series-win-pip/series-win-pip.component.css b/src/app/components/top/auxiliary/series-wins/series-win-pip/series-win-pip.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/top/auxiliary/series-wins/series-win-pip/series-win-pip.component.html b/src/app/components/top/auxiliary/series-wins/series-win-pip/series-win-pip.component.html new file mode 100644 index 00000000..7a376e1f --- /dev/null +++ b/src/app/components/top/auxiliary/series-wins/series-win-pip/series-win-pip.component.html @@ -0,0 +1,8 @@ +
diff --git a/src/app/components/top/auxiliary/series-wins/series-win-pip/series-win-pip.component.ts b/src/app/components/top/auxiliary/series-wins/series-win-pip/series-win-pip.component.ts new file mode 100644 index 00000000..5e133a6c --- /dev/null +++ b/src/app/components/top/auxiliary/series-wins/series-win-pip/series-win-pip.component.ts @@ -0,0 +1,12 @@ +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "app-series-win-pip", + imports: [], + templateUrl: "./series-win-pip.component.html", + styleUrl: "./series-win-pip.component.css", +}) +export class SeriesWinPipComponent { + @Input() full = false; + @Input() right = false; +} diff --git a/src/app/components/top/auxiliary/series-wins/series-wins.component.css b/src/app/components/top/auxiliary/series-wins/series-wins.component.css new file mode 100644 index 00000000..cd786713 --- /dev/null +++ b/src/app/components/top/auxiliary/series-wins/series-wins.component.css @@ -0,0 +1,12 @@ +.mapwin-pip { + position: relative; + width: 8px; + height: 6px; + border-radius: 2px; + border: 1px solid; + border-color: #ffffffaa; +} + +.full { + background-color: #ffffff; +} diff --git a/src/app/components/top/auxiliary/series-wins/series-wins.component.html b/src/app/components/top/auxiliary/series-wins/series-wins.component.html new file mode 100644 index 00000000..36a69916 --- /dev/null +++ b/src/app/components/top/auxiliary/series-wins/series-wins.component.html @@ -0,0 +1,22 @@ +@if (dataModel.seriesInfo().needed > 1) { +
+
+ @for (i of numSequence(dataModel.seriesInfo().needed); track $index) { + + } +
+
+ @for (i of numSequence(dataModel.seriesInfo().needed); track $index) { + + } +
+
+} diff --git a/src/app/components/top/auxiliary/series-wins/series-wins.component.ts b/src/app/components/top/auxiliary/series-wins/series-wins.component.ts new file mode 100644 index 00000000..27fcb811 --- /dev/null +++ b/src/app/components/top/auxiliary/series-wins/series-wins.component.ts @@ -0,0 +1,16 @@ +import { Component, inject } from "@angular/core"; +import { DataModelService } from "../../../../services/dataModel.service"; +import { SeriesWinPipComponent } from "./series-win-pip/series-win-pip.component"; + +@Component({ + selector: "app-series-wins", + imports: [SeriesWinPipComponent], + templateUrl: "./series-wins.component.html", + styleUrl: "./series-wins.component.css", +}) +export class SeriesWinsComponent { + dataModel = inject(DataModelService); + numSequence(n: number): number[] { + return Array(n); + } +} diff --git a/src/app/components/top/auxiliary/sponsor-box/sponsor-box.component.css b/src/app/components/top/auxiliary/sponsor-box/sponsor-box.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/top/auxiliary/sponsor-box/sponsor-box.component.html b/src/app/components/top/auxiliary/sponsor-box/sponsor-box.component.html new file mode 100644 index 00000000..987feddc --- /dev/null +++ b/src/app/components/top/auxiliary/sponsor-box/sponsor-box.component.html @@ -0,0 +1,14 @@ +@if (dataModel.sponsorInfo().enabled) { +
+ @for (sponsor of dataModel.sponsorInfo().sponsors; track $index) { + @if (currentIndex() === $index) { + + } + } +
+} diff --git a/src/app/components/top/auxiliary/sponsor-box/sponsor-box.component.ts b/src/app/components/top/auxiliary/sponsor-box/sponsor-box.component.ts new file mode 100644 index 00000000..f54f1c78 --- /dev/null +++ b/src/app/components/top/auxiliary/sponsor-box/sponsor-box.component.ts @@ -0,0 +1,24 @@ +import { Component, inject, OnInit, signal } from "@angular/core"; +import { DataModelService } from "../../../../services/dataModel.service"; + +@Component({ + selector: "app-sponsor-box", + imports: [], + templateUrl: "./sponsor-box.component.html", + styleUrl: "./sponsor-box.component.css", +}) +export class SponsorBoxComponent implements OnInit { + dataModel = inject(DataModelService); + + currentIndex = signal(0); + + ngOnInit(): void { + setInterval(() => { + this.currentIndex.update((i) => { + let ret = i + 1; + ret %= this.dataModel.sponsorInfo().sponsors.length; + return ret; + }); + }, this.dataModel.sponsorInfo().duration); + } +} diff --git a/src/app/components/top/auxiliary/watermark/watermark.component.css b/src/app/components/top/auxiliary/watermark/watermark.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/top/auxiliary/watermark/watermark.component.html b/src/app/components/top/auxiliary/watermark/watermark.component.html new file mode 100644 index 00000000..23f9d458 --- /dev/null +++ b/src/app/components/top/auxiliary/watermark/watermark.component.html @@ -0,0 +1,24 @@ +@if (dataModel.watermarkInfo().spectraWatermark || dataModel.watermarkInfo().customTextEnabled) { +
+ @if (dataModel.watermarkInfo().spectraWatermark) { + +
+ @if (currentRotationIndex() === 0) { +

+ {{ TranslateKeys.Watermark_Text | translate }} +

+ } @else { +

+ © valospectra.com +

+ } +
+ } @else if (dataModel.watermarkInfo().customTextEnabled) { +
+

{{ dataModel.watermarkInfo().customText }}

+
+ } +
+} diff --git a/src/app/components/top/auxiliary/watermark/watermark.component.ts b/src/app/components/top/auxiliary/watermark/watermark.component.ts new file mode 100644 index 00000000..80c166fe --- /dev/null +++ b/src/app/components/top/auxiliary/watermark/watermark.component.ts @@ -0,0 +1,27 @@ +import { Component, inject, OnInit, signal } from "@angular/core"; +import { TranslatePipe } from "@ngx-translate/core"; +import { DataModelService } from "../../../../services/dataModel.service"; +import { TranslateKeys } from "../../../../services/i18nHelper"; + +@Component({ + selector: "app-watermark", + imports: [TranslatePipe], + templateUrl: "./watermark.component.html", + styleUrl: "./watermark.component.css", +}) +export class WatermarkComponent implements OnInit { + dataModel = inject(DataModelService); + TranslateKeys = TranslateKeys; + + currentRotationIndex = signal(0); + + ngOnInit(): void { + setInterval(() => { + this.currentRotationIndex.update((i) => { + let ret = i + 1; + ret %= 2; + return ret; + }); + }, 30 * 1000); + } +} diff --git a/src/app/components/top/match/background/background.component.css b/src/app/components/top/match/background/background.component.css new file mode 100644 index 00000000..32e83aa8 --- /dev/null +++ b/src/app/components/top/match/background/background.component.css @@ -0,0 +1,120 @@ +.max-opacity { + opacity: 0.8; +} + +.bg-to-max-opacity-right { + background: linear-gradient(to right, rgba(15, 25, 35, 1) 0%, rgba(15, 25, 35, 0.8) 100%); +} + +.bg-to-max-opacity-left { + background: linear-gradient(to left, rgba(15, 25, 35, 1) 0%, rgba(15, 25, 35, 0.8) 100%); +} + +.sponsor-skew { + display: inline-block; + clip-path: polygon(0 0, 100% 0, 100% 100%, 25% 100%); +} + +.sponsor-skew::before { + content: ""; + position: absolute; + top: 0px; + right: 0px; + width: 99.5%; + height: 98%; + background: var(--color-timer); + clip-path: polygon(0.5% 0, 100% 0, 100% 100%, 25% 100%); + z-index: -1; +} + +.left-score-skew-first { + display: inline-block; + clip-path: polygon(0 2%, 100% 0, 100% 100%, 12% 100%); +} + +.left-score-skew-first::before { + content: ""; + position: absolute; + top: 0px; + right: 0px; + width: 99.5%; + height: 100%; + background: var(--color-timer); + clip-path: polygon(0 0, 100% 0, 100% 100%, 12% 100%); + z-index: -1; +} + +.left-score-skew-second { + display: inline-block; + clip-path: polygon(0 0, 100% 0, 90% 100%, 10% 100%); +} + +.left-score-skew-second::before { + content: ""; + position: absolute; + top: 0px; + right: 0px; + width: 99.5%; + height: 100%; + background: + radial-gradient( + 100% 100% at 50% 100%, + rgba(var(--defender-color-rgb), 0.8), + rgba(var(--defender-color-rgb), 0) + ), + var(--color-timer); + clip-path: polygon(0.5% 0, 100% -1%, 89.5% 100%, 10% 100%); + z-index: -1; +} + +.right-score-skew-first { + display: inline-block; + clip-path: polygon(0 0, 100% 2%, 88% 100%, 0% 100%); +} + +.right-score-skew-first::before { + content: ""; + position: absolute; + top: 0px; + left: 0px; + width: 99.5%; + height: 100%; + background: var(--color-timer); + clip-path: polygon(0 0, 100% 0, 88% 100%, 0% 100%); + z-index: -1; +} + +.right-score-skew-second { + display: inline-block; + clip-path: polygon(0 0, 100% 0, 90% 100%, 10% 100%); +} + +.right-score-skew-second::before { + content: ""; + position: absolute; + top: 0px; + left: 0px; + width: 99.5%; + height: 100%; + background: + radial-gradient( + 100% 100% at 50% 100%, + rgba(var(--attacker-color-rgb), 0.8), + rgba(var(--attacker-color-rgb), 0) + ), + var(--color-timer); + clip-path: polygon(0 0, 100% 0%, 90% 100%, 10.5% 100%); + z-index: -1; +} + +.topbg-shadow.defender { + box-shadow: 0px 1px 4px 3px rgba(var(--defender-color-rgb), 0.3); +} + +.topbg-shadow.attacker { + box-shadow: 0px 1px 4px 3px rgba(var(--attacker-color-secondary-rgb), 0.3); +} + +.bg-clash { + background: linear-gradient(to bottom, rgba(15, 25, 35, 1) 0%, rgba(15, 25, 35, 0) 100%); +} diff --git a/src/app/components/top/match/background/background.component.html b/src/app/components/top/match/background/background.component.html new file mode 100644 index 00000000..c94b51c3 --- /dev/null +++ b/src/app/components/top/match/background/background.component.html @@ -0,0 +1,176 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/app/components/top/match/background/background.component.ts b/src/app/components/top/match/background/background.component.ts new file mode 100644 index 00000000..270ac2d6 --- /dev/null +++ b/src/app/components/top/match/background/background.component.ts @@ -0,0 +1,13 @@ +import { Component, computed, inject } from "@angular/core"; +import { DataModelService } from "../../../../services/dataModel.service"; + +@Component({ + selector: "app-top-background", + imports: [], + templateUrl: "./background.component.html", + styleUrl: "./background.component.css", +}) +export class TopBackgroundComponent { + dataModel = inject(DataModelService); + leftAttacker = computed(() => this.dataModel.teams()[0].isAttacking); +} diff --git a/src/app/components/top/match/round-number/round-number.component.css b/src/app/components/top/match/round-number/round-number.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/top/match/round-number/round-number.component.html b/src/app/components/top/match/round-number/round-number.component.html new file mode 100644 index 00000000..2d91d8a0 --- /dev/null +++ b/src/app/components/top/match/round-number/round-number.component.html @@ -0,0 +1,7 @@ +

+ @if (otNumber() > 0) { + {{ TranslateKeys.Top_OvertimeNumber | translate: { otNumber: otNumber() } }} + } @else { + {{ TranslateKeys.Top_RoundNumber | translate: { rounds: dataModel.match().roundNumber } }} + } +

diff --git a/src/app/components/top/match/round-number/round-number.component.ts b/src/app/components/top/match/round-number/round-number.component.ts new file mode 100644 index 00000000..7471f978 --- /dev/null +++ b/src/app/components/top/match/round-number/round-number.component.ts @@ -0,0 +1,21 @@ +import { Component, computed, inject } from "@angular/core"; +import { TranslatePipe } from "@ngx-translate/core"; +import { DataModelService } from "../../../../services/dataModel.service"; +import { TranslateKeys } from "../../../../services/i18nHelper"; + +@Component({ + selector: "app-round-number", + imports: [TranslatePipe], + templateUrl: "./round-number.component.html", + styleUrl: "./round-number.component.css", +}) +export class RoundNumberComponent { + dataModel = inject(DataModelService); + TranslateKeys = TranslateKeys; + + otNumber = computed(() => { + const adjustedRound = this.dataModel.match().roundNumber - this.dataModel.match().firstOtRound; + const otNumber = Math.floor(adjustedRound / 2 + 1); + return otNumber; + }); +} diff --git a/src/app/components/top/match/spike-planted/spike-planted.component.css b/src/app/components/top/match/spike-planted/spike-planted.component.css new file mode 100644 index 00000000..cd72dae8 --- /dev/null +++ b/src/app/components/top/match/spike-planted/spike-planted.component.css @@ -0,0 +1,15 @@ +.animate-spike-slide-in { + animation: spike-slide-in 1s ease-out; +} +.animate-spike-slide-out { + animation: spike-slide-in 1s reverse; +} + +@keyframes spike-slide-in { + from { + transform: translateY(-150%); + } + to { + transform: translateY(0%); + } +} diff --git a/src/app/components/top/match/spike-planted/spike-planted.component.html b/src/app/components/top/match/spike-planted/spike-planted.component.html new file mode 100644 index 00000000..f5f4f01a --- /dev/null +++ b/src/app/components/top/match/spike-planted/spike-planted.component.html @@ -0,0 +1,18 @@ +@if (show()) { +
+ + +
+} diff --git a/src/app/components/top/match/spike-planted/spike-planted.component.ts b/src/app/components/top/match/spike-planted/spike-planted.component.ts new file mode 100644 index 00000000..03f5d14e --- /dev/null +++ b/src/app/components/top/match/spike-planted/spike-planted.component.ts @@ -0,0 +1,80 @@ +import { Component, computed, inject, effect } from "@angular/core"; +import { DataModelService } from "../../../../services/dataModel.service"; + +@Component({ + selector: "app-spike-planted", + imports: [], + templateUrl: "./spike-planted.component.html", + styleUrl: "./spike-planted.component.css", +}) +export class SpikePlantedComponent { + dataModel = inject(DataModelService); + + readonly show = computed(() => { + return ( + this.dataModel.match().roundPhase === "combat" && + this.dataModel.spikeState().planted && + !this.dataModel.spikeState().detonated && + !this.dataModel.spikeState().defused + ); + }); + + readonly effectRef = effect(() => { + if (this.show() && !this.isBlinking) { + this.startBlink(); + } else { + this.endBlink(); + } + }); + + blinkTimerRef?: NodeJS.Timeout; + blinkState = true; + isBlinking = false; + blinkStartTime = 0; + blinkLastTime = 0; + + protected startBlink() { + this.isBlinking = true; + this.blinkStartTime = Date.now(); + this.blinkLastTime = this.blinkStartTime; + this.timeoutFunction(45 * 1000, 0); + } + + protected endBlink() { + clearInterval(this.blinkTimerRef); + this.blinkTimerRef = undefined; + this.blinkState = true; + this.isBlinking = false; + } + + protected timeoutFunction(durationLeft: number, lastTimeout: number) { + this.blinkState = !this.blinkState; + + const now = Date.now(); + const timeDiff = now - this.blinkLastTime; + durationLeft -= timeDiff; + this.blinkLastTime = now; + + if (durationLeft <= 0) { + this.endBlink(); + return; //recursion exit + } + + let nextTimeout = 0; + if (durationLeft > 20 * 1000) nextTimeout = 1000; + else if (durationLeft > 10 * 1000) nextTimeout = 500; + else if (durationLeft > 5 * 1000) nextTimeout = 250; + else if (durationLeft > 1 * 1000) nextTimeout = 125; + else { + this.endBlink(); + return; //another recursion exit + } + + //adjust next timeout depending on the call delay of the last iteration + nextTimeout -= timeDiff - lastTimeout; + + this.blinkTimerRef = setTimeout(() => { + this.timeoutFunction(durationLeft, nextTimeout); + }, nextTimeout); + } +} diff --git a/src/app/components/top/match/team-info/team-info.component.css b/src/app/components/top/match/team-info/team-info.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/top/match/team-info/team-info.component.html b/src/app/components/top/match/team-info/team-info.component.html new file mode 100644 index 00000000..c8310972 --- /dev/null +++ b/src/app/components/top/match/team-info/team-info.component.html @@ -0,0 +1,34 @@ +
+ @for (team of dataModel.teams(); track $index) { +
+ +
+ +
+ +
+

+ {{ team.teamTricode }} +

+

+ {{ $index === 0 ? dataModel.seedingInfo().left : dataModel.seedingInfo().right }} +

+
+ +
+

+ {{ team.roundsWon }} +

+
+
+ } +
diff --git a/src/app/components/top/match/team-info/team-info.component.ts b/src/app/components/top/match/team-info/team-info.component.ts new file mode 100644 index 00000000..f7bc6a43 --- /dev/null +++ b/src/app/components/top/match/team-info/team-info.component.ts @@ -0,0 +1,12 @@ +import { Component, inject } from "@angular/core"; +import { DataModelService } from "../../../../services/dataModel.service"; + +@Component({ + selector: "app-team-info", + imports: [], + templateUrl: "./team-info.component.html", + styleUrl: "./team-info.component.css", +}) +export class TopTeamInfoComponent { + dataModel = inject(DataModelService); +} diff --git a/src/app/endround/endround.component.html b/src/app/endround/endround.component.html deleted file mode 100644 index ab2304ec..00000000 --- a/src/app/endround/endround.component.html +++ /dev/null @@ -1,38 +0,0 @@ -
-
-
-
- -
{{ "endround.round_win" | translate }}
-
-
-
-
-
-
-
- -
-
- {{ - "endround.win" - | translate - : { - team: match.attackersWon - ? ("endround.attacker" | translate) - : ("endround.defender" | translate), - } - }} -
-
-
-
- -
-
- {{ "endround.round" | translate: { rounds: match.roundNumber } }} -
-
-
-
-
diff --git a/src/app/endround/endround.component.scss b/src/app/endround/endround.component.scss deleted file mode 100644 index 51b085f4..00000000 --- a/src/app/endround/endround.component.scss +++ /dev/null @@ -1,205 +0,0 @@ -.intro-box { - position: absolute; - left: 26.23%; - top: 40.5%; - width: 875px; - height: 200px; - overflow: hidden; - animation-name: fly-down; - animation-duration: 4s; - animation-fill-mode: both; -} - -.intro-box-content { - position: relative; - width: 875px; - height: 200px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - animation-name: slide-in; - animation-duration: 1s; - animation-fill-mode: both; - transition-timing-function: ease-in-out; -} - -.intro-info-box { - position: relative; - display: flex; - flex-direction: column; - flex-wrap: nowrap; - justify-content: center; - align-items: center; - overflow: hidden; - width: 50%; - height: 100%; -} - -.intro-info-image { - position: relative; - max-height: 70%; - max-width: 100%; -} - -.intro-round-text { - position: relative; - width: fit-content; - text-shadow: 0px 1.21px 4.83px rgba(0, 0, 0, 0.12); - font-family: "Unbounded", Helvetica; - font-weight: 700; - color: #ffffff; - font-size: 30px; - font-style: normal; - text-align: center; - line-height: normal; -} - -.endround { - position: absolute; - left: 26%; - top: 100%; - width: 875px; - height: 200px; - overflow: hidden; - animation-name: slide-up; - animation-duration: 3.95s; - animation-fill-mode: both; -} - -.endround-box { - position: relative; - width: 875px; - height: 200px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - display: flex; - flex-direction: row; - overflow: hidden; - flex-wrap: nowrap; - justify-content: center; - align-items: stretch; -} - -.win-side { - position: relative; - flex-grow: 1; - display: flex; - flex-direction: column; - flex-wrap: nowrap; - justify-content: center; - align-items: center; - overflow: hidden; - width: 30%; - height: 100%; -} - -.win-side-image-box { - display: flex; - height: 70%; - align-items: center; - justify-content: center; - scale: 0.9; -} - -.win-side-image { - position: relative; - max-height: 100%; - max-width: 100%; -} - -.win-side-text { - position: relative; - width: fit-content; - text-shadow: 0px 1.21px 4.83px rgba(0, 0, 0, 0.12); - font-family: "Montserrat", Helvetica; - font-weight: 700; - color: #ffffff; - font-size: 30px; - font-style: normal; - text-align: center; - line-height: normal; -} - -.info-box { - position: relative; - flex-grow: 1; - display: flex; - flex-direction: column; - flex-wrap: nowrap; - justify-content: center; - align-items: center; - overflow: hidden; - width: 50%; - height: 100%; -} - -.info-image-box { - display: flex; - height: 70%; - align-items: center; - justify-content: center; - scale: 0.9; -} - -.info-image { - position: relative; - max-height: 100%; - max-width: 100%; -} - -.round-number { - position: relative; - width: fit-content; - text-shadow: 0px 1.21px 4.83px rgba(0, 0, 0, 0.12); - font-family: "Montserrat", Helvetica; - font-weight: 700; - color: #ffffff; - font-size: 30px; - font-style: normal; - text-align: center; - line-height: normal; -} - -@keyframes fly-down { - 0% { - top: 40.5%; - } - 90% { - top: 40.5%; - } - 100% { - top: 150%; - } -} - -@keyframes slide-up { - 0% { - top: 100%; - } - 25% { - top: 100%; - } - 90% { - top: 100%; - } - 100% { - top: 82%; - } -} - -@keyframes slide-in { - 0% { - left: -102%; - } - 75% { - left: -102%; - } - 100% { - left: 0%; - } -} diff --git a/src/app/endround/endround.component.ts b/src/app/endround/endround.component.ts deleted file mode 100644 index ff82b2bc..00000000 --- a/src/app/endround/endround.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, Input, OnChanges, SimpleChanges, OnInit } from "@angular/core"; -import { NgIf } from "@angular/common"; -import { TranslateModule } from "@ngx-translate/core"; -@Component({ - selector: "app-endround", - templateUrl: "./endround.component.html", - styleUrls: ["./endround.component.scss"], - imports: [TranslateModule, NgIf], -}) -export class EndroundComponent implements OnChanges, OnInit { - @Input() match!: any; - tournamentUrl = "../../assets/misc/logo.webp"; - endRoundEnabled = false; - - tournamentBackgroundUrl = "../../assets/misc/backdrop.webp"; - - teamWon = 0; - ngOnInit(): void { - this.endRoundEnabled = this.match?.tools?.tournamentInfo?.enabled || false; - if (!this.endRoundEnabled) return; - - this.tournamentUrl = - this.match?.tools?.tournamentInfo?.logoUrl && this.match.tools.tournamentInfo.logoUrl !== "" - ? this.match.tools.tournamentInfo.logoUrl - : "../../assets/misc/logo.webp"; - - this.tournamentBackgroundUrl = - this.match?.tools?.tournamentInfo?.backdropUrl && - this.match.tools.tournamentInfo.backdropUrl !== "" - ? this.match.tools.tournamentInfo.backdropUrl - : "../../assets/misc/backdrop.webp"; - - this.preloadImage(this.tournamentUrl); - this.preloadImage(this.tournamentBackgroundUrl); - } - ngOnChanges(changes: SimpleChanges) { - if (changes["match"]) { - const match = changes["match"].currentValue; - if (match.attackersWon) { - this.teamWon = match.teams[0].isAttacking ? 0 : 1; - } else { - this.teamWon = match.teams[0].isAttacking ? 1 : 0; - } - } - } - private preloadImage(url: string): void { - const img = new Image(); - img.src = url; - } - setTournamentBackgroundImage(): string { - return `url(${this.tournamentBackgroundUrl})`; - } -} diff --git a/src/app/overlay/overlay.component.html b/src/app/overlay/overlay.component.html deleted file mode 100644 index c3dfe00a..00000000 --- a/src/app/overlay/overlay.component.html +++ /dev/null @@ -1,4 +0,0 @@ -
- - -
diff --git a/src/app/overlay/overlay.component.scss b/src/app/overlay/overlay.component.scss deleted file mode 100644 index 2609c3f2..00000000 --- a/src/app/overlay/overlay.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -.main-body { - position: relative; - width: 1920px; - height: 1080px; - background-image: none; - background-size: cover; - background-position: 50% 50%; -} diff --git a/src/app/overlay/overlay.component.ts b/src/app/overlay/overlay.component.ts deleted file mode 100644 index 6e089831..00000000 --- a/src/app/overlay/overlay.component.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { AfterViewInit, Component, OnInit, ViewChild, inject } from "@angular/core"; -import { TrackerComponent } from "../tracker/tracker.component"; -import { ActivatedRoute } from "@angular/router"; -import { SocketService } from "../services/SocketService"; -import { Config } from "../shared/config"; -import { TimeoutComponent } from "../timeout/timeout.component"; -import { TranslateService } from "@ngx-translate/core"; -import { LanguageAliasService } from "../services/languageAlias.service"; - -@Component({ - selector: "app-overlay", - templateUrl: "./overlay.component.html", - styleUrls: ["./overlay.component.scss"], - imports: [TrackerComponent, TimeoutComponent], -}) -export class OverlayComponent implements OnInit, AfterViewInit { - private route = inject(ActivatedRoute); - private config = inject(Config); - private translate = inject(TranslateService); - - @ViewChild(TrackerComponent) trackerComponent!: TrackerComponent; - groupCode = "UNKNOWN"; - lang = "en"; - socketService!: SocketService; - - hideAuxiliary = false; - - constructor() { - this.route.queryParams.subscribe((params) => { - this.groupCode = params["groupCode"]?.toUpperCase() || "UNKNOWN"; - const paramLang = params["lang"]?.toLowerCase() || "en"; - this.lang = LanguageAliasService.resolveLanguageAlias(paramLang); - - this.hideAuxiliary = params["hideAuxiliary"] != undefined; - }); - } - - ngOnInit(): void { - this.socketService = SocketService.getInstance().connectMatch( - this.config.serverEndpoint, - this.groupCode, - ); - - this.translate.use(this.lang); - } - - ngAfterViewInit(): void { - this.socketService.subscribeMatch((data: any) => { - this.trackerComponent.updateMatch(data); - }); - } -} diff --git a/src/app/overlays/agent-select-overlay/agent-select-overlay.component.css b/src/app/overlays/agent-select-overlay/agent-select-overlay.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/overlays/agent-select-overlay/agent-select-overlay.component.html b/src/app/overlays/agent-select-overlay/agent-select-overlay.component.html new file mode 100644 index 00000000..895afa7c --- /dev/null +++ b/src/app/overlays/agent-select-overlay/agent-select-overlay.component.html @@ -0,0 +1 @@ + diff --git a/src/app/overlays/agent-select-overlay/agent-select-overlay.component.ts b/src/app/overlays/agent-select-overlay/agent-select-overlay.component.ts new file mode 100644 index 00000000..f3e2a114 --- /dev/null +++ b/src/app/overlays/agent-select-overlay/agent-select-overlay.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; +import { AgentSelectComponent } from "../../components/agent-select/agent-select.component"; + +@Component({ + selector: "app-agent-select-overlay", + imports: [AgentSelectComponent], + templateUrl: "./agent-select-overlay.component.html", + styleUrl: "./agent-select-overlay.component.css", +}) +export class AgentSelectOverlayComponent {} diff --git a/src/app/overlays/mapban-overlay/mapban-overlay.component.css b/src/app/overlays/mapban-overlay/mapban-overlay.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/mapban-ui/mapban-ui.component.html b/src/app/overlays/mapban-overlay/mapban-overlay.component.html similarity index 57% rename from src/app/mapban-ui/mapban-ui.component.html rename to src/app/overlays/mapban-overlay/mapban-overlay.component.html index a0d8080e..a26eb46f 100644 --- a/src/app/mapban-ui/mapban-ui.component.html +++ b/src/app/overlays/mapban-overlay/mapban-overlay.component.html @@ -1,8 +1,9 @@
-
+
@for (map of selectedMaps; track $index) { }
diff --git a/src/app/mapban-ui/mapban-ui.component.ts b/src/app/overlays/mapban-overlay/mapban-overlay.component.ts similarity index 80% rename from src/app/mapban-ui/mapban-ui.component.ts rename to src/app/overlays/mapban-overlay/mapban-overlay.component.ts index 2acf71de..7f8cb49f 100644 --- a/src/app/mapban-ui/mapban-ui.component.ts +++ b/src/app/overlays/mapban-overlay/mapban-overlay.component.ts @@ -1,23 +1,15 @@ -import { trigger, transition, style, animate } from "@angular/animations"; import { AfterViewInit, Component, inject, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { SocketService } from "../services/SocketService"; -import { Config } from "../shared/config"; -import { MapbanMapComponent } from "./mapban-map/mapban-map.component"; +import { SocketService } from "../../services/SocketService"; +import { Config } from "../../shared/config"; +import { MapbanMapComponent } from "../../components/mapban/mapban-map/mapban-map.component"; @Component({ standalone: true, imports: [MapbanMapComponent], - selector: "app-mapban-ui", - templateUrl: "./mapban-ui.component.html", - styleUrl: "./mapban-ui.component.css", - animations: [ - trigger("fade", [ - transition(":enter", [style({ opacity: "0" }), animate("0.5s", style({ opacity: "1" }))]), - - transition(":leave", animate("0.5s", style({ opacity: "0" }))), - ]), - ], + selector: "app-mapban-overlay", + templateUrl: "./mapban-overlay.component.html", + styleUrl: "./mapban-overlay.component.css", }) export class MapbanUiComponent implements OnInit, AfterViewInit { private route = inject(ActivatedRoute); diff --git a/src/app/overlays/match-overlay/match-overlay.component.css b/src/app/overlays/match-overlay/match-overlay.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/overlays/match-overlay/match-overlay.component.html b/src/app/overlays/match-overlay/match-overlay.component.html new file mode 100644 index 00000000..5fdc38d0 --- /dev/null +++ b/src/app/overlays/match-overlay/match-overlay.component.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/overlays/match-overlay/match-overlay.component.ts b/src/app/overlays/match-overlay/match-overlay.component.ts new file mode 100644 index 00000000..c539cd95 --- /dev/null +++ b/src/app/overlays/match-overlay/match-overlay.component.ts @@ -0,0 +1,41 @@ +import { Component, inject } from "@angular/core"; +import { ScoreboardComponent } from "../../components/shopping/scoreboard/scoreboard.component"; +import { DataModelService } from "../../services/dataModel.service"; +import { SeriesMapsComponent } from "../../components/top/auxiliary/series-maps/series-maps.component"; +import { RoundNumberComponent } from "../../components/top/match/round-number/round-number.component"; +import { TopTeamInfoComponent } from "../../components/top/match/team-info/team-info.component"; +import { SpikePlantedComponent } from "../../components/top/match/spike-planted/spike-planted.component"; +import { SeriesWinsComponent } from "../../components/top/auxiliary/series-wins/series-wins.component"; +import { SponsorBoxComponent } from "../../components/top/auxiliary/sponsor-box/sponsor-box.component"; +import { WatermarkComponent } from "../../components/top/auxiliary/watermark/watermark.component"; +import { RoundreasonsComponent } from "../../components/shopping/roundreasons/roundreasons.component"; +import { CombatPlayerListComponent } from "../../components/combat/player-list/player-list.component"; +import { PlayercamsComponent } from "../../components/combat/playercams/playercams.component"; +import { EndroundBannerComponent } from "../../components/combat/endround-banner/endround-banner.component"; +import { TimeoutComponent } from "../../components/common/timeout/timeout.component"; +import { TopBackgroundComponent } from "../../components/top/match/background/background.component"; + +@Component({ + selector: "app-match-overlay", + imports: [ + ScoreboardComponent, + SeriesMapsComponent, + RoundNumberComponent, + TopTeamInfoComponent, + SpikePlantedComponent, + SeriesWinsComponent, + SponsorBoxComponent, + WatermarkComponent, + RoundreasonsComponent, + CombatPlayerListComponent, + PlayercamsComponent, + EndroundBannerComponent, + TimeoutComponent, + TopBackgroundComponent, + ], + templateUrl: "./match-overlay.component.html", + styleUrl: "./match-overlay.component.css", +}) +export class MatchOverlayComponent { + dataModel = inject(DataModelService); +} diff --git a/src/app/overlays/testing-agent-select/testing-agent-select.component.css b/src/app/overlays/testing-agent-select/testing-agent-select.component.css new file mode 100644 index 00000000..fa92d779 --- /dev/null +++ b/src/app/overlays/testing-agent-select/testing-agent-select.component.css @@ -0,0 +1,12 @@ +button { + color: white; + background-color: #0f1923d9; + border: 2px groove gray; + padding: 4px; + font-family: Montserrat, Helvetica; + max-height: 28px; + font-size: 13.333px; + line-height: normal; + box-sizing: border-box; + cursor: pointer; +} diff --git a/src/app/overlays/testing-agent-select/testing-agent-select.component.html b/src/app/overlays/testing-agent-select/testing-agent-select.component.html new file mode 100644 index 00000000..8b64b097 --- /dev/null +++ b/src/app/overlays/testing-agent-select/testing-agent-select.component.html @@ -0,0 +1,21 @@ + + +
+ @for (team of dataModel.teams(); track $index; let teamIndex = $index) { +
+ @for (player of team.players; track $index) { +
+ + + +
+ } +
+ } +
diff --git a/src/app/overlays/testing-agent-select/testing-agent-select.component.ts b/src/app/overlays/testing-agent-select/testing-agent-select.component.ts new file mode 100644 index 00000000..ee94b053 --- /dev/null +++ b/src/app/overlays/testing-agent-select/testing-agent-select.component.ts @@ -0,0 +1,581 @@ +import { Component, inject, OnInit } from "@angular/core"; +import { AgentSelectOverlayComponent } from "../agent-select-overlay/agent-select-overlay.component"; +import { DataModelService } from "../../services/dataModel.service"; +import { IMatchData } from "../../services/Types"; + +@Component({ + selector: "app-testing-agent-select", + imports: [AgentSelectOverlayComponent], + templateUrl: "./testing-agent-select.component.html", + styleUrl: "./testing-agent-select.component.css", +}) +export class TestingAgentSelectComponent implements OnInit { + readonly dataModel = inject(DataModelService); + + ngOnInit(): void { + const match: IMatchData = { + groupCode: "A", + isRanked: false, + isRunning: true, + roundNumber: 0, + roundPhase: "LOBBY", + spikeState: { planted: false, defused: false, detonated: false }, + map: "Ascent", + switchRound: 12, + firstOtRound: 25, + showAliveKDA: true, + attackersWon: false, + tools: { + seriesInfo: { + needed: 3, + wonLeft: 2, + wonRight: 2, + mapInfo: [ + { + type: "past", + map: "Fracture", + left: { + score: 13, + logo: "assets/misc/icon.webp", + }, + right: { + score: 9, + logo: "assets/misc/icon.webp", + }, + }, + { + type: "present", + logo: "assets/misc/icon.webp", + }, + { + type: "future", + map: "Haven", + logo: "assets/misc/icon.webp", + }, + ], + }, + seedingInfo: { + left: "Group A", + right: "Group B", + }, + tournamentInfo: { + enabled: true, + name: "", + logoUrl: "", + backdropUrl: "", + }, + timeoutDuration: 60, + sponsorInfo: { + enabled: true, + duration: 5000, + sponsors: ["assets/misc/logo.webp", "assets/misc/icon.webp"], + }, + watermarkInfo: { + customText: "", + customTextEnabled: false, + spectraWatermark: true, + }, + playercamsInfo: { + enable: false, + }, + nameOverrides: { + overrides: [], + }, + }, + timeoutState: { + techPause: false, + leftTeam: false, + rightTeam: false, + timeRemaining: 0, + }, + teams: [ + { + players: [ + { + name: "Testg", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Vampire", + locked: false, + isObserved: false, + armorName: "", + money: 0, + moneySpent: 0, + highestWeapon: "", + isCaptain: false, + currUltPoints: 0, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Smonk", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Wushu", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Wushu", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Wushu", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + ], + teamName: "The Naturals", + teamUrl: "assets/misc/icon.webp", + teamTricode: "INT", + spentThisRound: 1000, + isAttacking: false, + roundsWon: 5, + roundRecord: [ + { type: "detonated", wasAttack: true, round: 1 }, + { type: "lost", wasAttack: true, round: 2 }, + { type: "kills", wasAttack: true, round: 3 }, + { type: "timeout", wasAttack: true, round: 4 }, + { type: "lost", wasAttack: true, round: 5 }, + { type: "kills", wasAttack: true, round: 6 }, + { type: "lost", wasAttack: true, round: 7 }, + { type: "defused", wasAttack: true, round: 8 }, + { type: "lost", wasAttack: true, round: 9 }, + { type: "lost", wasAttack: true, round: 10 }, + { type: "detonated", wasAttack: true, round: 11 }, + { type: "lost", wasAttack: true, round: 12 }, + { type: "kills", wasAttack: false, round: 13 }, + { type: "timeout", wasAttack: false, round: 14 }, + { type: "lost", wasAttack: false, round: 15 }, + { type: "kills", wasAttack: false, round: 16 }, + { type: "lost", wasAttack: false, round: 17 }, + { type: "defused", wasAttack: false, round: 18 }, + { type: "lost", wasAttack: false, round: 19 }, + { type: "lost", wasAttack: false, round: 20 }, + { type: "lost", wasAttack: true, round: 21 }, + { type: "lost", wasAttack: false, round: 22 }, + { type: "lost", wasAttack: false, round: 23 }, + { type: "defused", wasAttack: false, round: 24 }, + { type: "lost", wasAttack: true, round: 25 }, + { type: "lost", wasAttack: false, round: 26 }, + ], + }, + { + players: [ + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Wushu", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Smonk", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Wushu", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Wushu", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Test", + fullName: "Testg#ABC", + playerId: 0, + isAlive: true, + agentInternal: "Wushu", + locked: false, + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + currUltPoints: 2, + maxUltPoints: 7, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + ], + teamName: "The Zoologists", + teamUrl: "assets/misc/icon.webp", + teamTricode: "ZOO", + spentThisRound: 1000, + isAttacking: true, + roundsWon: 5, + roundRecord: [ + { type: "lost", wasAttack: false, round: 1 }, + { type: "defused", wasAttack: false, round: 2 }, + { type: "lost", wasAttack: false, round: 3 }, + { type: "lost", wasAttack: false, round: 4 }, + { type: "kills", wasAttack: false, round: 5 }, + { type: "lost", wasAttack: false, round: 6 }, + { type: "detonated", wasAttack: false, round: 7 }, + { type: "lost", wasAttack: false, round: 8 }, + { type: "kills", wasAttack: false, round: 9 }, + { type: "timeout", wasAttack: false, round: 10 }, + { type: "lost", wasAttack: false, round: 11 }, + { type: "defused", wasAttack: false, round: 12 }, + { type: "lost", wasAttack: true, round: 13 }, + { type: "lost", wasAttack: true, round: 14 }, + { type: "kills", wasAttack: true, round: 15 }, + { type: "lost", wasAttack: true, round: 16 }, + { type: "detonated", wasAttack: true, round: 17 }, + { type: "lost", wasAttack: true, round: 18 }, + { type: "kills", wasAttack: true, round: 19 }, + { type: "timeout", wasAttack: true, round: 20 }, + { type: "lost", wasAttack: true, round: 21 }, + { type: "kills", wasAttack: true, round: 22 }, + { type: "lost", wasAttack: true, round: 23 }, + { type: "lost", wasAttack: true, round: 24 }, + { type: "kills", wasAttack: false, round: 25 }, + { type: "kills", wasAttack: true, round: 26 }, + ], + }, + ], + }; + this.dataModel.match.set(match); + } + + lockAgent(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + player.locked = true; + return ret; + }); + } + + unlockAgent(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + player.locked = false; + return ret; + }); + } + + agentList = [ + "Aggrobot", + "BountyHunter", + "Breach", + "Cable", + "Cashew", + "Clay", + "Deadeye", + "Grenadier", + "Guide", + "Gumshoe", + "Hunter", + "Killjoy", + "Mage", + "Nox", + "Pandemic", + "Phoenix", + "Rift", + "Sarge", + "Sequoia", + "Smonk", + "Sprinter", + "Stealth", + "Terra", + "Thorne", + "Vampire", + "Wraith", + "Wushu", + ]; + changeAgent(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + player.agentInternal = + this.agentList[ + (this.agentList.findIndex((e) => e === player.agentInternal) + 1) % this.agentList.length + ]; + return ret; + }); + } +} diff --git a/src/app/overlays/testing/testing.component.css b/src/app/overlays/testing/testing.component.css new file mode 100644 index 00000000..fa92d779 --- /dev/null +++ b/src/app/overlays/testing/testing.component.css @@ -0,0 +1,12 @@ +button { + color: white; + background-color: #0f1923d9; + border: 2px groove gray; + padding: 4px; + font-family: Montserrat, Helvetica; + max-height: 28px; + font-size: 13.333px; + line-height: normal; + box-sizing: border-box; + cursor: pointer; +} diff --git a/src/app/overlays/testing/testing.component.html b/src/app/overlays/testing/testing.component.html new file mode 100644 index 00000000..ca40412a --- /dev/null +++ b/src/app/overlays/testing/testing.component.html @@ -0,0 +1,91 @@ + + +
+ +
+ + +
+ + + + + + + +
+ + +@if (showInterface()) { +
+ @for (team of dataModel.teams(); track $index) { +
+ + + +
+ } +
+} + +@if (showInterface()) { +
+ @for (team of dataModel.teams(); track $index; let teamIndex = $index) { + +
+ @for (player of team.players; track $index) { +
+ + + + + + + + + + +
+ } +
+ } +
+} diff --git a/src/app/overlays/testing/testing.component.ts b/src/app/overlays/testing/testing.component.ts new file mode 100644 index 00000000..a7877041 --- /dev/null +++ b/src/app/overlays/testing/testing.component.ts @@ -0,0 +1,768 @@ +import { Component, inject, OnInit, signal } from "@angular/core"; +import { MatchOverlayComponent } from "../match-overlay/match-overlay.component"; +import { DataModelService } from "../../services/dataModel.service"; + +@Component({ + selector: "app-testing", + imports: [MatchOverlayComponent], + templateUrl: "./testing.component.html", + styleUrl: "./testing.component.css", +}) +export class TestingComponent implements OnInit { + dataModel = inject(DataModelService); + match: any; + + bgCounter = 1; + + ngOnInit(): void { + const nameOverrideMap = new Map(); + nameOverrideMap.set("", ""); + + this.match = { + groupCode: "A", + isRanked: false, + isRunning: true, + roundNumber: 10, + roundPhase: "combat", + spikeState: { planted: false, defused: false, detonated: false }, + map: "Ascent", + switchRound: 12, + firstOtRound: 25, + showAliveKDA: true, + tools: { + seriesInfo: { + needed: 3, + wonLeft: 1, + wonRight: 2, + mapInfo: [ + { + type: "past", + map: "Fracture", + left: { + score: 13, + logo: "assets/misc/icon.webp", + }, + right: { + score: 9, + logo: "assets/misc/icon.webp", + }, + }, + { + type: "present", + logo: "assets/misc/icon.webp", + }, + { + type: "future", + map: "Haven", + logo: "assets/misc/icon.webp", + }, + ], + }, + seedingInfo: { + left: "Group A", + right: "Group B", + }, + tournamentInfo: { + enabled: true, + name: "", + logoUrl: "", + backdropUrl: "", + }, + timeoutDuration: 60, + sponsorInfo: { + enabled: true, + duration: 5000, + sponsors: ["assets/misc/logo.webp", "assets/misc/icon.webp"], + }, + watermarkInfo: { + customText: "", + customTextEnabled: false, + spectraWatermark: true, + }, + playercamsInfo: { enable: true, enabledPlayers: ["Voodoo One#DEBUG"] }, + nameOverrides: { overrides: nameOverrideMap }, + }, + timeoutState: { + techPause: false, + leftTeam: false, + rightTeam: false, + timeRemaining: 0, + }, + teams: [ + { + players: [ + { + name: "Voodoo One", + fullName: "Voodoo One#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "Vampire", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Operator", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 4, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 1, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Twoperator", + fullName: "Twoperator#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "Smonk", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "ThreeOfLife", + fullName: "ThreeOfLife#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "BountyHunter", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 1, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Fourcefield", + fullName: "Fourcefield#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "Killjoy", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "FIVEbyFIVE", + fullName: "FIVEbyFIVE#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "Wushu", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + ], + teamName: "The Naturals", + teamUrl: "assets/misc/icon.webp", + teamTricode: "INT", + spentThisRound: 1000, + isAttacking: false, + roundsWon: 5, + roundRecord: [ + { type: "detonated", wasAttack: true, round: 1 }, + { type: "lost", wasAttack: true, round: 2 }, + { type: "kills", wasAttack: true, round: 3 }, + { type: "timeout", wasAttack: true, round: 4 }, + { type: "lost", wasAttack: true, round: 5 }, + { type: "kills", wasAttack: true, round: 6 }, + { type: "lost", wasAttack: true, round: 7 }, + { type: "defused", wasAttack: true, round: 8 }, + { type: "lost", wasAttack: true, round: 9 }, + { type: "lost", wasAttack: true, round: 10 }, + { type: "detonated", wasAttack: true, round: 11 }, + { type: "lost", wasAttack: true, round: 12 }, + { type: "kills", wasAttack: false, round: 13 }, + { type: "timeout", wasAttack: false, round: 14 }, + { type: "lost", wasAttack: false, round: 15 }, + { type: "kills", wasAttack: false, round: 16 }, + { type: "lost", wasAttack: false, round: 17 }, + { type: "defused", wasAttack: false, round: 18 }, + { type: "lost", wasAttack: false, round: 19 }, + { type: "lost", wasAttack: false, round: 20 }, + { type: "lost", wasAttack: true, round: 21 }, + { type: "lost", wasAttack: false, round: 22 }, + { type: "lost", wasAttack: false, round: 23 }, + { type: "defused", wasAttack: false, round: 24 }, + { type: "lost", wasAttack: true, round: 25 }, + { type: "lost", wasAttack: false, round: 26 }, + { type: "lost", wasAttack: true, round: 27 }, + { type: "lost", wasAttack: false, round: 28 }, + { type: "lost", wasAttack: true, round: 29 }, + { type: "lost", wasAttack: false, round: 30 }, + ], + }, + { + players: [ + { + name: "AlpacaHoarder", + fullName: "AlpcacaHoarder#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "Grenadier", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "BeeSting", + fullName: "BeeSting#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "Terra", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 1, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "CowTipper", + fullName: "CowTipper#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "Sprinter", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 1, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "DodoDaniel", + fullName: "DodoDaniel#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "BountyHunter", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 1, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + { + name: "Eeliminator", + fullName: "Eeliminator#DEBUG", + playerId: 0, + isAlive: true, + agentInternal: "Stealth", + isObserved: false, + armorName: "Heavy", + money: 2100, + moneySpent: 2900, + highestWeapon: "Vandal", + isCaptain: false, + maxUltPoints: Math.floor(Math.random() * 3) + 6, + currUltPoints: Math.floor(Math.random() * 3) + 2, + ultReady: false, + hasSpike: false, + scoreboardAvailable: true, + auxiliaryAvailable: { + health: true, + abilities: true, + scoreboard: true, + }, + kills: 0, + deaths: 0, + assists: 0, + killsThisRound: 0, + health: 100, + abilities: { + grenade: 1, + ability1: 1, + ability2: 0, + }, + iconNameSuffix: "", + }, + ], + teamName: "The Zoologists", + teamUrl: "assets/misc/icon.webp", + teamTricode: "ZOO", + spentThisRound: 1000, + isAttacking: true, + roundsWon: 5, + roundRecord: [ + { type: "lost", wasAttack: false, round: 1 }, + { type: "defused", wasAttack: false, round: 2 }, + { type: "lost", wasAttack: false, round: 3 }, + { type: "lost", wasAttack: false, round: 4 }, + { type: "kills", wasAttack: false, round: 5 }, + { type: "lost", wasAttack: false, round: 6 }, + { type: "detonated", wasAttack: false, round: 7 }, + { type: "lost", wasAttack: false, round: 8 }, + { type: "kills", wasAttack: false, round: 9 }, + { type: "timeout", wasAttack: false, round: 10 }, + { type: "lost", wasAttack: false, round: 11 }, + { type: "defused", wasAttack: false, round: 12 }, + { type: "lost", wasAttack: true, round: 13 }, + { type: "lost", wasAttack: true, round: 14 }, + { type: "kills", wasAttack: true, round: 15 }, + { type: "lost", wasAttack: true, round: 16 }, + { type: "detonated", wasAttack: true, round: 17 }, + { type: "lost", wasAttack: true, round: 18 }, + { type: "kills", wasAttack: true, round: 19 }, + { type: "timeout", wasAttack: true, round: 20 }, + { type: "lost", wasAttack: true, round: 21 }, + { type: "kills", wasAttack: true, round: 22 }, + { type: "lost", wasAttack: true, round: 23 }, + { type: "lost", wasAttack: true, round: 24 }, + { type: "kills", wasAttack: false, round: 25 }, + { type: "kills", wasAttack: true, round: 26 }, + { type: "kills", wasAttack: false, round: 27 }, + { type: "kills", wasAttack: true, round: 28 }, + { type: "kills", wasAttack: false, round: 29 }, + { type: "kills", wasAttack: true, round: 30 }, + ], + }, + ], + }; + this.dataModel.match.set(this.match); + } + + //#region General button handlers + changeRoundPhase() { + this.dataModel.match.update((v) => { + const ret = v; + if (ret.roundPhase == "shopping") { + ret.roundPhase = "combat"; + } else if (ret.roundPhase == "combat") { + ret.roundPhase = "end"; + } else if (ret.roundPhase == "LOBBY") { + ret.roundPhase = "end"; + } else { + ret.roundPhase = "shopping"; + } + return ret; + }); + } + + swapTeamColors() { + this.dataModel.match.update((v) => { + const ret = v; + ret.teams.forEach((team: any) => { + team.isAttacking = !team.isAttacking; + team.players.forEach((player: any) => { + player.hasSpike = false; + }); + }); + return ret; + }); + } + + spikeTimer?: NodeJS.Timeout; + + plantSpike() { + this.dataModel.match.update((v) => { + const ret = v; + ret.spikeState.planted = true; + ret.spikeState.defused = false; + ret.spikeState.detonated = false; + return ret; + }); + this.spikeTimer = setTimeout(() => { + this.defuseSpike(); + }, 45 * 1000); + } + + defuseSpike() { + this.dataModel.match.update((v) => { + const ret = v; + ret.spikeState.planted = false; + ret.spikeState.defused = true; + ret.spikeState.detonated = false; + return ret; + }); + clearTimeout(this.spikeTimer); + this.spikeTimer = undefined; + } + + showInterface = signal(true); + toggleInterface() { + this.showInterface.update((v) => !v); + } + + switchBackground() { + this.bgCounter++; + if (this.bgCounter > 4) { + this.bgCounter = 1; + } + } + + techPause() { + this.stopTimeoutTimer(); + this.dataModel.match.update((v) => { + const ret = v; + ret.timeoutState.techPause = !ret.timeoutState.techPause; + return ret; + }); + } + //#endregion + + //#region Team button handlers + + winRound(teamIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const team = ret.teams[teamIndex]; + team.roundsWon++; + team.roundsWon %= 13; + ret.roundNumber = ret.teams[0].roundsWon + ret.teams[1].roundsWon + 1; + return ret; + }); + } + + timeout(teamIndex: number) { + if ( + (teamIndex == 0 && this.dataModel.timeoutState().leftTeam) || + (teamIndex == 1 && this.dataModel.timeoutState().rightTeam) + ) { + //allows to toggle the timeout back off + this.stopTimeoutTimer(); + return; + } + this.stopTimeoutTimer(); + this.dataModel.match.update((v) => { + const ret = v; + ret.timeoutState.techPause = false; + ret.timeoutState.leftTeam = teamIndex == 0 ? !ret.timeoutState.leftTeam : false; + ret.timeoutState.rightTeam = teamIndex == 1 ? !ret.timeoutState.rightTeam : false; + ret.timeoutState.timeRemaining = ret.tools.timeoutDuration; + return ret; + }); + this.startTimeoutTimer(); + } + //#endregion + + //#region Player button handlers + killPlayer(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + ret.teams[teamIndex].players[playerIndex].isAlive = false; + ret.teams[teamIndex].players[playerIndex].health = 0; + return ret; + }); + } + + revivePlayer(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + ret.teams[teamIndex].players[playerIndex].isAlive = true; + ret.teams[teamIndex].players[playerIndex].health = 100; + return ret; + }); + } + + giveUltPoint(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + player.currUltPoints++; + player.ultReady = player.currUltPoints == player.maxUltPoints; + return ret; + }); + } + + useUltimate(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + player.currUltPoints = 0; + player.ultReady = false; + return ret; + }); + } + + armorOrder = ["Heavy", "Regen", "Light", "None"]; + changeShield(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + let i = this.armorOrder.findIndex((e) => e == player.armorName); + i++; + i %= this.armorOrder.length; + player.armorName = this.armorOrder[i]; + player.health = Math.floor(Math.random() * 100) + 1; + return ret; + }); + } + + weaponOrder = ["Vandal", "Operator", "Classic", "Spectre"]; + changeWeapon(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + let i = this.weaponOrder.findIndex((e) => e == player.highestWeapon); + i++; + i %= this.weaponOrder.length; + player.highestWeapon = this.weaponOrder[i]; + return ret; + }); + } + + makeCaptain(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + ret.teams[teamIndex].players.forEach((e: any) => (e.isCaptain = false)); + player.isCaptain = true; + return ret; + }); + } + + spectate(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + ret.teams[0].players.forEach((e: any) => (e.isObserved = false)); + ret.teams[1].players.forEach((e: any) => (e.isObserved = false)); + player.isObserved = true; + return ret; + }); + } + + giveSpike(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + ret.teams[teamIndex].players.forEach((e: any) => (e.hasSpike = false)); + player.hasSpike = true; + return ret; + }); + } + + changeStats(teamIndex: number, playerIndex: number) { + this.dataModel.match.update((v) => { + const ret = v; + const player = ret.teams[teamIndex].players[playerIndex]; + player.kills = Math.floor(Math.random() * 20); + player.deaths = Math.floor(Math.random() * 20); + player.assists = Math.floor(Math.random() * 20); + return ret; + }); + } + //#endregion + + timeoutTimerRef?: NodeJS.Timeout; + startTimeoutTimer() { + this.timeoutTimerRef = setInterval(() => { + this.dataModel.match.update((v) => { + const ret = v; + ret.timeoutState.timeRemaining--; + return ret; + }); + if (this.dataModel.timeoutState().timeRemaining <= 0) { + this.stopTimeoutTimer(); + } + }, 1000); + } + + stopTimeoutTimer() { + clearInterval(this.timeoutTimerRef); + this.dataModel.match.update((v) => { + const ret = v; + ret.timeoutState.leftTeam = false; + ret.timeoutState.rightTeam = false; + ret.timeoutState.timeRemaining = 0; + return ret; + }); + } +} diff --git a/src/app/pipes/scoreboardorder.pipe.ts b/src/app/pipes/scoreboardorder.pipe.ts new file mode 100644 index 00000000..65889e07 --- /dev/null +++ b/src/app/pipes/scoreboardorder.pipe.ts @@ -0,0 +1,24 @@ +import { Pipe, type PipeTransform } from "@angular/core"; + +@Pipe({ name: "appScoreboardOrder" }) +export class ScoreboardOrderPipe implements PipeTransform { + transform(players: any): MinPlayer[] { + if (!Array.isArray(players)) return []; + + players.sort((a: any, b: any) => { + if (a.kills < b.kills) return 1; + if (a.kills > b.kills) return -1; + // If kills are identical, sort by deaths (higher KDA first) + if (a.deaths < b.deaths) return -1; + return 0; + }); + return players; + } +} + +export interface MinPlayer { + playerId: string; + kills: number; + deaths: number; + maxUltPoints: number; +} diff --git a/src/app/playercams/playercams.component.html b/src/app/playercams/playercams.component.html deleted file mode 100644 index 04cf4de0..00000000 --- a/src/app/playercams/playercams.component.html +++ /dev/null @@ -1,61 +0,0 @@ -@for (player of match?.teams[0].players; track $index) { - @if (streams.has(player.fullName)) { -
-
- -
-
-
-
- {{ player.fullName | nameOverride: player.name : getOverrideNames() }} -
-
- {{ player.kills }} / {{ player.deaths }} / {{ player.assists }} -
-
-
- } -} - -@for (player of match?.teams[1].players; track $index) { - @if (streams.has(player.fullName)) { -
-
- -
-
-
-
- {{ player.fullName | nameOverride: player.name : getOverrideNames() }} -
-
- {{ player.kills }} / {{ player.deaths }} / {{ player.assists }} -
-
-
- } -} diff --git a/src/app/playercams/playercams.component.ts b/src/app/playercams/playercams.component.ts deleted file mode 100644 index 74fbd698..00000000 --- a/src/app/playercams/playercams.component.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { Component, inject, Input, OnInit, AfterViewInit } from "@angular/core"; -import { DomSanitizer, SafeResourceUrl } from "@angular/platform-browser"; -import { NameoverridePipe } from "../pipes/nameoverride.pipe"; -import { ActivatedRoute } from "@angular/router"; -import { Config } from "../shared/config"; -import { SocketService } from "../services/SocketService"; - -@Component({ - selector: "app-playercams", - imports: [NameoverridePipe], - templateUrl: "./playercams.component.html", - styleUrl: "./playercams.component.scss", -}) -export class PlayercamsComponent implements OnInit, AfterViewInit { - private sanitizer = inject(DomSanitizer); - @Input() match!: any; - streams = new Map(); - private route = inject(ActivatedRoute); - private config = inject(Config); - private groupCode: string | undefined = undefined; - private socketService!: SocketService; - private roundPhase = "LOBBY"; - - constructor() { - const location = window.location.href.toLowerCase(); - if (location.includes("playercams")) { - console.log("PlayercamsComponent Standalone initialized"); - this.route.queryParams.subscribe((params) => { - this.groupCode = params["groupCode"]?.toUpperCase() || undefined; - }); - } - } - - ngOnInit() { - if (this.groupCode != undefined && this.groupCode != "") { - this.socketService = SocketService.getInstance().connectMatch( - this.config.serverEndpoint, - this.groupCode, - ); - this.socketService.subscribeMatch((data: any) => { - this.updateMatch(data); - }); - } - } - - ngAfterViewInit(): void { - this.iterateStreamUrls(); - } - - iterateStreamUrls() { - if ( - !this.match || - !this.match.tools || - !this.match.tools.playercamsInfo || - !this.match.tools.playercamsInfo.enabledPlayers - ) { - return; - } - for (const player of this.match.tools.playercamsInfo.enabledPlayers) { - this.streams.set(player, this.getStreamUrl(player.split("#")[0], player.split("#")[1])); - } - } - - public updateMatch(data: any) { - delete data.eventNumber; - delete data.replayLog; - this.match = data; - - // Construct map for name overrides if it's a string (from JSON). The server might keep it as JSON to avoid issues. - const tempOverrides = this.match?.tools?.nameOverrides?.overrides || null; - if (typeof tempOverrides === "string") { - this.match.tools.nameOverrides.overrides = this.jsonToMap(tempOverrides); - } - - if (this.match.roundPhase !== this.roundPhase && this.match.roundPhase === "shopping") { - this.roundPhase = this.match.roundPhase; - this.iterateStreamUrls(); - } - } - - private jsonToMap(json: string): Map { - try { - const obj = JSON.parse(json); - if (Array.isArray(obj)) { - return new Map(obj); - } else { - throw new Error("Invalid JSON format for Map"); - } - } catch (error) { - console.error("Failed to parse JSON to Map:", error); - return new Map(); - } - } - - public getEnabledPlayers(): string[] { - let toReturn = this.match?.tools?.playercamsInfo?.enabledPlayers; - if (!toReturn || toReturn.length === 0) { - toReturn = []; - } - return toReturn; - } - - public getOverrideNames(): Map { - let toReturn = this.match?.tools?.nameOverrides?.overrides; - if (!toReturn) { - toReturn = new Map(); - } - return toReturn; - } - - public getStreamUrl(name: string, tagline: string): SafeResourceUrl { - name = name.replaceAll(" ", "_"); - const streamVdoUrl = `https://vdo.ninja/?room=${this.match.tools.playercamsInfo.identifier}&view=${name + "_H_" + tagline}&scene=0&cleanoutput&vb=5000&transparent&waitmessage=Loading&disablehotkeys&codec=h265,av1,h264,vp8`; - return this.sanitizer.bypassSecurityTrustResourceUrl(streamVdoUrl); - } -} diff --git a/src/app/scoreboard/playerscore/playerscore-minimal.component.html b/src/app/scoreboard/playerscore/playerscore-minimal.component.html deleted file mode 100644 index 787f307c..00000000 --- a/src/app/scoreboard/playerscore/playerscore-minimal.component.html +++ /dev/null @@ -1,43 +0,0 @@ -
-
- - -
-
{{ getAgentName(player.agentInternal) }}
-
- {{ player.fullName | nameOverride: player.name : getOverrideNames() }} -
-
-
-
-
- -
-
-
-
-
{{ "scoreboard.kills" | translate }}
-
{{ player.kills }}
-
-
-
{{ "scoreboard.deaths" | translate }}
-
{{ player.deaths }}
-
-
-
{{ "scoreboard.assists" | translate }}
-
{{ player.assists }}
-
-
-
-
-
diff --git a/src/app/scoreboard/playerscore/playerscore.component.html b/src/app/scoreboard/playerscore/playerscore.component.html deleted file mode 100644 index e4768623..00000000 --- a/src/app/scoreboard/playerscore/playerscore.component.html +++ /dev/null @@ -1,94 +0,0 @@ -
-
- - -
-
- {{ player.fullName | nameOverride: player.name : getOverrideNames() }} -
-
-
-
-
-
- -
-
-
-
-
- -
- -
-

- {{ player.kills }} - / - {{ player.deaths }} - / - {{ player.assists }} -

-
-
-
- -
-
-
-

- - - - {{ player.moneySpent }} - ? -

-

- - {{ player.money }} - ? -

-
-
-
diff --git a/src/app/scoreboard/playerscore/playerscore.component.scss b/src/app/scoreboard/playerscore/playerscore.component.scss deleted file mode 100644 index 7add991d..00000000 --- a/src/app/scoreboard/playerscore/playerscore.component.scss +++ /dev/null @@ -1,338 +0,0 @@ -.flip { - transform: rotateY(180deg); -} - -.right { - @extend .flip; -} - -.playerscore-component { - display: flex; - height: 74px; - width: 760px; - align-items: center; - justify-content: space-between; - position: relative; - flex: 0 0 auto; - - &.defender { - background: linear-gradient( - 90deg, - rgba(var(--defender-color-rgb), 0) 3.74%, - rgba(var(--defender-color-rgb), 0.65) 5.57%, - rgba(var(--defender-color-rgb), 0.3) 22.42%, - rgba(var(--defender-color-rgb), 0) 37.11% - ); - } - - &.attacker { - background: linear-gradient( - 90deg, - rgba(var(--attacker-color-rgb), 0) 4.69%, - rgba(var(--attacker-color-rgb), 0.65) 6.5%, - rgba(var(--attacker-color-rgb), 0.3) 23.1%, - rgba(var(--attacker-color-rgb), 0) 37.57% - ); - } - - &.minimal { - @extend .playerscore-component; - width: auto; - - &.defender { - background: linear-gradient( - 90deg, - rgba(var(--defender-color-rgb), 0) 3.74%, - rgba(var(--defender-color-rgb), 0.65) 5.57%, - rgba(var(--defender-color-rgb), 0.3) 42.42%, - rgba(var(--defender-color-rgb), 0) 67.11% - ); - } - - &.attacker { - background: linear-gradient( - 90deg, - rgba(var(--attacker-color-rgb), 0) 4.69%, - rgba(var(--attacker-color-rgb), 0.65) 6.5%, - rgba(var(--attacker-color-rgb), 0.3) 53.1%, - rgba(var(--attacker-color-rgb), 0) 74.57% - ); - } - } -} - -.playerinfo-container { - display: inline-flex; - align-items: center; - gap: 16px; - position: relative; - align-self: stretch; - flex: 0 0 auto; -} - -.agent-icon { - background-size: cover; - background-position: 50% 50%; - position: relative; - width: 74px; - height: 74px; -} - -.playername-container { - display: flex; - flex-direction: column; - width: 121px; - align-items: center; - justify-content: center; - gap: 3px; - position: relative; - align-self: stretch; -} - -.playername-text { - position: relative; - width: fit-content; - font-family: "Montserrat", Helvetica; - font-weight: 600; - color: #ffffff; - font-size: 16px; - text-align: center; - letter-spacing: 0; - line-height: normal; - white-space: nowrap; - - &.minimal { - @extend .playername-text; - font-size: 18px; - } -} - -.agentname-text { - font-family: "Montserrat", Helvetica; - font-weight: 700; - font-size: 11px; - text-align: center; - - &.attacker { - @extend .agentname-text; - color: var(--attacker-color-shield-currency); - } - - &.defender { - @extend .agentname-text; - color: var(--defender-color-shield-currency); - } -} - -.ultimate-tracker { - display: inline-flex; - align-items: center; - gap: 1.25px; - position: relative; - flex: 0 0 auto; -} - -.pip-ultimate { - position: relative; - background-image: url(/assets/misc/ultimate-pip.svg); - background-size: 100% 100%; - width: 10px; - height: 10px; - - &-full { - @extend .pip-ultimate; - background-image: url(/assets/misc/ultimate-pip-full.svg); - } -} - -.ultimate-full-image { - width: 25px; - margin-left: auto; - margin-right: auto; -} - -.resources-container { - display: flex; - width: 530px; - align-items: center; - justify-content: flex-end; - gap: 12px; - position: relative; - align-self: stretch; - margin-left: -85.6px; - left: 7px; - - &.minimal { - @extend .resources-container; - width: 360px; - } -} - -.rank-icon-container { - position: absolute; - width: 30px; - height: 30px; - left: -5px; - top: 44px; - background-size: cover; - background-position: 50% 50%; -} - -.rank-icon { - height: 100%; - aspect-ratio: 1; -} - -.shield-icon-container { - width: 36px; - height: 36px; -} - -.shield-icon { - height: 100%; - aspect-ratio: 1; -} - -.KDA-tracker-wrapper { - display: flex; - width: 120px; - align-items: center; - justify-content: center; - gap: 10px; - position: relative; - align-self: stretch; - - &.minimal { - @extend .KDA-tracker-wrapper; - width: 170px; - } -} - -.KDA-tracker { - position: relative; - width: fit-content; - font-family: "Unbounded", Helvetica; - font-weight: 600; - color: transparent; - font-size: 16px; - text-align: center; - letter-spacing: 0; - line-height: normal; - white-space: nowrap; - - &.minimal { - @extend .KDA-tracker; - display: flex; - flex-direction: row; - gap: 14px; - } -} - -.KDA-tracker-bundle { - display: flex; - flex-direction: column; -} - -.KDA-title { - @extend .agentname-text; - color: white; -} - -.KDA-text { - color: #ffffff; - font-family: "Unbounded", Helvetica; - font-weight: 600; - font-size: 16px; - letter-spacing: 0; - - &-delimiter { - @extend .KDA-text; - color: #ffffff80; - } -} - -.weapon-icon-container { - display: flex; - min-width: 160px; - max-width: 200px; - flex-shrink: 1; - align-items: center; - justify-content: center; - gap: 10px; - position: relative; - align-self: stretch; -} - -.weapon-icon-wrapper { - align-items: flex-start; - justify-content: center; - display: inline-flex; - flex-direction: column; - gap: 20px; - max-width: 190px; - position: relative; - flex: 0 0 auto; -} - -.weapon-icon { - position: relative; - max-height: 40px; - max-width: 160px; - object-fit: cover; -} - -.money-container { - display: flex; - flex-direction: column; - min-width: 80px; - max-width: 100px; - flex: auto; - align-items: center; - justify-content: center; - gap: 8px; - position: relative; - align-self: stretch; -} - -.money-element { - position: relative; - width: fit-content; - opacity: 0.8; - font-family: "Montserrat", Helvetica; - font-weight: 700; - font-size: 18px; - text-align: center; - line-height: normal; - white-space: nowrap; - margin: -5px; -} - -.credits-icon { - position: relative; - width: 12px; - height: 12px; - display: unset; -} - -.money-text { - letter-spacing: 0; - opacity: 0.8; - font-family: "Montserrat", Helvetica; - font-weight: 700; - font-size: 18px; - - &-red { - @extend .money-text; - color: #ff4557; - } - - &-white { - @extend .money-text; - color: white; - } -} - -app-abilities { - min-width: 90px; - margin: 0 5px; -} diff --git a/src/app/scoreboard/playerscore/playerscore.component.ts b/src/app/scoreboard/playerscore/playerscore.component.ts deleted file mode 100644 index 1f4bb78f..00000000 --- a/src/app/scoreboard/playerscore/playerscore.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, Input } from "@angular/core"; -import { AgentNameService } from "../../services/agentName.service"; -import { AgentRoleService } from "../../services/agentRole.service"; -import { NgIf, NgFor } from "@angular/common"; -import { AbilitiesComponent } from "../../abilities/abilities.component"; -import { TranslateModule } from "@ngx-translate/core"; -import { NameoverridePipe } from "../../pipes/nameoverride.pipe"; - -@Component({ - selector: "app-playerscore", - templateUrl: "./playerscore.component.html", - styleUrls: ["./playerscore.component.scss"], - imports: [NgIf, NgFor, AbilitiesComponent, NameoverridePipe], -}) -export class PlayerscoreComponent { - public readonly assets: string = "../../../assets"; - - @Input() match!: any; - @Input() player!: any; - @Input() color!: "attacker" | "defender"; - @Input() side!: "left" | "right"; - @Input() hideAuxiliary = false; - - get showAssistCounts() { - return this.match.teams.findIndex((e: any) => e.hasDuplicateAgents) == -1; - } - - numSequence(n: number): number[] { - return Array(n); - } - - getAgentName(agent: string): string { - return AgentNameService.getAgentName(agent); - } - - getAgentRole(agent: string): string { - return AgentRoleService.getAgentRole(agent); - } - - getOverrideNames(): Map { - let toReturn = this.match?.tools?.nameOverrides?.overrides; - if (!toReturn) { - toReturn = new Map(); - } - return toReturn; - } -} - -@Component({ - selector: "app-playerscore-minimal", - templateUrl: "./playerscore-minimal.component.html", - styleUrls: ["./playerscore.component.scss"], - imports: [TranslateModule, NgIf, NameoverridePipe], -}) -export class PlayerscoreMinimalComponent extends PlayerscoreComponent {} diff --git a/src/app/scoreboard/roundreasons/roundreasons.component.html b/src/app/scoreboard/roundreasons/roundreasons.component.html deleted file mode 100644 index ff9ecafc..00000000 --- a/src/app/scoreboard/roundreasons/roundreasons.component.html +++ /dev/null @@ -1,66 +0,0 @@ -
-
-
- {{ match.teams[0].teamTricode }} -
-
-
-
- -
- -
-
- -
-
- -
-
{{ record.round }}
-
- -
-
{{ record.round }}
-
-
-
-
- -
-
- {{ match.teams[1].teamTricode }} -
-
-
-
-
- -
-
- -
-
{{ record.round }}
-
-
-
-
-
diff --git a/src/app/scoreboard/roundreasons/roundreasons.component.scss b/src/app/scoreboard/roundreasons/roundreasons.component.scss deleted file mode 100644 index cc8d8720..00000000 --- a/src/app/scoreboard/roundreasons/roundreasons.component.scss +++ /dev/null @@ -1,170 +0,0 @@ -.round-reasons-container { - display: block; - max-width: 600px; - align-items: center; - gap: 4px; - padding: 0px 4px; - position: relative; - align-self: stretch; - background-color: #0f1923cc; - border-radius: 6px; - box-shadow: inset 34px 0px 24.7px -8px #0f1923; - top: -400px; -} - -.left-team { - display: flex; - padding-top: 2px; -} - -.right-team { - display: flex; - padding-bottom: 2px; -} - -.team-info { - max-width: 75px; - min-width: 75px; - color: white; - - text-align: center; - line-height: 40px; - font-size: 14px; - font-weight: 800; - font-family: "Unbounded", Helvetica; -} - -.reason-container { - width: max-content; - overflow-x: visible; - float: right; - - display: inline-flex; - flex-direction: row; - flex-wrap: nowrap; -} - -.image-container { - position: relative; - width: 24px; - height: 24px; -} - -.image { - position: absolute; - width: 24px; - height: 24px; - top: 0; - left: 0; - object-fit: cover; -} - -.round-number { - position: absolute; - padding: 0px 0px; - margin: 0px 0px; - - width: 24px; - height: 40px; - line-height: 40px; - - text-align: center; - color: rgba(255, 255, 255, 0.8); - - font-size: 16px; - font-weight: 800; - font-family: "Unbounded", Helvetica; -} - -.round-number-upcoming { - position: absolute; - left: 0; - top: 24px; - width: 40px; - - line-height: 40px; - text-align: center; - color: white; - - font-size: 20px; - font-weight: 800; - font-family: "Unbounded", Helvetica; -} - -.reason-color { - display: inline-flex; - flex-direction: column; - height: 40px; - width: 25px; - align-items: flex-start; - justify-content: center; - padding: 0px 6px; - margin: 0px 1px; - position: relative; - flex: 0 0 auto; - - &.top { - @extend .reason-color; - border-top-width: 2px; - border-top-style: solid; - - // Colors need to be in top and bottom because the gradient is shifts direction - &.attacker { - @extend .top; - border-color: var(--attacker-color-secondary); - background: linear-gradient( - 180deg, - rgba(var(--attacker-color-secondary-rgb), 0.28) 0%, - rgba(var(--attacker-color-secondary-rgb), 0) 100% - ); - } - - &.defender { - @extend .top; - border-color: var(--defender-color-shield-currency); - background: linear-gradient( - 180deg, - rgba(var(--defender-color-shield-currency-rgb), 0.28) 0%, - rgba(var(--defender-color-shield-currency-rgb), 0) 100% - ); - } - } - - &.bottom { - @extend .reason-color; - border-bottom-width: 2px; - border-bottom-style: solid; - - &.attacker { - @extend .bottom; - border-color: var(--attacker-color-secondary); - background: linear-gradient( - 180deg, - rgba(var(--attacker-color-secondary-rgb), 0) 0%, - rgba(var(--attacker-color-secondary-rgb), 0.28) 100% - ); - } - - &.defender { - @extend .bottom; - border-color: var(--defender-color-shield-currency); - background: linear-gradient( - 180deg, - rgba(var(--defender-color-shield-currency-rgb), 0) 0%, - rgba(var(--defender-color-shield-currency-rgb), 0.28) 100% - ); - } - } -} - -.divider { - position: absolute; - top: 30%; -} - -.line { - position: relative; - width: 1px; - height: 40px; - object-fit: cover; -} diff --git a/src/app/scoreboard/roundreasons/roundreasons.component.ts b/src/app/scoreboard/roundreasons/roundreasons.component.ts deleted file mode 100644 index db7c7463..00000000 --- a/src/app/scoreboard/roundreasons/roundreasons.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, Input } from "@angular/core"; -import { NgIf, NgFor, SlicePipe } from "@angular/common"; - -interface recordType { - type: string; - wasAttack: boolean; - round: number; -} - -interface matchType { - switchRound: number; - firstOtRound: number; - roundNumber: number; - teams: [ - { - teamTricode: string; - roundRecord: recordType[]; - }, - { - teamTricode: string; - roundRecord: recordType[]; - }, - ]; -} - -@Component({ - selector: "app-roundreasons", - templateUrl: "./roundreasons.component.html", - styleUrls: ["./roundreasons.component.scss"], - imports: [NgIf, NgFor, SlicePipe], -}) -export class RoundreasonsComponent { - @Input() match!: matchType; - public readonly assets: string = "../../../assets"; - - public readonly roundRecordLength: number = 10; - private readonly extraRounds: number = 1; - - getReasonStartIndex(): number { - // Start index should be the first 10 rounds of the match OR - // a 10 round window offset by the extra rounds to show - return this.match.roundNumber + this.extraRounds - 1 < this.roundRecordLength - ? 0 - : this.match.roundNumber + this.extraRounds - 1 - this.roundRecordLength; - } -} diff --git a/src/app/scoreboard/scoreboard.component.html b/src/app/scoreboard/scoreboard.component.html deleted file mode 100644 index 72c96ae2..00000000 --- a/src/app/scoreboard/scoreboard.component.html +++ /dev/null @@ -1,79 +0,0 @@ -
-
-
-
- -
-
-
{{ match.teams[0].teamName }}
-
-
- - {{ match.teams[0].spentThisRound }} -
-
{{ "scoreboard.spent" | translate }}
-
-
-
- -
-
- -
-
-
{{ match.teams[1].teamName }}
-
-
{{ "scoreboard.spent" | translate }}
-
- - {{ match.teams[1].spentThisRound }} -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
diff --git a/src/app/scoreboard/scoreboard.component.scss b/src/app/scoreboard/scoreboard.component.scss deleted file mode 100644 index edd1e5f3..00000000 --- a/src/app/scoreboard/scoreboard.component.scss +++ /dev/null @@ -1,159 +0,0 @@ -.flip { - transform: rotateY(180deg); -} - -.team-icon-container { - display: inline-flex; - justify-content: center; - align-items: center; - position: relative; - width: 11%; - height: 100%; -} - -.team-icon { - position: relative; - max-width: 80%; - max-height: 80%; -} - -.scoreboard-container { - display: inline-flex; - flex-direction: column; - align-items: flex-start; - gap: 8px; - position: absolute; - top: 546px; - left: 19px; -} - -.scoreboard-header-container { - display: flex; - height: 64px; - align-items: flex-start; - gap: 32px; - position: relative; - align-self: stretch; - width: 100%; -} - -.team-container { - display: flex; - width: 400px; - align-items: center; - position: relative; - flex: 1; - align-self: stretch; - flex-grow: 1; - border-radius: 8px; - overflow: visible; - background: linear-gradient( - 90deg, - rgba(15, 25, 35, 0.65) 0%, - rgba(15, 25, 35, 0.53) 53%, - rgba(15, 25, 35, 0) 75%, - rgba(15, 25, 35, 0) 100% - ); -} - -.money-spent-container { - display: inline-flex; - align-items: flex-end; - gap: 8px; - position: relative; - flex: 0 0 auto; -} - -.teaminfo-wrapper { - display: inline-flex; - flex-direction: column; - justify-content: flex-end; - position: relative; - flex: 0 0 auto; - &-left { - @extend .teaminfo-wrapper; - align-items: flex-start; - } - &-right { - @extend .teaminfo-wrapper; - align-items: flex-end; - } -} - -.teamname-text { - position: relative; - width: fit-content; - margin-top: -1px; - font-family: "Unbounded", Helvetica; - font-weight: 800; - color: #ffffff; - font-size: 36px; - text-align: center; - letter-spacing: -0.72px; - line-height: normal; - white-space: nowrap; - text-transform: uppercase; -} - -.money-spent-wrapper { - margin-top: -1px; - font-family: "Unbounded", Helvetica; - color: #ffffffe6; - font-size: 12px; - letter-spacing: 0; - position: relative; - width: fit-content; - font-weight: 700; - text-align: center; - line-height: normal; - white-space: nowrap; -} - -.credits-icon { - position: relative; - width: 12px; - height: 12px; - display: unset; -} - -.money-spent-label-text { - position: relative; - width: fit-content; - margin-top: -1px; - font-family: "Unbounded", Helvetica; - font-weight: 700; - color: #ffffff99; - font-size: 12px; - text-align: center; - letter-spacing: -0.24px; - line-height: normal; - white-space: nowrap; -} - -.scoreboard-content-container { - display: flex; - width: 1882px; - align-items: flex-start; - justify-content: space-between; - position: relative; - flex: 0 0 auto; -} - -.playerscore-wrapper { - display: inline-flex; - flex-direction: column; - height: 415px; - align-items: flex-start; - gap: 10px; - padding: 13px 16px; - background-color: #0f1923cc; - border-radius: 8px; - overflow: hidden; - position: relative; - flex: 0 0 auto; -} - -.round-reasons { - position: relative; - bottom: 40px; -} diff --git a/src/app/scoreboard/scoreboard.component.ts b/src/app/scoreboard/scoreboard.component.ts deleted file mode 100644 index c3471c78..00000000 --- a/src/app/scoreboard/scoreboard.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, Input, Pipe, PipeTransform, forwardRef, inject } from "@angular/core"; -import { ActivatedRoute } from "@angular/router"; -import { NgIf, NgFor } from "@angular/common"; -import { RoundreasonsComponent } from "./roundreasons/roundreasons.component"; -import { - PlayerscoreComponent, - PlayerscoreMinimalComponent, -} from "./playerscore/playerscore.component"; -import { TranslateModule } from "@ngx-translate/core"; - -@Component({ - selector: "app-scoreboard", - templateUrl: "./scoreboard.component.html", - styleUrls: ["./scoreboard.component.scss"], - imports: [ - TranslateModule, - NgIf, - RoundreasonsComponent, - NgFor, - PlayerscoreComponent, - PlayerscoreMinimalComponent, - forwardRef(() => ScoreboardOrderPipe), - ], -}) -export class ScoreboardComponent { - private route = inject(ActivatedRoute); - - @Input() match!: any; - @Input() hideAuxiliary = false; - - isMinimal(): boolean { - if (this.route.snapshot.data["minimal"]) { - return this.route.snapshot.data["minimal"]; - } else { - return false; - } - } - - trackByPlayerId(index: number, player: any) { - return player.playerId; - } - - numSequence(n: number): number[] { - return Array(n); - } -} - -@Pipe({ name: "scoreboardOrder" }) -export class ScoreboardOrderPipe implements PipeTransform { - transform(players: any): MinPlayer[] { - if (!Array.isArray(players)) return []; - - players.sort((a: any, b: any) => { - if (a.kills < b.kills) return 1; - if (a.kills > b.kills) return -1; - return 0; - }); - return players; - } -} - -export interface MinPlayer { - playerId: string; - kills: number; -} diff --git a/src/app/services/SocketService.ts b/src/app/services/SocketService.ts index 5a34658d..8eeea412 100644 --- a/src/app/services/SocketService.ts +++ b/src/app/services/SocketService.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-unsafe-function-type */ import * as io from "socket.io-client"; -import { ISessionData } from "../mapban-ui/mapban-ui.component"; +import { ISessionData } from "../overlays/mapban-overlay/mapban-overlay.component"; export class SocketService { matchSocket!: io.Socket; diff --git a/src/app/services/Types.ts b/src/app/services/Types.ts new file mode 100644 index 00000000..1591e0ac --- /dev/null +++ b/src/app/services/Types.ts @@ -0,0 +1,230 @@ +//#region Regular Matches +export interface IMatchData { + groupCode: string; + isRanked: boolean; + isRunning: boolean; + roundNumber: number; + roundPhase: string; + teams: ITeamData[]; + spikeState: ISpikeState; + map: string; + timeoutState: ITimeoutState; + showAliveKDA: boolean; + tools: IToolsData; + switchRound: number; + firstOtRound: number; + attackersWon: boolean; +} + +export interface ITeamData { + teamName: string; + teamUrl: string; + teamTricode: string; + spentThisRound: number; + isAttacking: boolean; + roundsWon: number; + players: IPlayerData[]; + roundRecord?: IRoundReason[]; +} + +export interface IPlayerData { + name: string; + fullName: string; + playerId: number; + isAlive: boolean; + agentInternal: string; + locked: boolean; + isObserved: boolean; + armorName: string; + money: number; + moneySpent: number; + highestWeapon: string; + isCaptain: boolean; + currUltPoints: number; + maxUltPoints: number; + ultReady: boolean; + hasSpike: boolean; + scoreboardAvailable: boolean; + auxiliaryAvailable: { + health: boolean; + abilities: boolean; + scoreboard: boolean; + }; + kills: number; + deaths: number; + assists: number; + killsThisRound: number; + health: number; + abilities: { + grenade: number; + ability1: number; + ability2: number; + }; + iconNameSuffix: string; +} + +export interface IRoundReason { + type: "lost" | "kills" | "defused" | "detonated" | "timeout" | "upcoming"; + wasAttack: boolean; + round: number; +} + +export interface ISpikeState { + planted: boolean; + defused: boolean; + detonated: boolean; +} + +export interface ITimeoutState { + techPause: boolean; + leftTeam: boolean; + rightTeam: boolean; + timeRemaining: number; +} + +//#endregion +//#region Tools + +export interface IToolsData { + seriesInfo: ISeriesInfo; + seedingInfo: ISeedingInfo; + tournamentInfo: ITournamentInfo; + timeoutDuration: number; + sponsorInfo: ISponsorInfo; + watermarkInfo: IWatermarkInfo; + playercamsInfo: IPlayercamsInfo; + nameOverrides: INameOverrides; +} + +export interface ISeriesInfo { + needed: number; + wonLeft: number; + wonRight: number; + mapInfo: MapPoolInfo[]; +} + +export interface ISeedingInfo { + left: string; + right: string; +} + +export interface ITournamentInfo { + name: string; + logoUrl: string; + backdropUrl: string; + enabled: boolean; +} + +export interface ISponsorInfo { + enabled: boolean; + duration: number; + sponsors: string[]; +} + +export interface IWatermarkInfo { + spectraWatermark: boolean; + customTextEnabled: boolean; + customText: string; +} + +export interface IPlayercamsInfo { + enable: boolean; + removeTricodes?: boolean; + identifier?: string; + secret?: string; + endTime?: number; + enabledPlayers?: string[]; +} + +export interface INameOverrides { + overrides: string[]; +} + +export interface IOverridesPlayercamsData { + nameOverrides: string[]; + enabledPlayers: string[]; +} + +interface BaseMapPoolInfo { + type: "past" | "present" | "future" | "disabled"; +} + +type PastMapPoolInfo = BaseMapPoolInfo & { + type: "past"; + map: string; + left: { + logo: string; + score: number; + }; + right: { + logo: string; + score: number; + }; +}; + +type PresentMapPoolInfo = BaseMapPoolInfo & { + type: "present"; + logo: string; +}; + +type FutureMapPoolInfo = BaseMapPoolInfo & { + type: "future"; + map: string; + logo: string; +}; + +type DisabledMapPoolInfo = BaseMapPoolInfo & { + type: "disabled"; +}; + +export type MapPoolInfo = + | PastMapPoolInfo + | PresentMapPoolInfo + | FutureMapPoolInfo + | DisabledMapPoolInfo; + +//#endregion +//#region Mapban +export interface IMapbanSessionData { + sessionIdentifier: string; + organizationName: string; + isSupporter: boolean; + teams: ISessionTeam[]; + format: "bo1" | "bo3" | "bo5" | "custom" | undefined; + customFormatData?: ICustomFormatData; + availableMaps: SessionMap[]; + selectedMaps: SessionMap[]; + stage: Stage; + actingTeamCode: string; + actingTeam: 0 | 1; +} + +export interface ISessionTeam { + name: string; + tricode: string; + url: string; +} + +export class SessionMap { + name: string; + bannedBy?: 0 | 1 = undefined; // 0 = left team, 1 = right team + pickedBy?: 0 | 1 = undefined; + sidePickedBy?: 0 | 1 = undefined; + pickedAttack: boolean | undefined = undefined; + score: (number | undefined)[] = [undefined, undefined]; + + constructor(name: string) { + this.name = name; + } +} + +export interface ICustomFormatData { + pickAmount: number; + banAmount: number; + hasDecider: boolean; + pickBanStates: ("pick" | "ban" | "decider")[]; + selectorTeam: (0 | 1)[]; + sideSelectorTeam: (0 | 1)[]; +} + +export type Stage = "ban" | "pick" | "side" | "decider"; diff --git a/src/app/services/dataModel.service.ts b/src/app/services/dataModel.service.ts new file mode 100644 index 00000000..9c5ed858 --- /dev/null +++ b/src/app/services/dataModel.service.ts @@ -0,0 +1,197 @@ +import { computed, inject, Injectable, signal } from "@angular/core"; +import { SocketService } from "./SocketService"; +import { IMapbanSessionData, IMatchData } from "./Types"; +import { ActivatedRoute } from "@angular/router"; +import { Config } from "../shared/config"; +import { isEqual } from "lodash"; +import { i18nHelper } from "./i18nHelper"; +import { TranslateService } from "@ngx-translate/core"; + +@Injectable({ + providedIn: "root", +}) +export class DataModelService { + protected route = inject(ActivatedRoute); + protected config = inject(Config); + protected translate = inject(TranslateService); + + constructor() { + this.route.queryParams.subscribe((params) => { + this.groupCode.set(((params["groupCode"] as string) || "").toUpperCase()); + this.sessionId.set(params["sessionId"] || ""); + const paramLang = params["lang"]?.toLowerCase() || "en"; + console.log("Setting language to", paramLang); + this.language.set(i18nHelper.resolveLanguageAlias(paramLang)); + this.translate.use(this.language()); + this.hideAuxiliary.set(params["hideAuxiliary"] === "true"); + }); + + if (this.route.firstChild && this.route.firstChild.firstChild) { + this.route.firstChild!.firstChild!.data.subscribe((data) => { + this.minimalMode.set(data["minimal"]); + }); + } + + if (!this.config.serverEndpoint || this.config.serverEndpoint.length === 0) { + console.error("No server endpoint configured, cannot connect to match data"); + return; + } + + if (!this.groupCode() || this.groupCode().length === 0) { + console.error("No group code provided, cannot connect to match data"); + } else { + SocketService.getInstance().subscribeMatch(this.onMatchUpdate.bind(this)); + SocketService.getInstance().connectMatch(this.config.serverEndpoint, this.groupCode()); + } + + if (this.sessionId() && this.sessionId().length > 0) { + if (!this.config.mapbanEndpoint || this.config.mapbanEndpoint.length === 0) { + console.error("No mapban endpoint configured, cannot connect to mapban data"); + } else { + SocketService.getInstance().subscribeMapban(this.onMapbanUpdate.bind(this)); + SocketService.getInstance().connectMapban(this.config.mapbanEndpoint, { + sessionId: this.sessionId(), + }); + } + } + } + + private onMatchUpdate(data: any) { + // Construct map for name overrides if it's a string (from JSON). + // The server keeps it as JSON to avoid having to (de)-serialize multiple times. + const tempOverrides = data?.tools?.nameOverrides?.overrides || null; + if (typeof tempOverrides === "string") { + data.tools.nameOverrides.overrides = this.jsonToMap(tempOverrides); + } + this.match.set(data); + } + + private jsonToMap(json: string): Map { + try { + const obj = JSON.parse(json); + if (Array.isArray(obj)) { + return new Map(obj); + } else { + throw new Error("Invalid JSON format for Map"); + } + } catch (error) { + console.error("Failed to parse JSON to Map:", error); + return new Map(); + } + } + + private onMapbanUpdate(data: any) { + this.mapban.set(data); + } + + public readonly groupCode = signal(""); + public readonly sessionId = signal(""); + public readonly language = signal("en"); + public readonly minimalMode = signal(false); + public readonly hideAuxiliary = signal(false); + + public readonly match = signal(initialMatchData, { equal: () => false }); + public readonly teams = computed(() => this.match().teams, { equal: () => false }); + public readonly timeoutState = computed(() => this.match().timeoutState, { + equal: () => false, + }); + public readonly spikeState = computed(() => this.match().spikeState, { + equal: isEqual, + }); + public readonly seriesInfo = computed(() => this.match().tools.seriesInfo); + public readonly seedingInfo = computed(() => this.match().tools.seedingInfo); + public readonly sponsorInfo = computed(() => this.match().tools.sponsorInfo); + public readonly watermarkInfo = computed(() => this.match().tools.watermarkInfo); + public readonly tournamentInfo = computed(() => this.match().tools.tournamentInfo); + public readonly playercamsInfo = computed(() => this.match().tools.playercamsInfo, { + equal: () => false, + }); + + public readonly mapban = signal(initialMapbanData, { equal: () => false }); +} + +//setting up with empty match state so certain ui parts dont complain +const initialMatchData: IMatchData = { + groupCode: "A", + isRanked: false, + isRunning: true, + roundNumber: 0, + roundPhase: "LOBBY", + teams: [ + { + teamName: "", + teamUrl: "", + teamTricode: "", + spentThisRound: 0, + isAttacking: false, + roundsWon: 0, + players: [], + }, + { + teamName: "", + teamUrl: "", + teamTricode: "", + spentThisRound: 0, + isAttacking: false, + roundsWon: 0, + players: [], + }, + ], + spikeState: { planted: false, defused: false, detonated: false }, + map: "Ascent", + tools: { + seriesInfo: { + needed: 1, + wonLeft: 0, + wonRight: 0, + mapInfo: [], + }, + seedingInfo: { + left: "", + right: "", + }, + tournamentInfo: { + enabled: false, + name: "", + logoUrl: "", + backdropUrl: "", + }, + timeoutDuration: 60, + sponsorInfo: { + enabled: false, + duration: 5000, + sponsors: [], + }, + // Disabling the watermark/setting a custom text without Spectra Plus is against the License terms and strictly forbidden + watermarkInfo: { + spectraWatermark: true, + customTextEnabled: false, + customText: "", + }, + playercamsInfo: { enable: false }, + nameOverrides: { overrides: [] }, + }, + timeoutState: { + techPause: false, + leftTeam: false, + rightTeam: false, + timeRemaining: 0, + }, + showAliveKDA: false, + switchRound: 12, + firstOtRound: 25, + attackersWon: false, +}; + +const initialMapbanData: IMapbanSessionData = { + sessionIdentifier: "", + organizationName: "", + isSupporter: false, + teams: [], + format: undefined, + availableMaps: [], + selectedMaps: [], + stage: "ban", + actingTeamCode: "", + actingTeam: 0, +}; diff --git a/src/app/services/displayName.service.ts b/src/app/services/displayName.service.ts new file mode 100644 index 00000000..07c44c76 --- /dev/null +++ b/src/app/services/displayName.service.ts @@ -0,0 +1,18 @@ +import { inject, Injectable } from "@angular/core"; +import { DataModelService } from "./dataModel.service"; + +@Injectable({ + providedIn: "root", +}) +export class DisplayNameService { + readonly dataModel = inject(DataModelService); + public getDisplayName(fullName: string, fallback: string): string { + const map = this.dataModel.match().tools.nameOverrides.overrides as any; + if (!map || typeof map.get !== "function") { + //check that map is actually a map (type shenanigans) + return fallback; + } else { + return map.get(fullName) || fallback; + } + } +} diff --git a/src/app/services/i18nHelper.ts b/src/app/services/i18nHelper.ts new file mode 100644 index 00000000..1b2ef5c3 --- /dev/null +++ b/src/app/services/i18nHelper.ts @@ -0,0 +1,35 @@ +export class i18nHelper { + static LanguageAliases: Record = { + jp: "ja", + zh_CN: "zh_HANS", + }; + + public static resolveLanguageAlias(alias: string) { + return this.LanguageAliases[alias] || alias; + } +} + +export enum TranslateKeys { + Playercard_Kills = "playercard.kills", + Playercard_Deaths = "playercard.deaths", + Playercards_Assists = "playercard.assists", + Endround_RoundWin = "endround.round_win", + Endround_Winner = "endround.win", + Endround_Attacker = "endround.attacker", + Endround_Defender = "endround.defender", + Endround_Round = "endround.round", + Mapinfo_Live = "mapinfo.live", + Mapinfo_Decider = "mapinfo.decider", + Mapinfo_Next = "mapinfo.next", + Watermark_Text = "topinfo.watermark", + Top_RoundNumber = "topscore.round", + Top_OvertimeNumber = "topscore.overtime", + Team_Is_Attacker = "team.attacker", + Team_Is_Defender = "team.defender", + Scoreboard_Spent = "scoreboard.spent", + Scoreboard_Kills = "scoreboard.kills", + Scoreboard_Deaths = "scoreboard.deaths", + Scoreboard_Assists = "scoreboard.assists", + Timeout_Techpause = "timeout.technical_pause", + Timeout_Tactical = "timeout.tactical_timeout", +} diff --git a/src/app/services/languageAlias.service.ts b/src/app/services/languageAlias.service.ts deleted file mode 100644 index 10d93848..00000000 --- a/src/app/services/languageAlias.service.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class LanguageAliasService { - static LanguageAliases: Record = { - jp: "ja", - zh_CN: "zh_HANS", - }; - - public static resolveLanguageAlias(alias: string) { - return this.LanguageAliases[alias] || alias; - } -} diff --git a/src/app/testing/player-controller/player-controller.component.html b/src/app/testing/player-controller/player-controller.component.html deleted file mode 100644 index bc2c8c0a..00000000 --- a/src/app/testing/player-controller/player-controller.component.html +++ /dev/null @@ -1,32 +0,0 @@ -
- - - - - - - - - - -
diff --git a/src/app/testing/player-controller/player-controller.component.scss b/src/app/testing/player-controller/player-controller.component.scss deleted file mode 100644 index e5d1a531..00000000 --- a/src/app/testing/player-controller/player-controller.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -@use "../testing.component.scss"; - -.playerControls { - height: 61px; -} diff --git a/src/app/testing/player-controller/player-controller.component.ts b/src/app/testing/player-controller/player-controller.component.ts deleted file mode 100644 index 40485f56..00000000 --- a/src/app/testing/player-controller/player-controller.component.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { booleanAttribute, Component, EventEmitter, Input, Output, OnDestroy } from "@angular/core"; -import { NgIf } from "@angular/common"; - -@Component({ - selector: "app-player-controller", - templateUrl: "./player-controller.component.html", - styleUrl: "./player-controller.component.scss", - imports: [NgIf], -}) -export class PlayerControllerComponent implements OnDestroy { - @Output() spikeTakenEvent = new EventEmitter(); - @Output() captainTakenEvent = new EventEmitter(); - @Output() spectateTakenEvent = new EventEmitter(); - - @Input() showInterface = true; - @Input({ transform: booleanAttribute }) flipInterface = false; - - @Input() teamId = 0; - - inCombat = true; - inShopping = false; - inEnd = false; - @Input() - set gamePhase(v: string) { - if (v == "combat") { - this.inCombat = true; - this.inShopping = false; - this.inEnd = false; - } else if (v == "shopping") { - this.inCombat = false; - this.inShopping = true; - this.inEnd = false; - } else { - this.inCombat = false; - this.inShopping = false; - this.inEnd = true; - } - } - - isAttacking = false; - weaponOrder = ["Vandal", "Operator", "Classic", "Spectre"]; - moneyOrder = [2900, 4700, 0, 1600]; - armorOrder = ["Heavy", "Regen", "Light", "None"]; - - static agentIndex = [0, 0]; - static agentOrder = [ - ["Vampire", "Killjoy", "Guide", "Stealth", "Smonk"], - ["Grenadier", "Terra", "Sprinter", "BountyHunter", "Mage"], - ]; - - static playerNameIndex = [0, 0]; - static playerNameOrder = [ - ["VoodooOne", "Twoperator", "ThreeOfLife", "Fourcefield", "FIVEbyFIVE"], - ["AlpacaHoarder", "BeeSting", "CowTipper", "DodoDaniel", "Eeliminator"], - ]; - - playerObject = { - name: "Test", - tagline: "DEBUG", - searchName: "Test #DEBUG", - fullName: "Test#DEBUG", - playerId: 0, - isAlive: true, - agentInternal: "Wushu", - isObserved: false, - armorName: this.armorOrder[0], - money: 2100, - moneySpent: 2900, - highestWeapon: this.weaponOrder[0], - isCaptain: false, - currUltPoints: 2, - maxUltPoints: 7, - ultReady: false, - hasSpike: false, - scoreboardAvailable: true, - auxiliaryAvailable: { - health: true, - abilities: true, - scoreboard: true, - }, - kills: 0, - deaths: 0, - assists: 0, - health: 100, - abilities: { - grenade: 1, - ability1: 1, - ability2: 0, - }, - iconNameSuffix: "", - }; - - constructor() { - this.changeStats(); - this.playerObject.playerId = Math.floor(Math.random() * (99999 - 11111 + 1) + 11111); - } - - ngOnDestroy() { - PlayerControllerComponent.agentIndex[this.teamId]--; - PlayerControllerComponent.playerNameIndex[this.teamId]--; - } - - getData(): any { - this.playerObject.agentInternal = - PlayerControllerComponent.agentOrder[this.teamId][ - PlayerControllerComponent.agentIndex[this.teamId]++ - ]; - this.playerObject.isObserved = - this.teamId === 0 && PlayerControllerComponent.playerNameIndex[this.teamId] === 0 - ? true - : false; - this.playerObject.name = - PlayerControllerComponent.playerNameOrder[this.teamId][ - PlayerControllerComponent.playerNameIndex[this.teamId]++ - ]; - this.playerObject.searchName = `${this.playerObject.name} #${this.playerObject.tagline}`; - this.playerObject.fullName = `${this.playerObject.name}#${this.playerObject.tagline}`; - return this.playerObject; - } - - kill(): void { - this.playerObject.isAlive = false; - this.stopSpectate(); - this.playerObject.armorName = this.armorOrder[3]; - this.playerObject.health = 0; - } - - revive(): void { - this.playerObject.isAlive = true; - this.playerObject.armorName = this.armorOrder[0]; - this.playerObject.health = 100; - } - - giveUltPoint(): void { - this.playerObject.currUltPoints++; - if (this.playerObject.currUltPoints == this.playerObject.maxUltPoints) { - this.playerObject.ultReady = true; - } - } - - useUlt(): void { - this.playerObject.ultReady = false; - this.playerObject.currUltPoints = 0; - } - - makeLeader(): void { - this.captainTakenEvent.emit(); - this.playerObject.isCaptain = true; - } - - removeLeader(): void { - this.playerObject.isCaptain = false; - } - - giveSpike(): void { - this.spikeTakenEvent.emit(); - this.playerObject.hasSpike = true; - } - - removeSpike(): void { - this.playerObject.hasSpike = false; - } - - spectate(): void { - this.spectateTakenEvent.emit(); - this.playerObject.isObserved = true; - } - - stopSpectate(): void { - this.playerObject.isObserved = false; - } - - changeWeapon(): void { - let i = this.weaponOrder.findIndex((e) => e == this.playerObject.highestWeapon); - i++; - i %= this.weaponOrder.length; - this.playerObject.highestWeapon = this.weaponOrder[i]; - - //money change here - let j = this.moneyOrder.findIndex((e) => e == this.playerObject.moneySpent); - this.playerObject.money += this.playerObject.moneySpent; - j++; - j %= this.moneyOrder.length; - this.playerObject.moneySpent = this.moneyOrder[j]; - this.playerObject.money -= this.playerObject.moneySpent; - } - - changeShield(): void { - let i = this.armorOrder.findIndex((e) => e == this.playerObject.armorName); - i++; - i %= this.armorOrder.length; - this.playerObject.armorName = this.armorOrder[i]; - this.playerObject.health = Math.floor(Math.random() * 100) + 1; - } - - changeStats(): void { - this.playerObject.kills = Math.floor(Math.random() * 20); - this.playerObject.deaths = Math.floor(Math.random() * 20); - this.playerObject.assists = Math.floor(Math.random() * 20); - } -} diff --git a/src/app/testing/team-controller/team-controller.component.html b/src/app/testing/team-controller/team-controller.component.html deleted file mode 100644 index 33e2384b..00000000 --- a/src/app/testing/team-controller/team-controller.component.html +++ /dev/null @@ -1,14 +0,0 @@ -
-
- - - -
-
- -
-
diff --git a/src/app/testing/team-controller/team-controller.component.scss b/src/app/testing/team-controller/team-controller.component.scss deleted file mode 100644 index 4a280a5d..00000000 --- a/src/app/testing/team-controller/team-controller.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -@use "../testing.component.scss"; - -.playerControllerSpace { - position: relative; - width: 100%; - top: 70px; - left: 0; - display: flex; - flex-direction: column; - gap: 31px; - &.shop { - @extend .playerControllerSpace; - gap: 23px; - } -} diff --git a/src/app/testing/team-controller/team-controller.component.ts b/src/app/testing/team-controller/team-controller.component.ts deleted file mode 100644 index 61054d93..00000000 --- a/src/app/testing/team-controller/team-controller.component.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { - booleanAttribute, - Component, - ComponentRef, - EventEmitter, - Input, - numberAttribute, - Output, - ViewChild, - ViewContainerRef, -} from "@angular/core"; -import { PlayerControllerComponent } from "../player-controller/player-controller.component"; -import { NgIf } from "@angular/common"; - -@Component({ - selector: "app-team-controller", - templateUrl: "./team-controller.component.html", - styleUrl: "./team-controller.component.scss", - imports: [NgIf], -}) -export class TeamControllerComponent { - @ViewChild("playerControllerSpace", { read: ViewContainerRef }) - playerControllerSpace!: ViewContainerRef; - @Output() roundWinEvent = new EventEmitter(); - @Output() spectateTakenEvent = new EventEmitter(); - @Input({ transform: booleanAttribute }) flipInterface = false; - @Input({ transform: numberAttribute }) teamId = 0; - @Input() teamName!: string; - @Input() teamCode!: string; - - _roundPhase: "shopping" | "combat" | "end" = "combat"; - @Input() - set roundPhase(s: "shopping" | "combat" | "end") { - this._roundPhase = s; - this.propagateRoundPhase(s); - } - get roundPhase() { - return this._roundPhase; - } - - _showInterface = true; - @Input() - set showInterface(b: boolean) { - this._showInterface = b; - this.propagateInterfaceState(b); - } - get showInterface() { - return this._showInterface; - } - - playerControllers: ComponentRef[] = []; - - players: PlayerControllerComponent[] = []; - teamObject = { - players: this.players, - isAttacking: false, - teamName: "Team Name", - teamTricode: "TEAM", - teamUrl: "assets/misc/icon.webp", - roundsWon: 0, - spentThisRound: 1000, - roundRecord: [], - hasDuplicateAgents: false, - }; - - getData(): any { - this.teamObject.teamName = this.teamName; - this.teamObject.teamTricode = this.teamCode; - return this.teamObject; - } - - addPlayer(): void { - const newPlayerControllerRef = - this.playerControllerSpace.createComponent( - PlayerControllerComponent, - ); - this.playerControllers.push(newPlayerControllerRef); - - newPlayerControllerRef.instance.isAttacking = this.teamObject.isAttacking; - newPlayerControllerRef.instance.showInterface = this.showInterface; - newPlayerControllerRef.instance.flipInterface = this.flipInterface; - newPlayerControllerRef.instance.gamePhase = this.roundPhase; - newPlayerControllerRef.instance.teamId = this.teamId; - newPlayerControllerRef.instance.spikeTakenEvent.subscribe(this.spikeCleanse.bind(this)); - newPlayerControllerRef.instance.captainTakenEvent.subscribe(this.captainCleanse.bind(this)); - newPlayerControllerRef.instance.spectateTakenEvent.subscribe(this.clearSpectate.bind(this)); - - this.players.push(newPlayerControllerRef.instance.getData()); - } - - removePlayer(): void { - const playerController = this.playerControllers.pop(); - playerController?.destroy(); - this.players.pop(); - } - - swapColor(): void { - this.teamObject.isAttacking = !this.teamObject.isAttacking; - - for (const playerController of this.playerControllers) { - const player = playerController.instance; - player.isAttacking = this.teamObject.isAttacking; - player.removeSpike(); - } - } - - addRoundwin(): void { - this.teamObject.roundsWon++; - this.teamObject.roundsWon %= 13; - this.roundWinEvent.emit(); - } - - spikeCleanse(): void { - for (const playerController of this.playerControllers) { - playerController.instance.removeSpike(); - } - } - - captainCleanse(): void { - for (const playerController of this.playerControllers) { - playerController.instance.removeLeader(); - } - } - - private clearSpectate(): void { - this.spectateCleanse(); - this.spectateTakenEvent.emit(); - } - - spectateCleanse(): void { - for (const playerController of this.playerControllers) { - playerController.instance.stopSpectate(); - } - } - - propagateInterfaceState(state: boolean) { - for (const playerController of this.playerControllers) { - playerController.instance.showInterface = state; - } - } - - propagateRoundPhase(phase: "shopping" | "combat" | "end") { - for (const playerController of this.playerControllers) { - playerController.instance.gamePhase = phase; - } - } -} diff --git a/src/app/testing/testing.component.html b/src/app/testing/testing.component.html deleted file mode 100644 index acf80a48..00000000 --- a/src/app/testing/testing.component.html +++ /dev/null @@ -1,37 +0,0 @@ -
- - -
- - - - - - -
-
- - -
-
diff --git a/src/app/testing/testing.component.scss b/src/app/testing/testing.component.scss deleted file mode 100644 index 41584d6c..00000000 --- a/src/app/testing/testing.component.scss +++ /dev/null @@ -1,71 +0,0 @@ -.testing-body { - position: relative; - width: 1920px; - height: 1080px; - background-size: cover; - background-position: 50% 50%; -} - -.bg1 { - background-image: url(/assets/backgrounds/bg1.webp); -} - -.bg2 { - background-image: url(/assets/backgrounds/bg2.webp); -} - -.bg3 { - background-image: url(/assets/backgrounds/bg3.webp); -} - -.bg4 { - background-image: url(/assets/backgrounds/bg4.webp); -} - -.bg5 { - background-image: none; -} - -.teamControllerContainer { - position: absolute; - top: 47%; - left: 5%; - width: 90%; - display: flex; - flex-direction: row; - justify-content: space-between; - &.shop { - @extend .teamControllerContainer; - top: 48%; - left: 7%; - width: 86%; - } -} - -.matchControlsSpace { - position: absolute; - top: 25%; - left: 25%; - width: 50%; - justify-content: center; -} - -.test-button { - color: white; - background-color: #0f1923d9; - border: 2px groove gray; - padding: 4px; - font-family: Montserrat, Helvetica; - max-height: 28px; -} - -.controlBlock { - display: flex; - flex-direction: row; - flex-wrap: wrap; - gap: 5px; - &.flip { - @extend .controlBlock; - flex-direction: row-reverse; - } -} diff --git a/src/app/testing/testing.component.ts b/src/app/testing/testing.component.ts deleted file mode 100644 index f6c12ab0..00000000 --- a/src/app/testing/testing.component.ts +++ /dev/null @@ -1,226 +0,0 @@ -import { AfterViewInit, Component, ViewChild, inject } from "@angular/core"; -import { TrackerComponent } from "../tracker/tracker.component"; -import { ActivatedRoute } from "@angular/router"; -import { TeamControllerComponent } from "./team-controller/team-controller.component"; -import { HttpClient } from "@angular/common/http"; -import { NgIf } from "@angular/common"; -import { TranslateService } from "@ngx-translate/core"; -import { LanguageAliasService } from "../services/languageAlias.service"; - -@Component({ - selector: "app-testing", - templateUrl: "./testing.component.html", - styleUrls: ["./testing.component.scss"], - imports: [TrackerComponent, NgIf, TeamControllerComponent], -}) -export class TestingComponent implements AfterViewInit { - private route = inject(ActivatedRoute); - private http = inject(HttpClient); - private translate = inject(TranslateService); - - @ViewChild(TrackerComponent) trackerComponent!: TrackerComponent; - @ViewChild("team1") team1!: TeamControllerComponent; - @ViewChild("team2") team2!: TeamControllerComponent; - - matchData: any; - isSpikePlanted = false; - roundPhase: "shopping" | "combat" | "end" = "combat"; - hideAuxiliary = false; - - loadingPreview = false; - loadingPreviewText = "Loading preview match data..."; - previewCode = ""; - previewMatch = undefined; - lang = "en"; - - showInterface = true; - showBackground = true; - backgroundClass = "bg1"; - backgroundClassId = 1; - - constructor() { - this.route.queryParams.subscribe((params) => { - this.hideAuxiliary = params["hideAuxiliary"] != undefined; - this.previewCode = params["previewCode"] || ""; - const paramLang = params["lang"]?.toLowerCase() || "en"; - this.lang = LanguageAliasService.resolveLanguageAlias(paramLang); - }); - } - - async ngAfterViewInit() { - if (this.previewCode !== "") { - this.loadingPreview = true; - this.http.get(`https://eu.valospectra.com:5101/preview/${this.previewCode}`).subscribe({ - next: (data: any) => { - this.previewMatch = data; - this.matchData = this.previewMatch; - console.log("Preview match data loaded:", this.matchData); - this.team2.swapColor(); - this.trackerComponent.updateMatch(this.matchData); - for (let i = 0; i < 5; i++) { - this.team1.addPlayer(); - this.team2.addPlayer(); - } - - this.roundPhase = this.matchData.roundPhase; - - this.loadingPreview = false; - }, - error: (err) => { - console.error("Error fetching preview match data:", err); - this.previewCode = ""; - this.ngAfterViewInit(); - }, - }); - } else { - this.matchData = this.trackerComponent.match; - this.matchData.teams[0] = this.team1.getData(); - this.matchData.teams[1] = this.team2.getData(); - - this.matchData.switchRound = 6; - - this.matchData.teams[0].roundRecord = [ - { type: "detonated", wasAttack: true, round: 1 }, - { type: "lost", wasAttack: true, round: 2 }, - { type: "kills", wasAttack: true, round: 3 }, - { type: "timeout", wasAttack: true, round: 4 }, - { type: "lost", wasAttack: true, round: 5 }, - { type: "kills", wasAttack: false, round: 6 }, - { type: "lost", wasAttack: false, round: 7 }, - { type: "defused", wasAttack: false, round: 8 }, - { type: "lost", wasAttack: false, round: 9 }, - { type: "lost", wasAttack: false, round: 10 }, - ]; - - this.matchData.teams[1].roundRecord = [ - { type: "lost", wasAttack: false, round: 1 }, - { type: "defused", wasAttack: false, round: 2 }, - { type: "lost", wasAttack: false, round: 3 }, - { type: "lost", wasAttack: false, round: 4 }, - { type: "kills", wasAttack: false, round: 5 }, - { type: "lost", wasAttack: true, round: 6 }, - { type: "detonated", wasAttack: true, round: 7 }, - { type: "lost", wasAttack: true, round: 8 }, - { type: "kills", wasAttack: true, round: 9 }, - { type: "timeout", wasAttack: true, round: 10 }, - ]; - - this.matchData.tools = { - seriesInfo: { - needed: 3, - wonLeft: 1, - wonRight: 2, - mapInfo: [ - { - type: "past", - map: "Fracture", - left: { - score: 13, - logo: "assets/misc/icon.webp", - }, - right: { - score: 9, - logo: "assets/misc/icon.webp", - }, - }, - { - type: "present", - logo: "assets/misc/icon.webp", - }, - { - type: "future", - map: "Haven", - logo: "assets/misc/icon.webp", - }, - ], - }, - seedingInfo: { - left: "Group A", - right: "Group B", - }, - tournamentInfo: { - name: "", - logoUrl: "", - backdropUrl: "", - enabled: true, - }, - watermarkInfo: { - spectraWatermark: true, - customTextEnabled: false, - customText: "This is a tournament", - }, - playercamsInfo: { - enable: true, - identifier: "SPPCDEBUG", - enabledPlayers: ["VoodooOne#DEBUG", "AlpacaHoarder#DEBUG"], - }, - nameOverrides: { - overrides: new Map([ - ["VoodooOne#DEBUG", "Voodoo One"], - ["AlpacaHoarder#DEBUG", "AlpacaHoarder"], - ]), - }, - }; - this.team2.swapColor(); - this.trackerComponent.updateMatch(this.matchData); - for (let i = 0; i < 5; i++) { - this.team1.addPlayer(); - this.team2.addPlayer(); - } - this.roundPhase = this.matchData.roundPhase; - this.translate.use(this.lang); - this.changeRoundPhase(); - } - } - - changeRoundPhase(): void { - if (this.matchData.roundPhase == "shopping") { - this.matchData.roundPhase = "combat"; - } else if (this.matchData.roundPhase == "combat") { - this.matchData.roundPhase = "end"; - } else if (this.matchData.roundPhase == "LOBBY") { - this.matchData.roundPhase = "combat"; - } else { - this.matchData.roundPhase = "shopping"; - } - this.roundPhase = this.matchData.roundPhase; - } - - swapTeamColors(): void { - this.team1.swapColor(); - this.team2.swapColor(); - } - - updateRoundNumber(): void { - const a = this.team1.teamObject.roundsWon; - const b = this.team2.teamObject.roundsWon; - this.matchData.roundNumber = a + b; - } - - plantSpike(): void { - this.matchData.spikeState = { planted: true, detonated: false, defused: false }; - this.isSpikePlanted = true; - console.log(this.backgroundClassId); - - if (this.backgroundClassId == 1 || this.backgroundClassId == 3) { - this.switchBackground(); - } - } - - detonateDefuseSpike(): void { - this.matchData.spikeState = { planted: false, detonated: false, defused: false }; - this.isSpikePlanted = false; - } - - toggleInterface(): void { - this.showInterface = !this.showInterface; - } - - switchBackground(): void { - this.backgroundClass = "bg" + ++this.backgroundClassId; - this.backgroundClassId %= 5; - if (this.isSpikePlanted && (this.backgroundClassId == 1 || this.backgroundClassId == 3)) { - this.switchBackground(); - } - } -} diff --git a/src/app/timeout/timeout.component.html b/src/app/timeout/timeout.component.html deleted file mode 100644 index 3d2852e5..00000000 --- a/src/app/timeout/timeout.component.html +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-
-
- -
- {{ "timeout.technical_pause" | translate }} -
-
- {{ - "timeout.tactical_timeout" - | translate: { teamName: match.teams[timeout.leftTeam ? 0 : 1].teamName } - }} -
-
-
-
-
-
{{ timeLeft }}s
-
-
-
-
diff --git a/src/app/timeout/timeout.component.scss b/src/app/timeout/timeout.component.scss deleted file mode 100644 index 5ec623fd..00000000 --- a/src/app/timeout/timeout.component.scss +++ /dev/null @@ -1,111 +0,0 @@ -.iner-wrapper { - position: absolute; - left: 26.23%; - top: 23%; - width: 875px; - height: 200px; - overflow: hidden; -} - -@keyframes slide-in { - 0% { - left: -102%; - } - 75% { - left: -102%; - } - 100% { - left: 0%; - } -} - -.timeout-box { - position: relative; - width: 875px; - height: 200px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: center; - align-items: center; - // animation-name: slide-in; - // animation-duration: 1s; - // animation-fill-mode: both; - // transition-timing-function: ease-in-out; -} - -.info-box { - position: relative; - flex-grow: 1; - display: flex; - flex-direction: column; - flex-wrap: nowrap; - justify-content: center; - align-items: center; - overflow: hidden; - row-gap: 10px; -} - -.info-image { - position: relative; - max-height: 120px; - max-width: 400px; -} - -.info-text { - position: relative; - width: fit-content; - text-shadow: 0px 1.21px 4.83px rgba(0, 0, 0, 0.12); - font-family: "Montserrat", Helvetica; - font-weight: 700; - color: #ffffff; - font-size: 25px; - font-style: normal; - text-align: center; - // letter-spacing: 1.2px; - line-height: normal; -} - -.info-text-tech-pause { - @extend .info-text; - font-size: 40px; - font-family: "Unbounded", Helvetica; -} - -.add-margin { - margin-bottom: 10px; -} - -.progress-bar { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 23px; - background: rgba(255, 255, 255, 0.2); - display: flex; - justify-content: center; - align-items: center; -} - -.progress { - position: absolute; - left: 0; - height: 100%; - background: rgba(255, 255, 255, 0.4); - transition: width 1s linear; - z-index: 1; -} - -.timer { - width: fit-content; - font-family: "Montserrat", Helvetica; - font-weight: 700; - color: #ffffff; - font-size: 18px; - z-index: 2; - text-shadow: 0 0 2px rgba(0, 0, 0, 0.5); -} diff --git a/src/app/timeout/timeout.component.ts b/src/app/timeout/timeout.component.ts deleted file mode 100644 index 82a77049..00000000 --- a/src/app/timeout/timeout.component.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { Component, OnInit, ViewChild, AfterViewInit, OnDestroy, inject } from "@angular/core"; -import { TrackerComponent } from "../tracker/tracker.component"; -import { SocketService } from "../services/SocketService"; -import { ActivatedRoute } from "@angular/router"; -import { Config } from "../shared/config"; -import { trigger, transition, style, animate } from "@angular/animations"; -import { NgIf } from "@angular/common"; -import { TranslateModule, TranslateService } from "@ngx-translate/core"; -import { LanguageAliasService } from "../services/languageAlias.service"; - -@Component({ - selector: "app-timeout", - templateUrl: "./timeout.component.html", - styleUrls: ["./timeout.component.scss"], - animations: [ - trigger("fade", [ - transition(":enter", [style({ opacity: "0" }), animate("0.3s", style({ opacity: "1" }))]), - transition(":leave", animate("0.3s", style({ opacity: "0" }))), - ]), - ], - imports: [TranslateModule, NgIf], -}) -export class TimeoutComponent implements OnInit, AfterViewInit, OnDestroy { - private route = inject(ActivatedRoute); - private config = inject(Config); - private translate = inject(TranslateService); - - @ViewChild(TrackerComponent) trackerComponent!: TrackerComponent; - groupCode = "UNKNOWN"; - lang = "en"; - socketService!: SocketService; - match: any; - timeout: any; //Store timeout data extracted from match object - tournamentBackgroundUrl = "../../assets/misc/backdrop.webp"; - timeLeft!: number; //Store remaining time in seconds - interval: any; - anyTimeout = false; - - constructor() { - this.route.queryParams.subscribe((params) => { - this.groupCode = params["groupCode"]?.toUpperCase() || "UNKNOWN"; - const paramLang = params["lang"]?.toLowerCase() || "en"; - this.lang = LanguageAliasService.resolveLanguageAlias(paramLang); - }); - } - - ngOnInit(): void { - this.match = { - groupCode: "A", - teams: [ - { - isAttacking: true, - teamName: "Team Name", - teamTricode: "TEAM", - teamUrl: "assets/misc/icon.webp", - roundsWon: 0, - spentThisRound: 1000, - players: [], - }, - { - isAttacking: false, - teamName: "Team Name", - teamTricode: "TEAM", - teamUrl: "assets/misc/icon.webp", - roundsWon: 0, - spentThisRound: 1000, - players: [], - }, - ], - tools: { - timeoutDuration: 60, - }, - timeoutState: { - techPause: false, - leftTeam: false, - leftTeamStartTime: 0, - rightTeam: false, - rightTeamStartTime: 0, - }, - }; - - this.timeout = this.match.timeoutState; - this.socketService = SocketService.getInstance().connectMatch( - this.config.serverEndpoint, - this.groupCode, - ); - this.getTournamentBackdropUrl(); - this.preloadImage(this.tournamentBackgroundUrl); - this.preloadImage(this.match.teams[0].teamUrl); - this.preloadImage(this.match.teams[1].teamUrl); - this.translate.use(this.lang); - } - - ngAfterViewInit(): void { - this.timeLeft = this.match.tools.timeoutDuration || 60; - this.socketService.subscribeMatch((data: any) => { - this.updateTimeout(data); - }); - } - - public updateTimeout(data: any) { - this.match = data; - - const newTimeout = this.match.timeoutState; - if (newTimeout.techPause && newTimeout.techPause !== this.timeout.techPause) { - this.anyTimeout = true; - this.getTournamentBackdropUrl(); - } - - if (newTimeout.leftTeam && newTimeout.leftTeam !== this.timeout.leftTeam) { - this.anyTimeout = true; - this.getTournamentBackdropUrl(); - } - - if (newTimeout.rightTeam && newTimeout.rightTeam !== this.timeout.rightTeam) { - this.anyTimeout = true; - this.getTournamentBackdropUrl(); - } - - if (this.anyTimeout && !newTimeout.techPause && !newTimeout.leftTeam && !newTimeout.rightTeam) { - this.anyTimeout = false; - this.timeLeft = this.match.tools.timeoutDuration || 60; - } - - this.timeLeft = newTimeout.timeRemaining; - this.timeout = this.match.timeoutState; - } - - private getTournamentBackdropUrl() { - this.tournamentBackgroundUrl = - this.match?.tools?.tournamentInfo?.backdropUrl && - this.match.tools.tournamentInfo.backdropUrl !== "" - ? this.match.tools.tournamentInfo.backdropUrl - : "../../assets/misc/backdrop.webp"; - } - - private preloadImage(url: string): void { - const img = new Image(); - img.src = url; - } - - setTournamentBackgroundImage(): string { - return `url(${this.tournamentBackgroundUrl})`; - } - - getProgressWidth(): string { - return `${(this.timeLeft / (this.match.tools.timeoutDuration || 60)) * 100}%`; - } - - ngOnDestroy() { - if (this.interval) { - clearInterval(this.interval); - } - } -} diff --git a/src/app/topscore/topinfo/mapinfo/mapinfo.component.html b/src/app/topscore/topinfo/mapinfo/mapinfo.component.html deleted file mode 100644 index 894d2db2..00000000 --- a/src/app/topscore/topinfo/mapinfo/mapinfo.component.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
-
- {{ mapinfo.map }} - {{ mapinfo.left.score }} - {{ mapinfo.right.score }} - -
-
-
-
- {{ "mapinfo.live" | translate: { map: map } }} - -
-
-
-
- {{ "mapinfo.next" | translate: { map: mapinfo.map } }} - -
-
- {{ "mapinfo.decider" | translate: { map: mapinfo.map } }} -
-
-
diff --git a/src/app/topscore/topinfo/mapinfo/mapinfo.component.scss b/src/app/topscore/topinfo/mapinfo/mapinfo.component.scss deleted file mode 100644 index 72c538b7..00000000 --- a/src/app/topscore/topinfo/mapinfo/mapinfo.component.scss +++ /dev/null @@ -1,36 +0,0 @@ -:host { - display: block; -} - -.container { - display: flex; - justify-content: center; - align-items: center; - top: 0; - left: 0; - height: 100%; -} - -.text { - position: relative; - width: fit-content; - font-family: Montserrat, Helvetica; - font-weight: 800; - color: #ffffff; - font-size: 15px; - font-style: normal; - text-align: center; - text-transform: uppercase; - letter-spacing: 0; - white-space: nowrap; - display: flex; - justify-content: center; - align-items: center; -} - -.logo { - padding: 2px 4px; - max-width: 20px; - max-height: 20px; - vertical-align: middle; -} diff --git a/src/app/topscore/topinfo/mapinfo/mapinfo.component.ts b/src/app/topscore/topinfo/mapinfo/mapinfo.component.ts deleted file mode 100644 index 06e64508..00000000 --- a/src/app/topscore/topinfo/mapinfo/mapinfo.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input, OnChanges } from "@angular/core"; -import { NgIf } from "@angular/common"; -import { TranslateModule } from "@ngx-translate/core"; - -@Component({ - selector: "app-mapinfo", - templateUrl: "./mapinfo.component.html", - styleUrls: ["./mapinfo.component.scss"], - imports: [TranslateModule, NgIf], -}) -export class MapinfoComponent implements OnChanges { - @Input() map!: string; - @Input() mapinfo!: any; - type: "past" | "present" | "disabled" | "future" = "future"; - - ngOnChanges(): void { - this.type = this.mapinfo.type; - } -} diff --git a/src/app/topscore/topinfo/topinfo.component.html b/src/app/topscore/topinfo/topinfo.component.html deleted file mode 100644 index 82376779..00000000 --- a/src/app/topscore/topinfo/topinfo.component.html +++ /dev/null @@ -1,56 +0,0 @@ -
-
- -
-
- -
-
- -
-
- - -@if (tools.watermarkInfo.spectraWatermark || tools.watermarkInfo.customTextEnabled) { -
-
- @if (tools.watermarkInfo.spectraWatermark) { - -
{{ "topinfo.watermark" | translate }}
-
© valospectra.com
- } @else { - -
{{ tools.watermarkInfo.customText }}
- } -
-
-} - - - - - - - - - diff --git a/src/app/topscore/topinfo/topinfo.component.scss b/src/app/topscore/topinfo/topinfo.component.scss deleted file mode 100644 index 25881d79..00000000 --- a/src/app/topscore/topinfo/topinfo.component.scss +++ /dev/null @@ -1,109 +0,0 @@ -.topinfo-container { - display: inline-flex; - align-items: flex-start; - position: absolute; - top: 0; - left: 4px; - border-radius: 0px 0px 8px 8px; - overflow: hidden; - &-right { - @extend .topinfo-container; - left: 1363px; - } -} - -.topinfo-pill { - display: flex; - width: 180px; - height: 24px; - align-items: center; - justify-content: center; - gap: 10px; - padding: 0px 10px 0px; - position: relative; - z-index: 2; - background: linear-gradient( - 90deg, - rgba(15, 25, 35, 0.85) 0%, - rgba(31.14, 37.75, 40.58, 0.85) 100% - ); - &-flex { - @extend .topinfo-pill; - width: 240px; - } -} - -.topinfo-pill-text { - position: relative; - width: fit-content; - font-family: Montserrat, Helvetica; - font-weight: 800; - color: #ffffff; - font-size: 14px; - font-style: normal; - text-align: center; - text-transform: uppercase; - letter-spacing: 0; - line-height: normal; - white-space: nowrap; -} - -.sponsor-container { - position: absolute; - width: 240px; - height: 88px; - top: 0; - left: 1680px; - background: rgba(0, 0, 0, 0.6); - border-radius: 0px 0px 6px 6px; -} - -.sponsor-logo { - position: absolute; - width: 156px; - height: 71px; - top: 11px; - left: 42px; - object-fit: contain; - transition: opacity 1s ease-in-out; -} - -.spectra-logo { - max-width: 24px; - max-height: 100%; - position: absolute; - left: 5%; -} - -@keyframes fadeLoop { - 0% { - opacity: 1; - } - 47% { - opacity: 1; - } - 48% { - opacity: 0; - } - 99% { - opacity: 0; - } - 100% { - opacity: 1; - } -} - -.fadeLoopStart { - animation: fadeLoop 60s normal infinite; - animation-delay: 0s; - position: absolute; - left: 20%; -} - -.fadeLoopDelay { - animation: fadeLoop 60s normal infinite; - animation-delay: -30s; - position: absolute; - left: 25%; - opacity: 0; -} diff --git a/src/app/topscore/topinfo/topinfo.component.ts b/src/app/topscore/topinfo/topinfo.component.ts deleted file mode 100644 index 865a7d0a..00000000 --- a/src/app/topscore/topinfo/topinfo.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Component, Input, OnChanges, OnInit, SimpleChanges, inject } from "@angular/core"; -import { Config } from "../../shared/config"; -import { animate, style, transition, trigger } from "@angular/animations"; -import { NgIf, NgFor } from "@angular/common"; -import { MapinfoComponent } from "./mapinfo/mapinfo.component"; -import { TranslateModule } from "@ngx-translate/core"; - -@Component({ - selector: "app-topinfo", - templateUrl: "./topinfo.component.html", - styleUrls: ["./topinfo.component.scss"], - animations: [ - trigger("fadeInOut", [ - transition(":enter", [style({ opacity: 0 }), animate("1s", style({ opacity: 1 }))]), - transition(":leave", [animate("1s", style({ opacity: 0 }))]), - ]), - ], - imports: [TranslateModule, NgIf, MapinfoComponent, NgFor], -}) -export class TopinfoComponent implements OnInit, OnChanges { - private config = inject(Config); - - @Input() tools!: any; - @Input() map!: any; - - sponsorsAvailable = false; - sponsorImages: string[] = []; - currentSponsorIndex = 0; - - sponsorInterval: any; - - ngOnInit() { - this.sponsorsAvailable = this.config.sponsorImageUrls.length > 0; - if (this.sponsorsAvailable) { - this.sponsorImages = this.config.sponsorImageUrls; - this.currentSponsorIndex = 0; - if (this.config.sponsorImageUrls.length > 1) { - this.sponsorInterval = setInterval( - () => this.nextSponsor(), - this.config.sponsorImageRotateSpeed, - ); - } - } - } - - ngOnChanges(changes: SimpleChanges): void { - const newSponsors = changes["tools"]["currentValue"]["sponsorInfo"] as SponsorInfo; - if (newSponsors) { - if (newSponsors.enabled != this.sponsorsAvailable) { - this.sponsorsAvailable = newSponsors.enabled; - } - if (newSponsors.sponsors != this.sponsorImages) { - this.sponsorImages = newSponsors.sponsors; - this.currentSponsorIndex = 0; // Reset to first sponsor in case we might be out of bounds - if (this.sponsorInterval) { - clearInterval(this.sponsorInterval); - } - if (this.sponsorImages.length > 1) { - this.sponsorInterval = setInterval(() => this.nextSponsor(), newSponsors.duration); - } - } - } - } - - nextSponsor() { - this.currentSponsorIndex = (this.currentSponsorIndex + 1) % this.sponsorImages.length; - } -} - -interface SponsorInfo { - enabled: boolean; - duration: number; - sponsors: string[]; -} diff --git a/src/app/topscore/topscore.component.html b/src/app/topscore/topscore.component.html deleted file mode 100644 index a843c28c..00000000 --- a/src/app/topscore/topscore.component.html +++ /dev/null @@ -1,90 +0,0 @@ -
-
-
-
-
-
-
-
- -
-
-
{{ match.teams[0].teamTricode }}
-
- {{ match.tools.seedingInfo.left }} -
-
-
-
-
-
{{ match.teams[0].roundsWon }}
-
-
-
-
-
-
-
- -
-
-
-
{{ match.teams[1].roundsWon }}
-
-
-
-
-
{{ match.teams[1].teamTricode }}
-
- {{ match.tools.seedingInfo.right }} -
-
-
- -
-
-
-
-
-
-
-
-
-
- - -
-
-
{{ "topscore.round" | translate: { rounds: match.roundNumber } }}
-
diff --git a/src/app/topscore/topscore.component.scss b/src/app/topscore/topscore.component.scss deleted file mode 100644 index 2395f314..00000000 --- a/src/app/topscore/topscore.component.scss +++ /dev/null @@ -1,228 +0,0 @@ -.topscore { - position: absolute; - width: 601px; - height: 143px; - top: 4px; - left: 660px; -} - -.topscore-container { - display: inline-flex; - flex-direction: column; - align-items: center; - gap: 9px; - position: absolute; - top: 5px; - left: 0; -} - -.scoreboard { - display: inline-flex; - height: 62.76px; - align-items: flex-start; - justify-content: center; - gap: 168.97px; - position: relative; - // box-shadow: -1px 1px 1px #0000001f; This currently creates a weird shadow between the two scoreblocks -} - -.teamcard { - display: flex; - width: 216px; - align-items: center; - position: relative; -} - -.teamcard-border { - @extend .teamcard; - height: 62.76px; - overflow: hidden; - border-radius: 8px; -} - -.teaminfo-container { - display: flex; - align-items: center; - justify-content: center; - position: relative; - flex: 1; - align-self: stretch; - flex-grow: 1; - background-color: #0f1923d9; -} - -.teamimage-container { - width: 40%; - display: flex; - justify-content: center; - align-items: center; -} - -.team-image { - position: relative; - max-width: 80%; - max-height: 80%; -} - -.teamname-container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - max-width: 60%; - overflow: hidden; -} - -.teamcode { - font-family: Unbounded, Helvetica; - font-weight: 800; - color: #ffffff; - font-size: 20px; - font-style: normal; - text-align: center; - text-transform: uppercase; - letter-spacing: -0.48px; - line-height: normal; - white-space: nowrap; -} - -.teamseeding { - font-family: "Montserrat", Helvetica; - font-weight: 800; - color: #ffffff99; - font-size: 10px; - font-style: normal; - text-align: center; - line-height: normal; - white-space: nowrap; -} - -.divider { - position: relative; - align-self: stretch; - width: 3.62px; - &.defender { - @extend .divider; - background-color: var(--defender-color-secondary); - } - &.attacker { - @extend .divider; - background-color: var(--attacker-color-secondary); - } -} - -.scoreblock { - display: flex; - flex-direction: column; - width: 70px; - align-items: center; - justify-content: center; - gap: 12.07px; - position: relative; - align-self: stretch; - border: 0px none; - &-left { - @extend .scoreblock; - border-radius: 0px 4px 4px 0px; - } - &-right { - @extend .scoreblock; - border-radius: 4px 0px 0px 4px; - } - &.defender { - @extend .scoreblock; - background-color: var(--defender-color); - } - &.attacker { - @extend .scoreblock; - background-color: var(--attacker-color); - } -} - -.score-text { - position: relative; - width: fit-content; - text-shadow: 0px 1.21px 4.83px rgba(0, 0, 0, 0.12); - font-family: "Montserrat", Helvetica; - font-weight: 700; - color: #ffffff; - font-size: 40px; - font-style: normal; - text-align: center; - // letter-spacing: 1.2px; - line-height: normal; -} - -.round-number { - font-family: "Unbounded-Bold", Helvetica; - font-weight: 700; - color: #fefeff99; - font-size: 15px; - text-align: center; - letter-spacing: 0.39px; - line-height: normal; -} - -.spike-indicator { - width: 23%; - height: 120%; - top: -20%; - position: absolute; - display: inline-flex; - align-items: center; - justify-content: center; - background-color: #0f1923; - z-index: -5; -} - -.spike-icon { - position: relative; - top: 20%; - width: 70px; - height: 70px; -} - -.mapwin-line { - display: inline-flex; - justify-content: center; - gap: 5px; - position: absolute; - top: 110%; - min-width: 32%; - &-left { - @extend .mapwin-line; - right: 0; - } - &-right { - @extend .mapwin-line; - left: 0; - } -} - -.mapwin-pip { - position: relative; - width: 14px; - height: 7px; - border-radius: 3px; - border: 1.75px solid; - border-color: #ffffffaa; - &-full { - @extend .mapwin-pip; - background-color: #ffffff; - } -} - -.timer-rounder { - position: absolute; - top: -4px; - left: 50%; - transform: translateX(-50%); - width: 23%; - height: 50%; - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-bottom: 3px solid #0f1923; - border-left: 3px solid #0f1923; - border-right: 3px solid #0f1923; - z-index: -10; -} diff --git a/src/app/topscore/topscore.component.ts b/src/app/topscore/topscore.component.ts deleted file mode 100644 index e3ed6a4f..00000000 --- a/src/app/topscore/topscore.component.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { animate, style, transition, trigger } from "@angular/animations"; -import { Component, Input, SimpleChanges, OnChanges } from "@angular/core"; -import { NgIf, NgFor } from "@angular/common"; -import { TranslateModule } from "@ngx-translate/core"; - -@Component({ - selector: "app-topscore", - templateUrl: "./topscore.component.html", - styleUrls: ["./topscore.component.scss"], - animations: [ - trigger("spike", [ - transition(":enter", [ - style({ transform: "translateY(-150%)" }), - animate("0.3s ease-out", style({ transform: "translateY(0%)" })), - ]), - transition(":leave", animate("0.3s", style({ transform: "translateY(-150%)" }))), - ]), - ], - imports: [TranslateModule, NgIf, NgFor], -}) -export class TopscoreComponent implements OnChanges { - @Input() match!: any; - - spikePlanted = false; - blinkState = false; - - detonationTime = 0; - lastActedTime = 9999; - blinkInterval: any = undefined; - - ngOnChanges(changes: SimpleChanges) { - if (changes["match"]) { - const match = changes["match"].currentValue; - if (match["spikeState"]["planted"] != this.spikePlanted) { - this.spikePlanted = match["spikeState"]["planted"]; - if (this.spikePlanted) { - this.detonationTime = match["spikeDetonationTime"]; - this.blinkState = false; - this.lastActedTime = 9999; - this.initSpikeBlink(); - } else { - clearInterval(this.blinkInterval); - this.blinkState = false; - } - } - } - } - - initSpikeBlink() { - this.blinkInterval = setInterval(() => { - const timeLeft = (this.detonationTime - Date.now()) / 1000; - if (timeLeft > 20) { - if (this.lastActedTime >= timeLeft + 0.95) { - this.blinkState = !this.blinkState; - this.lastActedTime = timeLeft; - } - } else if (timeLeft > 10) { - if (this.lastActedTime >= timeLeft + 0.45) { - this.blinkState = !this.blinkState; - this.lastActedTime = timeLeft; - } - } else if (timeLeft > 5) { - if (this.lastActedTime >= timeLeft + 0.275) { - this.blinkState = !this.blinkState; - this.lastActedTime = timeLeft; - } - } else if (timeLeft > 0) { - if (this.lastActedTime >= timeLeft + 0.125) { - this.blinkState = !this.blinkState; - this.lastActedTime = timeLeft; - } - } else { - clearInterval(this.blinkInterval); - this.blinkState = true; - } - }, 25); - } - - numSequence(n: number): number[] { - return Array(n); - } -} diff --git a/src/app/tracker/tracker.component.html b/src/app/tracker/tracker.component.html deleted file mode 100644 index 2f5a5323..00000000 --- a/src/app/tracker/tracker.component.html +++ /dev/null @@ -1,24 +0,0 @@ -
- - - - - - - -
diff --git a/src/app/tracker/tracker.component.scss b/src/app/tracker/tracker.component.scss deleted file mode 100644 index 0b6d0562..00000000 --- a/src/app/tracker/tracker.component.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import url("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=Unbounded:wght@200..900&display=swap"); diff --git a/src/app/tracker/tracker.component.ts b/src/app/tracker/tracker.component.ts deleted file mode 100644 index 9c66a847..00000000 --- a/src/app/tracker/tracker.component.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { Component, inject, Input, OnInit } from "@angular/core"; -import { trigger, transition, style, animate } from "@angular/animations"; -import { ActivatedRoute } from "@angular/router"; -import { NgIf } from "@angular/common"; -import { TopinfoComponent } from "../topscore/topinfo/topinfo.component"; -import { TopscoreComponent } from "../topscore/topscore.component"; -import { EndroundComponent } from "../endround/endround.component"; -import { CombatComponent } from "../combat/combat.component"; -import { ScoreboardComponent } from "../scoreboard/scoreboard.component"; -import { PlayercamsComponent } from "../playercams/playercams.component"; - -@Component({ - selector: "app-tracker", - templateUrl: "./tracker.component.html", - styleUrls: ["./tracker.component.scss"], - animations: [ - trigger("fade", [ - transition(":enter", [style({ opacity: "0" }), animate("0.5s", style({ opacity: "1" }))]), - transition(":leave", animate("0.5s", style({ opacity: "0" }))), - ]), - trigger("fadeFast", [transition(":leave", animate("0.25s ease-out", style({ opacity: "0" })))]), - ], - imports: [ - NgIf, - TopinfoComponent, - TopscoreComponent, - EndroundComponent, - CombatComponent, - ScoreboardComponent, - PlayercamsComponent, - ], -}) -export class TrackerComponent implements OnInit { - private route = inject(ActivatedRoute); - - @Input() hideAuxiliary = false; - - activelyTracking = false; - currentTrackId: string | null = null; - match: any = null; - teamLeft: any = null; - teamRight: any = null; - - ranksEnabled = false; - ranksByName: any = {}; - - async ngOnInit(): Promise { - //setting up with empty match state so certain ui parts dont complain - this.match = { - groupCode: "A", - isRanked: false, - isRunning: true, - roundNumber: 0, - roundPhase: "LOBBY", - teams: [{ players: [] }, { players: [] }], - spikeState: { planted: false }, - map: "Ascent", - tools: { - seriesInfo: { - needed: 1, - wonLeft: 0, - wonRight: 0, - mapInfo: [], - }, - seedingInfo: { - left: "", - right: "", - }, - tournamentInfo: { - name: "", - logoUrl: "", - backdropUrl: "", - }, - timeoutDuration: 60, - sponsorInfo: { - enabled: false, - duration: 5000, - sponsors: [], - }, - // Disabling the watermark/setting a custom text without Spectra Plus is against the License terms and strictly forbidden - watermarkInfo: { - spectraWatermark: true, - customTextEnabled: false, - customText: "", - }, - }, - timeoutState: { - techPause: false, - leftTeam: false, - leftTeamStartTime: 0, - rightTeam: false, - rightTeamStartTime: 0, - }, - showAliveKDA: false, - }; - - if (this.ranksEnabled) { - // this.ranksByName = this.inhouseTrackerService.getRanksFromSheet(); - } - } - - isAutoswitch(): boolean { - return this.route.snapshot.parent?.routeConfig?.path == "autoswitch"; - } - - isMinimal(): boolean { - if (this.route.snapshot.data["minimal"]) { - return this.route.snapshot.data["minimal"]; - } else { - return false; - } - } - - autoDisplayPhases = ["shopping", "combat", "end", "game_start", "game_end"]; - - shouldDisplay(): boolean { - if (this.isAutoswitch()) { - if (this.autoDisplayPhases.includes(this.match.roundPhase)) { - return true; - } else { - return false; - } - } else { - return true; - } - } - - public updateMatch(data: any) { - delete data.eventNumber; - delete data.replayLog; - this.match = data; - - this.teamLeft = this.match.teams[0]; - this.teamRight = this.match.teams[1]; - - this.match.ranksEnabled = this.ranksEnabled; - this.match.ranksByName = this.ranksByName; - - // Construct map for name overrides if it's a string (from JSON). The server might keep it as JSON to avoid issues. - const tempOverrides = this.match?.tools?.nameOverrides?.overrides || null; - if (typeof tempOverrides === "string") { - this.match.tools.nameOverrides.overrides = this.jsonToMap(tempOverrides); - } - } - - resetTracker() { - if (!this.activelyTracking) return; - this.currentTrackId = null; - } - - numSequence(n: number): number[] { - return Array(n); - } - - private jsonToMap(json: string): Map { - try { - const obj = JSON.parse(json); - if (Array.isArray(obj)) { - return new Map(obj); - } else { - throw new Error("Invalid JSON format for Map"); - } - } catch (error) { - console.error("Failed to parse JSON to Map:", error); - return new Map(); - } - } -} diff --git a/src/styles.css b/src/styles.css index 57348e99..90b9a06c 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1,8 +1,85 @@ /* You can add global styles to this file, and also import other style files */ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap"); @import url("https://fonts.googleapis.com/css2?family=DM+Sans&family=Montserrat:wght@400;700;900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Unbounded:wght@200..900&display=swap"); @import "tailwindcss"; +@import "./animations.css"; + +@theme static inline { + --color-timer: #0f1923; + --color-timer-rgb: 15, 25, 35; + --color-background: #0f1923cc; + --color-credits-negative: #ff4557; + + --color-defender-primary: var(--defender-color); + --color-defender-secondary: var(--defender-color-secondary); + --color-defender-shield: var(--defender-color-shield-currency); + + --color-attacker-primary: var(--attacker-color); + --color-attacker-secondary: var(--attacker-color-secondary); + --color-attacker-shield: var(--attacker-color-shield-currency); +} + +@utility font-montserrat { + font-family: Montserrat, Helvetica; +} +@utility font-unbounded { + font-family: Unbounded, Helvetica; +} + +/* Custom classes to size a component according to its relative size within a 1080p screen */ +@utility vw-* { + width: calc((--value(integer) / 1920) * 100vw); +} +@utility vh-* { + height: calc((--value(integer) / 1080) * 100vh); +} +@utility max-vw-* { + max-width: calc((--value(integer) / 1920) * 100vw); +} +@utility max-vh-* { + max-height: calc((--value(integer) / 1080) * 100vh); +} +@utility min-vw-* { + min-width: calc((--value(integer) / 1920) * 100vw); +} +@utility min-vh-* { + min-height: calc((--value(integer) / 1080) * 100vh); +} + +/* Custom classes to position components on an overlay screen */ +@utility pos-x-center { + position: absolute; + left: 50vw; + translate: -50%; +} +@utility pos-x-* { + position: absolute; + left: calc((--value(integer) / 1920) * 100vw); +} +@utility pos-y-* { + position: absolute; + top: calc((--value(integer) / 1080) * 100vh); +} + +@utility pos-b-* { + position: absolute; + bottom: calc((--value(integer) / 1080) * 100vh); +} + +@utility pill-background { + background: linear-gradient( + 90deg, + rgba(15, 25, 35, 0.85) 0%, + rgba(31.14, 37.75, 40.58, 0.85) 100% + ); +} + +@utility flip { + transform: rotateY(180deg); +} img { max-width: unset; diff --git a/yarn.lock b/yarn.lock index e0c6b59d..646d5085 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,160 @@ __metadata: version: 8 cacheKey: 10c0 +"@algolia/abtesting@npm:1.1.0": + version: 1.1.0 + resolution: "@algolia/abtesting@npm:1.1.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/0531541f10ab45deffd74188c481f61faf959c2b8293249798d9d47fe76ab53627f8a135c49770bbdde1234057d1a9385a5df5b74b20295ba494002877fed073 + languageName: node + linkType: hard + +"@algolia/client-abtesting@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/client-abtesting@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/3f06a1c2433602355c4463a14a961ae3bef9e7baeeb72d8deea9d19059c08d4c639e24c0450de508a5a82d3904835a178925058a16675e671512f03e2d0d7625 + languageName: node + linkType: hard + +"@algolia/client-analytics@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/client-analytics@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/1e771cdeb5044ff8346e944f4da317a77e939047916dad03790a820540e194f28ccdcb1c790b998388696b3d1ac9e48aa2deb1532f096831891c5c0d5010eb89 + languageName: node + linkType: hard + +"@algolia/client-common@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/client-common@npm:5.35.0" + checksum: 10c0/c2d614260e5961e96f7de428b748af8ea3041c8530064b1926f35063c4c88e3ee0769537c35f130ff94eb701927cc72f3ccfdd8a5a8513a87ed528fec7fdb79c + languageName: node + linkType: hard + +"@algolia/client-insights@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/client-insights@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/c3b146a433500c73148bba58ab2abef0bca9bce08cf15446e8b6143fdf884dafeba6fe86b9ab77337cce91c70f7ef4cc4ffee87736b96a30bad92a53897bfaa7 + languageName: node + linkType: hard + +"@algolia/client-personalization@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/client-personalization@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/0cecdca5bec6bf059c4569c66b6ecec3d556825b6767d54254b46333a6e8a2aeacff49a08aefc9490d3f5cc4fefb54200f3945117964a23f7a7bbfd2c7993fac + languageName: node + linkType: hard + +"@algolia/client-query-suggestions@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/client-query-suggestions@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/dd0f2a1e41f9203cfbdaa301346c6a363d1da3016b625439453435363bb0f7c14fed49480ae0a2e013131a6632a6d8c1749b0223336f1642a1f26b214ce3c0f7 + languageName: node + linkType: hard + +"@algolia/client-search@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/client-search@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/a9e52b4f21822f723fad21647056439737d956eb9bd70f541fcbdf96ad5ef60ac0782ed1801af9d3671444bfef95dd74133f3d8846a600bcb387dc8f1b910da6 + languageName: node + linkType: hard + +"@algolia/ingestion@npm:1.35.0": + version: 1.35.0 + resolution: "@algolia/ingestion@npm:1.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/342b9adea87d01a5f29168c16365e5ae0cade177b0749042cda29a64eaaacb2086957bbf70c40ad49a361436d744ca585937f27ebfd1edf12c62ec091c5111bb + languageName: node + linkType: hard + +"@algolia/monitoring@npm:1.35.0": + version: 1.35.0 + resolution: "@algolia/monitoring@npm:1.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/2bbad1df73421c7bb77efcaab82c83a2bec919e8d843b638640a6c6294fb8b35ad617ec79cc422636125f8365268bd8071e0dbd15455130fec15c9d920de02db + languageName: node + linkType: hard + +"@algolia/recommend@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/recommend@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/fa81ef425b9f2c63cfda584372d073b7ced020d0b13e3ced2ea0d992562bb642f7b2bab91844dc91bc4dacc260de437a595242704690fff74f1eceb211356293 + languageName: node + linkType: hard + +"@algolia/requester-browser-xhr@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/requester-browser-xhr@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + checksum: 10c0/59061fe14c641714136bedec90d54f5146ccc11c576687bbe800b42c1aff26e7106d76d367b3c58edc2e6a14efd22d1f3c3e2417c6734e35c27042c937476830 + languageName: node + linkType: hard + +"@algolia/requester-fetch@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/requester-fetch@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + checksum: 10c0/45c654f1b5746503b268cf5b1959c81943aea2d0fd78e7a028bfa134bbc2b7e2264ab25fa7429eef1ffa4e347030314577d3b5e92e405326d06ae44813786d4d + languageName: node + linkType: hard + +"@algolia/requester-node-http@npm:5.35.0": + version: 5.35.0 + resolution: "@algolia/requester-node-http@npm:5.35.0" + dependencies: + "@algolia/client-common": "npm:5.35.0" + checksum: 10c0/c33fbeb38ea48660f61c028074bb37c226d50b1cb853938dbc9bcf8e1144930438764d9ea009d1c98da511c1bd2663f363ee27a21f8aea83510525a0ae5a8a6b + languageName: node + linkType: hard + "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -12,7 +166,7 @@ __metadata: languageName: node linkType: hard -"@ampproject/remapping@npm:2.3.0, @ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.3.0": +"@ampproject/remapping@npm:2.3.0, @ampproject/remapping@npm:^2.2.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" dependencies: @@ -22,184 +176,184 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/architect@npm:0.2000.2, @angular-devkit/architect@npm:>= 0.2000.0 < 0.2100.0": - version: 0.2000.2 - resolution: "@angular-devkit/architect@npm:0.2000.2" +"@angular-devkit/architect@npm:0.2002.2, @angular-devkit/architect@npm:>= 0.2000.0 < 0.2100.0": + version: 0.2002.2 + resolution: "@angular-devkit/architect@npm:0.2002.2" dependencies: - "@angular-devkit/core": "npm:20.0.2" + "@angular-devkit/core": "npm:20.2.2" rxjs: "npm:7.8.2" - checksum: 10c0/b4e8dbe32bc57e0abc5a2d5c71c845192f20aa664eefdea836ec438257b75aa2c6cf460251b161c6fd971f42d176138c392daa0457875e41fcc88cebe31612ed + checksum: 10c0/f29ebd0af0fe74b1b3ef30647b4ba4588a9d6faa45c37dc8bb4fcfc7987f4c675510b020f2674661ca45d75c2ce8f1705ca76c28873d7876453f1532dab53d52 languageName: node linkType: hard -"@angular-devkit/core@npm:20.0.2, @angular-devkit/core@npm:>= 20.0.0 < 21.0.0": - version: 20.0.2 - resolution: "@angular-devkit/core@npm:20.0.2" +"@angular-devkit/core@npm:20.2.2, @angular-devkit/core@npm:>= 20.0.0 < 21.0.0": + version: 20.2.2 + resolution: "@angular-devkit/core@npm:20.2.2" dependencies: ajv: "npm:8.17.1" ajv-formats: "npm:3.0.1" jsonc-parser: "npm:3.3.1" - picomatch: "npm:4.0.2" + picomatch: "npm:4.0.3" rxjs: "npm:7.8.2" - source-map: "npm:0.7.4" + source-map: "npm:0.7.6" peerDependencies: chokidar: ^4.0.0 peerDependenciesMeta: chokidar: optional: true - checksum: 10c0/909a712f75d862e7cd5a87e83cf38a8996dd2fe8499fe6a007aea4bf747b45dee3f7422dcd372703aec3f614b566ab5c4c4c1955cbfa59589afa1ca91080f17a + checksum: 10c0/67e95351430ce92d722923d50f2fc914b09dd3e695b2e3623a0b9bf53340014b11eacfe536987dc17a584fbbedeb3eadeceaa2e1b8cb3bda4a1a5585b0264cca languageName: node linkType: hard -"@angular-devkit/schematics@npm:20.0.2, @angular-devkit/schematics@npm:>= 20.0.0 < 21.0.0": - version: 20.0.2 - resolution: "@angular-devkit/schematics@npm:20.0.2" +"@angular-devkit/schematics@npm:20.2.2, @angular-devkit/schematics@npm:>= 20.0.0 < 21.0.0": + version: 20.2.2 + resolution: "@angular-devkit/schematics@npm:20.2.2" dependencies: - "@angular-devkit/core": "npm:20.0.2" + "@angular-devkit/core": "npm:20.2.2" jsonc-parser: "npm:3.3.1" magic-string: "npm:0.30.17" ora: "npm:8.2.0" rxjs: "npm:7.8.2" - checksum: 10c0/43da88a872f14aedf4fb5e946e5346863d3a066b6a1b760ef394878276680bce5e6a1192a0fc773475b932c23af210aaa6afad97b30ae4dd98548bb721851277 + checksum: 10c0/989ccca4d323165ef4c7845112eefc84aa990039070766229b2e189b59c62a5f279b629c567b21d2487c3653a144c73b0d4c21ffc504f8273ce7f16758bd4925 languageName: node linkType: hard -"@angular-eslint/builder@npm:20.0.0": - version: 20.0.0 - resolution: "@angular-eslint/builder@npm:20.0.0" +"@angular-eslint/builder@npm:20.2.0": + version: 20.2.0 + resolution: "@angular-eslint/builder@npm:20.2.0" dependencies: "@angular-devkit/architect": "npm:>= 0.2000.0 < 0.2100.0" "@angular-devkit/core": "npm:>= 20.0.0 < 21.0.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: "*" - checksum: 10c0/d2c5a91c753f1551f1bdc8af82befbd1aa8d1df5afd0c7cfd1383b7be6e4f178306cf1bdd3372c4163efa688bb25d939f8adb97295aec345616e2f563722529e + checksum: 10c0/19d94e209986d674a1d509fdee977ad93c20a5a662522e2833e0de989ead11ded94746288054c7ccebeacf4533dcd2b7e5643c58386d960399496e5ae1b7550f languageName: node linkType: hard -"@angular-eslint/bundled-angular-compiler@npm:20.0.0": - version: 20.0.0 - resolution: "@angular-eslint/bundled-angular-compiler@npm:20.0.0" - checksum: 10c0/da3b5f1808fd1e97e5e76ff646d068a39183431f84b3399fe3ede21dd3d41283f51e46b891b56cb8c93a8b8b1570fb685be87bf4961cb1aa3f7d9dbcc26fbc41 +"@angular-eslint/bundled-angular-compiler@npm:20.2.0": + version: 20.2.0 + resolution: "@angular-eslint/bundled-angular-compiler@npm:20.2.0" + checksum: 10c0/7990cf3ec27fea3f0f4e8b0ac7ef03e0d5d933503f786cf63085e9feeda469d7a0cdba07cc2f3111aed2bfd0cf3b601548746debf7b2a3dbaab3fbd96102790a languageName: node linkType: hard -"@angular-eslint/eslint-plugin-template@npm:20.0.0": - version: 20.0.0 - resolution: "@angular-eslint/eslint-plugin-template@npm:20.0.0" +"@angular-eslint/eslint-plugin-template@npm:20.2.0": + version: 20.2.0 + resolution: "@angular-eslint/eslint-plugin-template@npm:20.2.0" dependencies: - "@angular-eslint/bundled-angular-compiler": "npm:20.0.0" - "@angular-eslint/utils": "npm:20.0.0" + "@angular-eslint/bundled-angular-compiler": "npm:20.2.0" + "@angular-eslint/utils": "npm:20.2.0" aria-query: "npm:5.3.2" axobject-query: "npm:4.1.0" peerDependencies: - "@angular-eslint/template-parser": 20.0.0 + "@angular-eslint/template-parser": 20.2.0 "@typescript-eslint/types": ^7.11.0 || ^8.0.0 "@typescript-eslint/utils": ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 typescript: "*" - checksum: 10c0/1a0f7c23e045fa1f72ae8ba4f9580c849f53011cf0ac1152bbbeb8af995081ab9655513dad879eeeffbe97419847b03804bae8227918ba89269ab1fa54b17879 + checksum: 10c0/bbd22cd9f22db346cce53df264b9c1733abaff2fa3c9132e7917f63dc44b4c408ef94b672017f95bc97cf7f3c8a5e781a6ed66c81058ddeece62b6dfb904dff0 languageName: node linkType: hard -"@angular-eslint/eslint-plugin@npm:20.0.0": - version: 20.0.0 - resolution: "@angular-eslint/eslint-plugin@npm:20.0.0" +"@angular-eslint/eslint-plugin@npm:20.2.0": + version: 20.2.0 + resolution: "@angular-eslint/eslint-plugin@npm:20.2.0" dependencies: - "@angular-eslint/bundled-angular-compiler": "npm:20.0.0" - "@angular-eslint/utils": "npm:20.0.0" + "@angular-eslint/bundled-angular-compiler": "npm:20.2.0" + "@angular-eslint/utils": "npm:20.2.0" + ts-api-utils: "npm:^2.1.0" peerDependencies: "@typescript-eslint/utils": ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 typescript: "*" - checksum: 10c0/8135de265c376ced41c95d58912bac9e93af4fb7fb1807904cdb4cae437efe957e399f6d62dc5f7ec41e8b4413c439fc831ecf017b03e394cc5db76e294139c9 + checksum: 10c0/76b42bce8bfd8a44823ef14517f8c335b897854cbe2b5ce511e9aab03f137a39e3a6620425857db7bc479ed2d1caba257a31821abd5205b6495ff718b8f43a65 languageName: node linkType: hard -"@angular-eslint/schematics@npm:20.0.0": - version: 20.0.0 - resolution: "@angular-eslint/schematics@npm:20.0.0" +"@angular-eslint/schematics@npm:20.2.0": + version: 20.2.0 + resolution: "@angular-eslint/schematics@npm:20.2.0" dependencies: "@angular-devkit/core": "npm:>= 20.0.0 < 21.0.0" "@angular-devkit/schematics": "npm:>= 20.0.0 < 21.0.0" - "@angular-eslint/eslint-plugin": "npm:20.0.0" - "@angular-eslint/eslint-plugin-template": "npm:20.0.0" + "@angular-eslint/eslint-plugin": "npm:20.2.0" + "@angular-eslint/eslint-plugin-template": "npm:20.2.0" ignore: "npm:7.0.5" semver: "npm:7.7.2" strip-json-comments: "npm:3.1.1" - checksum: 10c0/31af1106c7c03d3e456b6a214eacc5af054a24e2a986986ae7d2522b100caf8f6e3cd7458263954ac4bae1be38009712c3628fcef97830d53d8508127fbb09e2 + checksum: 10c0/c0b2884cc1c85b107003da532466232d495d01a9560990a8d308c30cbe235bcca09a4e935fbacd178375262c711098f138d57dc1923a47257081f2bc1fe5abf8 languageName: node linkType: hard -"@angular-eslint/template-parser@npm:20.0.0": - version: 20.0.0 - resolution: "@angular-eslint/template-parser@npm:20.0.0" +"@angular-eslint/template-parser@npm:20.2.0": + version: 20.2.0 + resolution: "@angular-eslint/template-parser@npm:20.2.0" dependencies: - "@angular-eslint/bundled-angular-compiler": "npm:20.0.0" + "@angular-eslint/bundled-angular-compiler": "npm:20.2.0" eslint-scope: "npm:^8.0.2" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: "*" - checksum: 10c0/f5e955b5e630dc16723ed4e0c513d674616cdc0f4f90f79a51b71c79518de7de8adf64a20ab32cefc610ac6b311a2823b8e382ed1da4e287a2e13777c72d2eb0 + checksum: 10c0/315d6d0456febff1696ab4fcb092e6ab6b25e026f3c723c50bac85b9d77e7109984f5b1b9f7f12b5282f247431a4226b038d702f0e5a8f4eda28f5d3a776069a languageName: node linkType: hard -"@angular-eslint/utils@npm:20.0.0": - version: 20.0.0 - resolution: "@angular-eslint/utils@npm:20.0.0" +"@angular-eslint/utils@npm:20.2.0": + version: 20.2.0 + resolution: "@angular-eslint/utils@npm:20.2.0" dependencies: - "@angular-eslint/bundled-angular-compiler": "npm:20.0.0" + "@angular-eslint/bundled-angular-compiler": "npm:20.2.0" peerDependencies: "@typescript-eslint/utils": ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 typescript: "*" - checksum: 10c0/164edb4aaa4df721fbe119347be396205ac4298b55c2c86ede4b388ba04a5b2834ff9dce2e0c9095462a95d90db8d11906078f48874e48b7235a982889244240 + checksum: 10c0/9b74562332f564cbc59bd8409782410f354dee101df8ec3e1d288e2b09ec09aa9b7c02965cea9a42b0d5492ed4fbfa5f906754e3e7ff678811f03c792998f098 languageName: node linkType: hard -"@angular/animations@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/animations@npm:20.0.3" +"@angular/animations@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/animations@npm:20.2.4" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 20.0.3 - "@angular/core": 20.0.3 - checksum: 10c0/86b768b98be403410197a37a2766485394e159bc36cce5df199d0ff517af487f76c45ab67ebb510b55768f6409efeaf04d2bee37ea429a9b9fdd0995dc0c35a6 + "@angular/core": 20.2.4 + checksum: 10c0/fdf9dfa23217f5dbc2a82ae56e0b605ed93efb18001e5104f1a1fa407a8fa9fb6db6b4814bd72aa1a199767e5f1592f9f906d54ac786f0f20a2becf303d992d2 languageName: node linkType: hard -"@angular/build@npm:^20.0.2": - version: 20.0.2 - resolution: "@angular/build@npm:20.0.2" +"@angular/build@npm:^20.2.0": + version: 20.2.2 + resolution: "@angular/build@npm:20.2.2" dependencies: "@ampproject/remapping": "npm:2.3.0" - "@angular-devkit/architect": "npm:0.2000.2" - "@babel/core": "npm:7.27.1" - "@babel/helper-annotate-as-pure": "npm:7.27.1" + "@angular-devkit/architect": "npm:0.2002.2" + "@babel/core": "npm:7.28.3" + "@babel/helper-annotate-as-pure": "npm:7.27.3" "@babel/helper-split-export-declaration": "npm:7.24.7" - "@inquirer/confirm": "npm:5.1.10" - "@vitejs/plugin-basic-ssl": "npm:2.0.0" - beasties: "npm:0.3.4" + "@inquirer/confirm": "npm:5.1.14" + "@vitejs/plugin-basic-ssl": "npm:2.1.0" + beasties: "npm:0.3.5" browserslist: "npm:^4.23.0" - esbuild: "npm:0.25.5" + esbuild: "npm:0.25.9" https-proxy-agent: "npm:7.0.6" istanbul-lib-instrument: "npm:6.0.3" jsonc-parser: "npm:3.3.1" - listr2: "npm:8.3.3" - lmdb: "npm:3.3.0" + listr2: "npm:9.0.1" + lmdb: "npm:3.4.2" magic-string: "npm:0.30.17" mrmime: "npm:2.0.1" - parse5-html-rewriting-stream: "npm:7.1.0" - picomatch: "npm:4.0.2" - piscina: "npm:5.0.0" - rollup: "npm:4.40.2" - sass: "npm:1.88.0" + parse5-html-rewriting-stream: "npm:8.0.0" + picomatch: "npm:4.0.3" + piscina: "npm:5.1.3" + rolldown: "npm:1.0.0-beta.32" + sass: "npm:1.90.0" semver: "npm:7.7.2" source-map-support: "npm:0.5.21" - tinyglobby: "npm:0.2.13" - vite: "npm:6.3.5" - watchpack: "npm:2.4.2" + tinyglobby: "npm:0.2.14" + vite: "npm:7.1.2" + watchpack: "npm:2.4.4" peerDependencies: "@angular/compiler": ^20.0.0 "@angular/compiler-cli": ^20.0.0 @@ -208,14 +362,14 @@ __metadata: "@angular/platform-browser": ^20.0.0 "@angular/platform-server": ^20.0.0 "@angular/service-worker": ^20.0.0 - "@angular/ssr": ^20.0.2 + "@angular/ssr": ^20.2.2 karma: ^6.4.0 less: ^4.2.0 ng-packagr: ^20.0.0 postcss: ^8.4.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 - typescript: ">=5.8 <5.9" + typescript: ">=5.8 <6.0" vitest: ^3.1.1 dependenciesMeta: lmdb: @@ -245,53 +399,55 @@ __metadata: optional: true vitest: optional: true - checksum: 10c0/b6ffbac1cb47a9e3c8198e0513218c55d67ee39c967c64a5cbd76b9e67c8e81d9fb7d82ee6097ab27a1d18c458c360e9875f70f17eca4ecf7839e5a57d0616f5 + checksum: 10c0/6659c73cb927f9578059820d53ec0e44345f8f810a072e986c67c5fbc428f4f0b16892a56319bfb98480cbdbf65db4a537033105761a24487b736b83f7140433 languageName: node linkType: hard -"@angular/cli@npm:^20.0.2": - version: 20.0.2 - resolution: "@angular/cli@npm:20.0.2" +"@angular/cli@npm:^20.2.0": + version: 20.2.2 + resolution: "@angular/cli@npm:20.2.2" dependencies: - "@angular-devkit/architect": "npm:0.2000.2" - "@angular-devkit/core": "npm:20.0.2" - "@angular-devkit/schematics": "npm:20.0.2" - "@inquirer/prompts": "npm:7.5.1" - "@listr2/prompt-adapter-inquirer": "npm:2.0.22" - "@schematics/angular": "npm:20.0.2" + "@angular-devkit/architect": "npm:0.2002.2" + "@angular-devkit/core": "npm:20.2.2" + "@angular-devkit/schematics": "npm:20.2.2" + "@inquirer/prompts": "npm:7.8.2" + "@listr2/prompt-adapter-inquirer": "npm:3.0.1" + "@modelcontextprotocol/sdk": "npm:1.17.3" + "@schematics/angular": "npm:20.2.2" "@yarnpkg/lockfile": "npm:1.1.0" + algoliasearch: "npm:5.35.0" ini: "npm:5.0.0" jsonc-parser: "npm:3.3.1" - listr2: "npm:8.3.3" - npm-package-arg: "npm:12.0.2" - npm-pick-manifest: "npm:10.0.0" + listr2: "npm:9.0.1" + npm-package-arg: "npm:13.0.0" pacote: "npm:21.0.0" resolve: "npm:1.22.10" semver: "npm:7.7.2" - yargs: "npm:17.7.2" + yargs: "npm:18.0.0" + zod: "npm:3.25.76" bin: ng: bin/ng.js - checksum: 10c0/93d6e44c231953a9b6e6a99743c3a4d0469f72589e1adde4c21e23d829a828c3f9720852848a900ca8b010c967daebda07735268b7398310618a769f826ad712 + checksum: 10c0/cdfb41ca0dec0deb8b862ff92443cc971abde1741bdef4c0e67d61cf7874d9b38722600c16656b78d8f69508f820fe95e5152dfa34b318534f2420ecec58718a languageName: node linkType: hard -"@angular/common@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/common@npm:20.0.3" +"@angular/common@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/common@npm:20.2.4" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 20.0.3 + "@angular/core": 20.2.4 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/41623714145ff937b14e02ebe7b2a64126ddc75d09f94b6b9e8cb8bbdeb1e3d2c2bd0a843b1b281d7b18d0b848a6ae4a062311ee2361937a481372f7bc198335 + checksum: 10c0/1daaa3f4ffe3ee4d5bd5ffef19854bf842d3c3aa831333b2591fc42bfe08526b866816dd3f0d8cd0aa4ca38e7f28ba0c5b133c61e52e6276e297be2c66647a2a languageName: node linkType: hard -"@angular/compiler-cli@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/compiler-cli@npm:20.0.3" +"@angular/compiler-cli@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/compiler-cli@npm:20.2.4" dependencies: - "@babel/core": "npm:7.27.4" + "@babel/core": "npm:7.28.3" "@jridgewell/sourcemap-codec": "npm:^1.4.14" chokidar: "npm:^4.0.0" convert-source-map: "npm:^1.5.1" @@ -300,34 +456,34 @@ __metadata: tslib: "npm:^2.3.0" yargs: "npm:^18.0.0" peerDependencies: - "@angular/compiler": 20.0.3 - typescript: ">=5.8 <5.9" + "@angular/compiler": 20.2.4 + typescript: ">=5.8 <6.0" peerDependenciesMeta: typescript: optional: true bin: ng-xi18n: bundles/src/bin/ng_xi18n.js ngc: bundles/src/bin/ngc.js - checksum: 10c0/f07c2192f08fddbdbdd482be70bbd8bd6a77c2042355332500fec7b5eb2d0722b625a176365d851e202ade8c3713b1c72d8319958eaf12f8dcf65d73b41d6618 + checksum: 10c0/707081c91a6eea19cdbe8e501c1482aa039587415e0e47afafba03d5ca6329be76f79c7d53c832acf525e85697db50c74e883c344ca4d48bf12bef4a0058daf8 languageName: node linkType: hard -"@angular/compiler@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/compiler@npm:20.0.3" +"@angular/compiler@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/compiler@npm:20.2.4" dependencies: tslib: "npm:^2.3.0" - checksum: 10c0/5019c06b2517ebb5e036e394cebb20697071cd066b8034ff293060ebac9448c2599f54642c3805c85d076c466bcffa6f29a265587fe718c163c01f64b15bcf7a + checksum: 10c0/9a0667d62a198fb8531104a59c9967d7e377f4c8aa43d23bcccf062227c982f99d6c0fd111b9e3e1aa26f7a00b5c7ac509829839f853476d5a0370288f048069 languageName: node linkType: hard -"@angular/core@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/core@npm:20.0.3" +"@angular/core@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/core@npm:20.2.4" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/compiler": 20.0.3 + "@angular/compiler": 20.2.4 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 peerDependenciesMeta: @@ -335,76 +491,65 @@ __metadata: optional: true zone.js: optional: true - checksum: 10c0/591a3df40823340a799da01d8f0ffc862c86c79ba7eca55615f60879f367ad7d50b2004023245a123a071d267aefeacf10b0c6bab2cf6b330667705a00f7cd6d + checksum: 10c0/35aaf085b835952133a1b99ab8806d56636947919d050a19c946f55089dfabf7807760993e860283a028b347167902d72366bd195a8c36599abc4c37132b4771 languageName: node linkType: hard -"@angular/forms@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/forms@npm:20.0.3" +"@angular/forms@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/forms@npm:20.2.4" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 20.0.3 - "@angular/core": 20.0.3 - "@angular/platform-browser": 20.0.3 + "@angular/common": 20.2.4 + "@angular/core": 20.2.4 + "@angular/platform-browser": 20.2.4 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/35a32cceaea40e409f91aacd72f6d4f2e57dab7e52f59d4d1cf5c035270a231d5938806de0ac960765ee5fe3c3fe67f0cb830d9f6c36cb009e9747923437a94f + checksum: 10c0/7316dde0f4ed540cdaa9c20937727b333b8925d38666c1e6f6bbcc4e3f924a06ef7a749ef071e95867228e41956e7f78acd0878561e057d4203a4e4d59015629 languageName: node linkType: hard -"@angular/platform-browser-dynamic@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/platform-browser-dynamic@npm:20.0.3" +"@angular/platform-browser-dynamic@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/platform-browser-dynamic@npm:20.2.4" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 20.0.3 - "@angular/compiler": 20.0.3 - "@angular/core": 20.0.3 - "@angular/platform-browser": 20.0.3 - checksum: 10c0/f65136a2cdfd2580ccc447e6fb732d933e6a808705f01f02698912466c72357bc37301987cd7e2fe80122858382e567273759de283b945f1e266ed2a73945682 + "@angular/common": 20.2.4 + "@angular/compiler": 20.2.4 + "@angular/core": 20.2.4 + "@angular/platform-browser": 20.2.4 + checksum: 10c0/b33c97136e1d1a362d09aec3ca2d9f0167d034d18f51fa042189e6bc80a71676b4b0c9110094d9a6588107938ab199e55ec274c9c4ee505a1930e23071fdff29 languageName: node linkType: hard -"@angular/platform-browser@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/platform-browser@npm:20.0.3" +"@angular/platform-browser@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/platform-browser@npm:20.2.4" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/animations": 20.0.3 - "@angular/common": 20.0.3 - "@angular/core": 20.0.3 + "@angular/animations": 20.2.4 + "@angular/common": 20.2.4 + "@angular/core": 20.2.4 peerDependenciesMeta: "@angular/animations": optional: true - checksum: 10c0/f8dbc45022ebb742fe5e1d18e366e160f5bd24aaf403900ed52d19091a42ef32308d060a9aedf4058ce42a84d0b6f389f1c36eb9a054822a44cb8df0289b85a9 + checksum: 10c0/ca22719b564a96d440a700df4ceb4d2bed59727979585ad52ad5513ed5544469333afd96980f72c59150d98827fd546db436ec07ea8bff2ac3ab5170de7b7d33 languageName: node linkType: hard -"@angular/router@npm:^20.0.3": - version: 20.0.3 - resolution: "@angular/router@npm:20.0.3" +"@angular/router@npm:^20.2.1": + version: 20.2.4 + resolution: "@angular/router@npm:20.2.4" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 20.0.3 - "@angular/core": 20.0.3 - "@angular/platform-browser": 20.0.3 + "@angular/common": 20.2.4 + "@angular/core": 20.2.4 + "@angular/platform-browser": 20.2.4 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/806c9497c88ae7462587ba7356cfcc5657e6afdca65635eceb574949f55779da4a16b7031d6a879ff51205e91325f7641736b6ac38483974f8b9d7ea49311b2a - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0": - version: 7.26.2 - resolution: "@babel/code-frame@npm:7.26.2" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + checksum: 10c0/98f5bcd1f9059aacd98067723ec73b4d96cd85579f897b4c757c4a54f8a943d9752c287e82bb8ac2e5680c0a019334502281616ae08575ca9d2a9e3a1995a837 languageName: node linkType: hard @@ -419,138 +564,82 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.25.9": - version: 7.26.2 - resolution: "@babel/compat-data@npm:7.26.2" - checksum: 10c0/c9b5f3724828d17f728a778f9d66c19b55c018d0d76de6d731178cca64f182c22b71400a73bf2b65dcc4fcfe52b630088a94d5902911b54206aa90e3ffe07d12 - languageName: node - linkType: hard - "@babel/compat-data@npm:^7.27.2": - version: 7.27.5 - resolution: "@babel/compat-data@npm:7.27.5" - checksum: 10c0/da2751fcd0b58eea958f2b2f7ff7d6de1280712b709fa1ad054b73dc7d31f589e353bb50479b9dc96007935f3ed3cada68ac5b45ce93086b7122ddc32e60dc00 + version: 7.28.4 + resolution: "@babel/compat-data@npm:7.28.4" + checksum: 10c0/9d346471e0a016641df9a325f42ad1e8324bbdc0243ce4af4dd2b10b974128590da9eb179eea2c36647b9bb987343119105e96773c1f6981732cd4f87e5a03b9 languageName: node linkType: hard -"@babel/core@npm:7.27.1": - version: 7.27.1 - resolution: "@babel/core@npm:7.27.1" +"@babel/core@npm:7.28.3": + version: 7.28.3 + resolution: "@babel/core@npm:7.28.3" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.27.1" - "@babel/helper-compilation-targets": "npm:^7.27.1" - "@babel/helper-module-transforms": "npm:^7.27.1" - "@babel/helpers": "npm:^7.27.1" - "@babel/parser": "npm:^7.27.1" - "@babel/template": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/0fc31f87f5401ac5d375528cb009f4ea5527fc8c5bb5b64b5b22c033b60fd0ad723388933a5f3f5db14e1edd13c958e9dd7e5c68f9b68c767aeb496199c8a4bb - languageName: node - linkType: hard - -"@babel/core@npm:7.27.4": - version: 7.27.4 - resolution: "@babel/core@npm:7.27.4" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.27.3" + "@babel/generator": "npm:^7.28.3" "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-module-transforms": "npm:^7.27.3" - "@babel/helpers": "npm:^7.27.4" - "@babel/parser": "npm:^7.27.4" + "@babel/helper-module-transforms": "npm:^7.28.3" + "@babel/helpers": "npm:^7.28.3" + "@babel/parser": "npm:^7.28.3" "@babel/template": "npm:^7.27.2" - "@babel/traverse": "npm:^7.27.4" - "@babel/types": "npm:^7.27.3" + "@babel/traverse": "npm:^7.28.3" + "@babel/types": "npm:^7.28.2" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/d2d17b106a8d91d3eda754bb3f26b53a12eb7646df73c2b2d2e9b08d90529186bc69e3823f70a96ec6e5719dc2372fb54e14ad499da47ceeb172d2f7008787b5 + checksum: 10c0/e6b3eb830c4b93f5a442b305776df1cd2bb4fafa4612355366f67c764f3e54a69d45b84def77fb2d4fd83439102667b0a92c3ea2838f678733245b748c602a7b languageName: node linkType: hard "@babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": - version: 7.26.0 - resolution: "@babel/core@npm:7.26.0" + version: 7.28.4 + resolution: "@babel/core@npm:7.28.4" dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.0" - "@babel/generator": "npm:^7.26.0" - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.0" - "@babel/parser": "npm:^7.26.0" - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.28.3" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-module-transforms": "npm:^7.28.3" + "@babel/helpers": "npm:^7.28.4" + "@babel/parser": "npm:^7.28.4" + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.28.4" + "@babel/types": "npm:^7.28.4" + "@jridgewell/remapping": "npm:^2.3.5" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e + checksum: 10c0/ef5a6c3c6bf40d3589b5593f8118cfe2602ce737412629fb6e26d595be2fcbaae0807b43027a5c42ec4fba5b895ff65891f2503b5918c8a3ea3542ab44d4c278 languageName: node linkType: hard -"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": - version: 7.26.2 - resolution: "@babel/generator@npm:7.26.2" +"@babel/generator@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/generator@npm:7.28.3" dependencies: - "@babel/parser": "npm:^7.26.2" - "@babel/types": "npm:^7.26.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" + "@babel/parser": "npm:^7.28.3" + "@babel/types": "npm:^7.28.2" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" jsesc: "npm:^3.0.2" - checksum: 10c0/167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c + checksum: 10c0/0ff58bcf04f8803dcc29479b547b43b9b0b828ec1ee0668e92d79f9e90f388c28589056637c5ff2fd7bcf8d153c990d29c448d449d852bf9d1bc64753ca462bc languageName: node linkType: hard -"@babel/generator@npm:^7.27.1, @babel/generator@npm:^7.27.3": - version: 7.27.5 - resolution: "@babel/generator@npm:7.27.5" +"@babel/helper-annotate-as-pure@npm:7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: - "@babel/parser": "npm:^7.27.5" "@babel/types": "npm:^7.27.3" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10c0/8f649ef4cd81765c832bb11de4d6064b035ffebdecde668ba7abee68a7b0bce5c9feabb5dc5bb8aeba5bd9e5c2afa3899d852d2bd9ca77a711ba8c8379f416f0 - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:7.27.1": - version: 7.27.1 - resolution: "@babel/helper-annotate-as-pure@npm:7.27.1" - dependencies: - "@babel/types": "npm:^7.27.1" - checksum: 10c0/fc4751b59c8f5417e1acb0455d6ffce53fa5e79b3aca690299fbbf73b1b65bfaef3d4a18abceb190024c5836bb6cfbc3711e83888648df93df54e18152a1196c - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-compilation-targets@npm:7.25.9" - dependencies: - "@babel/compat-data": "npm:^7.25.9" - "@babel/helper-validator-option": "npm:^7.25.9" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa + checksum: 10c0/94996ce0a05b7229f956033e6dcd69393db2b0886d0db6aff41e704390402b8cdcca11f61449cb4f86cfd9e61b5ad3a73e4fa661eeed7846b125bd1c33dbc633 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": +"@babel/helper-compilation-targets@npm:^7.27.2": version: 7.27.2 resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: @@ -563,13 +652,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10c0/5a0cd0c0e8c764b5f27f2095e4243e8af6fa145daea2b41b53c0c1414fe6ff139e3640f4e2207ae2b3d2153a1abd346f901c26c290ee7cb3881dd922d4ee9232 languageName: node linkType: hard @@ -583,29 +669,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helper-module-transforms@npm:7.26.0" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.27.3": - version: 7.27.3 - resolution: "@babel/helper-module-transforms@npm:7.27.3" +"@babel/helper-module-transforms@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helper-module-transforms@npm:7.28.3" dependencies: "@babel/helper-module-imports": "npm:^7.27.1" "@babel/helper-validator-identifier": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.3" + "@babel/traverse": "npm:^7.28.3" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/fccb4f512a13b4c069af51e1b56b20f54024bcf1591e31e978a30f3502567f34f90a80da6a19a6148c249216292a8074a0121f9e52602510ef0f32dbce95ca01 + checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb languageName: node linkType: hard @@ -618,13 +691,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 - languageName: node - linkType: hard - "@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-string-parser@npm:7.27.1" @@ -632,13 +698,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d - languageName: node - linkType: hard - "@babel/helper-validator-identifier@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-identifier@npm:7.27.1" @@ -646,13 +705,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e - languageName: node - linkType: hard - "@babel/helper-validator-option@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-option@npm:7.27.1" @@ -660,60 +712,28 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helpers@npm:7.26.0" - dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" - checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.27.1, @babel/helpers@npm:^7.27.4": - version: 7.27.6 - resolution: "@babel/helpers@npm:7.27.6" +"@babel/helpers@npm:^7.28.3, @babel/helpers@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/helpers@npm:7.28.4" dependencies: "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.27.6" - checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/parser@npm:7.26.2" - dependencies: - "@babel/types": "npm:^7.26.0" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 + "@babel/types": "npm:^7.28.4" + checksum: 10c0/aaa5fb8098926dfed5f223adf2c5e4c7fbba4b911b73dfec2d7d3083f8ba694d201a206db673da2d9b3ae8c01793e795767654558c450c8c14b4c2175b4fcb44 languageName: node linkType: hard -"@babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.27.5": - version: 7.27.5 - resolution: "@babel/parser@npm:7.27.5" +"@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3, @babel/parser@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/parser@npm:7.28.4" dependencies: - "@babel/types": "npm:^7.27.3" + "@babel/types": "npm:^7.28.4" bin: parser: ./bin/babel-parser.js - checksum: 10c0/f7faaebf21cc1f25d9ca8ac02c447ed38ef3460ea95be7ea760916dcf529476340d72a5a6010c6641d9ed9d12ad827c8424840277ec2295c5b082ba0f291220a + checksum: 10c0/58b239a5b1477ac7ed7e29d86d675cc81075ca055424eba6485872626db2dc556ce63c45043e5a679cd925e999471dba8a3ed4864e7ab1dbf64306ab72c52707 languageName: node linkType: hard -"@babel/template@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/template@npm:7.25.9" - dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab - languageName: node - linkType: hard - -"@babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2": +"@babel/template@npm:^7.27.2": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" dependencies: @@ -724,53 +744,28 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/traverse@npm:7.25.9" - dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/generator": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.27.4": - version: 7.27.4 - resolution: "@babel/traverse@npm:7.27.4" +"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/traverse@npm:7.28.4" dependencies: "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.27.3" - "@babel/parser": "npm:^7.27.4" + "@babel/generator": "npm:^7.28.3" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.4" "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.27.3" + "@babel/types": "npm:^7.28.4" debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/6de8aa2a0637a6ee6d205bf48b9e923928a02415771fdec60085ed754dcdf605e450bb3315c2552fa51c31a4662275b45d5ae4ad527ce55a7db9acebdbbbb8ed + checksum: 10c0/ee678fdd49c9f54a32e07e8455242390d43ce44887cea6567b233fe13907b89240c377e7633478a32c6cf1be0e17c2f7f3b0c59f0666e39c5074cc47b968489c languageName: node linkType: hard -"@babel/types@npm:^7.24.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/types@npm:7.26.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 - languageName: node - linkType: hard - -"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6": - version: 7.27.6 - resolution: "@babel/types@npm:7.27.6" +"@babel/types@npm:^7.24.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/types@npm:7.28.4" dependencies: "@babel/helper-string-parser": "npm:^7.27.1" "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10c0/39d556be114f2a6d874ea25ad39826a9e3a0e98de0233ae6d932f6d09a4b222923a90a7274c635ed61f1ba49bbd345329226678800900ad1c8d11afabd573aaf + checksum: 10c0/ac6f909d6191319e08c80efbfac7bd9a25f80cc83b43cd6d82e7233f7a6b9d6e7b90236f3af7400a3f83b576895bcab9188a22b584eb0f224e80e6d4e95f4517 languageName: node linkType: hard @@ -781,228 +776,224 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.4.3": - version: 1.4.3 - resolution: "@emnapi/core@npm:1.4.3" +"@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.4.5": + version: 1.5.0 + resolution: "@emnapi/core@npm:1.5.0" dependencies: - "@emnapi/wasi-threads": "npm:1.0.2" + "@emnapi/wasi-threads": "npm:1.1.0" tslib: "npm:^2.4.0" - checksum: 10c0/e30101d16d37ef3283538a35cad60e22095aff2403fb9226a35330b932eb6740b81364d525537a94eb4fb51355e48ae9b10d779c0dd1cdcd55d71461fe4b45c7 + checksum: 10c0/52ba3485277706d92fa27d92b37e5b4f6ef0742c03ed68f8096f294c6bfa30f0752c82d4c2bfa14bff4dc30d63c9f71a8f9fb64a92743d00807d9e468fafd5ff languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.3": - version: 1.4.3 - resolution: "@emnapi/runtime@npm:1.4.3" +"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.4.5": + version: 1.5.0 + resolution: "@emnapi/runtime@npm:1.5.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/3b7ab72d21cb4e034f07df80165265f85f445ef3f581d1bc87b67e5239428baa00200b68a7d5e37a0425c3a78320b541b07f76c5530f6f6f95336a6294ebf30b + checksum: 10c0/a85c9fc4e3af49cbe41e5437e5be2551392a931910cd0a5b5d3572532786927810c9cc1db11b232ec8f9657b33d4e6f7c4f985f1a052917d7cd703b5b2a20faa languageName: node linkType: hard -"@emnapi/wasi-threads@npm:1.0.2, @emnapi/wasi-threads@npm:^1.0.2": - version: 1.0.2 - resolution: "@emnapi/wasi-threads@npm:1.0.2" +"@emnapi/wasi-threads@npm:1.1.0, @emnapi/wasi-threads@npm:^1.0.4": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/f0621b1fc715221bd2d8332c0ca922617bcd77cdb3050eae50a124eb8923c54fa425d23982dc8f29d505c8798a62d1049bace8b0686098ff9dd82270e06d772e + checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/aix-ppc64@npm:0.25.5" +"@esbuild/aix-ppc64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/aix-ppc64@npm:0.25.9" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/android-arm64@npm:0.25.5" +"@esbuild/android-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-arm64@npm:0.25.9" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/android-arm@npm:0.25.5" +"@esbuild/android-arm@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-arm@npm:0.25.9" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/android-x64@npm:0.25.5" +"@esbuild/android-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-x64@npm:0.25.9" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/darwin-arm64@npm:0.25.5" +"@esbuild/darwin-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/darwin-arm64@npm:0.25.9" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/darwin-x64@npm:0.25.5" +"@esbuild/darwin-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/darwin-x64@npm:0.25.9" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/freebsd-arm64@npm:0.25.5" +"@esbuild/freebsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/freebsd-arm64@npm:0.25.9" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/freebsd-x64@npm:0.25.5" +"@esbuild/freebsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/freebsd-x64@npm:0.25.9" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-arm64@npm:0.25.5" +"@esbuild/linux-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-arm64@npm:0.25.9" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-arm@npm:0.25.5" +"@esbuild/linux-arm@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-arm@npm:0.25.9" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-ia32@npm:0.25.5" +"@esbuild/linux-ia32@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-ia32@npm:0.25.9" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-loong64@npm:0.25.5" +"@esbuild/linux-loong64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-loong64@npm:0.25.9" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-mips64el@npm:0.25.5" +"@esbuild/linux-mips64el@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-mips64el@npm:0.25.9" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-ppc64@npm:0.25.5" +"@esbuild/linux-ppc64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-ppc64@npm:0.25.9" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-riscv64@npm:0.25.5" +"@esbuild/linux-riscv64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-riscv64@npm:0.25.9" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-s390x@npm:0.25.5" +"@esbuild/linux-s390x@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-s390x@npm:0.25.9" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-x64@npm:0.25.5" +"@esbuild/linux-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-x64@npm:0.25.9" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/netbsd-arm64@npm:0.25.5" +"@esbuild/netbsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/netbsd-arm64@npm:0.25.9" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/netbsd-x64@npm:0.25.5" +"@esbuild/netbsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/netbsd-x64@npm:0.25.9" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/openbsd-arm64@npm:0.25.5" +"@esbuild/openbsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openbsd-arm64@npm:0.25.9" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/openbsd-x64@npm:0.25.5" +"@esbuild/openbsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openbsd-x64@npm:0.25.9" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/sunos-x64@npm:0.25.5" +"@esbuild/openharmony-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openharmony-arm64@npm:0.25.9" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/sunos-x64@npm:0.25.9" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/win32-arm64@npm:0.25.5" +"@esbuild/win32-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-arm64@npm:0.25.9" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/win32-ia32@npm:0.25.5" +"@esbuild/win32-ia32@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-ia32@npm:0.25.9" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/win32-x64@npm:0.25.5" +"@esbuild/win32-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-x64@npm:0.25.9" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.1 - resolution: "@eslint-community/eslint-utils@npm:4.4.1" - dependencies: - eslint-visitor-keys: "npm:^3.4.3" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.7.0": - version: 4.7.0 - resolution: "@eslint-community/eslint-utils@npm:4.7.0" +"@eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0": + version: 4.8.0 + resolution: "@eslint-community/eslint-utils@npm:4.8.0" dependencies: eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/c0f4f2bd73b7b7a9de74b716a664873d08ab71ab439e51befe77d61915af41a81ecec93b408778b3a7856185244c34c2c8ee28912072ec14def84ba2dec70adf + checksum: 10c0/33b93d2a4e9d5fe4c11d02d0fc5ed69e12fcb1e7ca031ded0d6adb24e768c36df77288ed79eecc784f9db34219816247db27688dfe869fb7fbf096840a097d7a languageName: node linkType: hard @@ -1013,39 +1004,30 @@ __metadata: languageName: node linkType: hard -"@eslint/config-array@npm:^0.20.1": - version: 0.20.1 - resolution: "@eslint/config-array@npm:0.20.1" +"@eslint/config-array@npm:^0.21.0": + version: 0.21.0 + resolution: "@eslint/config-array@npm:0.21.0" dependencies: "@eslint/object-schema": "npm:^2.1.6" debug: "npm:^4.3.1" minimatch: "npm:^3.1.2" - checksum: 10c0/709108c3925d83c2166024646829ab61ba5fa85c6568daefd32508899f46ed8dc36d7153042df6dcc7e58ad543bc93298b646575daecb5eb4e39a43d838dab42 + checksum: 10c0/0ea801139166c4aa56465b309af512ef9b2d3c68f9198751bbc3e21894fe70f25fbf26e1b0e9fffff41857bc21bfddeee58649ae6d79aadcd747db0c5dca771f languageName: node linkType: hard -"@eslint/config-helpers@npm:^0.2.1": - version: 0.2.3 - resolution: "@eslint/config-helpers@npm:0.2.3" - checksum: 10c0/8fd36d7f33013628787947c81894807c7498b31eacf6648efa6d7c7a99aac6bf0d59a8a4d14f968ec2aeebefb76a1a7e4fd4cd556a296323d4711b3d7a7cda22 - languageName: node - linkType: hard - -"@eslint/core@npm:^0.14.0": - version: 0.14.0 - resolution: "@eslint/core@npm:0.14.0" - dependencies: - "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/259f279445834ba2d2cbcc18e9d43202a4011fde22f29d5fb802181d66e0f6f0bd1f6b4b4b46663451f545d35134498231bd5e656e18d9034a457824b92b7741 +"@eslint/config-helpers@npm:^0.3.1": + version: 0.3.1 + resolution: "@eslint/config-helpers@npm:0.3.1" + checksum: 10c0/f6c5b3a0b76a0d7d84cc93e310c259e6c3e0792ddd0a62c5fc0027796ffae44183432cb74b2c2b1162801ee1b1b34a6beb5d90a151632b4df7349f994146a856 languageName: node linkType: hard -"@eslint/core@npm:^0.15.0": - version: 0.15.0 - resolution: "@eslint/core@npm:0.15.0" +"@eslint/core@npm:^0.15.2": + version: 0.15.2 + resolution: "@eslint/core@npm:0.15.2" dependencies: "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/9882c69acfe29743ce473a619d5248589c6687561afaabe8ec8d7ffed07592db16edcca3af022f33ea92fe5f6cfbe3545ee53e89292579d22a944ebaeddcf72d + checksum: 10c0/c17a6dc4f5a6006ecb60165cc38bcd21fefb4a10c7a2578a0cfe5813bbd442531a87ed741da5adab5eb678e8e693fda2e2b14555b035355537e32bcec367ea17 languageName: node linkType: hard @@ -1066,10 +1048,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.29.0": - version: 9.29.0 - resolution: "@eslint/js@npm:9.29.0" - checksum: 10c0/d0ccf37063fa27a3fae9347cb044f84ca10b5a2fa19ffb2b3fedf3b96843ac1ff359ea9f0ab0e80f2f16fda4cb0dc61ea0fed0375090f050fe0a029e7d6de3a3 +"@eslint/js@npm:9.35.0": + version: 9.35.0 + resolution: "@eslint/js@npm:9.35.0" + checksum: 10c0/d40fe38724bc76c085c0b753cdf937fa35c0d6807ae76b2632e3f5f66c3040c91adcf1aff2ce70b4f45752e60629fadc415eeec9af3be3c274bae1cac54b9840 languageName: node linkType: hard @@ -1080,13 +1062,13 @@ __metadata: languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.3.1": - version: 0.3.2 - resolution: "@eslint/plugin-kit@npm:0.3.2" +"@eslint/plugin-kit@npm:^0.3.5": + version: 0.3.5 + resolution: "@eslint/plugin-kit@npm:0.3.5" dependencies: - "@eslint/core": "npm:^0.15.0" + "@eslint/core": "npm:^0.15.2" levn: "npm:^0.4.1" - checksum: 10c0/e069b0a46eb9fa595a1ac7dea4540a9daa493afba88875ee054e9117609c1c41555e779303cb4cff36cf88f603ba6eba2556a927e8ced77002828206ee17fc7e + checksum: 10c0/c178c1b58c574200c0fd125af3e4bc775daba7ce434ba6d1eeaf9bcb64b2e9fea75efabffb3ed3ab28858e55a016a5efa95f509994ee4341b341199ca630b89e languageName: node linkType: hard @@ -1098,12 +1080,12 @@ __metadata: linkType: hard "@humanfs/node@npm:^0.16.6": - version: 0.16.6 - resolution: "@humanfs/node@npm:0.16.6" + version: 0.16.7 + resolution: "@humanfs/node@npm:0.16.7" dependencies: "@humanfs/core": "npm:^0.19.1" - "@humanwhocodes/retry": "npm:^0.3.0" - checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 + "@humanwhocodes/retry": "npm:^0.4.0" + checksum: 10c0/9f83d3cf2cfa37383e01e3cdaead11cd426208e04c44adcdd291aa983aaf72d7d3598844d2fe9ce54896bb1bf8bd4b56883376611c8905a19c44684642823f30 languageName: node linkType: hard @@ -1114,27 +1096,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/retry@npm:^0.3.0": - version: 0.3.1 - resolution: "@humanwhocodes/retry@npm:0.3.1" - checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.4.2": - version: 0.4.2 - resolution: "@humanwhocodes/retry@npm:0.4.2" - checksum: 10c0/0235525d38f243bee3bf8b25ed395fbf957fb51c08adae52787e1325673071abe856c7e18e530922ed2dd3ce12ed82ba01b8cee0279ac52a3315fcdc3a69ef0c +"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2": + version: 0.4.3 + resolution: "@humanwhocodes/retry@npm:0.4.3" + checksum: 10c0/3775bb30087d4440b3f7406d5a057777d90e4b9f435af488a4923ef249e93615fb78565a85f173a186a076c7706a81d0d57d563a2624e4de2c5c9c66c486ce42 languageName: node linkType: hard -"@inquirer/checkbox@npm:^4.1.6": - version: 4.1.8 - resolution: "@inquirer/checkbox@npm:4.1.8" +"@inquirer/checkbox@npm:^4.2.1": + version: 4.2.2 + resolution: "@inquirer/checkbox@npm:4.2.2" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/figures": "npm:^1.0.12" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/figures": "npm:^1.0.13" + "@inquirer/type": "npm:^3.0.8" ansi-escapes: "npm:^4.3.2" yoctocolors-cjs: "npm:^2.1.2" peerDependencies: @@ -1142,46 +1117,46 @@ __metadata: peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/6d726420b179c55b2f0001aaf6e339fa56e9e939afcbda31c386ab2e5d029ef6f2d392ec99c6a6950af1776a399791bbb88a635e4d047f1170b2ed8c5bba1e4c + checksum: 10c0/d5861d1e6c18ce263b2d88da5c8071857e65e5815409b062919fcfc489598615ccc7df1d32c7348dc2587aed2053ee045cf770612a73ef8a0b08374f969ed388 languageName: node linkType: hard -"@inquirer/confirm@npm:5.1.10": - version: 5.1.10 - resolution: "@inquirer/confirm@npm:5.1.10" +"@inquirer/confirm@npm:5.1.14": + version: 5.1.14 + resolution: "@inquirer/confirm@npm:5.1.14" dependencies: - "@inquirer/core": "npm:^10.1.11" - "@inquirer/type": "npm:^3.0.6" + "@inquirer/core": "npm:^10.1.15" + "@inquirer/type": "npm:^3.0.8" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/71a1b1c1007b0edd06984c356a9e13764ca917bdbf947a59ce0f55084d36e653daffe56b3806fc9959337aae80ff7b37eeaf01a40746e5f60de86475fdf0502a + checksum: 10c0/12f49e8d1564c77c290163e87c9a256cfc087eab0c096738c73b03aa3d59a98c233fb9fb3692f162d67f923d120a4aa8ef819f75d979916dc13456f726c579d1 languageName: node linkType: hard -"@inquirer/confirm@npm:^5.1.10": - version: 5.1.12 - resolution: "@inquirer/confirm@npm:5.1.12" +"@inquirer/confirm@npm:^5.1.14": + version: 5.1.16 + resolution: "@inquirer/confirm@npm:5.1.16" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/type": "npm:^3.0.8" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/581aedfe8ce45e177fb4470a12f874f5162a4396636bf4140edc5812ffc8ed0d1fa7e9bbc3a7af618203089a084f489e0b32112947eedc6930a766fad992449e + checksum: 10c0/9a54171554404bfc89f2a065bb89282ca7cc69046956943e348c29a6a7c4d263dfbcbb46ad115aef616866083eb42130d05424a4a8ef3b30777a912e7ae20fec languageName: node linkType: hard -"@inquirer/core@npm:^10.1.11, @inquirer/core@npm:^10.1.13": - version: 10.1.13 - resolution: "@inquirer/core@npm:10.1.13" +"@inquirer/core@npm:^10.1.15, @inquirer/core@npm:^10.2.0": + version: 10.2.0 + resolution: "@inquirer/core@npm:10.2.0" dependencies: - "@inquirer/figures": "npm:^1.0.12" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/figures": "npm:^1.0.13" + "@inquirer/type": "npm:^3.0.8" ansi-escapes: "npm:^4.3.2" cli-width: "npm:^4.1.0" mute-stream: "npm:^2.0.0" @@ -1193,158 +1168,173 @@ __metadata: peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/919208a31307297d5a07a44b9ebe69a999ce1470b31a2e1b5a04538bc36624d2053808cd6c677637a61690af09bdbdd635bd7031b64e3dd86c5b18df3ca7c3f9 + checksum: 10c0/6dc93634dc6005bb7c58522cd80bbf8fb5f756f104445a1916ed7a00dad99e10165a559f5b13e6d141ae744dbe4a5b9e405e10c5986ef7859988de191b3b71f3 languageName: node linkType: hard -"@inquirer/editor@npm:^4.2.11": - version: 4.2.13 - resolution: "@inquirer/editor@npm:4.2.13" +"@inquirer/editor@npm:^4.2.17": + version: 4.2.18 + resolution: "@inquirer/editor@npm:4.2.18" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/type": "npm:^3.0.7" - external-editor: "npm:^3.1.0" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/external-editor": "npm:^1.0.1" + "@inquirer/type": "npm:^3.0.8" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/e1a27d75f737d7847905c14cf04d66d864eeb0f3e4cb2d36e34b51993741c5b70c22754171820c5d880a740765471455a8a98874285fd4a10b162342898f6c6b + checksum: 10c0/a8b48bc692a566cbbf6c3ea3d095d26bef14abfba631958f61cea85b54bcd7a4dbd7aa164a4752f48d7317340ebe126ac4ef6593b12ad6b3b729d4ec99df1fc1 languageName: node linkType: hard -"@inquirer/expand@npm:^4.0.13": - version: 4.0.15 - resolution: "@inquirer/expand@npm:4.0.15" +"@inquirer/expand@npm:^4.0.17": + version: 4.0.18 + resolution: "@inquirer/expand@npm:4.0.18" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/type": "npm:^3.0.8" yoctocolors-cjs: "npm:^2.1.2" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/d558e367995a38a31d830de45d1e6831b73a798d6076c7fc8bdb639d3fac947a5d15810f7336b45c7712fc0e21fe8a2728f7f594550a20b6b4a839a18f9086cb + checksum: 10c0/9fe1daef1efefdc4760bfe0317e0a765a8defe2f9453230938886ea06abd65c6a7a3eb72dc90ba5bbb82709f6703a271b8f7bb97283b825763a4cd1f68efb8a8 + languageName: node + linkType: hard + +"@inquirer/external-editor@npm:^1.0.1": + version: 1.0.1 + resolution: "@inquirer/external-editor@npm:1.0.1" + dependencies: + chardet: "npm:^2.1.0" + iconv-lite: "npm:^0.6.3" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/bdac4395e0bba7065d39b141d618bfc06369f246c402c511396a5238baf2657f3038ccba8438521a49e5cb602f4302b9d1f46b52b647b27af2c9911720022118 languageName: node linkType: hard -"@inquirer/figures@npm:^1.0.12": - version: 1.0.12 - resolution: "@inquirer/figures@npm:1.0.12" - checksum: 10c0/08694288bdf9aa474571ca94272113a5ac443229519ce71447eba9eb7d5a2007901bdc3e92216d929a69746dcbac29683886c20e67b7864a7c7f6c59b99d3269 +"@inquirer/figures@npm:^1.0.13": + version: 1.0.13 + resolution: "@inquirer/figures@npm:1.0.13" + checksum: 10c0/23700a4a0627963af5f51ef4108c338ae77bdd90393164b3fdc79a378586e1f5531259882b7084c690167bf5a36e83033e45aca0321570ba810890abe111014f languageName: node linkType: hard -"@inquirer/input@npm:^4.1.10": - version: 4.1.12 - resolution: "@inquirer/input@npm:4.1.12" +"@inquirer/input@npm:^4.2.1": + version: 4.2.2 + resolution: "@inquirer/input@npm:4.2.2" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/type": "npm:^3.0.8" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/17b59547432f54a18ec573fde96c2c13c827f04faf694fc58239ec97e993ac6af151ed2a0521029c9199a4f422742dbe5dc23c20705748eafdc7dd26c7adca3a + checksum: 10c0/7d8f202eb0e970841005026634596ffdb3b68a9c6b599841ad46b25841e277d2950582e5eeddd69b168d7ef52631cf15782922844731d01d3808a018461d8f98 languageName: node linkType: hard -"@inquirer/number@npm:^3.0.13": - version: 3.0.15 - resolution: "@inquirer/number@npm:3.0.15" +"@inquirer/number@npm:^3.0.17": + version: 3.0.18 + resolution: "@inquirer/number@npm:3.0.18" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/type": "npm:^3.0.8" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/724fc0d10611a0a9ea43280a94ed9194b8bb22d9a2af940eb37592d0cebc9e6e219edc4f79d8c176f53fd1b078543a9e4773037c7bde4b8d929a3034406eec90 + checksum: 10c0/dbaead7813bba1978ef429eb485bb02e55e9047194f2337313592546b4504b06ea18b37919e23ea53388f5314dc96ea038e4599c7f396344910b17b3d9a159cb languageName: node linkType: hard -"@inquirer/password@npm:^4.0.13": - version: 4.0.15 - resolution: "@inquirer/password@npm:4.0.15" +"@inquirer/password@npm:^4.0.17": + version: 4.0.18 + resolution: "@inquirer/password@npm:4.0.18" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/type": "npm:^3.0.8" ansi-escapes: "npm:^4.3.2" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/673d7c33dd0ee951c96f349d4fb66f8762f31c62188546da4d7af544202b638eecef6b8c78e62f43a46c72a5fa0712d94a56ed56f12e1badbb1001128bc991bd + checksum: 10c0/7d05940633f74d1fa3850884ce71b32c3790bc421439cd77366553df39ec910f64dcdb2084776ee9d9a10d248390801700113ca3d8b0b02b1517531109798814 languageName: node linkType: hard -"@inquirer/prompts@npm:7.5.1": - version: 7.5.1 - resolution: "@inquirer/prompts@npm:7.5.1" - dependencies: - "@inquirer/checkbox": "npm:^4.1.6" - "@inquirer/confirm": "npm:^5.1.10" - "@inquirer/editor": "npm:^4.2.11" - "@inquirer/expand": "npm:^4.0.13" - "@inquirer/input": "npm:^4.1.10" - "@inquirer/number": "npm:^3.0.13" - "@inquirer/password": "npm:^4.0.13" - "@inquirer/rawlist": "npm:^4.1.1" - "@inquirer/search": "npm:^3.0.13" - "@inquirer/select": "npm:^4.2.1" +"@inquirer/prompts@npm:7.8.2": + version: 7.8.2 + resolution: "@inquirer/prompts@npm:7.8.2" + dependencies: + "@inquirer/checkbox": "npm:^4.2.1" + "@inquirer/confirm": "npm:^5.1.14" + "@inquirer/editor": "npm:^4.2.17" + "@inquirer/expand": "npm:^4.0.17" + "@inquirer/input": "npm:^4.2.1" + "@inquirer/number": "npm:^3.0.17" + "@inquirer/password": "npm:^4.0.17" + "@inquirer/rawlist": "npm:^4.1.5" + "@inquirer/search": "npm:^3.1.0" + "@inquirer/select": "npm:^4.3.1" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/7f9cf44e1caff3eb61939f8abc9906acfec0d955c25e860212dc9e0e7bd6b9fb046415731e2407eb8a0745d282bb73c03587481090720255c4b828d85b830a08 + checksum: 10c0/17b5388715ebb4e8e5d957774d016818c4794c5f6fa76dbdb05dad293f023479322b867aa439f2d585ee2f2abe9b0c3d7e77ef5360f012f3aa4b5809b3ce0796 languageName: node linkType: hard -"@inquirer/rawlist@npm:^4.1.1": - version: 4.1.3 - resolution: "@inquirer/rawlist@npm:4.1.3" +"@inquirer/rawlist@npm:^4.1.5": + version: 4.1.6 + resolution: "@inquirer/rawlist@npm:4.1.6" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/type": "npm:^3.0.8" yoctocolors-cjs: "npm:^2.1.2" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/d653e730188e6849df540186cf7cb0f37f06c64d03f075b5a617145671fb015c27aeb60adb003d1a05a925795968efff0a3ae5a737a8d04c5679aa6fdc423662 + checksum: 10c0/0589a3098de545cf83450b2ce59623865e06e435a773240a5f6f47c20602a13ea3e9bf85849f39e57335e4faace510182c0251e88de0a3cc8d23b4f2270772e3 languageName: node linkType: hard -"@inquirer/search@npm:^3.0.13": - version: 3.0.15 - resolution: "@inquirer/search@npm:3.0.15" +"@inquirer/search@npm:^3.1.0": + version: 3.1.1 + resolution: "@inquirer/search@npm:3.1.1" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/figures": "npm:^1.0.12" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/figures": "npm:^1.0.13" + "@inquirer/type": "npm:^3.0.8" yoctocolors-cjs: "npm:^2.1.2" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/32b29789e72e53a7b6cfdbc1803bd9e466c424d9f0368a145bef9e25c6fbde72af29cdd4667a785fee79de213f11fa76453f8120ea02ac5158dce259565ce7fd + checksum: 10c0/31f5e74d200f1c40b47099ebb74f5138b0900c99afe1b98b4a3d60e286cd8ca062ed5a68a5d1394cb6b8584cac2931f2b584241cf39dc34b83dc4ce8eb7daddd languageName: node linkType: hard -"@inquirer/select@npm:^4.2.1": - version: 4.2.3 - resolution: "@inquirer/select@npm:4.2.3" +"@inquirer/select@npm:^4.3.1": + version: 4.3.2 + resolution: "@inquirer/select@npm:4.3.2" dependencies: - "@inquirer/core": "npm:^10.1.13" - "@inquirer/figures": "npm:^1.0.12" - "@inquirer/type": "npm:^3.0.7" + "@inquirer/core": "npm:^10.2.0" + "@inquirer/figures": "npm:^1.0.13" + "@inquirer/type": "npm:^3.0.8" ansi-escapes: "npm:^4.3.2" yoctocolors-cjs: "npm:^2.1.2" peerDependencies: @@ -1352,28 +1342,35 @@ __metadata: peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/376535f50a9c2e19e27a5c81930cd1b5afa0b7d86228e5789782955a2d0a89bf5a8890a97943042e1b393094fe236ce97c9ff4bb777c9b44b22c1424f883b063 + checksum: 10c0/48aaec29e21fd19b9b3045ad01d7fbe46aa9ac828adc5b8e5b8e5055daad47e0d1134cde40281e9e639bd963c30756ca729c20fcb629e3053ac411020cf4bc78 languageName: node linkType: hard -"@inquirer/type@npm:^1.5.5": - version: 1.5.5 - resolution: "@inquirer/type@npm:1.5.5" - dependencies: - mute-stream: "npm:^1.0.0" - checksum: 10c0/4c41736c09ba9426b5a9e44993bdd54e8f532e791518802e33866f233a2a6126a25c1c82c19d1abbf1df627e57b1b957dd3f8318ea96073d8bfc32193943bcb3 - languageName: node - linkType: hard - -"@inquirer/type@npm:^3.0.6, @inquirer/type@npm:^3.0.7": - version: 3.0.7 - resolution: "@inquirer/type@npm:3.0.7" +"@inquirer/type@npm:^3.0.7, @inquirer/type@npm:^3.0.8": + version: 3.0.8 + resolution: "@inquirer/type@npm:3.0.8" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/bbaa33c274a10f70d3a587264e1db6dbfcd8c1458d595c54870d1d5b3fc113ab5063203ec12a098485bb9e2fcef1a87d8c6ecd2a6d44ddc575f5c4715379be5e + checksum: 10c0/1171bffb9ea0018b12ec4f46a7b485f7e2a328e620e89f3b03f2be8c25889e5b9e62daca3ea10ed040a71d847066c4d9879dc1fea8aa5690ebbc968d3254a5ac + languageName: node + linkType: hard + +"@isaacs/balanced-match@npm:^4.0.1": + version: 4.0.1 + resolution: "@isaacs/balanced-match@npm:4.0.1" + checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 + languageName: node + linkType: hard + +"@isaacs/brace-expansion@npm:^5.0.0": + version: 5.0.0 + resolution: "@isaacs/brace-expansion@npm:5.0.0" + dependencies: + "@isaacs/balanced-match": "npm:^4.0.1" + checksum: 10c0/b4d4812f4be53afc2c5b6c545001ff7a4659af68d4484804e9d514e183d20269bb81def8682c01a22b17c4d6aed14292c8494f7d2ac664e547101c1a905aa977 languageName: node linkType: hard @@ -1407,14 +1404,23 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.4, @jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 languageName: node linkType: hard @@ -1425,90 +1431,104 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.30 + resolution: "@jridgewell/trace-mapping@npm:0.3.30" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + checksum: 10c0/3a1516c10f44613b9ba27c37a02ff8f410893776b2b3dad20a391b51b884dd60f97bbb56936d65d2ff8fe978510a0000266654ab8426bdb9ceb5fb4585b19e23 languageName: node linkType: hard -"@listr2/prompt-adapter-inquirer@npm:2.0.22": - version: 2.0.22 - resolution: "@listr2/prompt-adapter-inquirer@npm:2.0.22" +"@listr2/prompt-adapter-inquirer@npm:3.0.1": + version: 3.0.1 + resolution: "@listr2/prompt-adapter-inquirer@npm:3.0.1" dependencies: - "@inquirer/type": "npm:^1.5.5" + "@inquirer/type": "npm:^3.0.7" peerDependencies: "@inquirer/prompts": ">= 3 < 8" - checksum: 10c0/861fd7c66122551d078b10bfaf8927255be1e9169ed4b6b8844c323bfa1a6da7628dc0b0eb15c6830741d1d87f3b137131388a4f57bcc896b37a68e40cebe615 + listr2: 9.0.1 + checksum: 10c0/ecd53852b377344dc39d7106389f9eb96c8e11835564ec18830c5624c62551d3e51bbf175bcd0769c1f2e1e1c9f8490cc83a0f79dc0dc1291abf76e87b60ef3c languageName: node linkType: hard -"@lmdb/lmdb-darwin-arm64@npm:3.3.0": - version: 3.3.0 - resolution: "@lmdb/lmdb-darwin-arm64@npm:3.3.0" +"@lmdb/lmdb-darwin-arm64@npm:3.4.2": + version: 3.4.2 + resolution: "@lmdb/lmdb-darwin-arm64@npm:3.4.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@lmdb/lmdb-darwin-x64@npm:3.3.0": - version: 3.3.0 - resolution: "@lmdb/lmdb-darwin-x64@npm:3.3.0" +"@lmdb/lmdb-darwin-x64@npm:3.4.2": + version: 3.4.2 + resolution: "@lmdb/lmdb-darwin-x64@npm:3.4.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@lmdb/lmdb-linux-arm64@npm:3.3.0": - version: 3.3.0 - resolution: "@lmdb/lmdb-linux-arm64@npm:3.3.0" +"@lmdb/lmdb-linux-arm64@npm:3.4.2": + version: 3.4.2 + resolution: "@lmdb/lmdb-linux-arm64@npm:3.4.2" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@lmdb/lmdb-linux-arm@npm:3.3.0": - version: 3.3.0 - resolution: "@lmdb/lmdb-linux-arm@npm:3.3.0" +"@lmdb/lmdb-linux-arm@npm:3.4.2": + version: 3.4.2 + resolution: "@lmdb/lmdb-linux-arm@npm:3.4.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@lmdb/lmdb-linux-x64@npm:3.3.0": - version: 3.3.0 - resolution: "@lmdb/lmdb-linux-x64@npm:3.3.0" +"@lmdb/lmdb-linux-x64@npm:3.4.2": + version: 3.4.2 + resolution: "@lmdb/lmdb-linux-x64@npm:3.4.2" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@lmdb/lmdb-win32-arm64@npm:3.3.0": - version: 3.3.0 - resolution: "@lmdb/lmdb-win32-arm64@npm:3.3.0" +"@lmdb/lmdb-win32-arm64@npm:3.4.2": + version: 3.4.2 + resolution: "@lmdb/lmdb-win32-arm64@npm:3.4.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@lmdb/lmdb-win32-x64@npm:3.3.0": - version: 3.3.0 - resolution: "@lmdb/lmdb-win32-x64@npm:3.3.0" +"@lmdb/lmdb-win32-x64@npm:3.4.2": + version: 3.4.2 + resolution: "@lmdb/lmdb-win32-x64@npm:3.4.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard +"@modelcontextprotocol/sdk@npm:1.17.3": + version: 1.17.3 + resolution: "@modelcontextprotocol/sdk@npm:1.17.3" + dependencies: + ajv: "npm:^6.12.6" + content-type: "npm:^1.0.5" + cors: "npm:^2.8.5" + cross-spawn: "npm:^7.0.5" + eventsource: "npm:^3.0.2" + eventsource-parser: "npm:^3.0.0" + express: "npm:^5.0.1" + express-rate-limit: "npm:^7.5.0" + pkce-challenge: "npm:^5.0.0" + raw-body: "npm:^3.0.0" + zod: "npm:^3.23.8" + zod-to-json-schema: "npm:^3.24.1" + checksum: 10c0/23df0949724279eaa620f2780e3c731dcf746311f3175e3cba602643aacf9ee6dbcf99daeab3fa848296fe9ac971456fc031c79c1b55870dd019baf0263fd080 + languageName: node + linkType: hard + "@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.3": version: 3.0.3 resolution: "@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.3" @@ -1551,138 +1571,146 @@ __metadata: languageName: node linkType: hard -"@napi-rs/nice-android-arm-eabi@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-android-arm-eabi@npm:1.0.1" +"@napi-rs/nice-android-arm-eabi@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-android-arm-eabi@npm:1.1.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@napi-rs/nice-android-arm64@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-android-arm64@npm:1.0.1" +"@napi-rs/nice-android-arm64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-android-arm64@npm:1.1.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@napi-rs/nice-darwin-arm64@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-darwin-arm64@npm:1.0.1" +"@napi-rs/nice-darwin-arm64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-darwin-arm64@npm:1.1.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@napi-rs/nice-darwin-x64@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-darwin-x64@npm:1.0.1" +"@napi-rs/nice-darwin-x64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-darwin-x64@npm:1.1.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@napi-rs/nice-freebsd-x64@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-freebsd-x64@npm:1.0.1" +"@napi-rs/nice-freebsd-x64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-freebsd-x64@npm:1.1.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@napi-rs/nice-linux-arm-gnueabihf@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-linux-arm-gnueabihf@npm:1.0.1" +"@napi-rs/nice-linux-arm-gnueabihf@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-arm-gnueabihf@npm:1.1.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@napi-rs/nice-linux-arm64-gnu@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-linux-arm64-gnu@npm:1.0.1" +"@napi-rs/nice-linux-arm64-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-arm64-gnu@npm:1.1.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@napi-rs/nice-linux-arm64-musl@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-linux-arm64-musl@npm:1.0.1" +"@napi-rs/nice-linux-arm64-musl@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-arm64-musl@npm:1.1.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@napi-rs/nice-linux-ppc64-gnu@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-linux-ppc64-gnu@npm:1.0.1" +"@napi-rs/nice-linux-ppc64-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-ppc64-gnu@npm:1.1.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@napi-rs/nice-linux-riscv64-gnu@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-linux-riscv64-gnu@npm:1.0.1" +"@napi-rs/nice-linux-riscv64-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-riscv64-gnu@npm:1.1.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@napi-rs/nice-linux-s390x-gnu@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-linux-s390x-gnu@npm:1.0.1" +"@napi-rs/nice-linux-s390x-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-s390x-gnu@npm:1.1.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@napi-rs/nice-linux-x64-gnu@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-linux-x64-gnu@npm:1.0.1" +"@napi-rs/nice-linux-x64-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-x64-gnu@npm:1.1.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@napi-rs/nice-linux-x64-musl@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-linux-x64-musl@npm:1.0.1" +"@napi-rs/nice-linux-x64-musl@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-x64-musl@npm:1.1.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@napi-rs/nice-win32-arm64-msvc@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-win32-arm64-msvc@npm:1.0.1" +"@napi-rs/nice-openharmony-arm64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-openharmony-arm64@npm:1.1.1" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-win32-arm64-msvc@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-win32-arm64-msvc@npm:1.1.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@napi-rs/nice-win32-ia32-msvc@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-win32-ia32-msvc@npm:1.0.1" +"@napi-rs/nice-win32-ia32-msvc@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-win32-ia32-msvc@npm:1.1.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@napi-rs/nice-win32-x64-msvc@npm:1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice-win32-x64-msvc@npm:1.0.1" +"@napi-rs/nice-win32-x64-msvc@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-win32-x64-msvc@npm:1.1.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@napi-rs/nice@npm:^1.0.1": - version: 1.0.1 - resolution: "@napi-rs/nice@npm:1.0.1" - dependencies: - "@napi-rs/nice-android-arm-eabi": "npm:1.0.1" - "@napi-rs/nice-android-arm64": "npm:1.0.1" - "@napi-rs/nice-darwin-arm64": "npm:1.0.1" - "@napi-rs/nice-darwin-x64": "npm:1.0.1" - "@napi-rs/nice-freebsd-x64": "npm:1.0.1" - "@napi-rs/nice-linux-arm-gnueabihf": "npm:1.0.1" - "@napi-rs/nice-linux-arm64-gnu": "npm:1.0.1" - "@napi-rs/nice-linux-arm64-musl": "npm:1.0.1" - "@napi-rs/nice-linux-ppc64-gnu": "npm:1.0.1" - "@napi-rs/nice-linux-riscv64-gnu": "npm:1.0.1" - "@napi-rs/nice-linux-s390x-gnu": "npm:1.0.1" - "@napi-rs/nice-linux-x64-gnu": "npm:1.0.1" - "@napi-rs/nice-linux-x64-musl": "npm:1.0.1" - "@napi-rs/nice-win32-arm64-msvc": "npm:1.0.1" - "@napi-rs/nice-win32-ia32-msvc": "npm:1.0.1" - "@napi-rs/nice-win32-x64-msvc": "npm:1.0.1" +"@napi-rs/nice@npm:^1.0.4": + version: 1.1.1 + resolution: "@napi-rs/nice@npm:1.1.1" + dependencies: + "@napi-rs/nice-android-arm-eabi": "npm:1.1.1" + "@napi-rs/nice-android-arm64": "npm:1.1.1" + "@napi-rs/nice-darwin-arm64": "npm:1.1.1" + "@napi-rs/nice-darwin-x64": "npm:1.1.1" + "@napi-rs/nice-freebsd-x64": "npm:1.1.1" + "@napi-rs/nice-linux-arm-gnueabihf": "npm:1.1.1" + "@napi-rs/nice-linux-arm64-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-arm64-musl": "npm:1.1.1" + "@napi-rs/nice-linux-ppc64-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-riscv64-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-s390x-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-x64-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-x64-musl": "npm:1.1.1" + "@napi-rs/nice-openharmony-arm64": "npm:1.1.1" + "@napi-rs/nice-win32-arm64-msvc": "npm:1.1.1" + "@napi-rs/nice-win32-ia32-msvc": "npm:1.1.1" + "@napi-rs/nice-win32-x64-msvc": "npm:1.1.1" dependenciesMeta: "@napi-rs/nice-android-arm-eabi": optional: true @@ -1710,24 +1738,37 @@ __metadata: optional: true "@napi-rs/nice-linux-x64-musl": optional: true + "@napi-rs/nice-openharmony-arm64": + optional: true "@napi-rs/nice-win32-arm64-msvc": optional: true "@napi-rs/nice-win32-ia32-msvc": optional: true "@napi-rs/nice-win32-x64-msvc": optional: true - checksum: 10c0/9be30f8292e23f45f5b8f6553411f5cbaead998cc3a51859c60f56fc2e679610a3a04ed49b748267552b9abd17fe5e6ae88186e223ab5cb93d5d184d10b6569b + checksum: 10c0/517eacfd5d5de191f1469a6caad9f9e26924b25079550149fc792fb09d15184013a8a81966a666f08c0a93fbb17a458d50ba9e2e9d6a61141c6c515d083733b2 languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^0.2.10": - version: 0.2.11 - resolution: "@napi-rs/wasm-runtime@npm:0.2.11" +"@napi-rs/wasm-runtime@npm:^0.2.12": + version: 0.2.12 + resolution: "@napi-rs/wasm-runtime@npm:0.2.12" dependencies: "@emnapi/core": "npm:^1.4.3" "@emnapi/runtime": "npm:^1.4.3" - "@tybys/wasm-util": "npm:^0.9.0" - checksum: 10c0/049bd14c58b99fbe0967b95e9921c5503df196b59be22948d2155f17652eb305cff6728efd8685338b855da7e476dd2551fbe3a313fc2d810938f0717478441e + "@tybys/wasm-util": "npm:^0.10.0" + checksum: 10c0/6d07922c0613aab30c6a497f4df297ca7c54e5b480e00035e0209b872d5c6aab7162fc49477267556109c2c7ed1eb9c65a174e27e9b87568106a87b0a6e3ca7d + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:^1.0.3": + version: 1.0.3 + resolution: "@napi-rs/wasm-runtime@npm:1.0.3" + dependencies: + "@emnapi/core": "npm:^1.4.5" + "@emnapi/runtime": "npm:^1.4.5" + "@tybys/wasm-util": "npm:^0.10.0" + checksum: 10c0/7918d82477e75931b6e35bb003464382eb93e526362f81a98bf8610407a67b10f4d041931015ad48072c89db547deb7e471dfb91f4ab11ac63a24d8580297f75 languageName: node linkType: hard @@ -1778,20 +1819,7 @@ __metadata: dependencies: "@nodelib/fs.scandir": "npm:2.1.5" fastq: "npm:^1.6.0" - checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 languageName: node linkType: hard @@ -1808,15 +1836,6 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 - languageName: node - linkType: hard - "@npmcli/fs@npm:^4.0.0": version: 4.0.0 resolution: "@npmcli/fs@npm:4.0.0" @@ -1877,11 +1896,11 @@ __metadata: linkType: hard "@npmcli/promise-spawn@npm:^8.0.0": - version: 8.0.2 - resolution: "@npmcli/promise-spawn@npm:8.0.2" + version: 8.0.3 + resolution: "@npmcli/promise-spawn@npm:8.0.3" dependencies: which: "npm:^5.0.0" - checksum: 10c0/fe987dece7b843d9353d4d38982336ab3beabc2dd3c135862a4ba2921aae55b0d334891fe44c6cbbee20626259e54478bf498ad8d380c14c53732b489ae14f40 + checksum: 10c0/596b8f626d3764c761cb931982546b8a94ceedcb6d62884b90118be1b06c7e33b3f5890f4946e29d4b913ec3089384b13c3957d8b58e33ceb6ac4daf786e84a0 languageName: node linkType: hard @@ -1906,6 +1925,20 @@ __metadata: languageName: node linkType: hard +"@oxc-project/runtime@npm:=0.81.0": + version: 0.81.0 + resolution: "@oxc-project/runtime@npm:0.81.0" + checksum: 10c0/735d9f29499ef613d3ad45dc81616c627c9f0cf827f2dbe7fabcfbce7006d49bd6e79fd008dc5b9eba4a8a65fdd510eb7e6c07ee839721bf6e381cd97f092343 + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.81.0": + version: 0.81.0 + resolution: "@oxc-project/types@npm:0.81.0" + checksum: 10c0/10a96658d007c16e0b65b5f058f2a4affee29511330ca6abcb7d542aa381b2c2aa313fa34dec246816303836ed30f812418f732de836cd8d7beacf326f898ab4 + languageName: node + linkType: hard + "@parcel/watcher-android-arm64@npm:2.5.1": version: 2.5.1 resolution: "@parcel/watcher-android-arm64@npm:2.5.1" @@ -2057,294 +2090,268 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.2" - conditions: os=android & cpu=arm +"@rolldown/binding-android-arm64@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-android-arm64@npm:1.0.0-beta.32" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.43.0" - conditions: os=android & cpu=arm +"@rolldown/binding-darwin-arm64@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-beta.32" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-android-arm64@npm:4.40.2" - conditions: os=android & cpu=arm64 +"@rolldown/binding-darwin-x64@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-beta.32" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-android-arm64@npm:4.43.0" - conditions: os=android & cpu=arm64 +"@rolldown/binding-freebsd-x64@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-beta.32" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.40.2" - conditions: os=darwin & cpu=arm64 +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.32" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.43.0" - conditions: os=darwin & cpu=arm64 +"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.32" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.40.2" - conditions: os=darwin & cpu=x64 +"@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.32" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.43.0" - conditions: os=darwin & cpu=x64 +"@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.32" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.40.2" - conditions: os=freebsd & cpu=arm64 +"@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.32" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.43.0" - conditions: os=freebsd & cpu=arm64 +"@rolldown/binding-openharmony-arm64@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-beta.32" + conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-freebsd-x64@npm:4.40.2" - conditions: os=freebsd & cpu=x64 +"@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.32" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.0.3" + conditions: cpu=wasm32 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.43.0" - conditions: os=freebsd & cpu=x64 +"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.32" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.40.2" - conditions: os=linux & cpu=arm & libc=glibc +"@rolldown/binding-win32-ia32-msvc@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-win32-ia32-msvc@npm:1.0.0-beta.32" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.43.0" - conditions: os=linux & cpu=arm & libc=glibc +"@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.32" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.40.2" - conditions: os=linux & cpu=arm & libc=musl +"@rolldown/pluginutils@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.32" + checksum: 10c0/ba3582fc3c35c8eb57b0df2d22d0733b1be83d37edcc258203364773f094f58fc0cb7a056d604603573a69dd0105a466506cad467f59074e1e53d0dc26191f06 languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.43.0" - conditions: os=linux & cpu=arm & libc=musl +"@rollup/rollup-android-arm-eabi@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.50.0" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.40.2" - conditions: os=linux & cpu=arm64 & libc=glibc +"@rollup/rollup-android-arm64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-android-arm64@npm:4.50.0" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.43.0" - conditions: os=linux & cpu=arm64 & libc=glibc +"@rollup/rollup-darwin-arm64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.50.0" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.40.2" - conditions: os=linux & cpu=arm64 & libc=musl +"@rollup/rollup-darwin-x64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.50.0" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.43.0" - conditions: os=linux & cpu=arm64 & libc=musl +"@rollup/rollup-freebsd-arm64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.50.0" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.40.2" - conditions: os=linux & cpu=loong64 & libc=glibc +"@rollup/rollup-freebsd-x64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.50.0" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.43.0" - conditions: os=linux & cpu=loong64 & libc=glibc +"@rollup/rollup-linux-arm-gnueabihf@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.0" + conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.2" - conditions: os=linux & cpu=ppc64 & libc=glibc +"@rollup/rollup-linux-arm-musleabihf@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.50.0" + conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.43.0" - conditions: os=linux & cpu=ppc64 & libc=glibc +"@rollup/rollup-linux-arm64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.50.0" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.40.2" - conditions: os=linux & cpu=riscv64 & libc=glibc +"@rollup/rollup-linux-arm64-musl@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.50.0" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.43.0" - conditions: os=linux & cpu=riscv64 & libc=glibc +"@rollup/rollup-linux-loongarch64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.50.0" + conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.40.2" - conditions: os=linux & cpu=riscv64 & libc=musl +"@rollup/rollup-linux-ppc64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.50.0" + conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.43.0" - conditions: os=linux & cpu=riscv64 & libc=musl +"@rollup/rollup-linux-riscv64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.50.0" + conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.40.2" - conditions: os=linux & cpu=s390x & libc=glibc +"@rollup/rollup-linux-riscv64-musl@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.50.0" + conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.43.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.50.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.40.2" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.43.0" +"@rollup/rollup-linux-x64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.50.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.40.2" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.43.0" +"@rollup/rollup-linux-x64-musl@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.50.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.40.2" - conditions: os=win32 & cpu=arm64 +"@rollup/rollup-openharmony-arm64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.50.0" + conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.43.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.50.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.40.2" +"@rollup/rollup-win32-ia32-msvc@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.50.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.43.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.40.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.43.0" +"@rollup/rollup-win32-x64-msvc@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.50.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@schematics/angular@npm:20.0.2": - version: 20.0.2 - resolution: "@schematics/angular@npm:20.0.2" +"@schematics/angular@npm:20.2.2": + version: 20.2.2 + resolution: "@schematics/angular@npm:20.2.2" dependencies: - "@angular-devkit/core": "npm:20.0.2" - "@angular-devkit/schematics": "npm:20.0.2" + "@angular-devkit/core": "npm:20.2.2" + "@angular-devkit/schematics": "npm:20.2.2" jsonc-parser: "npm:3.3.1" - checksum: 10c0/35aff2559caa78a8d136e8a129342bc21056caf37bcfca1d034d485b80b0b4216ba7a1d0314acefd56b1570a3c45cf12aee56f923be5fe5d6484c6fe4ad4e5e0 + checksum: 10c0/ca328a9e180ae39567b29e9218b0e259495cc936606bfb6864e47dbac05716ca5d0fa646f0262264c19ef6c2ef8e442ba392f905349db2dd53513030e979f7c5 languageName: node linkType: hard @@ -2413,128 +2420,128 @@ __metadata: languageName: node linkType: hard -"@tailwindcss/node@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/node@npm:4.1.10" +"@tailwindcss/node@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/node@npm:4.1.13" dependencies: - "@ampproject/remapping": "npm:^2.3.0" - enhanced-resolve: "npm:^5.18.1" - jiti: "npm:^2.4.2" + "@jridgewell/remapping": "npm:^2.3.4" + enhanced-resolve: "npm:^5.18.3" + jiti: "npm:^2.5.1" lightningcss: "npm:1.30.1" - magic-string: "npm:^0.30.17" + magic-string: "npm:^0.30.18" source-map-js: "npm:^1.2.1" - tailwindcss: "npm:4.1.10" - checksum: 10c0/5cf900fe53ba08b5d9bfbd48925ea2c18eb8f89ae47738d95372152ed9b20c020bf3660ad04fa5dbb67f62ce01efd431cf4d3015d2d43e918fa89ce3c77b5170 + tailwindcss: "npm:4.1.13" + checksum: 10c0/969b2eaefced271655fdf53a07737103736115c6b55fa1559c78147d17871da988c165ab2236bf4da8cdbde1e50a5116b8df2225e20f63de981d43da5b69e3f1 languageName: node linkType: hard -"@tailwindcss/oxide-android-arm64@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.10" +"@tailwindcss/oxide-android-arm64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.13" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-arm64@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.10" +"@tailwindcss/oxide-darwin-arm64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.13" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-x64@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.10" +"@tailwindcss/oxide-darwin-x64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.13" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-freebsd-x64@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.10" +"@tailwindcss/oxide-freebsd-x64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.13" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.10" +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.13" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.10" +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.13" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.10" +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.13" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.10" +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.13" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-musl@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.10" +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.13" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-wasm32-wasi@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.10" +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.13" dependencies: - "@emnapi/core": "npm:^1.4.3" - "@emnapi/runtime": "npm:^1.4.3" - "@emnapi/wasi-threads": "npm:^1.0.2" - "@napi-rs/wasm-runtime": "npm:^0.2.10" - "@tybys/wasm-util": "npm:^0.9.0" + "@emnapi/core": "npm:^1.4.5" + "@emnapi/runtime": "npm:^1.4.5" + "@emnapi/wasi-threads": "npm:^1.0.4" + "@napi-rs/wasm-runtime": "npm:^0.2.12" + "@tybys/wasm-util": "npm:^0.10.0" tslib: "npm:^2.8.0" conditions: cpu=wasm32 languageName: node linkType: hard -"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.10" +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.13" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.10" +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.13" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide@npm:4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/oxide@npm:4.1.10" +"@tailwindcss/oxide@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide@npm:4.1.13" dependencies: - "@tailwindcss/oxide-android-arm64": "npm:4.1.10" - "@tailwindcss/oxide-darwin-arm64": "npm:4.1.10" - "@tailwindcss/oxide-darwin-x64": "npm:4.1.10" - "@tailwindcss/oxide-freebsd-x64": "npm:4.1.10" - "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.10" - "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.10" - "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.10" - "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.10" - "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.10" - "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.10" - "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.10" - "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.10" + "@tailwindcss/oxide-android-arm64": "npm:4.1.13" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.13" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.13" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.13" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.13" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.13" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.13" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.13" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.13" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.13" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.13" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.13" detect-libc: "npm:^2.0.4" tar: "npm:^7.4.3" dependenciesMeta: @@ -2562,20 +2569,20 @@ __metadata: optional: true "@tailwindcss/oxide-win32-x64-msvc": optional: true - checksum: 10c0/38adecfedb1854acbf82538881b9caf475e656a3cb9b86d860c0bfac5f3f042da34c85d664506ab0feaff2d6106d29d74afc93ea8c4281e4eac35da690f6ca5c + checksum: 10c0/7cc64827b0c854724a3b371a7f1484535db5cca9f53dda359631bce9c42b043f2822db6c5359f7ed9f1c8adbc48ecb52c414454f9330ffd25a9a679686d2a83e languageName: node linkType: hard "@tailwindcss/postcss@npm:^4.1.10": - version: 4.1.10 - resolution: "@tailwindcss/postcss@npm:4.1.10" + version: 4.1.13 + resolution: "@tailwindcss/postcss@npm:4.1.13" dependencies: "@alloc/quick-lru": "npm:^5.2.0" - "@tailwindcss/node": "npm:4.1.10" - "@tailwindcss/oxide": "npm:4.1.10" + "@tailwindcss/node": "npm:4.1.13" + "@tailwindcss/oxide": "npm:4.1.13" postcss: "npm:^8.4.41" - tailwindcss: "npm:4.1.10" - checksum: 10c0/f320527b4e50e586e6bbe0e653f0c63ef0738a40737d1c80f47b074d42c0762d8dc20d40cbea9f13c7592f008e850b2f6eac61439ef9dc1c366d11dea52afda1 + tailwindcss: "npm:4.1.13" + checksum: 10c0/c5ea1cc00a966989df274ec4de44294a08344d3957636eb416f7e95a84060ddbc974e66968c2b88c6eb2e90b217d231f2b33e8af4792836b4025f26a95ce3ab2 languageName: node linkType: hard @@ -2596,49 +2603,35 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.9.0": - version: 0.9.0 - resolution: "@tybys/wasm-util@npm:0.9.0" +"@tybys/wasm-util@npm:^0.10.0": + version: 0.10.0 + resolution: "@tybys/wasm-util@npm:0.10.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d - languageName: node - linkType: hard - -"@types/cookie@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cookie@npm:0.4.1" - checksum: 10c0/f96afe12bd51be1ec61410b0641243d93fa3a494702407c787a4c872b5c8bcd39b224471452055e44a9ce42af1a636e87d161994226eaf4c2be9c30f60418409 + checksum: 10c0/044feba55c1e2af703aa4946139969badb183ce1a659a75ed60bc195a90e73a3f3fc53bcd643497c9954597763ddb051fec62f80962b2ca6fc716ba897dc696e languageName: node linkType: hard "@types/cors@npm:^2.8.12": - version: 2.8.17 - resolution: "@types/cors@npm:2.8.17" + version: 2.8.19 + resolution: "@types/cors@npm:2.8.19" dependencies: "@types/node": "npm:*" - checksum: 10c0/457364c28c89f3d9ed34800e1de5c6eaaf344d1bb39af122f013322a50bc606eb2aa6f63de4e41a7a08ba7ef454473926c94a830636723da45bf786df032696d - languageName: node - linkType: hard - -"@types/estree@npm:1.0.7": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c + checksum: 10c0/b5dd407040db7d8aa1bd36e79e5f3f32292f6b075abc287529e9f48df1a25fda3e3799ba30b4656667ffb931d3b75690c1d6ca71e39f7337ea6dfda8581916d0 languageName: node linkType: hard -"@types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a +"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.6": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 languageName: node linkType: hard "@types/jasmine@npm:~5.1.7": - version: 5.1.7 - resolution: "@types/jasmine@npm:5.1.7" - checksum: 10c0/f8df11fb8c8dce20088bfbaf5f805878b1228b4522f6ef100ea539e2f363537304095200ea8e856a0795e45d18803970d12683bc5afa35ccb475cc8ec5ea6d54 + version: 5.1.9 + resolution: "@types/jasmine@npm:5.1.9" + checksum: 10c0/f39edad861c8d9c980fc5a8b594dc835d72bfa4187b9799a8a1d716b658ac0680e4a50d60e792718acfa19dc62016e8a23c2c6a87a2c90d1e31d070c01da1954 languageName: node linkType: hard @@ -2649,149 +2642,122 @@ __metadata: languageName: node linkType: hard +"@types/lodash@npm:^4": + version: 4.17.20 + resolution: "@types/lodash@npm:4.17.20" + checksum: 10c0/98cdd0faae22cbb8079a01a3bb65aa8f8c41143367486c1cbf5adc83f16c9272a2a5d2c1f541f61d0d73da543c16ee1d21cf2ef86cb93cd0cc0ac3bced6dd88f + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:>=10.0.0": - version: 22.8.6 - resolution: "@types/node@npm:22.8.6" + version: 24.3.1 + resolution: "@types/node@npm:24.3.1" dependencies: - undici-types: "npm:~6.19.8" - checksum: 10c0/d3a11f2549234a91a4c5d0ff35ab4bdcb7ba34db4d3f1d189be39b8bd41c19aac98d117150a95a9c5a9d45b1014135477ea240b2b8317c86ae3d3cf1c3b3f8f4 + undici-types: "npm:~7.10.0" + checksum: 10c0/99b86fc32294fcd61136ca1f771026443a1e370e9f284f75e243b29299dd878e18c193deba1ce29a374932db4e30eb80826e1049b9aad02d36f5c30b94b6f928 languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.34.0" +"@typescript-eslint/eslint-plugin@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.42.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.34.0" - "@typescript-eslint/type-utils": "npm:8.34.0" - "@typescript-eslint/utils": "npm:8.34.0" - "@typescript-eslint/visitor-keys": "npm:8.34.0" + "@typescript-eslint/scope-manager": "npm:8.42.0" + "@typescript-eslint/type-utils": "npm:8.42.0" + "@typescript-eslint/utils": "npm:8.42.0" + "@typescript-eslint/visitor-keys": "npm:8.42.0" graphemer: "npm:^1.4.0" ignore: "npm:^7.0.0" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - "@typescript-eslint/parser": ^8.34.0 + "@typescript-eslint/parser": ^8.42.0 eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/905a05d15f4b0367838ec445f9890321d87470198bf7a589278fc0f38c82cf3ccc1efce4acd3c9c94ee6149d5579ef58606fb7c50f4db50c830de65af8c27c6d + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/835fd7497f0e4eaef55dc3d94079acc0ad1dc74735916915f160419b1e7f44d04fbce683b4871148d1af33046bd5ae3fed59103d4c49460776b560c42173bbff languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/parser@npm:8.34.0" +"@typescript-eslint/parser@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/parser@npm:8.42.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.34.0" - "@typescript-eslint/types": "npm:8.34.0" - "@typescript-eslint/typescript-estree": "npm:8.34.0" - "@typescript-eslint/visitor-keys": "npm:8.34.0" + "@typescript-eslint/scope-manager": "npm:8.42.0" + "@typescript-eslint/types": "npm:8.42.0" + "@typescript-eslint/typescript-estree": "npm:8.42.0" + "@typescript-eslint/visitor-keys": "npm:8.42.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/a829be00ea3455c1e50983c8b44476fbfc9329d019764e407c4d591a95dbd168f83f13e309751242bb4fdc02f89cb51ca5cdc912a12b10f69eebcb1c46dcc39b + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/f071154bce7f874449236919a7367d977317959fe6d454fe5369ca54dee7d057fe3b8b250c5990ea4205a9c52fd59702da63d1721895c72d745168aa31532112 languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/project-service@npm:8.34.0" +"@typescript-eslint/project-service@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/project-service@npm:8.42.0" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.34.0" - "@typescript-eslint/types": "npm:^8.34.0" + "@typescript-eslint/tsconfig-utils": "npm:^8.42.0" + "@typescript-eslint/types": "npm:^8.42.0" debug: "npm:^4.3.4" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/88e64b8daf7db9603277fcbeb9e585e70ec6d6e34fa10d4b60f421e48081cc7c1f6acb01e1ee9dd95e10c0601f164c1defbfe6c9d1edc9822089bb72dbb0fc80 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.18.0": - version: 8.18.0 - resolution: "@typescript-eslint/scope-manager@npm:8.18.0" - dependencies: - "@typescript-eslint/types": "npm:8.18.0" - "@typescript-eslint/visitor-keys": "npm:8.18.0" - checksum: 10c0/6bf6532fd43f2b55b9b47fa8b0217c5b5a03f022e869a6a21228fc3ae04c0ac6c5ae5d6026866d189ba424d2f98cc6fbd2a34f909d241c9b86c031afd808f90c + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/788b0bc52683be376cd768a4fed3202cdaccc86f231ec94a0f6bbb1389fdfd0e14c505f03015cefb73869de63c8089b78a169ed957048a1e5ee1b6250ec19604 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/scope-manager@npm:8.34.0" +"@typescript-eslint/scope-manager@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/scope-manager@npm:8.42.0" dependencies: - "@typescript-eslint/types": "npm:8.34.0" - "@typescript-eslint/visitor-keys": "npm:8.34.0" - checksum: 10c0/35af36bddc4c227cb0bac42192c40b38179ced30866b6aac642781e21c3f3b1c72051eb4f685d7c99517c3296dd6ba83dd8360e4072e8dcf604aae266eece1b4 + "@typescript-eslint/types": "npm:8.42.0" + "@typescript-eslint/visitor-keys": "npm:8.42.0" + checksum: 10c0/caca15f2124909c588ed3e48fe0769ad8baa296a0b229f724ec94f5f746e486e08dd49eeddd66d01f09e2ddaed03f9e18d7b535a44196d413f283e22f929f623 languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.34.0, @typescript-eslint/tsconfig-utils@npm:^8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.34.0" +"@typescript-eslint/tsconfig-utils@npm:8.42.0, @typescript-eslint/tsconfig-utils@npm:^8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.42.0" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/98246f89d169d3feb453a6a8552c51d10225cb00c4ff1501549b7846e564ad0e218b644cd94ce779dceed07dcb9035c53fd32186b4c0223b7b2a1f7295b120c3 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/03882eeee279fafa2cb4ee3154742417fd29395b3bfe3f867d9d4cb9cb68d1200c885c35b96dd558a1aff8561ac3700cff8ca7680a5cf34e5e0e136a6ee3c30c languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/type-utils@npm:8.34.0" +"@typescript-eslint/type-utils@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/type-utils@npm:8.42.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.34.0" - "@typescript-eslint/utils": "npm:8.34.0" + "@typescript-eslint/types": "npm:8.42.0" + "@typescript-eslint/typescript-estree": "npm:8.42.0" + "@typescript-eslint/utils": "npm:8.42.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/7c25d7f4186411190142390467160e81384d400cfb21183d8a305991c723da0a74e5528cdce30b5f2cb6d9d2f6af7c0981c20c18b45fc084b35632429270ae80 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.18.0, @typescript-eslint/types@npm:^8.0.0": - version: 8.18.0 - resolution: "@typescript-eslint/types@npm:8.18.0" - checksum: 10c0/2dd7468c3f1c305545268b72c3a333488e6ab1b628c5f65081d895866422b9376c21634a7aac437805f84b22e352b6a8fc4dcf925ef4a8fd7d1898b8359f71be - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.34.0, @typescript-eslint/types@npm:^8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/types@npm:8.34.0" - checksum: 10c0/5d32b2ac03e4cbc1ac1777a53ee83d6d7887a783363bab4f0a6f7550a9e9df0254971cdf71e13b988e2215f2939e7592404856b8acb086ec63c4479c0225c742 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/47e5f7276cafd7719d3e2f2e456fa988927e658d15c2c188a692d9c639f9d76f582a6c133cb1bf01eba9027e1022eb6b79b57861a96302460e5e847c2b536afa languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.18.0": - version: 8.18.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.18.0" - dependencies: - "@typescript-eslint/types": "npm:8.18.0" - "@typescript-eslint/visitor-keys": "npm:8.18.0" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^1.3.0" - peerDependencies: - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/87b432b190b627314f007b17b2371898db78baaa3df67a0d9a94d080d88a7a307906b54a735084cacef37f6421e2b9c3320040617e73fe54eac2bf22c610f1ec +"@typescript-eslint/types@npm:8.42.0, @typescript-eslint/types@npm:^8.0.0, @typescript-eslint/types@npm:^8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/types@npm:8.42.0" + checksum: 10c0/d585dff5005328282cc59f9402e886a3db64727906ad3e68b49d7ef73bc07bef3ed569287ba826ebaa07b69be42a72232a38529951d64c28cebd83db0892cd33 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.34.0" +"@typescript-eslint/typescript-estree@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.42.0" dependencies: - "@typescript-eslint/project-service": "npm:8.34.0" - "@typescript-eslint/tsconfig-utils": "npm:8.34.0" - "@typescript-eslint/types": "npm:8.34.0" - "@typescript-eslint/visitor-keys": "npm:8.34.0" + "@typescript-eslint/project-service": "npm:8.42.0" + "@typescript-eslint/tsconfig-utils": "npm:8.42.0" + "@typescript-eslint/types": "npm:8.42.0" + "@typescript-eslint/visitor-keys": "npm:8.42.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -2799,67 +2765,42 @@ __metadata: semver: "npm:^7.6.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/e678982b0009e895aee2b4ccc55bb9ea5473a32e846a97c63d0c6a978c72e1a29e506e6a5f9dda45e9b7803e6c3e3abcdf4c316af1c59146abef4e10e0e94129 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/2d3354d780421cfa90f812048984c43cd47aabecef7a5c0f56ad0b91331cb369d1c8366da90bf9a8f6df47df3741f9e16897e998f16270ac55376f519b775c23 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/utils@npm:8.34.0" +"@typescript-eslint/utils@npm:8.42.0, @typescript-eslint/utils@npm:^8.0.0": + version: 8.42.0 + resolution: "@typescript-eslint/utils@npm:8.42.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.34.0" - "@typescript-eslint/types": "npm:8.34.0" - "@typescript-eslint/typescript-estree": "npm:8.34.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/d759cf6f1b1b23d7d8ab922345e7b68b7c829f4bad841164312cfa3a3e8e818b962dd0d96c1aca7fd7c10248d56538d9714df5f3cfec9f159ca0a139feac60b9 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:^8.0.0": - version: 8.18.0 - resolution: "@typescript-eslint/utils@npm:8.18.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.18.0" - "@typescript-eslint/types": "npm:8.18.0" - "@typescript-eslint/typescript-estree": "npm:8.18.0" + "@typescript-eslint/scope-manager": "npm:8.42.0" + "@typescript-eslint/types": "npm:8.42.0" + "@typescript-eslint/typescript-estree": "npm:8.42.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/58a2fc1e404d1f905c2a958d995824eb4abc6e73836b186717550677f8b1d17954acc369feddb83277350915388bc3d8b721423c37777b8b8017fc29c89ec6ee - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.18.0": - version: 8.18.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.18.0" - dependencies: - "@typescript-eslint/types": "npm:8.18.0" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/d4cdc2adab553098b5be7117fb7df76fb66cfd380528881a0a8c2a9eee03bf8baddda07d15ca0bd3ed8b35c379b3f449292183df18e3e81898dbcadafcb708b8 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/acf30019023669ddae00c02cabfa74fc12defccd4703e552ab5115edbeceaaf1688c1586873bf66aefeb3f03eb1ed456905403303913c724db38bf030e40a700 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.34.0": - version: 8.34.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.34.0" +"@typescript-eslint/visitor-keys@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.42.0" dependencies: - "@typescript-eslint/types": "npm:8.34.0" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/d50997e921a178589913d08ffe14d02eba40666c90bdc0c9751f2b87ce500598f64027e2d866dfc975647b2f8b907158503d0722d6b1976c8f1cf5dd8e1d6d69 + "@typescript-eslint/types": "npm:8.42.0" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/22c942f2a100d71c08f952b976446e824ddf227d4ac02b7016e12d4a33804ab06072d570695baed3565d0a08a1d3fa6ff3ccf97a122d63e65780f871d597f1b1 languageName: node linkType: hard -"@vitejs/plugin-basic-ssl@npm:2.0.0": - version: 2.0.0 - resolution: "@vitejs/plugin-basic-ssl@npm:2.0.0" +"@vitejs/plugin-basic-ssl@npm:2.1.0": + version: 2.1.0 + resolution: "@vitejs/plugin-basic-ssl@npm:2.1.0" peerDependencies: - vite: ^6.0.0 - checksum: 10c0/673f46dc5ee042f6fcfa7ecf514e717e770085f8979d4608cab952f3e9003fe7aed589cc812a67f3dcd5e80655975c6490ce8a07a4b6feef98766003256d4283 + vite: ^6.0.0 || ^7.0.0 + checksum: 10c0/aa618be6bd915163aba27b2db780eab2f0e5d800fea48795f638fb6c1d098db8008ba7f84c708dc191159efecf6ec4e0191ebc5bb7a1a31779c01d0252bf56b0 languageName: node linkType: hard @@ -2870,13 +2811,6 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 - languageName: node - linkType: hard - "abbrev@npm:^3.0.0": version: 3.0.1 resolution: "abbrev@npm:3.0.1" @@ -2884,6 +2818,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: "npm:^3.0.0" + negotiator: "npm:^1.0.0" + checksum: 10c0/98374742097e140891546076215f90c32644feacf652db48412329de4c2a529178a81aa500fbb13dd3e6cbf6e68d829037b123ac037fc9a08bcec4b87b358eef + languageName: node + linkType: hard + "accepts@npm:~1.3.4, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -2903,15 +2847,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.14.0": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" - bin: - acorn: bin/acorn - checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 - languageName: node - linkType: hard - "acorn@npm:^8.15.0": version: 8.15.0 resolution: "acorn@npm:8.15.0" @@ -2921,29 +2856,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 - languageName: node - linkType: hard - -"agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe languageName: node linkType: hard @@ -2973,7 +2889,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4": +"ajv@npm:^6.12.4, ajv@npm:^6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -2985,31 +2901,53 @@ __metadata: languageName: node linkType: hard -"angular-eslint@npm:20.0.0": - version: 20.0.0 - resolution: "angular-eslint@npm:20.0.0" +"algoliasearch@npm:5.35.0": + version: 5.35.0 + resolution: "algoliasearch@npm:5.35.0" + dependencies: + "@algolia/abtesting": "npm:1.1.0" + "@algolia/client-abtesting": "npm:5.35.0" + "@algolia/client-analytics": "npm:5.35.0" + "@algolia/client-common": "npm:5.35.0" + "@algolia/client-insights": "npm:5.35.0" + "@algolia/client-personalization": "npm:5.35.0" + "@algolia/client-query-suggestions": "npm:5.35.0" + "@algolia/client-search": "npm:5.35.0" + "@algolia/ingestion": "npm:1.35.0" + "@algolia/monitoring": "npm:1.35.0" + "@algolia/recommend": "npm:5.35.0" + "@algolia/requester-browser-xhr": "npm:5.35.0" + "@algolia/requester-fetch": "npm:5.35.0" + "@algolia/requester-node-http": "npm:5.35.0" + checksum: 10c0/3b6593dc285e7dadda08dea3998391b9439b4e1144e8da767311e470e69e33067f2396e628cdf24767d52bdc0c08c063991cf76ac787ce5aec36864fcc1e3f9a + languageName: node + linkType: hard + +"angular-eslint@npm:20.2.0": + version: 20.2.0 + resolution: "angular-eslint@npm:20.2.0" dependencies: "@angular-devkit/core": "npm:>= 20.0.0 < 21.0.0" "@angular-devkit/schematics": "npm:>= 20.0.0 < 21.0.0" - "@angular-eslint/builder": "npm:20.0.0" - "@angular-eslint/eslint-plugin": "npm:20.0.0" - "@angular-eslint/eslint-plugin-template": "npm:20.0.0" - "@angular-eslint/schematics": "npm:20.0.0" - "@angular-eslint/template-parser": "npm:20.0.0" + "@angular-eslint/builder": "npm:20.2.0" + "@angular-eslint/eslint-plugin": "npm:20.2.0" + "@angular-eslint/eslint-plugin-template": "npm:20.2.0" + "@angular-eslint/schematics": "npm:20.2.0" + "@angular-eslint/template-parser": "npm:20.2.0" "@typescript-eslint/types": "npm:^8.0.0" "@typescript-eslint/utils": "npm:^8.0.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: "*" typescript-eslint: ^8.0.0 - checksum: 10c0/4f93b8bb4dc3ffd2ac1332c870cb7684e4d575471025ee19f58b4115ca5a6ad89b2db0a9b1f4c9aba60d0bee2e1a67da579c0be2291afdb0f630ca05fe6de742 + checksum: 10c0/8a6afb7bfd68217ca7c6fb9ae6ce1acc12bff7c47456a0305095f31061ec3c47e64d1319ad5081146969acec7ee387bbbe6b80c7593fbd67fa4948b9746a1531 languageName: node linkType: hard "animejs@npm:^4.0.2": - version: 4.0.2 - resolution: "animejs@npm:4.0.2" - checksum: 10c0/1889e145d61104a7531852ab7111e9077389047de9d5761288bb7ee4bdacd36184166a718279acd3fe8d1a3c3b45ebda681a505e2162a6c18d468d5103ba8a13 + version: 4.1.3 + resolution: "animejs@npm:4.1.3" + checksum: 10c0/31b573a51f77db4a9a15b1d52b331405a4a2ddcad96d08fd253b327271c79223cac0fb6d634eb1cae8589ec5c0d29d3aba1a50292eef46ea834f6d85197ba398 languageName: node linkType: hard @@ -3039,9 +2977,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + version: 6.2.0 + resolution: "ansi-regex@npm:6.2.0" + checksum: 10c0/20a2e55ae9816074a60e6729dbe3daad664cd967fc82acc08b02f5677db84baa688babf940d71f50acbbb184c02459453789705e079f4d521166ae66451de551 languageName: node linkType: hard @@ -3061,6 +2999,13 @@ __metadata: languageName: node linkType: hard +"ansis@npm:^4.0.0": + version: 4.1.0 + resolution: "ansis@npm:4.1.0" + checksum: 10c0/df62d017a7791babdaf45b93f930d2cfd6d1dab5568b610735c11434c9a5ef8f513740e7cfd80bcbc3530fc8bd892b88f8476f26621efc251230e53cbd1a2c24 + languageName: node + linkType: hard + "anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" @@ -3113,19 +3058,19 @@ __metadata: languageName: node linkType: hard -"beasties@npm:0.3.4": - version: 0.3.4 - resolution: "beasties@npm:0.3.4" +"beasties@npm:0.3.5": + version: 0.3.5 + resolution: "beasties@npm:0.3.5" dependencies: - css-select: "npm:^5.1.0" - css-what: "npm:^6.1.0" + css-select: "npm:^6.0.0" + css-what: "npm:^7.0.0" dom-serializer: "npm:^2.0.0" domhandler: "npm:^5.0.3" htmlparser2: "npm:^10.0.0" picocolors: "npm:^1.1.1" postcss: "npm:^8.4.49" postcss-media-query-parser: "npm:^0.2.3" - checksum: 10c0/e87d6eac3c2bb370789ae50a6e0818451694979bef05383283119fe2098ba6b92ab8210d68437adfb816d24b87b91a4716691e6d604e8876d5330ecc0e1c8c35 + checksum: 10c0/2bb8f386446a1f6d5ee73386971347e16d895f55384510da9fabccada4456a03e6a810e59d63b5faf9b76eb0f18a29f21255d67140b25d8348af7bdf74d0ddad languageName: node linkType: hard @@ -3156,6 +3101,23 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "body-parser@npm:2.2.0" + dependencies: + bytes: "npm:^3.1.2" + content-type: "npm:^1.0.5" + debug: "npm:^4.4.0" + http-errors: "npm:^2.0.0" + iconv-lite: "npm:^0.6.3" + on-finished: "npm:^2.4.1" + qs: "npm:^6.14.0" + raw-body: "npm:^3.0.0" + type-is: "npm:^2.0.0" + checksum: 10c0/a9ded39e71ac9668e2211afa72e82ff86cc5ef94de1250b7d1ba9cc299e4150408aaa5f1e8b03dd4578472a3ce6d1caa2a23b27a6c18e526e48b4595174c116c + languageName: node + linkType: hard + "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -3164,21 +3126,21 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" dependencies: balanced-match: "npm:^1.0.0" concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + checksum: 10c0/975fecac2bb7758c062c20d0b3b6288c7cc895219ee25f0a64a9de662dbac981ff0b6e89909c3897c1f84fa353113a721923afdec5f8b2350255b097f12b1f73 languageName: node linkType: hard "brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf languageName: node linkType: hard @@ -3192,16 +3154,16 @@ __metadata: linkType: hard "browserslist@npm:^4.23.0, browserslist@npm:^4.24.0": - version: 4.24.2 - resolution: "browserslist@npm:4.24.2" + version: 4.25.4 + resolution: "browserslist@npm:4.25.4" dependencies: - caniuse-lite: "npm:^1.0.30001669" - electron-to-chromium: "npm:^1.5.41" - node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.1" + caniuse-lite: "npm:^1.0.30001737" + electron-to-chromium: "npm:^1.5.211" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.3" bin: browserslist: cli.js - checksum: 10c0/d747c9fb65ed7b4f1abcae4959405707ed9a7b835639f8a9ba0da2911995a6ab9b0648fd05baf2a4d4e3cf7f9fdbad56d3753f91881e365992c1d49c8d88ff7a + checksum: 10c0/2b105948990dc2fc0bc2536b4889aadfa15d637e1d857a121611a704cdf539a68f575a391f6bf8b7ff19db36cee1b7834565571f35a7ea691051d2e7fb4f2eb1 languageName: node linkType: hard @@ -3212,33 +3174,13 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2": +"bytes@npm:3.1.2, bytes@npm:^3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f - languageName: node - linkType: hard - "cacache@npm:^19.0.0, cacache@npm:^19.0.1": version: 19.0.1 resolution: "cacache@npm:19.0.1" @@ -3259,16 +3201,23 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" +"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: - es-define-property: "npm:^1.0.0" es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 languageName: node linkType: hard @@ -3279,10 +3228,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001669": - version: 1.0.30001676 - resolution: "caniuse-lite@npm:1.0.30001676" - checksum: 10c0/53d310d76b5282947c99638a65d7534ac28a80aae1920de085a616ec8ad603358fad67cebacfc0452b1efdea12cce24fd37a50a712d074986b4962110e87d82b +"caniuse-lite@npm:^1.0.30001737": + version: 1.0.30001741 + resolution: "caniuse-lite@npm:1.0.30001741" + checksum: 10c0/45746f896205a61a8eeb85a32aeca243ebce640cd6eb80d04949d9389a13f4659c737860300d7b988057599f0958c55eeab74ec02ce9ef137feb7d006e75fec1 languageName: node linkType: hard @@ -3297,16 +3246,16 @@ __metadata: linkType: hard "chalk@npm:^5.3.0": - version: 5.4.1 - resolution: "chalk@npm:5.4.1" - checksum: 10c0/b23e88132c702f4855ca6d25cb5538b1114343e41472d5263ee8a37cccfccd9c4216d111e1097c6a27830407a1dc81fecdf2a56f2c63033d4dbbd88c10b0dcef + version: 5.6.0 + resolution: "chalk@npm:5.6.0" + checksum: 10c0/f8558fc12fd9805f167611803b325b0098bbccdc9f1d3bafead41c9bac61f263357f3c0df0cbe28bc2fd5fca3edcf618b01d6771a5a776b4c15d061482a72b23 languageName: node linkType: hard -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 10c0/96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d +"chardet@npm:^2.1.0": + version: 2.1.0 + resolution: "chardet@npm:2.1.0" + checksum: 10c0/d1b03e47371851ed72741a898281d58f8a9b577aeea6fdfa75a86832898b36c550b3ad057e66d50d774a9cebd9f56c66b6880e4fe75e387794538ba7565b0b6f languageName: node linkType: hard @@ -3330,11 +3279,11 @@ __metadata: linkType: hard "chokidar@npm:^4.0.0": - version: 4.0.1 - resolution: "chokidar@npm:4.0.1" + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" dependencies: readdirp: "npm:^4.0.1" - checksum: 10c0/4bb7a3adc304059810bb6c420c43261a15bb44f610d77c35547addc84faa0374265c3adc67f25d06f363d9a4571962b02679268c40de07676d260de1986efea9 + checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad languageName: node linkType: hard @@ -3352,13 +3301,6 @@ __metadata: languageName: node linkType: hard -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 - languageName: node - linkType: hard - "cli-cursor@npm:^5.0.0": version: 5.0.0 resolution: "cli-cursor@npm:5.0.0" @@ -3403,17 +3345,6 @@ __metadata: languageName: node linkType: hard -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 - languageName: node - linkType: hard - "cliui@npm:^9.0.1": version: 9.0.1 resolution: "cliui@npm:9.0.1" @@ -3476,7 +3407,16 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": +"content-disposition@npm:^1.0.0": + version: 1.0.0 + resolution: "content-disposition@npm:1.0.0" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10c0/c7b1ba0cea2829da0352ebc1b7f14787c73884bc707c8bc2271d9e3bf447b372270d09f5d3980dc5037c749ceef56b9a13fccd0b0001c87c3f12579967e4dd27 + languageName: node + linkType: hard + +"content-type@npm:^1.0.5, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af @@ -3504,6 +3444,13 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:^1.2.1": + version: 1.2.2 + resolution: "cookie-signature@npm:1.2.2" + checksum: 10c0/54e05df1a293b3ce81589b27dddc445f462f6fa6812147c033350cd3561a42bc14481674e05ed14c7bd0ce1e8bb3dc0e40851bad75415733711294ddce0b7bc6 + languageName: node + linkType: hard + "cookie@npm:0.7.1": version: 0.7.1 resolution: "cookie@npm:0.7.1" @@ -3511,14 +3458,14 @@ __metadata: languageName: node linkType: hard -"cookie@npm:~0.7.2": +"cookie@npm:^0.7.1, cookie@npm:~0.7.2": version: 0.7.2 resolution: "cookie@npm:0.7.2" checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 languageName: node linkType: hard -"cors@npm:~2.8.5": +"cors@npm:^2.8.5, cors@npm:~2.8.5": version: 2.8.5 resolution: "cors@npm:2.8.5" dependencies: @@ -3528,18 +3475,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -3550,23 +3486,23 @@ __metadata: languageName: node linkType: hard -"css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" +"css-select@npm:^6.0.0": + version: 6.0.0 + resolution: "css-select@npm:6.0.0" dependencies: boolbase: "npm:^1.0.0" - css-what: "npm:^6.1.0" - domhandler: "npm:^5.0.2" - domutils: "npm:^3.0.1" - nth-check: "npm:^2.0.1" - checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 + css-what: "npm:^7.0.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.2.2" + nth-check: "npm:^2.1.1" + checksum: 10c0/2f63e954b8a9475f25ea3ff23d20c556a99e464113e7dff53711bc63e5b579f17ebc82fe49d6443aa65f656e25f97e2b32b9e8143181fe22758536730b6999ca languageName: node linkType: hard -"css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 +"css-what@npm:^7.0.0": + version: 7.0.0 + resolution: "css-what@npm:7.0.0" + checksum: 10c0/590329e773d8103dcc4f2aefa48d824d5b934b53baae7d8bcc3b61f0a917a0d6b6a1154d7319c6416421e7eb3b1c94704ec21924c485f4b174f0218416211fd9 languageName: node linkType: hard @@ -3593,27 +3529,27 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": - version: 4.3.7 - resolution: "debug@npm:4.3.7" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.1": + version: 4.4.1 + resolution: "debug@npm:4.4.1" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 languageName: node linkType: hard -"debug@npm:^4.3.2": - version: 4.4.0 - resolution: "debug@npm:4.4.0" +"debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de + checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b languageName: node linkType: hard @@ -3624,18 +3560,7 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:^2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c @@ -3652,20 +3577,13 @@ __metadata: "detect-libc@npm:^1.0.3": version: 1.0.3 resolution: "detect-libc@npm:1.0.3" - bin: - detect-libc: ./bin/detect-libc.js - checksum: 10c0/4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.1": - version: 2.0.3 - resolution: "detect-libc@npm:2.0.3" - checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + bin: + detect-libc: ./bin/detect-libc.js + checksum: 10c0/4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d languageName: node linkType: hard -"detect-libc@npm:^2.0.3, detect-libc@npm:^2.0.4": +"detect-libc@npm:^2.0.1, detect-libc@npm:^2.0.3, detect-libc@npm:^2.0.4": version: 2.0.4 resolution: "detect-libc@npm:2.0.4" checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c @@ -3718,25 +3636,25 @@ __metadata: languageName: node linkType: hard -"domutils@npm:^3.0.1": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" +"domutils@npm:^3.2.1, domutils@npm:^3.2.2": + version: 3.2.2 + resolution: "domutils@npm:3.2.2" dependencies: dom-serializer: "npm:^2.0.0" domelementtype: "npm:^2.3.0" domhandler: "npm:^5.0.3" - checksum: 10c0/342d64cf4d07b8a0573fb51e0a6312a88fb520c7fefd751870bf72fa5fc0f2e0cb9a3958a573610b1d608c6e2a69b8e9b4b40f0bfb8f87a71bce4f180cca1887 + checksum: 10c0/47938f473b987ea71cd59e59626eb8666d3aa8feba5266e45527f3b636c7883cca7e582d901531961f742c519d7514636b7973353b648762b2e3bedbf235fada languageName: node linkType: hard -"domutils@npm:^3.2.1": - version: 3.2.2 - resolution: "domutils@npm:3.2.2" +"dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" dependencies: - dom-serializer: "npm:^2.0.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - checksum: 10c0/47938f473b987ea71cd59e59626eb8666d3aa8feba5266e45527f3b636c7883cca7e582d901531961f742c519d7514636b7973353b648762b2e3bedbf235fada + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 languageName: node linkType: hard @@ -3754,17 +3672,17 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.41": - version: 1.5.50 - resolution: "electron-to-chromium@npm:1.5.50" - checksum: 10c0/8b77b18ae833bfe2173e346ac33b8d66b5b5acf0cf5de65df9799f4d482334c938aa0950e4d01391d5fab8994f46c0e9059f4517843e7b8d861f9b0c49eb4c5d +"electron-to-chromium@npm:^1.5.211": + version: 1.5.214 + resolution: "electron-to-chromium@npm:1.5.214" + checksum: 10c0/76ca22fd97a2dad84a710915b5984263b31e61c7883cd3ec0c11c0d7beb3fa628780cdfd05a96ec79a904ea1c910cf02c513db60f31b627c96743e50f6b11a2e languageName: node linkType: hard "emoji-regex@npm:^10.3.0": - version: 10.4.0 - resolution: "emoji-regex@npm:10.4.0" - checksum: 10c0/a3fcedfc58bfcce21a05a5f36a529d81e88d602100145fcca3dc6f795e3c8acc4fc18fe773fbf9b6d6e9371205edb3afa2668ec3473fa2aa7fd47d2a9d46482d + version: 10.5.0 + resolution: "emoji-regex@npm:10.5.0" + checksum: 10c0/17cf84335a461fc23bf90575122ace2902630dc760e53299474cd3b0b5e4cfbc6c0223a389a766817538e5d20bf0f36c67b753f27c9e705056af510b8777e312 languageName: node linkType: hard @@ -3782,6 +3700,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:^2.0.0, encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -3789,13 +3714,6 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:~2.0.0": - version: 2.0.0 - resolution: "encodeurl@npm:2.0.0" - checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb - languageName: node - linkType: hard - "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -3806,15 +3724,15 @@ __metadata: linkType: hard "engine.io-client@npm:~6.6.1": - version: 6.6.2 - resolution: "engine.io-client@npm:6.6.2" + version: 6.6.3 + resolution: "engine.io-client@npm:6.6.3" dependencies: "@socket.io/component-emitter": "npm:~3.1.0" debug: "npm:~4.3.1" engine.io-parser: "npm:~5.2.1" ws: "npm:~8.17.1" xmlhttprequest-ssl: "npm:~2.1.1" - checksum: 10c0/a1a0995df1ce2425b43c7dd396cf4ef12d3ca85973b63e1b7bd3933d0292459e922d6be25d14013c9608dc7159ae1e10cd7005754b02bc42d40450381f691859 + checksum: 10c0/ebe0b1da6831d5a68564f9ffb80efe682da4f0538488eaffadf0bcf5177a8b4472cdb01d18a9f20dece2f8de30e2df951eb4635bef2f1b492e9f08a523db91a0 languageName: node linkType: hard @@ -3826,10 +3744,9 @@ __metadata: linkType: hard "engine.io@npm:~6.6.0": - version: 6.6.2 - resolution: "engine.io@npm:6.6.2" + version: 6.6.4 + resolution: "engine.io@npm:6.6.4" dependencies: - "@types/cookie": "npm:^0.4.1" "@types/cors": "npm:^2.8.12" "@types/node": "npm:>=10.0.0" accepts: "npm:~1.3.4" @@ -3839,30 +3756,33 @@ __metadata: debug: "npm:~4.3.1" engine.io-parser: "npm:~5.2.1" ws: "npm:~8.17.1" - checksum: 10c0/e9ac3cba49badb6905259df3b019fbcbe53e2a389c930fb9fbc10eebc8839554b189706206bba2509a4a3a7d78a32f7e027f73230f31662c7efd215276432dad + checksum: 10c0/845761163f8ea7962c049df653b75dafb6b3693ad6f59809d4474751d7b0392cbf3dc2730b8a902ff93677a91fd28711d34ab29efd348a8a4b49c6b0724021ab languageName: node linkType: hard -"enhanced-resolve@npm:^5.18.1": - version: 5.18.1 - resolution: "enhanced-resolve@npm:5.18.1" +"enhanced-resolve@npm:^5.18.3": + version: 5.18.3 + resolution: "enhanced-resolve@npm:5.18.3" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 + checksum: 10c0/d413c23c2d494e4c1c9c9ac7d60b812083dc6d446699ed495e69c920988af0a3c66bf3f8d0e7a45cb1686c2d4c1df9f4e7352d973f5b56fe63d8d711dd0ccc54 languageName: node linkType: hard "ent@npm:~2.2.0": - version: 2.2.1 - resolution: "ent@npm:2.2.1" + version: 2.2.2 + resolution: "ent@npm:2.2.2" dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" punycode: "npm:^1.4.1" - checksum: 10c0/1a8ed52210b9a688c481673a7cb82699b66bd25f6960f212a5456b635a4a9bfd42371230fe59a3134dd8c2f6ab2c8736c60cebead640d271d601c9346bed458d + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/83673cc952bb1ca01473460eb4f1289448d887ef2bfcdd142bfe83cd20a794a4393b6bca543922bf1eb913d1ae0ab69ca2d2f1f6a5e9f3de6e68464b3a3b9096 languageName: node linkType: hard -"entities@npm:^4.2.0, entities@npm:^4.5.0": +"entities@npm:^4.2.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 @@ -3897,12 +3817,10 @@ __metadata: languageName: node linkType: hard -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 +"es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c languageName: node linkType: hard @@ -3913,35 +3831,45 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:0.25.5, esbuild@npm:^0.25.0": - version: 0.25.5 - resolution: "esbuild@npm:0.25.5" - dependencies: - "@esbuild/aix-ppc64": "npm:0.25.5" - "@esbuild/android-arm": "npm:0.25.5" - "@esbuild/android-arm64": "npm:0.25.5" - "@esbuild/android-x64": "npm:0.25.5" - "@esbuild/darwin-arm64": "npm:0.25.5" - "@esbuild/darwin-x64": "npm:0.25.5" - "@esbuild/freebsd-arm64": "npm:0.25.5" - "@esbuild/freebsd-x64": "npm:0.25.5" - "@esbuild/linux-arm": "npm:0.25.5" - "@esbuild/linux-arm64": "npm:0.25.5" - "@esbuild/linux-ia32": "npm:0.25.5" - "@esbuild/linux-loong64": "npm:0.25.5" - "@esbuild/linux-mips64el": "npm:0.25.5" - "@esbuild/linux-ppc64": "npm:0.25.5" - "@esbuild/linux-riscv64": "npm:0.25.5" - "@esbuild/linux-s390x": "npm:0.25.5" - "@esbuild/linux-x64": "npm:0.25.5" - "@esbuild/netbsd-arm64": "npm:0.25.5" - "@esbuild/netbsd-x64": "npm:0.25.5" - "@esbuild/openbsd-arm64": "npm:0.25.5" - "@esbuild/openbsd-x64": "npm:0.25.5" - "@esbuild/sunos-x64": "npm:0.25.5" - "@esbuild/win32-arm64": "npm:0.25.5" - "@esbuild/win32-ia32": "npm:0.25.5" - "@esbuild/win32-x64": "npm:0.25.5" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c + languageName: node + linkType: hard + +"esbuild@npm:0.25.9, esbuild@npm:^0.25.0": + version: 0.25.9 + resolution: "esbuild@npm:0.25.9" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.9" + "@esbuild/android-arm": "npm:0.25.9" + "@esbuild/android-arm64": "npm:0.25.9" + "@esbuild/android-x64": "npm:0.25.9" + "@esbuild/darwin-arm64": "npm:0.25.9" + "@esbuild/darwin-x64": "npm:0.25.9" + "@esbuild/freebsd-arm64": "npm:0.25.9" + "@esbuild/freebsd-x64": "npm:0.25.9" + "@esbuild/linux-arm": "npm:0.25.9" + "@esbuild/linux-arm64": "npm:0.25.9" + "@esbuild/linux-ia32": "npm:0.25.9" + "@esbuild/linux-loong64": "npm:0.25.9" + "@esbuild/linux-mips64el": "npm:0.25.9" + "@esbuild/linux-ppc64": "npm:0.25.9" + "@esbuild/linux-riscv64": "npm:0.25.9" + "@esbuild/linux-s390x": "npm:0.25.9" + "@esbuild/linux-x64": "npm:0.25.9" + "@esbuild/netbsd-arm64": "npm:0.25.9" + "@esbuild/netbsd-x64": "npm:0.25.9" + "@esbuild/openbsd-arm64": "npm:0.25.9" + "@esbuild/openbsd-x64": "npm:0.25.9" + "@esbuild/openharmony-arm64": "npm:0.25.9" + "@esbuild/sunos-x64": "npm:0.25.9" + "@esbuild/win32-arm64": "npm:0.25.9" + "@esbuild/win32-ia32": "npm:0.25.9" + "@esbuild/win32-x64": "npm:0.25.9" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -3985,6 +3913,8 @@ __metadata: optional: true "@esbuild/openbsd-x64": optional: true + "@esbuild/openharmony-arm64": + optional: true "@esbuild/sunos-x64": optional: true "@esbuild/win32-arm64": @@ -3995,7 +3925,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/aba8cbc11927fa77562722ed5e95541ce2853f67ad7bdc40382b558abc2e0ec57d92ffb820f082ba2047b4ef9f3bc3da068cdebe30dfd3850cfa3827a78d604e + checksum: 10c0/aaa1284c75fcf45c82f9a1a117fe8dc5c45628e3386bda7d64916ae27730910b51c5aec7dd45a6ba19256be30ba2935e64a8f011a3f0539833071e06bf76d5b3 languageName: node linkType: hard @@ -4006,7 +3936,7 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:~1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 @@ -4021,27 +3951,17 @@ __metadata: linkType: hard "eslint-config-prettier@npm:^9.1.0": - version: 9.1.0 - resolution: "eslint-config-prettier@npm:9.1.0" + version: 9.1.2 + resolution: "eslint-config-prettier@npm:9.1.2" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d - languageName: node - linkType: hard - -"eslint-scope@npm:^8.0.2": - version: 8.2.0 - resolution: "eslint-scope@npm:8.2.0" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^5.2.0" - checksum: 10c0/8d2d58e2136d548ac7e0099b1a90d9fab56f990d86eb518de1247a7066d38c908be2f3df477a79cf60d70b30ba18735d6c6e70e9914dca2ee515a729975d70d6 + checksum: 10c0/d2e9dc913b1677764a4732433d83d258f40820458c65d0274cb9e3eaf6559b39f2136446f310c05abed065a4b3c2e901807ccf583dff76c6227eaebf4132c39a languageName: node linkType: hard -"eslint-scope@npm:^8.4.0": +"eslint-scope@npm:^8.0.2, eslint-scope@npm:^8.4.0": version: 8.4.0 resolution: "eslint-scope@npm:8.4.0" dependencies: @@ -4058,13 +3978,6 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.2.0": - version: 4.2.0 - resolution: "eslint-visitor-keys@npm:4.2.0" - checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 - languageName: node - linkType: hard - "eslint-visitor-keys@npm:^4.2.1": version: 4.2.1 resolution: "eslint-visitor-keys@npm:4.2.1" @@ -4073,17 +3986,17 @@ __metadata: linkType: hard "eslint@npm:^9.28.0": - version: 9.29.0 - resolution: "eslint@npm:9.29.0" + version: 9.35.0 + resolution: "eslint@npm:9.35.0" dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.20.1" - "@eslint/config-helpers": "npm:^0.2.1" - "@eslint/core": "npm:^0.14.0" + "@eslint/config-array": "npm:^0.21.0" + "@eslint/config-helpers": "npm:^0.3.1" + "@eslint/core": "npm:^0.15.2" "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.29.0" - "@eslint/plugin-kit": "npm:^0.3.1" + "@eslint/js": "npm:9.35.0" + "@eslint/plugin-kit": "npm:^0.3.5" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.4.2" @@ -4118,22 +4031,11 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/75e3f841e0f8b0fa93dbb2ba6ae538bd8b611c3654117bc3dadf90bb009923dfd2c15ec2948dc6e6b8b571317cc125c5cceb9255da8cd644ee740020df645dd8 - languageName: node - linkType: hard - -"espree@npm:^10.0.1": - version: 10.3.0 - resolution: "espree@npm:10.3.0" - dependencies: - acorn: "npm:^8.14.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 + checksum: 10c0/798c527520ccf62106f8cd210bd1db1f8eb1b0e7a56feb0a8b322bf3a1e6a0bc6dc3a414542c22b1b393d58d5e3cd0252c44c023049de9067b836450503a2f03 languageName: node linkType: hard -"espree@npm:^10.4.0": +"espree@npm:^10.0.1, espree@npm:^10.4.0": version: 10.4.0 resolution: "espree@npm:10.4.0" dependencies: @@ -4176,7 +4078,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:~1.8.1": +"etag@npm:^1.8.1, etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 @@ -4197,10 +4099,35 @@ __metadata: languageName: node linkType: hard +"eventsource-parser@npm:^3.0.0, eventsource-parser@npm:^3.0.1": + version: 3.0.6 + resolution: "eventsource-parser@npm:3.0.6" + checksum: 10c0/70b8ccec7dac767ef2eca43f355e0979e70415701691382a042a2df8d6a68da6c2fca35363669821f3da876d29c02abe9b232964637c1b6635c940df05ada78a + languageName: node + linkType: hard + +"eventsource@npm:^3.0.2": + version: 3.0.7 + resolution: "eventsource@npm:3.0.7" + dependencies: + eventsource-parser: "npm:^3.0.1" + checksum: 10c0/c48a73c38f300e33e9f11375d4ee969f25cbb0519608a12378a38068055ae8b55b6e0e8a49c3f91c784068434efe1d9f01eb49b6315b04b0da9157879ce2f67d + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 + languageName: node + linkType: hard + +"express-rate-limit@npm:^7.5.0": + version: 7.5.1 + resolution: "express-rate-limit@npm:7.5.1" + peerDependencies: + express: ">= 4.11" + checksum: 10c0/b07de84d700a2c07c4bf2f040e7558ed5a1f660f03ed5f30bf8ff7b51e98ba7a85215640e70fc48cbbb9151066ea51239d9a1b41febc9b84d98c7915b0186161 languageName: node linkType: hard @@ -4243,6 +4170,41 @@ __metadata: languageName: node linkType: hard +"express@npm:^5.0.1": + version: 5.1.0 + resolution: "express@npm:5.1.0" + dependencies: + accepts: "npm:^2.0.0" + body-parser: "npm:^2.2.0" + content-disposition: "npm:^1.0.0" + content-type: "npm:^1.0.5" + cookie: "npm:^0.7.1" + cookie-signature: "npm:^1.2.1" + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + finalhandler: "npm:^2.1.0" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + merge-descriptors: "npm:^2.0.0" + mime-types: "npm:^3.0.0" + on-finished: "npm:^2.4.1" + once: "npm:^1.4.0" + parseurl: "npm:^1.3.3" + proxy-addr: "npm:^2.0.7" + qs: "npm:^6.14.0" + range-parser: "npm:^1.2.1" + router: "npm:^2.2.0" + send: "npm:^1.1.0" + serve-static: "npm:^2.2.0" + statuses: "npm:^2.0.1" + type-is: "npm:^2.0.1" + vary: "npm:^1.1.2" + checksum: 10c0/80ce7c53c5f56887d759b94c3f2283e2e51066c98d4b72a4cc1338e832b77f1e54f30d0239cc10815a0f849bdb753e6a284d2fa48d4ab56faf9c501f55d751d6 + languageName: node + linkType: hard + "extend@npm:^3.0.0": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -4250,17 +4212,6 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^3.1.0": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: "npm:^0.7.0" - iconv-lite: "npm:^0.4.24" - tmp: "npm:^0.0.33" - checksum: 10c0/c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -4269,15 +4220,15 @@ __metadata: linkType: hard "fast-glob@npm:^3.3.2": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe languageName: node linkType: hard @@ -4296,30 +4247,30 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.3 - resolution: "fast-uri@npm:3.0.3" - checksum: 10c0/4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: 10c0/44364adca566f70f40d1e9b772c923138d47efeac2ae9732a872baafd77061f26b097ba2f68f0892885ad177becd065520412b8ffeec34b16c99433c5b9e2de7 languageName: node linkType: hard "fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" + version: 1.19.1 + resolution: "fastq@npm:1.19.1" dependencies: reusify: "npm:^1.0.4" - checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + checksum: 10c0/ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 languageName: node linkType: hard -"fdir@npm:^6.4.4": - version: 6.4.6 - resolution: "fdir@npm:6.4.6" +"fdir@npm:^6.4.4, fdir@npm:^6.4.6": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9 + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f languageName: node linkType: hard @@ -4371,6 +4322,20 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:^2.1.0": + version: 2.1.0 + resolution: "finalhandler@npm:2.1.0" + dependencies: + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + on-finished: "npm:^2.4.1" + parseurl: "npm:^1.3.3" + statuses: "npm:^2.0.1" + checksum: 10c0/da0bbca6d03873472ee890564eb2183f4ed377f25f3628a0fc9d16dac40bed7b150a0d82ebb77356e4c6d97d2796ad2dba22948b951dddee2c8768b0d1b9fb1f + languageName: node + linkType: hard + "find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -4391,37 +4356,30 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.2.7": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.3.2 - resolution: "flatted@npm:3.3.2" - checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 +"flatted@npm:^3.2.7, flatted@npm:^3.2.9": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 languageName: node linkType: hard "follow-redirects@npm:^1.0.0": - version: 1.15.9 - resolution: "follow-redirects@npm:1.15.9" + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" peerDependenciesMeta: debug: optional: true - checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + checksum: 10c0/d301f430542520a54058d4aeeb453233c564aaccac835d29d15e050beb33f339ad67d9bddbce01739c5dc46a6716dbe3d9d0d5134b1ca203effa11a7ef092343 languageName: node linkType: hard "foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" dependencies: - cross-spawn: "npm:^7.0.0" + cross-spawn: "npm:^7.0.6" signal-exit: "npm:^4.0.1" - checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 languageName: node linkType: hard @@ -4439,6 +4397,13 @@ __metadata: languageName: node linkType: hard +"fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 10c0/0557548194cb9a809a435bf92bcfbc20c89e8b5eb38861b73ced36750437251e39a111fc3a18b98531be9dd91fe1411e4969f229dc579ec0251ce6c5d4900bbc + languageName: node + linkType: hard + "fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" @@ -4515,23 +4480,38 @@ __metadata: languageName: node linkType: hard -"get-east-asian-width@npm:^1.0.0": - version: 1.3.0 - resolution: "get-east-asian-width@npm:1.3.0" - checksum: 10c0/1a049ba697e0f9a4d5514c4623781c5246982bdb61082da6b5ae6c33d838e52ce6726407df285cdbb27ec1908b333cf2820989bd3e986e37bb20979437fdf34b +"get-east-asian-width@npm:^1.0.0, get-east-asian-width@npm:^1.3.1": + version: 1.3.1 + resolution: "get-east-asian-width@npm:1.3.1" + checksum: 10c0/cfe2eba0ae066d9a8b9f2e524922c6ec00ed91427758d701850839315febbbc56b26b06b43c8a9c1373ae769cc188c04c6a6fcaf3c9273e712a1cc8cd438a1f8 languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" +"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a + languageName: node + linkType: hard + +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c languageName: node linkType: hard @@ -4560,7 +4540,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -4590,13 +4570,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -4604,12 +4577,10 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 +"gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead languageName: node linkType: hard @@ -4634,30 +4605,23 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e languageName: node linkType: hard -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.2": +"hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -4675,6 +4639,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^9.0.0": + version: 9.0.0 + resolution: "hosted-git-info@npm:9.0.0" + dependencies: + lru-cache: "npm:^11.1.0" + checksum: 10c0/567d36e26f63f654991eca53ef3787e55c6e48d38ed70107bf4828f5b1c506d590553de605f08bb5ed242e7044976406681070292d7d9ed9d8eb4833a4f3520d + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -4695,13 +4668,13 @@ __metadata: linkType: hard "http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 languageName: node linkType: hard -"http-errors@npm:2.0.0": +"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" dependencies: @@ -4735,7 +4708,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:7.0.6": +"https-proxy-agent@npm:7.0.6, https-proxy-agent@npm:^7.0.1": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -4745,17 +4718,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": +"iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -4764,7 +4727,16 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.7.0": + version: 0.7.0 + resolution: "iconv-lite@npm:0.7.0" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/2382400469071c55b6746c531eed5fa4d033e5db6690b7331fb2a5f59a30d7a9782932e92253db26df33c1cf46fa200a3fbe524a2a7c62037c762283f188ec2f + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -4773,12 +4745,12 @@ __metadata: languageName: node linkType: hard -"ignore-walk@npm:^7.0.0": - version: 7.0.0 - resolution: "ignore-walk@npm:7.0.0" +"ignore-walk@npm:^8.0.0": + version: 8.0.0 + resolution: "ignore-walk@npm:8.0.0" dependencies: - minimatch: "npm:^9.0.0" - checksum: 10c0/3754bcde369a53a92c1d0835ea93feb6c5b2934984d3f5a8f9dd962d13ac33ee3a9e930901a89b5d46fc061870639d983f497186afdfe3484e135f2ad89f5577 + minimatch: "npm:^10.0.3" + checksum: 10c0/fec71d904adaaf233f2f5a67cc547857d960abe1f41a8b43f675617a322aabe9401fb9afa13aba825d21d91c454d5cad72ecba156e69443f3df40288d6ebd058 languageName: node linkType: hard @@ -4804,12 +4776,12 @@ __metadata: linkType: hard "import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec languageName: node linkType: hard @@ -4820,13 +4792,6 @@ __metadata: languageName: node linkType: hard -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f - languageName: node - linkType: hard - "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -4851,13 +4816,10 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc +"ip-address@npm:^10.0.1": + version: 10.0.1 + resolution: "ip-address@npm:10.0.1" + checksum: 10c0/1634d79dae18394004775cb6d699dc46b7c23df6d2083164025a2b15240c1164fccde53d0e08bd5ee4fc53913d033ab6b5e395a809ad4b956a940c446e948843 languageName: node linkType: hard @@ -4908,11 +4870,11 @@ __metadata: linkType: hard "is-fullwidth-code-point@npm:^5.0.0": - version: 5.0.0 - resolution: "is-fullwidth-code-point@npm:5.0.0" + version: 5.1.0 + resolution: "is-fullwidth-code-point@npm:5.1.0" dependencies: - get-east-asian-width: "npm:^1.0.0" - checksum: 10c0/cd591b27d43d76b05fa65ed03eddce57a16e1eca0b7797ff7255de97019bcaf0219acfc0c4f7af13319e13541f2a53c0ace476f442b13267b9a6a7568f2b65c8 + get-east-asian-width: "npm:^1.3.1" + checksum: 10c0/c1172c2e417fb73470c56c431851681591f6a17233603a9e6f94b7ba870b2e8a5266506490573b607fb1081318589372034aa436aec07b465c2029c0bc7f07a4 languageName: node linkType: hard @@ -4932,13 +4894,6 @@ __metadata: languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d - languageName: node - linkType: hard - "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -4946,6 +4901,25 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 + languageName: node + linkType: hard + "is-unicode-supported@npm:^1.3.0": version: 1.3.0 resolution: "is-unicode-supported@npm:1.3.0" @@ -5037,12 +5011,12 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.0.5": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" + version: 3.2.0 + resolution: "istanbul-reports@npm:3.2.0" dependencies: html-escaper: "npm:^2.0.0" istanbul-lib-report: "npm:^3.0.0" - checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 + checksum: 10c0/d596317cfd9c22e1394f22a8d8ba0303d2074fe2e971887b32d870e4b33f8464b10f8ccbe6847808f7db485f084eba09e6c2ed706b3a978e4b52f07085b8f9bc languageName: node linkType: hard @@ -5067,18 +5041,18 @@ __metadata: linkType: hard "jasmine-core@npm:^5.6.0": - version: 5.6.0 - resolution: "jasmine-core@npm:5.6.0" - checksum: 10c0/30abee5c22a1fab5b1973cefdc21ba874a8b93fcf5d7641d9c62dfc4dbf22c9dc745d928fa33a63d4343698263fa715b5caf3404b392b6814b018d6d5c055e06 + version: 5.10.0 + resolution: "jasmine-core@npm:5.10.0" + checksum: 10c0/0826b723817aa428516b31e9321c1932e8317764235163e26f536e2033040df13b3b13f2eaa4d840b8b47fb92dab4ff06b2ab37487ed447d62ec7edbb43c1e61 languageName: node linkType: hard -"jiti@npm:^2.4.2": - version: 2.4.2 - resolution: "jiti@npm:2.4.2" +"jiti@npm:^2.5.1": + version: 2.5.1 + resolution: "jiti@npm:2.5.1" bin: jiti: lib/jiti-cli.mjs - checksum: 10c0/4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331 + checksum: 10c0/f0a38d7d8842cb35ffe883038166aa2d52ffd21f1a4fc839ae4076ea7301c22a1f11373f8fc52e2667de7acde8f3e092835620dd6f72a0fbe9296b268b0874bb languageName: node linkType: hard @@ -5100,19 +5074,12 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - "jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 languageName: node linkType: hard @@ -5394,9 +5361,9 @@ __metadata: languageName: node linkType: hard -"listr2@npm:8.3.3": - version: 8.3.3 - resolution: "listr2@npm:8.3.3" +"listr2@npm:9.0.1": + version: 9.0.1 + resolution: "listr2@npm:9.0.1" dependencies: cli-truncate: "npm:^4.0.0" colorette: "npm:^2.0.20" @@ -5404,21 +5371,21 @@ __metadata: log-update: "npm:^6.1.0" rfdc: "npm:^1.4.1" wrap-ansi: "npm:^9.0.0" - checksum: 10c0/0792f8a7fd482fa516e21689e012e07081cab3653172ca606090622cfa0024c784a1eba8095a17948a0e9a4aa98a80f7c9c90f78a0dd35173d6802f9cc123a82 + checksum: 10c0/73462e84a3c4f05de5a3cdea5eaa0209c6ab04a2fdb4046545049806e9ba17b6ee84a097ebf7ffc0e903b0f2a9094c0c480cd2f2bb21d7d21e20969e17a3c32b languageName: node linkType: hard -"lmdb@npm:3.3.0": - version: 3.3.0 - resolution: "lmdb@npm:3.3.0" +"lmdb@npm:3.4.2": + version: 3.4.2 + resolution: "lmdb@npm:3.4.2" dependencies: - "@lmdb/lmdb-darwin-arm64": "npm:3.3.0" - "@lmdb/lmdb-darwin-x64": "npm:3.3.0" - "@lmdb/lmdb-linux-arm": "npm:3.3.0" - "@lmdb/lmdb-linux-arm64": "npm:3.3.0" - "@lmdb/lmdb-linux-x64": "npm:3.3.0" - "@lmdb/lmdb-win32-arm64": "npm:3.3.0" - "@lmdb/lmdb-win32-x64": "npm:3.3.0" + "@lmdb/lmdb-darwin-arm64": "npm:3.4.2" + "@lmdb/lmdb-darwin-x64": "npm:3.4.2" + "@lmdb/lmdb-linux-arm": "npm:3.4.2" + "@lmdb/lmdb-linux-arm64": "npm:3.4.2" + "@lmdb/lmdb-linux-x64": "npm:3.4.2" + "@lmdb/lmdb-win32-arm64": "npm:3.4.2" + "@lmdb/lmdb-win32-x64": "npm:3.4.2" msgpackr: "npm:^1.11.2" node-addon-api: "npm:^6.1.0" node-gyp: "npm:latest" @@ -5442,7 +5409,7 @@ __metadata: optional: true bin: download-lmdb-prebuilds: bin/download-prebuilds.js - checksum: 10c0/91b22b552ad79ce39d05dc0025613fa9edd61762fadbac280c400fb0d7b680e3880833d7067e1f537ed3ef4376ea58c2a4b1ec79b83425866f2bce116e56f910 + checksum: 10c0/6bfbcb837d6997a825672bf69c22509dc30aadebbca2b1f7726a6a99ffa20d7d48db99cba9842f8c957d86ac6f875f673dda14f3969f8ab846e46537ff5d203c languageName: node linkType: hard @@ -5512,6 +5479,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.1.0": + version: 11.2.1 + resolution: "lru-cache@npm:11.2.1" + checksum: 10c0/6f0e6b27f368d5e464e7813bd5b0af8f9a81a3a7ce2f40509841fdef07998b2588869f3e70edfbdb3bf705857f7bb21cca58fb01e1a1dc2440a83fcedcb7e8d8 + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -5521,7 +5495,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:0.30.17, magic-string@npm:^0.30.17": +"magic-string@npm:0.30.17": version: 0.30.17 resolution: "magic-string@npm:0.30.17" dependencies: @@ -5530,6 +5504,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.18": + version: 0.30.18 + resolution: "magic-string@npm:0.30.18" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/80fba01e13ce1f5c474a0498a5aa462fa158eb56567310747089a0033e432d83a2021ee2c109ac116010cd9dcf90a5231d89fbe3858165f73c00a50a74dbefcd + languageName: node + linkType: hard + "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -5539,27 +5522,7 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e - languageName: node - linkType: hard - -"make-fetch-happen@npm:^14.0.0, make-fetch-happen@npm:^14.0.1, make-fetch-happen@npm:^14.0.2, make-fetch-happen@npm:^14.0.3": +"make-fetch-happen@npm:^14.0.0, make-fetch-happen@npm:^14.0.2, make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" dependencies: @@ -5578,6 +5541,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -5585,6 +5555,13 @@ __metadata: languageName: node linkType: hard +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: 10c0/7b4baa40b25964bb90e2121ee489ec38642127e48d0cc2b6baa442688d3fde6262bfdca86d6bbf6ba708784afcac168c06840c71facac70e390f5f759ac121b9 + languageName: node + linkType: hard + "merge-descriptors@npm:1.0.3": version: 1.0.3 resolution: "merge-descriptors@npm:1.0.3" @@ -5592,6 +5569,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: 10c0/95389b7ced3f9b36fbdcf32eb946dc3dd1774c2fdf164609e55b18d03aa499b12bd3aae3a76c1c7185b96279e9803525550d3eb292b5224866060a288f335cb3 + languageName: node + linkType: hard + "merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" @@ -5606,7 +5590,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": +"micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -5623,6 +5607,22 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 + languageName: node + linkType: hard + +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": + version: 3.0.1 + resolution: "mime-types@npm:3.0.1" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10c0/bd8c20d3694548089cf229016124f8f40e6a60bbb600161ae13e45f793a2d5bb40f96bbc61f275836696179c77c1d6bf4967b2a75e0a8ad40fe31f4ed5be4da5 + languageName: node + linkType: hard + "mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" @@ -5657,6 +5657,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.0.3": + version: 10.0.3 + resolution: "minimatch@npm:10.0.3" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.0" + checksum: 10c0/e43e4a905c5d70ac4cec8530ceaeccb9c544b1ba8ac45238e2a78121a01c17ff0c373346472d221872563204eabe929ad02669bb575cb1f0cc30facab369f70f + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -5666,7 +5675,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.0, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -5691,21 +5700,6 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b - languageName: node - linkType: hard - "minipass-fetch@npm:^4.0.0": version: 4.0.1 resolution: "minipass-fetch@npm:4.0.1" @@ -5771,7 +5765,7 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": +"minizlib@npm:^2.1.1": version: 2.1.2 resolution: "minizlib@npm:2.1.2" dependencies: @@ -5872,21 +5866,14 @@ __metadata: linkType: hard "msgpackr@npm:^1.11.2": - version: 1.11.4 - resolution: "msgpackr@npm:1.11.4" + version: 1.11.5 + resolution: "msgpackr@npm:1.11.5" dependencies: msgpackr-extract: "npm:^3.0.2" dependenciesMeta: msgpackr-extract: optional: true - checksum: 10c0/171f6e15b628e91969cbb715c076e218886dc505fdac9ce31aa9e8641877cb5cf52d89fe0ca2930520711b1bbc9f792e10d0a9fc08806ad5d543c50abfab322c - languageName: node - linkType: hard - -"mute-stream@npm:^1.0.0": - version: 1.0.0 - resolution: "mute-stream@npm:1.0.0" - checksum: 10c0/dce2a9ccda171ec979a3b4f869a102b1343dee35e920146776780de182f16eae459644d187e38d59a3d37adf85685e1c17c38cf7bfda7e39a9880f7a1d10a74c + checksum: 10c0/f35ffd218661e8afc52490cde3dbf2656304e7940563c5313aa2f45e31ac5bdce3b58f27e55b785c700085ee76f26fc7afbae25ae5abe05068a8f000fd0ac6cd languageName: node linkType: hard @@ -5920,13 +5907,6 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:^0.6.3": - version: 0.6.4 - resolution: "negotiator@npm:0.6.4" - checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea - languageName: node - linkType: hard - "negotiator@npm:^1.0.0": version: 1.0.0 resolution: "negotiator@npm:1.0.0" @@ -5965,9 +5945,9 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:^11.0.0": - version: 11.2.0 - resolution: "node-gyp@npm:11.2.0" +"node-gyp@npm:^11.0.0, node-gyp@npm:latest": + version: 11.4.2 + resolution: "node-gyp@npm:11.4.2" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -5981,45 +5961,14 @@ __metadata: which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/bd8d8c76b06be761239b0c8680f655f6a6e90b48e44d43415b11c16f7e8c15be346fba0cbf71588c7cdfb52c419d928a7d3db353afc1d952d19756237d8f10b9 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^4.1.0" - semver: "npm:^7.3.5" - tar: "npm:^6.2.1" - which: "npm:^4.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b + checksum: 10c0/0bfd3e96770ed70f07798d881dd37b4267708966d868a0e585986baac487d9cf5831285579fd629a83dc4e434f53e6416ce301097f2ee464cb74d377e4d8bdbe languageName: node - linkType: hard - -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 - languageName: node - linkType: hard - -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + linkType: hard + +"node-releases@npm:^2.0.19": + version: 2.0.20 + resolution: "node-releases@npm:2.0.20" + checksum: 10c0/24c5b1f5aa16d042c47a651ca2e022ca27320f95e4d2b76b9e543cc470eadd01032646383212ec373f1a3dd15cccce83d77c318ee99585366dbd25db4366abd8 languageName: node linkType: hard @@ -6051,11 +6000,11 @@ __metadata: linkType: hard "npm-install-checks@npm:^7.1.0": - version: 7.1.1 - resolution: "npm-install-checks@npm:7.1.1" + version: 7.1.2 + resolution: "npm-install-checks@npm:7.1.2" dependencies: semver: "npm:^7.1.1" - checksum: 10c0/3cfd705ef3f70add31a32b4a5462d16e0f06d9df636072483fb43c854414a1cc128f496e84a8d9c12c1f1820307b7a3c275643589c564dac3c870eb636f8eea4 + checksum: 10c0/eb490ac637869f6de65af0886f3a96f4d942609f1b3cfe0caf08b73bd76aff35ca4613fd3cbc36f3219727bc3183322051d1468b065911a59dbf87ecdb603bce languageName: node linkType: hard @@ -6066,7 +6015,19 @@ __metadata: languageName: node linkType: hard -"npm-package-arg@npm:12.0.2, npm-package-arg@npm:^12.0.0": +"npm-package-arg@npm:13.0.0": + version: 13.0.0 + resolution: "npm-package-arg@npm:13.0.0" + dependencies: + hosted-git-info: "npm:^9.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + validate-npm-package-name: "npm:^6.0.0" + checksum: 10c0/cb5d3378b5fa69320547ad80227932efedcbf772caf9f1350c28527eb6ac5c5d0085d3f2a09ce0a65cae34d7956b9bf40674dd8be91cd35a376bbb30888b2997 + languageName: node + linkType: hard + +"npm-package-arg@npm:^12.0.0": version: 12.0.2 resolution: "npm-package-arg@npm:12.0.2" dependencies: @@ -6079,15 +6040,15 @@ __metadata: linkType: hard "npm-packlist@npm:^10.0.0": - version: 10.0.0 - resolution: "npm-packlist@npm:10.0.0" + version: 10.0.1 + resolution: "npm-packlist@npm:10.0.1" dependencies: - ignore-walk: "npm:^7.0.0" - checksum: 10c0/be8cb82c4f9b6fdfba2e3379c538949d3ea7aeb303436db013aaccd8ad1ff49d9f894d7fa4684f9d3016b7944dcc3f0bfc8c3d10c535fa7cd29314a8aad4b80f + ignore-walk: "npm:^8.0.0" + checksum: 10c0/64397de9e1c8c90d63dfb37604a49e642106f086ebc84d1b1fc7519e35d7c599a246bb75396d5b62f307e35e849c879aebf5f6da505453d7f2d619cf5362d8b3 languageName: node linkType: hard -"npm-pick-manifest@npm:10.0.0, npm-pick-manifest@npm:^10.0.0": +"npm-pick-manifest@npm:^10.0.0": version: 10.0.0 resolution: "npm-pick-manifest@npm:10.0.0" dependencies: @@ -6115,7 +6076,7 @@ __metadata: languageName: node linkType: hard -"nth-check@npm:^2.0.1": +"nth-check@npm:^2.1.1": version: 2.1.1 resolution: "nth-check@npm:2.1.1" dependencies: @@ -6131,14 +6092,14 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 10c0/b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4 +"object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 languageName: node linkType: hard -"on-finished@npm:2.4.1": +"on-finished@npm:2.4.1, on-finished@npm:^2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -6156,7 +6117,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": +"once@npm:^1.3.0, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -6206,16 +6167,9 @@ __metadata: linkType: hard "ordered-binary@npm:^1.5.3": - version: 1.5.3 - resolution: "ordered-binary@npm:1.5.3" - checksum: 10c0/2b67c90c79071f54344762fcecac256c3c6fe02a3ce1d349c7cab38a55a6137320b13022d6dd26faac462d887f48a32e04693a3ae30592185f290c793b92de03 - languageName: node - linkType: hard - -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 + version: 1.6.0 + resolution: "ordered-binary@npm:1.6.0" + checksum: 10c0/fc82d1dc452e3e754749f88b1b4620c07fa685d47064c31a72dcc130d9e7dd02bde6606f4447eb15d4b2e8aea4af417cfa68705aadf5a0205787beb9e8448b30 languageName: node linkType: hard @@ -6237,15 +6191,6 @@ __metadata: languageName: node linkType: hard -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 - languageName: node - linkType: hard - "p-map@npm:^7.0.2": version: 7.0.3 resolution: "p-map@npm:7.0.3" @@ -6296,36 +6241,36 @@ __metadata: languageName: node linkType: hard -"parse5-html-rewriting-stream@npm:7.1.0": - version: 7.1.0 - resolution: "parse5-html-rewriting-stream@npm:7.1.0" +"parse5-html-rewriting-stream@npm:8.0.0": + version: 8.0.0 + resolution: "parse5-html-rewriting-stream@npm:8.0.0" dependencies: entities: "npm:^6.0.0" - parse5: "npm:^7.0.0" - parse5-sax-parser: "npm:^7.0.0" - checksum: 10c0/e44a2f52a0012ace6c04e4eb7b9733dabdc86d9a6d7ffc30e980b89bfaa6cab7f1e74c2a4d09017037247119589eb0532c1ab0790b6ce64674cbbcc2bbaf0de7 + parse5: "npm:^8.0.0" + parse5-sax-parser: "npm:^8.0.0" + checksum: 10c0/45f685115000c7e8c0b37243062589e486638e6337373553104cbd177ae314c2f0fecad812023394759882a7bb64d5c4dfa55a5146ebfc0e1de4a4d94b0e9b44 languageName: node linkType: hard -"parse5-sax-parser@npm:^7.0.0": - version: 7.0.0 - resolution: "parse5-sax-parser@npm:7.0.0" +"parse5-sax-parser@npm:^8.0.0": + version: 8.0.0 + resolution: "parse5-sax-parser@npm:8.0.0" dependencies: - parse5: "npm:^7.0.0" - checksum: 10c0/6b4184354f5ee75c2ec16ab4c7f4703e40d710375ed6c08f82aa425cda22b7ba4a2f43a0925bc6eb6fc88610ab0877693a8d9e10f5a0c21504fd6f97dbd130e9 + parse5: "npm:^8.0.0" + checksum: 10c0/beb228bbe2ce81ace711ed00f12afde779fbd93b1f381a7f68b6344ab07b98f1832cb1d90ef418cbf3e0a9f6f1ce8f75e016a966c727882c78151157305a44fe languageName: node linkType: hard -"parse5@npm:^7.0.0": - version: 7.2.1 - resolution: "parse5@npm:7.2.1" +"parse5@npm:^8.0.0": + version: 8.0.0 + resolution: "parse5@npm:8.0.0" dependencies: - entities: "npm:^4.5.0" - checksum: 10c0/829d37a0c709215a887e410a7118d754f8e1afd7edb529db95bc7bbf8045fb0266a7b67801331d8e8d9d073ea75793624ec27ce9ff3b96862c3b9008f4d68e80 + entities: "npm:^6.0.0" + checksum: 10c0/8279892dcd77b2f2229707f60eb039e303adf0288812b2a8fd5acf506a4d432da833c6c5d07a6554bef722c2367a81ef4a1f7e9336564379a7dba3e798bf16b3 languageName: node linkType: hard -"parseurl@npm:~1.3.3": +"parseurl@npm:^1.3.3, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 @@ -6377,17 +6322,24 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": +"path-to-regexp@npm:^8.0.0": + version: 8.3.0 + resolution: "path-to-regexp@npm:8.3.0" + checksum: 10c0/ee1544a73a3f294a97a4c663b0ce71bbf1621d732d80c9c9ed201b3e911a86cb628ebad691b9d40f40a3742fe22011e5a059d8eed2cf63ec2cb94f6fb4efe67c + languageName: node + linkType: hard + +"picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard -"picomatch@npm:4.0.2, picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc +"picomatch@npm:4.0.3, picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 languageName: node linkType: hard @@ -6398,15 +6350,22 @@ __metadata: languageName: node linkType: hard -"piscina@npm:5.0.0": - version: 5.0.0 - resolution: "piscina@npm:5.0.0" +"piscina@npm:5.1.3": + version: 5.1.3 + resolution: "piscina@npm:5.1.3" dependencies: - "@napi-rs/nice": "npm:^1.0.1" + "@napi-rs/nice": "npm:^1.0.4" dependenciesMeta: "@napi-rs/nice": optional: true - checksum: 10c0/91316fa6d7da348430104a5d0cdeff3114e736fdd7605b8ad7b605236cc1fddc0de53e075dbfb0a01c8f603c18ad1601cd74d8742d356ae8d73de275cdea0594 + checksum: 10c0/ba268d44f6ab992fa9ad1ca32c5903983f5e741eb25d2ba560a52de6f2872ee1e4197a4ce7b3f139fbd7a521f36ff3951849228ccf3c0f4666b03b570909c0a8 + languageName: node + linkType: hard + +"pkce-challenge@npm:^5.0.0": + version: 5.0.0 + resolution: "pkce-challenge@npm:5.0.0" + checksum: 10c0/c6706d627fdbb6f22bf8cc5d60d96d6b6a7bb481399b336a3d3f4e9bfba3e167a2c32f8ec0b5e74be686a0ba3bcc9894865d4c2dd1b91cea4c05dba1f28602c3 languageName: node linkType: hard @@ -6417,14 +6376,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.41, postcss@npm:^8.4.49, postcss@npm:^8.5.3": - version: 8.5.5 - resolution: "postcss@npm:8.5.5" +"postcss@npm:^8.4.41, postcss@npm:^8.4.49, postcss@npm:^8.5.6": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/6415873fab84de05c2d8fd18f72ea6654bca437bb4b9f02ca819c438501e4b3a450023e575e17587c6eaa5bedddaaa4dad3af210f5cf166e30cec09cac58baf8 + checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 languageName: node linkType: hard @@ -6435,6 +6394,70 @@ __metadata: languageName: node linkType: hard +"prettier-plugin-tailwindcss@npm:^0.6.14": + version: 0.6.14 + resolution: "prettier-plugin-tailwindcss@npm:0.6.14" + peerDependencies: + "@ianvs/prettier-plugin-sort-imports": "*" + "@prettier/plugin-hermes": "*" + "@prettier/plugin-oxc": "*" + "@prettier/plugin-pug": "*" + "@shopify/prettier-plugin-liquid": "*" + "@trivago/prettier-plugin-sort-imports": "*" + "@zackad/prettier-plugin-twig": "*" + prettier: ^3.0 + prettier-plugin-astro: "*" + prettier-plugin-css-order: "*" + prettier-plugin-import-sort: "*" + prettier-plugin-jsdoc: "*" + prettier-plugin-marko: "*" + prettier-plugin-multiline-arrays: "*" + prettier-plugin-organize-attributes: "*" + prettier-plugin-organize-imports: "*" + prettier-plugin-sort-imports: "*" + prettier-plugin-style-order: "*" + prettier-plugin-svelte: "*" + peerDependenciesMeta: + "@ianvs/prettier-plugin-sort-imports": + optional: true + "@prettier/plugin-hermes": + optional: true + "@prettier/plugin-oxc": + optional: true + "@prettier/plugin-pug": + optional: true + "@shopify/prettier-plugin-liquid": + optional: true + "@trivago/prettier-plugin-sort-imports": + optional: true + "@zackad/prettier-plugin-twig": + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + checksum: 10c0/1bf635be28b30b3f171a184497eecf512601d19328e402dd2eb1ede52aa57b4f5b605eae2929f4916de9ba22526f3d730d9afa90334db09d17c59f463f7b26d8 + languageName: node + linkType: hard + "prettier@npm:3.5.3": version: 3.5.3 resolution: "prettier@npm:3.5.3" @@ -6444,13 +6467,6 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 - languageName: node - linkType: hard - "proc-log@npm:^5.0.0": version: 5.0.0 resolution: "proc-log@npm:5.0.0" @@ -6468,7 +6484,7 @@ __metadata: languageName: node linkType: hard -"proxy-addr@npm:~2.0.7": +"proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" dependencies: @@ -6508,6 +6524,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:^6.14.0": + version: 6.14.0 + resolution: "qs@npm:6.14.0" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10c0/8ea5d91bf34f440598ee389d4a7d95820e3b837d3fd9f433871f7924801becaa0cd3b3b4628d49a7784d06a8aea9bc4554d2b6d8d584e2d221dc06238a42909c + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -6534,10 +6559,22 @@ __metadata: languageName: node linkType: hard +"raw-body@npm:^3.0.0": + version: 3.0.1 + resolution: "raw-body@npm:3.0.1" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.7.0" + unpipe: "npm:1.0.0" + checksum: 10c0/892f4fbd21ecab7e2fed0f045f7af9e16df7e8050879639d4e482784a2f4640aaaa33d916a0e98013f23acb82e09c2e3c57f84ab97104449f728d22f65a7d79a + languageName: node + linkType: hard + "readdirp@npm:^4.0.1": - version: 4.0.2 - resolution: "readdirp@npm:4.0.2" - checksum: 10c0/a16ecd8ef3286dcd90648c3b103e3826db2b766cdb4a988752c43a83f683d01c7059158d623cbcd8bdfb39e65d302d285be2d208e7d9f34d022d912b929217dd + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 languageName: node linkType: hard @@ -6629,9 +6666,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa languageName: node linkType: hard @@ -6653,106 +6690,89 @@ __metadata: languageName: node linkType: hard -"rollup@npm:4.40.2": - version: 4.40.2 - resolution: "rollup@npm:4.40.2" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.40.2" - "@rollup/rollup-android-arm64": "npm:4.40.2" - "@rollup/rollup-darwin-arm64": "npm:4.40.2" - "@rollup/rollup-darwin-x64": "npm:4.40.2" - "@rollup/rollup-freebsd-arm64": "npm:4.40.2" - "@rollup/rollup-freebsd-x64": "npm:4.40.2" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.40.2" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.40.2" - "@rollup/rollup-linux-arm64-gnu": "npm:4.40.2" - "@rollup/rollup-linux-arm64-musl": "npm:4.40.2" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.40.2" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.40.2" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.40.2" - "@rollup/rollup-linux-riscv64-musl": "npm:4.40.2" - "@rollup/rollup-linux-s390x-gnu": "npm:4.40.2" - "@rollup/rollup-linux-x64-gnu": "npm:4.40.2" - "@rollup/rollup-linux-x64-musl": "npm:4.40.2" - "@rollup/rollup-win32-arm64-msvc": "npm:4.40.2" - "@rollup/rollup-win32-ia32-msvc": "npm:4.40.2" - "@rollup/rollup-win32-x64-msvc": "npm:4.40.2" - "@types/estree": "npm:1.0.7" - fsevents: "npm:~2.3.2" +"rolldown@npm:1.0.0-beta.32": + version: 1.0.0-beta.32 + resolution: "rolldown@npm:1.0.0-beta.32" + dependencies: + "@oxc-project/runtime": "npm:=0.81.0" + "@oxc-project/types": "npm:=0.81.0" + "@rolldown/binding-android-arm64": "npm:1.0.0-beta.32" + "@rolldown/binding-darwin-arm64": "npm:1.0.0-beta.32" + "@rolldown/binding-darwin-x64": "npm:1.0.0-beta.32" + "@rolldown/binding-freebsd-x64": "npm:1.0.0-beta.32" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-beta.32" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-beta.32" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-beta.32" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-beta.32" + "@rolldown/binding-linux-x64-musl": "npm:1.0.0-beta.32" + "@rolldown/binding-openharmony-arm64": "npm:1.0.0-beta.32" + "@rolldown/binding-wasm32-wasi": "npm:1.0.0-beta.32" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-beta.32" + "@rolldown/binding-win32-ia32-msvc": "npm:1.0.0-beta.32" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-beta.32" + "@rolldown/pluginutils": "npm:1.0.0-beta.32" + ansis: "npm:^4.0.0" dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": + "@rolldown/binding-android-arm64": optional: true - "@rollup/rollup-linux-arm64-gnu": + "@rolldown/binding-darwin-arm64": optional: true - "@rollup/rollup-linux-arm64-musl": + "@rolldown/binding-darwin-x64": optional: true - "@rollup/rollup-linux-loongarch64-gnu": + "@rolldown/binding-freebsd-x64": optional: true - "@rollup/rollup-linux-powerpc64le-gnu": + "@rolldown/binding-linux-arm-gnueabihf": optional: true - "@rollup/rollup-linux-riscv64-gnu": + "@rolldown/binding-linux-arm64-gnu": optional: true - "@rollup/rollup-linux-riscv64-musl": + "@rolldown/binding-linux-arm64-musl": optional: true - "@rollup/rollup-linux-s390x-gnu": + "@rolldown/binding-linux-x64-gnu": optional: true - "@rollup/rollup-linux-x64-gnu": + "@rolldown/binding-linux-x64-musl": optional: true - "@rollup/rollup-linux-x64-musl": + "@rolldown/binding-openharmony-arm64": optional: true - "@rollup/rollup-win32-arm64-msvc": + "@rolldown/binding-wasm32-wasi": optional: true - "@rollup/rollup-win32-ia32-msvc": + "@rolldown/binding-win32-arm64-msvc": optional: true - "@rollup/rollup-win32-x64-msvc": + "@rolldown/binding-win32-ia32-msvc": optional: true - fsevents: + "@rolldown/binding-win32-x64-msvc": optional: true bin: - rollup: dist/bin/rollup - checksum: 10c0/cbe9b766891da74fbf7c3b50420bb75102e5c59afc0ea45751f7e43a581d2cd93367763f521f820b72e341cf1f6b9951fbdcd3be67a1b0aa774b754525a8b9c7 - languageName: node - linkType: hard - -"rollup@npm:^4.34.9": - version: 4.43.0 - resolution: "rollup@npm:4.43.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.43.0" - "@rollup/rollup-android-arm64": "npm:4.43.0" - "@rollup/rollup-darwin-arm64": "npm:4.43.0" - "@rollup/rollup-darwin-x64": "npm:4.43.0" - "@rollup/rollup-freebsd-arm64": "npm:4.43.0" - "@rollup/rollup-freebsd-x64": "npm:4.43.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.43.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.43.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.43.0" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.43.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-riscv64-musl": "npm:4.43.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.43.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-x64-musl": "npm:4.43.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.43.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.43.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.43.0" - "@types/estree": "npm:1.0.7" + rolldown: bin/cli.mjs + checksum: 10c0/a83d983f76cb5d192256cd581ad18323e0fe75d9dacd498fd75523490499bc352c7d685c62960d6d440ef2292efdc6ce0a3d1bfb5be13609b45cb74248a8ae49 + languageName: node + linkType: hard + +"rollup@npm:^4.43.0": + version: 4.50.0 + resolution: "rollup@npm:4.50.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.50.0" + "@rollup/rollup-android-arm64": "npm:4.50.0" + "@rollup/rollup-darwin-arm64": "npm:4.50.0" + "@rollup/rollup-darwin-x64": "npm:4.50.0" + "@rollup/rollup-freebsd-arm64": "npm:4.50.0" + "@rollup/rollup-freebsd-x64": "npm:4.50.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.50.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.50.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.50.0" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.50.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.50.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-x64-musl": "npm:4.50.0" + "@rollup/rollup-openharmony-arm64": "npm:4.50.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.50.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.50.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.50.0" + "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -6777,7 +6797,7 @@ __metadata: optional: true "@rollup/rollup-linux-loongarch64-gnu": optional: true - "@rollup/rollup-linux-powerpc64le-gnu": + "@rollup/rollup-linux-ppc64-gnu": optional: true "@rollup/rollup-linux-riscv64-gnu": optional: true @@ -6789,6 +6809,8 @@ __metadata: optional: true "@rollup/rollup-linux-x64-musl": optional: true + "@rollup/rollup-openharmony-arm64": + optional: true "@rollup/rollup-win32-arm64-msvc": optional: true "@rollup/rollup-win32-ia32-msvc": @@ -6799,7 +6821,20 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/a14a16ee5433f9eddfe803ed1a3f4528e3e96f746e55bf88c5482f9a60a4ad61f507b59f46d5d9c8dc98bb7983483e0c94b760ae37c02157eba9da5665c1641b + checksum: 10c0/8a9aa0885b61ee08315cdc097fb9f97b626a0992546a6857d7668f4690a7344d8497fa7504e4dba03acefc77f03d90fec3c11bfa80777177e76ea5d8c18ddc97 + languageName: node + linkType: hard + +"router@npm:^2.2.0": + version: 2.2.0 + resolution: "router@npm:2.2.0" + dependencies: + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + is-promise: "npm:^4.0.0" + parseurl: "npm:^1.3.3" + path-to-regexp: "npm:^8.0.0" + checksum: 10c0/3279de7450c8eae2f6e095e9edacbdeec0abb5cb7249c6e719faa0db2dba43574b4fff5892d9220631c9abaff52dd3cad648cfea2aaace845e1a071915ac8867 languageName: node linkType: hard @@ -6828,6 +6863,17 @@ __metadata: languageName: node linkType: hard +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -6835,9 +6881,9 @@ __metadata: languageName: node linkType: hard -"sass@npm:1.88.0": - version: 1.88.0 - resolution: "sass@npm:1.88.0" +"sass@npm:1.90.0": + version: 1.90.0 + resolution: "sass@npm:1.90.0" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -6848,11 +6894,11 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10c0/dcb16dc29116bfa5a90485d24fd8020d2b0d95155bd2e31285901588729343b59fefe44365c5f146b2ba5a9ebadef90b23a7220b902507bdbd91ca2ba0a0b688 + checksum: 10c0/cd882a61811447c079cdc78b41f3be8164f2a2ced56e0b256b33da2de383a5f10e11ed15f8080bd832e6df302238e11649b07eb5f6e7d257d9b6982a8325d269 languageName: node linkType: hard -"semver@npm:7.7.2": +"semver@npm:7.7.2, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.7.2 resolution: "semver@npm:7.7.2" bin: @@ -6870,15 +6916,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf - languageName: node - linkType: hard - "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -6900,6 +6937,25 @@ __metadata: languageName: node linkType: hard +"send@npm:^1.1.0, send@npm:^1.2.0": + version: 1.2.0 + resolution: "send@npm:1.2.0" + dependencies: + debug: "npm:^4.3.5" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + mime-types: "npm:^3.0.1" + ms: "npm:^2.1.3" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + statuses: "npm:^2.0.1" + checksum: 10c0/531bcfb5616948d3468d95a1fd0adaeb0c20818ba4a500f439b800ca2117971489e02074ce32796fd64a6772ea3e7235fe0583d8241dbd37a053dc3378eff9a5 + languageName: node + linkType: hard + "serve-static@npm:1.16.2": version: 1.16.2 resolution: "serve-static@npm:1.16.2" @@ -6912,17 +6968,15 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" +"serve-static@npm:^2.2.0": + version: 2.2.0 + resolution: "serve-static@npm:2.2.0" dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + parseurl: "npm:^1.3.3" + send: "npm:^1.2.0" + checksum: 10c0/30e2ed1dbff1984836cfd0c65abf5d3f3f83bcd696c99d2d3c97edbd4e2a3ff4d3f87108a7d713640d290a7b6fe6c15ddcbc61165ab2eaad48ea8d3b52c7f913 languageName: node linkType: hard @@ -6949,15 +7003,51 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.7" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 languageName: node linkType: hard @@ -7057,23 +7147,23 @@ __metadata: linkType: hard "socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: "npm:^7.1.1" + agent-base: "npm:^7.1.2" debug: "npm:^4.3.4" socks: "npm:^2.8.3" - checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 languageName: node linkType: hard "socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" + version: 2.8.7 + resolution: "socks@npm:2.8.7" dependencies: - ip-address: "npm:^9.0.5" + ip-address: "npm:^10.0.1" smart-buffer: "npm:^4.2.0" - checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 languageName: node linkType: hard @@ -7094,10 +7184,10 @@ __metadata: languageName: node linkType: hard -"source-map@npm:0.7.4": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc +"source-map@npm:0.7.6": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c languageName: node linkType: hard @@ -7136,9 +7226,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.20 - resolution: "spdx-license-ids@npm:3.0.20" - checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c + version: 3.0.22 + resolution: "spdx-license-ids@npm:3.0.22" + checksum: 10c0/4a85e44c2ccfc06eebe63239193f526508ebec1abc7cf7bca8ee43923755636234395447c2c87f40fb672cf580a9c8e684513a676bfb2da3d38a4983684bbb38 languageName: node linkType: hard @@ -7146,22 +7236,23 @@ __metadata: version: 0.0.0-use.local resolution: "spectra-frontend@workspace:." dependencies: - "@angular/animations": "npm:^20.0.3" - "@angular/build": "npm:^20.0.2" - "@angular/cli": "npm:^20.0.2" - "@angular/common": "npm:^20.0.3" - "@angular/compiler": "npm:^20.0.3" - "@angular/compiler-cli": "npm:^20.0.3" - "@angular/core": "npm:^20.0.3" - "@angular/forms": "npm:^20.0.3" - "@angular/platform-browser": "npm:^20.0.3" - "@angular/platform-browser-dynamic": "npm:^20.0.3" - "@angular/router": "npm:^20.0.3" + "@angular/animations": "npm:^20.2.1" + "@angular/build": "npm:^20.2.0" + "@angular/cli": "npm:^20.2.0" + "@angular/common": "npm:^20.2.1" + "@angular/compiler": "npm:^20.2.1" + "@angular/compiler-cli": "npm:^20.2.1" + "@angular/core": "npm:^20.2.1" + "@angular/forms": "npm:^20.2.1" + "@angular/platform-browser": "npm:^20.2.1" + "@angular/platform-browser-dynamic": "npm:^20.2.1" + "@angular/router": "npm:^20.2.1" "@ngx-translate/core": "npm:^17.0.0" "@ngx-translate/http-loader": "npm:^17.0.0" "@tailwindcss/postcss": "npm:^4.1.10" "@types/jasmine": "npm:~5.1.7" - angular-eslint: "npm:20.0.0" + "@types/lodash": "npm:^4" + angular-eslint: "npm:20.2.0" animejs: "npm:^4.0.2" eslint: "npm:^9.28.0" eslint-config-prettier: "npm:^9.1.0" @@ -7172,7 +7263,9 @@ __metadata: karma-coverage: "npm:~2.2.1" karma-jasmine: "npm:~5.1.0" karma-jasmine-html-reporter: "npm:~2.1.0" + lodash: "npm:^4.17.21" prettier: "npm:3.5.3" + prettier-plugin-tailwindcss: "npm:^0.6.14" rxjs: "npm:~7.8.2" socket.io-client: "npm:4.8.1" tailwindcss: "npm:^4.1.10" @@ -7183,22 +7276,6 @@ __metadata: languageName: unknown linkType: soft -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 - languageName: node - linkType: hard - "ssri@npm:^12.0.0": version: 12.0.0 resolution: "ssri@npm:12.0.0" @@ -7215,6 +7292,13 @@ __metadata: languageName: node linkType: hard +"statuses@npm:^2.0.1": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f + languageName: node + linkType: hard + "statuses@npm:~1.5.0": version: 1.5.0 resolution: "statuses@npm:1.5.0" @@ -7240,7 +7324,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -7314,21 +7398,21 @@ __metadata: languageName: node linkType: hard -"tailwindcss@npm:4.1.10, tailwindcss@npm:^4.1.10": - version: 4.1.10 - resolution: "tailwindcss@npm:4.1.10" - checksum: 10c0/9da74ee1f25d6065150f132a3eb18caad82cd9902b7c552278eb627266c68b12990a22bb4b6169d04ce775c058a8d2638a5051be905be99961889c572e2aeab8 +"tailwindcss@npm:4.1.13, tailwindcss@npm:^4.1.10": + version: 4.1.13 + resolution: "tailwindcss@npm:4.1.13" + checksum: 10c0/2b80b4b11463818fd16063b7cc13fd0f6e18d7e3c3e54bbdc98742981be807884addb1dd657bc6816cb4085197b7d583f5064f619e1039a54221ffa36b7ed4c0 languageName: node linkType: hard "tapable@npm:^2.2.0": - version: 2.2.2 - resolution: "tapable@npm:2.2.2" - checksum: 10c0/8ad130aa705cab6486ad89e42233569a1fb1ff21af115f59cebe9f2b45e9e7995efceaa9cc5062510cdb4ec673b527924b2ab812e3579c55ad659ae92117011e + version: 2.2.3 + resolution: "tapable@npm:2.2.3" + checksum: 10c0/e57fd8e2d756c317f8726a1bec8f2c904bc42e37fcbd4a78211daeab89f42c734b6a20e61774321f47be9a421da628a0c78b62d36c5ed186f4d5232d09ae15f2 languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.2.1": +"tar@npm:^6.1.11": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -7356,17 +7440,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:0.2.13": - version: 0.2.13 - resolution: "tinyglobby@npm:0.2.13" - dependencies: - fdir: "npm:^6.4.4" - picomatch: "npm:^4.0.2" - checksum: 10c0/ef07dfaa7b26936601d3f6d999f7928a4d1c6234c5eb36896bb88681947c0d459b7ebe797022400e555fe4b894db06e922b95d0ce60cb05fd827a0a66326b18c - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13": +"tinyglobby@npm:0.2.14, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14": version: 0.2.14 resolution: "tinyglobby@npm:0.2.14" dependencies: @@ -7376,19 +7450,10 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: "npm:~1.0.2" - checksum: 10c0/69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 - languageName: node - linkType: hard - "tmp@npm:^0.2.1": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + version: 0.2.5 + resolution: "tmp@npm:0.2.5" + checksum: 10c0/cee5bb7d674bb4ba3ab3f3841c2ca7e46daeb2109eec395c1ec7329a91d52fcb21032b79ac25161a37b2565c4858fefab927af9735926a113ef7bac9091a6e0e languageName: node linkType: hard @@ -7408,15 +7473,6 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.3.0": - version: 1.4.3 - resolution: "ts-api-utils@npm:1.4.3" - peerDependencies: - typescript: ">=4.2.0" - checksum: 10c0/e65dc6e7e8141140c23e1dc94984bf995d4f6801919c71d6dc27cf0cd51b100a91ffcfe5217626193e5bea9d46831e8586febdc7e172df3f1091a7384299e23a - languageName: node - linkType: hard - "ts-api-utils@npm:^2.1.0": version: 2.1.0 resolution: "ts-api-utils@npm:2.1.0" @@ -7434,13 +7490,13 @@ __metadata: linkType: hard "tuf-js@npm:^3.0.1": - version: 3.0.1 - resolution: "tuf-js@npm:3.0.1" + version: 3.1.0 + resolution: "tuf-js@npm:3.1.0" dependencies: "@tufjs/models": "npm:3.0.1" - debug: "npm:^4.3.6" - make-fetch-happen: "npm:^14.0.1" - checksum: 10c0/4214dd6bb1ec8a6cadbc5690e5a8556de0306f0e95022e54fc7c0ff9dbcc229ab379fd4b048511387f9c0023ea8f8c35acd8f7313f6cbc94a1b8af8b289f62ad + debug: "npm:^4.4.1" + make-fetch-happen: "npm:^14.0.3" + checksum: 10c0/90d5dbdd0ecf2e42826c6253296aae27db5070d67da6374ac5f69eb0d0244f4043b67e3a84fb12a9a256d5b23d7143127e52fb096264eaacc3027c1d08b172ec languageName: node linkType: hard @@ -7460,6 +7516,17 @@ __metadata: languageName: node linkType: hard +"type-is@npm:^2.0.0, type-is@npm:^2.0.1": + version: 2.0.1 + resolution: "type-is@npm:2.0.1" + dependencies: + content-type: "npm:^1.0.5" + media-typer: "npm:^1.1.0" + mime-types: "npm:^3.0.0" + checksum: 10c0/7f7ec0a060b16880bdad36824ab37c26019454b67d73e8a465ed5a3587440fbe158bc765f0da68344498235c877e7dbbb1600beccc94628ed05599d667951b99 + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -7471,16 +7538,17 @@ __metadata: linkType: hard "typescript-eslint@npm:^8.33.1": - version: 8.34.0 - resolution: "typescript-eslint@npm:8.34.0" + version: 8.42.0 + resolution: "typescript-eslint@npm:8.42.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.34.0" - "@typescript-eslint/parser": "npm:8.34.0" - "@typescript-eslint/utils": "npm:8.34.0" + "@typescript-eslint/eslint-plugin": "npm:8.42.0" + "@typescript-eslint/parser": "npm:8.42.0" + "@typescript-eslint/typescript-estree": "npm:8.42.0" + "@typescript-eslint/utils": "npm:8.42.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/20c748b714267836bf47b9ed71b02ab256083d889528857732d559bf85ba4924c60623eb158fe0f5704bb75d9f20fbb54bc79b4cb978883093c6071a484fc390 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/f2220c7230640ace7c34b4dd19186f85bebb7179a4dc7b3cac22c9cae0e5868f2356fd8eabda7e5f027f066a43ecb4e1b06c910ced97d6de6b1ad7fb3af8293b languageName: node linkType: hard @@ -7505,27 +7573,18 @@ __metadata: linkType: hard "ua-parser-js@npm:^0.7.30": - version: 0.7.39 - resolution: "ua-parser-js@npm:0.7.39" + version: 0.7.41 + resolution: "ua-parser-js@npm:0.7.41" bin: ua-parser-js: script/cli.js - checksum: 10c0/5d28deda5e04589c90e67e033136c2ecec38ac6e89e32fd5eab9ef7255af5839c4310c5bbf7361020bba17e85ac56dcb094077be7b6d45a8d776cd3ffe148a8c - languageName: node - linkType: hard - -"undici-types@npm:~6.19.8": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + checksum: 10c0/b134bc0d8da10c76e07740a0ade61c193fd4c4d120ba2cb2530e26931f6b550dd60b6e801d8891f6d9c23dfebadf5590294739069edff94396f173cc8cc5767e languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f +"undici-types@npm:~7.10.0": + version: 7.10.0 + resolution: "undici-types@npm:7.10.0" + checksum: 10c0/8b00ce50e235fe3cc601307f148b5e8fb427092ee3b23e8118ec0a5d7f68eca8cee468c8fc9f15cbb2cf2a3797945ebceb1cbd9732306a1d00e0a9b6afa0f635 languageName: node linkType: hard @@ -7538,15 +7597,6 @@ __metadata: languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 - languageName: node - linkType: hard - "unique-slug@npm:^5.0.0": version: 5.0.0 resolution: "unique-slug@npm:5.0.0" @@ -7570,17 +7620,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.1": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" +"update-browserslist-db@npm:^1.1.3": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" dependencies: escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 + checksum: 10c0/682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32 languageName: node linkType: hard @@ -7611,39 +7661,39 @@ __metadata: linkType: hard "validate-npm-package-name@npm:^6.0.0": - version: 6.0.1 - resolution: "validate-npm-package-name@npm:6.0.1" - checksum: 10c0/4d5455523e0a0c9a9ae3f306d4e6205c43be71dac85882db1c357ebbaf685390ea94985511824cfe41c04ca302dd85eb1f0292ab6941234b5ddca38d11865f9a + version: 6.0.2 + resolution: "validate-npm-package-name@npm:6.0.2" + checksum: 10c0/c4c23a8b9fa8deee11eea421d94fbe39f742146c06571b62247212579298186b724ebc5152240a415753bdaf9b8849a487e675ec2968d44660f8a65de6cdef9e languageName: node linkType: hard -"vary@npm:^1, vary@npm:~1.1.2": +"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f languageName: node linkType: hard -"vite@npm:6.3.5": - version: 6.3.5 - resolution: "vite@npm:6.3.5" +"vite@npm:7.1.2": + version: 7.1.2 + resolution: "vite@npm:7.1.2" dependencies: esbuild: "npm:^0.25.0" - fdir: "npm:^6.4.4" + fdir: "npm:^6.4.6" fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.2" - postcss: "npm:^8.5.3" - rollup: "npm:^4.34.9" - tinyglobby: "npm:^0.2.13" + picomatch: "npm:^4.0.3" + postcss: "npm:^8.5.6" + rollup: "npm:^4.43.0" + tinyglobby: "npm:^0.2.14" peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@types/node": ^20.19.0 || >=22.12.0 jiti: ">=1.21.0" - less: "*" + less: ^4.0.0 lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -7675,7 +7725,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/df70201659085133abffc6b88dcdb8a57ef35f742a01311fc56a4cfcda6a404202860729cc65a2c401a724f6e25f9ab40ce4339ed4946f550541531ced6fe41c + checksum: 10c0/4ed825b20bc0f49db99cd382de9506b2721ccd47dcebd4a68e0ef65e3cdd2347fded52b306c34178308e0fd7fe78fd5ff517623002cb00710182ad3012c92ced languageName: node linkType: hard @@ -7686,13 +7736,13 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:2.4.2": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" +"watchpack@npm:2.4.4": + version: 2.4.4 + resolution: "watchpack@npm:2.4.4" dependencies: glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.1.2" - checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 + checksum: 10c0/6c0901f75ce245d33991225af915eea1c5ae4ba087f3aee2b70dd377d4cacb34bef02a48daf109da9d59b2d31ec6463d924a0d72f8618ae1643dd07b95de5275 languageName: node linkType: hard @@ -7725,17 +7775,6 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a - languageName: node - linkType: hard - "which@npm:^5.0.0": version: 5.0.0 resolution: "which@npm:5.0.0" @@ -7862,13 +7901,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 - languageName: node - linkType: hard - "yargs-parser@npm:^22.0.0": version: 22.0.0 resolution: "yargs-parser@npm:22.0.0" @@ -7876,18 +7908,17 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.7.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" +"yargs@npm:18.0.0, yargs@npm:^18.0.0": + version: 18.0.0 + resolution: "yargs@npm:18.0.0" dependencies: - cliui: "npm:^8.0.1" + cliui: "npm:^9.0.1" escalade: "npm:^3.1.1" get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" + string-width: "npm:^7.2.0" y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + yargs-parser: "npm:^22.0.0" + checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 languageName: node linkType: hard @@ -7906,20 +7937,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^18.0.0": - version: 18.0.0 - resolution: "yargs@npm:18.0.0" - dependencies: - cliui: "npm:^9.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - string-width: "npm:^7.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^22.0.0" - checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -7928,15 +7945,31 @@ __metadata: linkType: hard "yoctocolors-cjs@npm:^2.1.2": - version: 2.1.2 - resolution: "yoctocolors-cjs@npm:2.1.2" - checksum: 10c0/a0e36eb88fea2c7981eab22d1ba45e15d8d268626e6c4143305e2c1628fa17ebfaa40cd306161a8ce04c0a60ee0262058eab12567493d5eb1409780853454c6f + version: 2.1.3 + resolution: "yoctocolors-cjs@npm:2.1.3" + checksum: 10c0/584168ef98eb5d913473a4858dce128803c4a6cd87c0f09e954fa01126a59a33ab9e513b633ad9ab953786ed16efdd8c8700097a51635aafaeed3fef7712fa79 + languageName: node + linkType: hard + +"zod-to-json-schema@npm:^3.24.1": + version: 3.24.6 + resolution: "zod-to-json-schema@npm:3.24.6" + peerDependencies: + zod: ^3.24.1 + checksum: 10c0/b907ab6d057100bd25a37e5545bf5f0efa5902cd84d3c3ec05c2e51541431a47bd9bf1e5e151a244273409b45f5986d55b26e5d207f98abc5200702f733eb368 + languageName: node + linkType: hard + +"zod@npm:3.25.76, zod@npm:^3.23.8": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c languageName: node linkType: hard "zone.js@npm:^0.15.0": - version: 0.15.0 - resolution: "zone.js@npm:0.15.0" - checksum: 10c0/981b664c1978759a2854f6e6692d245d1d6334c6b20b7e2e5fa9b60eed74743b29c6a71f7472dc6d2790ab53d67e30475bcd92b9f7664e50aef8bbcd40379552 + version: 0.15.1 + resolution: "zone.js@npm:0.15.1" + checksum: 10c0/4eca000f90dbea1c34f62e88ce56910dace8cdecbe14747b214f2af37aa511264c7bd50faf3e9b00612e95dc4567da156a9690fef1983bfcf74604a630d190ef languageName: node linkType: hard