diff --git a/app/Http/Controllers/UserProfileController.php b/app/Http/Controllers/UserProfileController.php index 6b69680..2a5ed0c 100644 --- a/app/Http/Controllers/UserProfileController.php +++ b/app/Http/Controllers/UserProfileController.php @@ -184,7 +184,7 @@ class UserProfileController extends Controller $alliance = Alliance::where('internal_name', $allianceInternalName) ->with('airlines') ->firstOrFail(); - $airlines = $alliance->airlines()->with('country')->orderBy('name')->get(); + $airlines = $alliance->airlines()->with(['country', 'mergedFrom'])->orderBy('name')->get(); } $aircraftFamilies = match($achievement->internal_name){ diff --git a/app/Models/Airline.php b/app/Models/Airline.php index d85aa7f..80c5394 100644 --- a/app/Models/Airline.php +++ b/app/Models/Airline.php @@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; class Airline extends Model { @@ -20,6 +21,7 @@ class Airline extends Model 'alliance_id', 'active', 'logo', + 'merged_into_id', ]; protected $casts = [ @@ -65,4 +67,19 @@ class Airline extends Model { return $this->belongsTo(Country::class); } + + public function mergedInto(): BelongsTo + { + return $this->belongsTo(Airline::class, 'merged_into_id'); + } + + public function mergedFrom(): HasMany + { + return $this->hasMany(Airline::class, 'merged_into_id'); + } + + public function canonical(): self + { + return $this->mergedInto ?? $this; + } } diff --git a/app/Services/Achievements/Checkers/AirlinesAndAlliancesChecker.php b/app/Services/Achievements/Checkers/AirlinesAndAlliancesChecker.php index 73b6e30..fe1585f 100644 --- a/app/Services/Achievements/Checkers/AirlinesAndAlliancesChecker.php +++ b/app/Services/Achievements/Checkers/AirlinesAndAlliancesChecker.php @@ -2,6 +2,7 @@ namespace App\Services\Achievements\Checkers; +use App\Models\Airline; use App\Models\Alliance; use App\Models\User; use App\Models\UserFlight; @@ -20,9 +21,10 @@ class AirlinesAndAlliancesChecker extends BaseChecker $alliances = Alliance::withCount('airlines')->pluck('id', 'internal_name'); $flownAllianceAirlines = $flights - ->filter(fn(UserFlight $f) => $f->airline?->alliance !== null) - ->groupBy(fn(UserFlight $f) => $f->airline->alliance->internal_name) - ->map(fn($group) => $group->pluck('airline.internal_name')->unique()->count()); + ->map(fn(UserFlight $f) => $f->airline?->canonical()) + ->filter(fn(?Airline $a) => $a?->alliance !== null) + ->groupBy(fn(Airline $a) => $a->alliance->internal_name) + ->map(fn($group) => $group->pluck('internal_name')->unique()->count()); $check = fn(string $alliance): int => $flownAllianceAirlines->get($alliance, 0); diff --git a/database/migrations/2026_07_07_134902_add_alliance_aliases.php b/database/migrations/2026_07_07_134902_add_alliance_aliases.php new file mode 100644 index 0000000..8a1287e --- /dev/null +++ b/database/migrations/2026_07_07_134902_add_alliance_aliases.php @@ -0,0 +1,51 @@ +foreignId('merged_into_id')->nullable()->after('alliance_id')->constrained('airlines')->nullOnDelete(); + }); + + $madagascarAirlines = Airline::where('internal_name', 'air-madagascar')->first(); + $madagascarAirlines->update(['internal_name' => 'madagascar-airlines']); + + $airMadagascar = Airline::create([ + 'iata_code' => 'MD', + 'icao_code' => 'MDG', + 'name' => 'Air Madagascar', + 'internal_name' => 'air-madagascar', + 'active' => false, + 'logo' => 'MD.png', + 'country_id' => 140, + 'alliance_id' => null, + 'merged_into_id' => $madagascarAirlines->id, + ]); + + UserFlight::where('airline_id', $madagascarAirlines->id)->first()->update(['airline_id' => $airMadagascar->id]); + + foreach(User::all() as $user) { + $user->calculateAchievements(); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/package-lock.json b/package-lock.json index 537c0c2..f38e1ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "@types/geojson": "^7946.0.16", "@types/leaflet": "^1.9.21", "@types/node": "^25.5.0", + "@vite-pwa/assets-generator": "^1.0.2", "@vitejs/plugin-vue": "^6.0.0", "autoprefixer": "^10.4.12", "axios": "^1.11.0", @@ -1801,6 +1802,13 @@ "devOptional": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, + "node_modules/@canvas/image-data": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.1.0.tgz", + "integrity": "sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==", + "dev": true, + "license": "MIT" + }, "node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", @@ -1853,6 +1861,422 @@ "license": "0BSD", "optional": true }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@inertiajs/core": { "version": "2.3.26", "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-2.3.26.tgz", @@ -2493,6 +2917,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/@quansync/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", @@ -3703,6 +4140,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@vite-pwa/assets-generator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vite-pwa/assets-generator/-/assets-generator-1.0.2.tgz", + "integrity": "sha512-MCbrb508JZHqe7bUibmZj/lyojdhLRnfkmyXnkrCM2zVrjTgL89U8UEfInpKTvPeTnxsw2hmyZxnhsdNR6yhwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "colorette": "^2.0.20", + "consola": "^3.4.2", + "sharp": "^0.33.5", + "sharp-ico": "^0.1.5", + "unconfig": "^7.3.1" + }, + "bin": { + "pwa-assets-generator": "bin/pwa-assets-generator.mjs" + }, + "engines": { + "node": ">=16.14.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@vitejs/plugin-vue": { "version": "6.0.7", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", @@ -5241,6 +5702,16 @@ "devOptional": true, "license": "MIT" }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -5417,6 +5888,20 @@ "node": ">=12" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5437,6 +5922,24 @@ "dev": true, "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, "node_modules/colorjs.io": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", @@ -5509,6 +6012,16 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -5676,6 +6189,35 @@ "ms": "2.0.0" } }, + "node_modules/decode-bmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz", + "integrity": "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@canvas/image-data": "^1.0.0", + "to-data-view": "^1.1.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/decode-ico": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz", + "integrity": "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@canvas/image-data": "^1.0.0", + "decode-bmp": "^0.2.0", + "to-data-view": "^1.1.0" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -5722,6 +6264,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6808,6 +7357,13 @@ "dev": true, "license": "MIT" }, + "node_modules/ico-endec": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz", + "integrity": "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==", + "dev": true, + "license": "MPL-2.0" + }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -6865,6 +7421,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true, + "license": "MIT" + }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -8606,6 +9169,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9487,6 +10067,71 @@ "node": ">= 0.4" } }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp-ico": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/sharp-ico/-/sharp-ico-0.1.5.tgz", + "integrity": "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "decode-ico": "*", + "ico-endec": "*", + "sharp": "*" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -9612,6 +10257,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -10127,6 +10782,13 @@ "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", "license": "ISC" }, + "node_modules/to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "license": "MIT" + }, "node_modules/to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -10324,6 +10986,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unconfig": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.5.0.tgz", + "integrity": "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "defu": "^6.1.4", + "jiti": "^2.6.1", + "quansync": "^1.0.0", + "unconfig-core": "7.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/undici-types": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", diff --git a/package.json b/package.json index 0fa124c..726b2b1 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@types/geojson": "^7946.0.16", "@types/leaflet": "^1.9.21", "@types/node": "^25.5.0", + "@vite-pwa/assets-generator": "^1.0.2", "@vitejs/plugin-vue": "^6.0.0", "autoprefixer": "^10.4.12", "axios": "^1.11.0", diff --git a/public/img/logos/apple-splash-landscape-1136x640.png b/public/img/logos/apple-splash-landscape-1136x640.png new file mode 100644 index 0000000..d74221e Binary files /dev/null and b/public/img/logos/apple-splash-landscape-1136x640.png differ diff --git a/public/img/logos/apple-splash-landscape-1334x750.png b/public/img/logos/apple-splash-landscape-1334x750.png new file mode 100644 index 0000000..7d0cf01 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-1334x750.png differ diff --git a/public/img/logos/apple-splash-landscape-1792x828.png b/public/img/logos/apple-splash-landscape-1792x828.png new file mode 100644 index 0000000..a99548b Binary files /dev/null and b/public/img/logos/apple-splash-landscape-1792x828.png differ diff --git a/public/img/logos/apple-splash-landscape-2048x1536.png b/public/img/logos/apple-splash-landscape-2048x1536.png new file mode 100644 index 0000000..2b21b89 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2048x1536.png differ diff --git a/public/img/logos/apple-splash-landscape-2160x1620.png b/public/img/logos/apple-splash-landscape-2160x1620.png new file mode 100644 index 0000000..e45a619 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2160x1620.png differ diff --git a/public/img/logos/apple-splash-landscape-2208x1242.png b/public/img/logos/apple-splash-landscape-2208x1242.png new file mode 100644 index 0000000..f8c3967 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2208x1242.png differ diff --git a/public/img/logos/apple-splash-landscape-2224x1668.png b/public/img/logos/apple-splash-landscape-2224x1668.png new file mode 100644 index 0000000..6d8818b Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2224x1668.png differ diff --git a/public/img/logos/apple-splash-landscape-2266x1488.png b/public/img/logos/apple-splash-landscape-2266x1488.png new file mode 100644 index 0000000..bff0b9f Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2266x1488.png differ diff --git a/public/img/logos/apple-splash-landscape-2360x1640.png b/public/img/logos/apple-splash-landscape-2360x1640.png new file mode 100644 index 0000000..7aa611e Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2360x1640.png differ diff --git a/public/img/logos/apple-splash-landscape-2388x1668.png b/public/img/logos/apple-splash-landscape-2388x1668.png new file mode 100644 index 0000000..39a8216 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2388x1668.png differ diff --git a/public/img/logos/apple-splash-landscape-2436x1125.png b/public/img/logos/apple-splash-landscape-2436x1125.png new file mode 100644 index 0000000..cdc461c Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2436x1125.png differ diff --git a/public/img/logos/apple-splash-landscape-2532x1170.png b/public/img/logos/apple-splash-landscape-2532x1170.png new file mode 100644 index 0000000..6f55d48 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2532x1170.png differ diff --git a/public/img/logos/apple-splash-landscape-2556x1179.png b/public/img/logos/apple-splash-landscape-2556x1179.png new file mode 100644 index 0000000..095aa6d Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2556x1179.png differ diff --git a/public/img/logos/apple-splash-landscape-2622x1206.png b/public/img/logos/apple-splash-landscape-2622x1206.png new file mode 100644 index 0000000..4628f92 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2622x1206.png differ diff --git a/public/img/logos/apple-splash-landscape-2688x1242.png b/public/img/logos/apple-splash-landscape-2688x1242.png new file mode 100644 index 0000000..364e9d5 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2688x1242.png differ diff --git a/public/img/logos/apple-splash-landscape-2732x2048.png b/public/img/logos/apple-splash-landscape-2732x2048.png new file mode 100644 index 0000000..08aa7b5 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2732x2048.png differ diff --git a/public/img/logos/apple-splash-landscape-2778x1284.png b/public/img/logos/apple-splash-landscape-2778x1284.png new file mode 100644 index 0000000..7489d73 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2778x1284.png differ diff --git a/public/img/logos/apple-splash-landscape-2796x1290.png b/public/img/logos/apple-splash-landscape-2796x1290.png new file mode 100644 index 0000000..e16544a Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2796x1290.png differ diff --git a/public/img/logos/apple-splash-landscape-2868x1320.png b/public/img/logos/apple-splash-landscape-2868x1320.png new file mode 100644 index 0000000..88d6275 Binary files /dev/null and b/public/img/logos/apple-splash-landscape-2868x1320.png differ diff --git a/public/img/logos/apple-splash-portrait-1125x2436.png b/public/img/logos/apple-splash-portrait-1125x2436.png new file mode 100644 index 0000000..4bd239a Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1125x2436.png differ diff --git a/public/img/logos/apple-splash-portrait-1170x2532.png b/public/img/logos/apple-splash-portrait-1170x2532.png new file mode 100644 index 0000000..172b8bc Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1170x2532.png differ diff --git a/public/img/logos/apple-splash-portrait-1179x2556.png b/public/img/logos/apple-splash-portrait-1179x2556.png new file mode 100644 index 0000000..7bdb730 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1179x2556.png differ diff --git a/public/img/logos/apple-splash-portrait-1206x2622.png b/public/img/logos/apple-splash-portrait-1206x2622.png new file mode 100644 index 0000000..8330bd8 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1206x2622.png differ diff --git a/public/img/logos/apple-splash-portrait-1242x2208.png b/public/img/logos/apple-splash-portrait-1242x2208.png new file mode 100644 index 0000000..22e0fd0 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1242x2208.png differ diff --git a/public/img/logos/apple-splash-portrait-1242x2688.png b/public/img/logos/apple-splash-portrait-1242x2688.png new file mode 100644 index 0000000..1ca3ff2 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1242x2688.png differ diff --git a/public/img/logos/apple-splash-portrait-1284x2778.png b/public/img/logos/apple-splash-portrait-1284x2778.png new file mode 100644 index 0000000..3cd8bbd Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1284x2778.png differ diff --git a/public/img/logos/apple-splash-portrait-1290x2796.png b/public/img/logos/apple-splash-portrait-1290x2796.png new file mode 100644 index 0000000..bf066bc Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1290x2796.png differ diff --git a/public/img/logos/apple-splash-portrait-1320x2868.png b/public/img/logos/apple-splash-portrait-1320x2868.png new file mode 100644 index 0000000..a708fd9 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1320x2868.png differ diff --git a/public/img/logos/apple-splash-portrait-1488x2266.png b/public/img/logos/apple-splash-portrait-1488x2266.png new file mode 100644 index 0000000..dee7e69 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1488x2266.png differ diff --git a/public/img/logos/apple-splash-portrait-1536x2048.png b/public/img/logos/apple-splash-portrait-1536x2048.png new file mode 100644 index 0000000..89cc1e0 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1536x2048.png differ diff --git a/public/img/logos/apple-splash-portrait-1620x2160.png b/public/img/logos/apple-splash-portrait-1620x2160.png new file mode 100644 index 0000000..48c89c5 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1620x2160.png differ diff --git a/public/img/logos/apple-splash-portrait-1640x2360.png b/public/img/logos/apple-splash-portrait-1640x2360.png new file mode 100644 index 0000000..e9d58ea Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1640x2360.png differ diff --git a/public/img/logos/apple-splash-portrait-1668x2224.png b/public/img/logos/apple-splash-portrait-1668x2224.png new file mode 100644 index 0000000..6a04d29 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1668x2224.png differ diff --git a/public/img/logos/apple-splash-portrait-1668x2388.png b/public/img/logos/apple-splash-portrait-1668x2388.png new file mode 100644 index 0000000..591ab1d Binary files /dev/null and b/public/img/logos/apple-splash-portrait-1668x2388.png differ diff --git a/public/img/logos/apple-splash-portrait-2048x2732.png b/public/img/logos/apple-splash-portrait-2048x2732.png new file mode 100644 index 0000000..dfb2233 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-2048x2732.png differ diff --git a/public/img/logos/apple-splash-portrait-640x1136.png b/public/img/logos/apple-splash-portrait-640x1136.png new file mode 100644 index 0000000..d5ce50f Binary files /dev/null and b/public/img/logos/apple-splash-portrait-640x1136.png differ diff --git a/public/img/logos/apple-splash-portrait-750x1334.png b/public/img/logos/apple-splash-portrait-750x1334.png new file mode 100644 index 0000000..8a42f58 Binary files /dev/null and b/public/img/logos/apple-splash-portrait-750x1334.png differ diff --git a/public/img/logos/apple-splash-portrait-828x1792.png b/public/img/logos/apple-splash-portrait-828x1792.png new file mode 100644 index 0000000..8ce272e Binary files /dev/null and b/public/img/logos/apple-splash-portrait-828x1792.png differ diff --git a/public/img/logos/apple-touch-icon-180x180.png b/public/img/logos/apple-touch-icon-180x180.png new file mode 100644 index 0000000..b517b22 Binary files /dev/null and b/public/img/logos/apple-touch-icon-180x180.png differ diff --git a/public/img/logos/favicon.ico b/public/img/logos/favicon.ico new file mode 100644 index 0000000..6b0552a Binary files /dev/null and b/public/img/logos/favicon.ico differ diff --git a/public/img/logos/maskable-icon-512x512.png b/public/img/logos/maskable-icon-512x512.png new file mode 100644 index 0000000..96e7813 Binary files /dev/null and b/public/img/logos/maskable-icon-512x512.png differ diff --git a/public/img/logos/pwa-192x192.png b/public/img/logos/pwa-192x192.png new file mode 100644 index 0000000..66da6b1 Binary files /dev/null and b/public/img/logos/pwa-192x192.png differ diff --git a/public/img/logos/pwa-512x512.png b/public/img/logos/pwa-512x512.png new file mode 100644 index 0000000..1578146 Binary files /dev/null and b/public/img/logos/pwa-512x512.png differ diff --git a/public/img/logos/pwa-64x64.png b/public/img/logos/pwa-64x64.png new file mode 100644 index 0000000..1fab4d7 Binary files /dev/null and b/public/img/logos/pwa-64x64.png differ diff --git a/pwa-assets.config.ts b/pwa-assets.config.ts new file mode 100644 index 0000000..50e6b82 --- /dev/null +++ b/pwa-assets.config.ts @@ -0,0 +1,20 @@ +import { defineConfig, minimal2023Preset, createAppleSplashScreens } from '@vite-pwa/assets-generator/config' + +export default defineConfig({ + headLinkOptions: { preset: '2023' }, + preset: { + ...minimal2023Preset, + appleSplashScreens: createAppleSplashScreens({ + padding: 0.3, + resizeOptions: { background: 'rgb(0, 12, 41)', fit: 'contain' }, + linkMediaOptions: { + log: true, + addMediaScreen: true, + basePath: '/img/logos/', + xhtml: false, + }, + png: { compressionLevel: 9, quality: 60 }, + }), + }, + images: ['public/img/logos/header_logo_color.svg'], +}) diff --git a/resources/js/Components/FlightsGoneBy/AllianceChallenge.vue b/resources/js/Components/FlightsGoneBy/AllianceChallenge.vue index 6e2ff2a..573026a 100644 --- a/resources/js/Components/FlightsGoneBy/AllianceChallenge.vue +++ b/resources/js/Components/FlightsGoneBy/AllianceChallenge.vue @@ -26,18 +26,25 @@ const props = defineProps<{ }>() const flightsByAirline = computed(() => { - const allianceAirlineIds = new Set(props.airlines.map(a => a.id)) const map = new Map() + const idToKey = new Map() + - // Pre-populate every alliance airline so unflown ones still appear for (const airline of props.airlines) { - map.set(rowKey(airline), { airline, flights: [] }) + const key = rowKey(airline) + map.set(key, { airline, flights: [] }) + idToKey.set(airline.id, key) + for (const alias of airline.merged_from ?? []) { + idToKey.set(alias.id, key) + } } for (const flight of props.flights) { const airline = flight.airline - if (!airline || !allianceAirlineIds.has(airline.id)) continue - map.get(rowKey(airline))?.flights.push(flight) + if (!airline) continue + const key = idToKey.get(airline.id) + if (!key) continue + map.get(key)?.flights.push(flight) } return map diff --git a/resources/js/Pages/Profile/Achievements/aircraft.all_boeing_737.vue b/resources/js/Pages/Profile/Achievements/aircraft.all_boeing_737.vue index f358dff..f5a7780 100644 --- a/resources/js/Pages/Profile/Achievements/aircraft.all_boeing_737.vue +++ b/resources/js/Pages/Profile/Achievements/aircraft.all_boeing_737.vue @@ -83,11 +83,11 @@ const generationGroups = computed(() => This challenge is impossible to complete if you start today, but it's a fun one to look at because despite how common as the 737 is, it's very hard to find them all!

diff --git a/resources/js/Pages/Profile/Achievements/airlines_alliances.all_vanilla_alliance.vue b/resources/js/Pages/Profile/Achievements/airlines_alliances.all_vanilla_alliance.vue index 6a01712..3d8bc60 100644 --- a/resources/js/Pages/Profile/Achievements/airlines_alliances.all_vanilla_alliance.vue +++ b/resources/js/Pages/Profile/Achievements/airlines_alliances.all_vanilla_alliance.vue @@ -1,6 +1,8 @@