diff --git a/package-lock.json b/package-lock.json
index 8169f6eece..e783c26e71 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1189,7 +1189,6 @@
}
],
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=18"
},
@@ -1233,7 +1232,6 @@
}
],
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=18"
}
@@ -2167,7 +2165,6 @@
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
"integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
"license": "Apache-2.0",
- "peer": true,
"engines": {
"node": ">=8.0.0"
}
@@ -4562,7 +4559,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.32.tgz",
"integrity": "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"undici-types": "~6.21.0"
}
@@ -4728,7 +4724,6 @@
"integrity": "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.34.1",
"@typescript-eslint/types": "8.34.1",
@@ -5208,7 +5203,6 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -5608,7 +5602,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001718",
"electron-to-chromium": "^1.5.160",
@@ -5762,7 +5755,6 @@
"integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"assertion-error": "^2.0.1",
"check-error": "^2.1.1",
@@ -6684,7 +6676,6 @@
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"dev": true,
"license": "ISC",
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -7254,7 +7245,6 @@
"integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -8589,7 +8579,6 @@
"integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@acemir/cssom": "^0.9.28",
"@asamuzakjp/dom-selector": "^6.7.6",
@@ -10185,7 +10174,6 @@
"integrity": "sha512-dyuThzncsgEgJZnvd/A/5x6IkUERbK+phXqUQrI+0C6WE+8xqGH5VChRTLecemhgZF0kQ+gZOM3tJTX9937xpg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@pixi/colord": "^2.9.6",
"@types/css-font-loading-module": "^0.0.12",
@@ -10230,7 +10218,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -10333,7 +10320,6 @@
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
"dev": true,
"license": "MIT",
- "peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -11156,7 +11142,6 @@
"integrity": "sha512-Z0NVCW45W8Mg5oC/27/+fCqIHFnW8kpkFOq0j9XJIev4Ld0mKmERaZv5DMLAb9fGCevjKwaEeIQz5+MBXfZcDw==",
"dev": true,
"license": "BSD-3-Clause",
- "peer": true,
"dependencies": {
"@sinonjs/commons": "^3.0.1",
"@sinonjs/fake-timers": "^15.1.0",
@@ -11578,7 +11563,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=12"
},
@@ -11821,7 +11805,6 @@
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz",
"integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"esbuild": "~0.25.0",
"get-tsconfig": "^4.7.5"
@@ -11890,7 +11873,6 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"license": "Apache-2.0",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -12037,7 +12019,6 @@
"integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"esbuild": "^0.27.0",
"fdir": "^6.5.0",
@@ -12787,7 +12768,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=12"
},
@@ -12801,7 +12781,6 @@
"integrity": "sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@vitest/expect": "4.0.16",
"@vitest/mocker": "4.0.16",
diff --git a/resources/images/OF.png b/resources/images/OF.png
new file mode 100644
index 0000000000..8b573105bb
Binary files /dev/null and b/resources/images/OF.png differ
diff --git a/resources/images/OpenFront.png b/resources/images/OpenFront.png
new file mode 100644
index 0000000000..2ddd74dedd
Binary files /dev/null and b/resources/images/OpenFront.png differ
diff --git a/resources/images/background.png b/resources/images/background.png
new file mode 100644
index 0000000000..773ed4b81f
Binary files /dev/null and b/resources/images/background.png differ
diff --git a/resources/lang/en.json b/resources/lang/en.json
index 23b15a4899..fd0e69a00f 100644
--- a/resources/lang/en.json
+++ b/resources/lang/en.json
@@ -394,7 +394,8 @@
"connecting": "Connecting to matchmaking server...",
"searching": "Searching for game...",
"waiting_for_game": "Waiting for game to start...",
- "elo": "Your ELO: {elo}"
+ "elo": "Your ELO: {elo}",
+ "no_elo": "No ELO yet"
},
"username": {
"enter_username": "Enter your username",
@@ -475,6 +476,13 @@
"teams": "Teams",
"humans_vs_nations": "Humans vs Nations"
},
+ "mode_selector": {
+ "special_title": "Special Mix",
+ "ranked_title": "Ranked",
+ "ranked_1v1_title": "1v1",
+ "ranked_2v2_title": "2v2",
+ "coming_soon": "Coming Soon"
+ },
"public_game_modifier": {
"random_spawn": "Random Spawn",
"compact_map": "Compact Map",
@@ -1001,8 +1009,6 @@
"recent_games": "Recent Games",
"game_id": "Game ID",
"mode": "Mode",
- "mode_ffa": "Free-for-All",
- "mode_team": "Team",
"replay": "Replay",
"details": "Details",
"ranking": "Ranking",
@@ -1020,8 +1026,6 @@
"stats_losses": "Losses",
"stats_wlr": "Win:Loss Ratio",
"stats_games_played": "Games Played",
- "mode_ffa": "Free-for-All",
- "mode_team": "Team",
"no_stats": "No stats recorded for this selection."
},
"matchmaking_button": {
diff --git a/src/client/AccountModal.ts b/src/client/AccountModal.ts
index 8169e95669..6879218dca 100644
--- a/src/client/AccountModal.ts
+++ b/src/client/AccountModal.ts
@@ -61,18 +61,9 @@ export class AccountModal extends BaseModal {
render() {
const content = this.isLoadingUser
- ? html`
-
-
-
- ${translateText("account_modal.fetching_account")}
-
-
- `
+ ? this.renderLoadingSpinner(
+ translateText("account_modal.fetching_account"),
+ )
: this.renderInner();
if (this.inline) {
@@ -99,9 +90,7 @@ export class AccountModal extends BaseModal {
const displayId = publicId || translateText("account_modal.not_found");
return html`
-
+
${modalHeader({
title,
onBack: () => this.close(),
diff --git a/src/client/FlagInput.ts b/src/client/FlagInput.ts
index 9bf17fce66..88f9be0602 100644
--- a/src/client/FlagInput.ts
+++ b/src/client/FlagInput.ts
@@ -84,7 +84,7 @@ export class FlagInput extends LitElement {
return html`