diff --git a/resources/lang/en.json b/resources/lang/en.json
index 58af1c01b..2c61a00be 100644
--- a/resources/lang/en.json
+++ b/resources/lang/en.json
@@ -949,7 +949,8 @@
"default": "Default"
},
"select_skin": "Select Skin",
- "selected": "selected"
+ "selected": "selected",
+ "search": "Search..."
},
"cosmetics": {
"artist_label": "Artist:"
diff --git a/src/client/TerritoryPatternsModal.ts b/src/client/TerritoryPatternsModal.ts
index 9d9c995ed..6702d05ef 100644
--- a/src/client/TerritoryPatternsModal.ts
+++ b/src/client/TerritoryPatternsModal.ts
@@ -22,6 +22,7 @@ export class TerritoryPatternsModal extends BaseModal {
@state() private selectedPattern: PlayerPattern | null;
@state() private selectedColor: string | null = null;
+ @state() private search = "";
private cosmetics: Cosmetics | null = null;
private userSettings: UserSettings = new UserSettings();
@@ -67,6 +68,15 @@ export class TerritoryPatternsModal extends BaseModal {
this.refresh();
}
+ private includedInSearch(name: string): boolean {
+ const displayName = name.replace(/_/g, " ");
+ return displayName.toLowerCase().includes(this.search.toLowerCase());
+ }
+
+ private handleSearch(event: Event) {
+ this.search = (event.target as HTMLInputElement).value;
+ }
+
private renderPatternGrid(): TemplateResult {
const buttons: TemplateResult[] = [];
const patterns: (Pattern | null)[] = [
@@ -74,6 +84,12 @@ export class TerritoryPatternsModal extends BaseModal {
...Object.values(this.cosmetics?.patterns ?? {}),
];
for (const pattern of patterns) {
+ if (pattern === null && this.search) {
+ continue;
+ }
+ if (pattern !== null && !this.includedInSearch(pattern.name)) {
+ continue;
+ }
const colorPalettes = pattern
? [...(pattern.colorPalettes ?? []), null]
: [null];
@@ -135,6 +151,19 @@ export class TerritoryPatternsModal extends BaseModal {
ariaLabel: translateText("common.back"),
rightContent: html`