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