diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png index c7b87879..d14baf5a 100644 Binary files a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png index 2fb1ef26..dbd84b55 100644 Binary files a/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png and b/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png index bc988217..dfa2970f 100644 Binary files a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png index 9e167dd6..f3bc0d90 100644 Binary files a/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png and b/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png index ea4fd2eb..46e53042 100644 Binary files a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png index cf8e0a14..64fba3b5 100644 Binary files a/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png index 130892f3..387d9910 100644 Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png index 8f0b8a23..9bb378cf 100644 Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png index 79d3ba67..8dcc1a0e 100644 Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png index 59ca15b0..3db240f1 100644 Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index e0e85ffe..1dcb8be5 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 5c10e8a6..12dccf86 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index a4d76fea..d86d02ae 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 90b45bcd..8c835720 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index ebe161de..6876753c 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/assets/app_icon/latest_container.png b/assets/app_icon/latest_container.png index edb72dda..bd308ae2 100644 Binary files a/assets/app_icon/latest_container.png and b/assets/app_icon/latest_container.png differ diff --git a/assets/app_icon/latest_container_foreground.png b/assets/app_icon/latest_container_foreground.png index 68d7ad8b..50971e21 100644 Binary files a/assets/app_icon/latest_container_foreground.png and b/assets/app_icon/latest_container_foreground.png differ diff --git a/assets/app_icon/latest_container_ios_dark.png b/assets/app_icon/latest_container_ios_dark.png index edb72dda..bd308ae2 100644 Binary files a/assets/app_icon/latest_container_ios_dark.png and b/assets/app_icon/latest_container_ios_dark.png differ diff --git a/assets/app_icon/latest_container_ios_tinted.png b/assets/app_icon/latest_container_ios_tinted.png index 5501bd41..4bd93f6d 100644 Binary files a/assets/app_icon/latest_container_ios_tinted.png and b/assets/app_icon/latest_container_ios_tinted.png differ diff --git a/assets/app_icon/latest_container_monochrome.png b/assets/app_icon/latest_container_monochrome.png index c840a4fb..add37c1e 100644 Binary files a/assets/app_icon/latest_container_monochrome.png and b/assets/app_icon/latest_container_monochrome.png differ diff --git a/assets/containers/30004.webp b/assets/containers/30004.webp index 84031bf6..4109fd5b 100644 Binary files a/assets/containers/30004.webp and b/assets/containers/30004.webp differ diff --git a/assets/data/containers.json b/assets/data/containers.json index c73b4088..41df1a02 100644 --- a/assets/data/containers.json +++ b/assets/data/containers.json @@ -6136,5 +6136,17 @@ "sourceType": null, "sourceId": null, "sourceName": null + }, + { + "id": "30004", + "name": "Jackass Sticker Capsule", + "containerImage": "assets/containers/30004.webp", + "releaseDate": "2026-07-03", + "type": "STICKER_CAPSULE", + "tournamentName": null, + "tournamentLogo": null, + "sourceType": null, + "sourceId": null, + "sourceName": null } ] diff --git a/assets/data/sticker_contents.json b/assets/data/sticker_contents.json index c0198eaf..f1ae98ca 100644 --- a/assets/data/sticker_contents.json +++ b/assets/data/sticker_contents.json @@ -10181,5 +10181,49 @@ "9487", "9488" ] + }, + { + "containerId": "30004", + "stickerIds": [ + "11196", + "11197", + "11198", + "11199", + "11200", + "11201", + "11202", + "11203", + "11204", + "11205", + "11206", + "11207", + "11208", + "11209", + "11210", + "11211", + "11212", + "11213", + "11214", + "11215", + "11216", + "11217", + "11218", + "11219", + "11220", + "11221", + "11222", + "11223", + "11224", + "11225", + "11226", + "11227", + "11228", + "11229", + "11230", + "11231", + "11232", + "11233", + "11234" + ] } ] diff --git a/assets/data/stickers.json b/assets/data/stickers.json index 37f75d5c..5618e5bd 100644 --- a/assets/data/stickers.json +++ b/assets/data/stickers.json @@ -104388,5 +104388,595 @@ "effect": "GOLD", "collection": null, "tournament": "IEM Cologne 2026" + }, + { + "id": "11174", + "name": "NiKo (Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11174.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11175", + "name": "NiKo (Foil, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11175.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11176", + "name": "NiKo (Holo, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11176.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11177", + "name": "NiKo (Gold, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11177.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11178", + "name": "kyxsan (Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11178.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11179", + "name": "kyxsan (Foil, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11179.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11180", + "name": "kyxsan (Holo, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11180.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11181", + "name": "kyxsan (Gold, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11181.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11182", + "name": "m0NESY (Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11182.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11183", + "name": "m0NESY (Foil, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11183.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11184", + "name": "m0NESY (Holo, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11184.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11185", + "name": "m0NESY (Gold, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11185.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11186", + "name": "TeSeS (Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11186.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11187", + "name": "TeSeS (Foil, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11187.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11188", + "name": "TeSeS (Holo, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11188.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11189", + "name": "TeSeS (Gold, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11189.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11190", + "name": "kyousuke (Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11190.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11191", + "name": "kyousuke (Foil, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11191.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11192", + "name": "kyousuke (Holo, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11192.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11193", + "name": "kyousuke (Gold, Champion) | Cologne 2026", + "stickerImage": "assets/stickers/11193.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11196", + "name": "Airhorn", + "stickerImage": "assets/stickers/11196.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11197", + "name": "Assterisk", + "stickerImage": "assets/stickers/11197.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11198", + "name": "Big Red Rocket", + "stickerImage": "assets/stickers/11198.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11199", + "name": "Boner Snap", + "stickerImage": "assets/stickers/11199.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11200", + "name": "Censored", + "stickerImage": "assets/stickers/11200.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11201", + "name": "Explosives", + "stickerImage": "assets/stickers/11201.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11202", + "name": "Golf Cart", + "stickerImage": "assets/stickers/11202.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11203", + "name": "Gonna Leave A Mark", + "stickerImage": "assets/stickers/11203.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11204", + "name": "Head In Hands", + "stickerImage": "assets/stickers/11204.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11205", + "name": "High Five!", + "stickerImage": "assets/stickers/11205.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11206", + "name": "Jackass", + "stickerImage": "assets/stickers/11206.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11207", + "name": "Partyboy", + "stickerImage": "assets/stickers/11207.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11208", + "name": "Radiograph", + "stickerImage": "assets/stickers/11208.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11209", + "name": "Rocket Skates", + "stickerImage": "assets/stickers/11209.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11210", + "name": "Skull Bunny", + "stickerImage": "assets/stickers/11210.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11211", + "name": "The Magic Trick", + "stickerImage": "assets/stickers/11211.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11212", + "name": "WARNING", + "stickerImage": "assets/stickers/11212.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11213", + "name": "ZZZAP!", + "stickerImage": "assets/stickers/11213.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": null + }, + { + "id": "11214", + "name": "Airhorn (Glitter)", + "stickerImage": "assets/stickers/11214.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "GLITTER", + "collection": null, + "tournament": null + }, + { + "id": "11215", + "name": "Assterisk (Glitter)", + "stickerImage": "assets/stickers/11215.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "GLITTER", + "collection": null, + "tournament": null + }, + { + "id": "11216", + "name": "Big Red Rocket (Glitter)", + "stickerImage": "assets/stickers/11216.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "GLITTER", + "collection": null, + "tournament": null + }, + { + "id": "11217", + "name": "Head In Hands (Glitter)", + "stickerImage": "assets/stickers/11217.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "GLITTER", + "collection": null, + "tournament": null + }, + { + "id": "11218", + "name": "High Five! (Glitter)", + "stickerImage": "assets/stickers/11218.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "GLITTER", + "collection": null, + "tournament": null + }, + { + "id": "11219", + "name": "Skull Bunny (Glitter)", + "stickerImage": "assets/stickers/11219.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "GLITTER", + "collection": null, + "tournament": null + }, + { + "id": "11220", + "name": "The Magic Trick (Glitter)", + "stickerImage": "assets/stickers/11220.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "GLITTER", + "collection": null, + "tournament": null + }, + { + "id": "11221", + "name": "Boner Snap (Holo)", + "stickerImage": "assets/stickers/11221.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": null + }, + { + "id": "11222", + "name": "Jackass (Holo)", + "stickerImage": "assets/stickers/11222.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": null + }, + { + "id": "11223", + "name": "Gonna Leave A Mark (Holo)", + "stickerImage": "assets/stickers/11223.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": null + }, + { + "id": "11224", + "name": "Partyboy (Lenticular)", + "stickerImage": "assets/stickers/11224.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "LENTICULAR", + "collection": null, + "tournament": null + }, + { + "id": "11225", + "name": "Radiograph (Holo)", + "stickerImage": "assets/stickers/11225.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": null + }, + { + "id": "11226", + "name": "Rocket Skates (Holo)", + "stickerImage": "assets/stickers/11226.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": null + }, + { + "id": "11227", + "name": "ZZZAP! (Holo)", + "stickerImage": "assets/stickers/11227.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": null + }, + { + "id": "11228", + "name": "Assterisk (Foil)", + "stickerImage": "assets/stickers/11228.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": null + }, + { + "id": "11229", + "name": "Censored (Foil)", + "stickerImage": "assets/stickers/11229.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": null + }, + { + "id": "11230", + "name": "Explosives (Foil)", + "stickerImage": "assets/stickers/11230.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": null + }, + { + "id": "11231", + "name": "Radiograph (Foil)", + "stickerImage": "assets/stickers/11231.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": null + }, + { + "id": "11232", + "name": "WARNING (Foil)", + "stickerImage": "assets/stickers/11232.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": null + }, + { + "id": "11233", + "name": "Electric Avenue (Lenticular)", + "stickerImage": "assets/stickers/11233.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "LENTICULAR", + "collection": null, + "tournament": null + }, + { + "id": "11234", + "name": "Poo Cocktail Supreme (Lenticular)", + "stickerImage": "assets/stickers/11234.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "LENTICULAR", + "collection": null, + "tournament": null } ] diff --git a/assets/stickers/11174.webp b/assets/stickers/11174.webp new file mode 100644 index 00000000..998d4e40 Binary files /dev/null and b/assets/stickers/11174.webp differ diff --git a/assets/stickers/11175.webp b/assets/stickers/11175.webp new file mode 100644 index 00000000..586c5e75 Binary files /dev/null and b/assets/stickers/11175.webp differ diff --git a/assets/stickers/11176.webp b/assets/stickers/11176.webp new file mode 100644 index 00000000..9436ee88 Binary files /dev/null and b/assets/stickers/11176.webp differ diff --git a/assets/stickers/11177.webp b/assets/stickers/11177.webp new file mode 100644 index 00000000..f0879497 Binary files /dev/null and b/assets/stickers/11177.webp differ diff --git a/assets/stickers/11178.webp b/assets/stickers/11178.webp new file mode 100644 index 00000000..e694bcce Binary files /dev/null and b/assets/stickers/11178.webp differ diff --git a/assets/stickers/11179.webp b/assets/stickers/11179.webp new file mode 100644 index 00000000..be6e5189 Binary files /dev/null and b/assets/stickers/11179.webp differ diff --git a/assets/stickers/11180.webp b/assets/stickers/11180.webp new file mode 100644 index 00000000..568ae0d3 Binary files /dev/null and b/assets/stickers/11180.webp differ diff --git a/assets/stickers/11181.webp b/assets/stickers/11181.webp new file mode 100644 index 00000000..d735edb6 Binary files /dev/null and b/assets/stickers/11181.webp differ diff --git a/assets/stickers/11182.webp b/assets/stickers/11182.webp new file mode 100644 index 00000000..0662c5dd Binary files /dev/null and b/assets/stickers/11182.webp differ diff --git a/assets/stickers/11183.webp b/assets/stickers/11183.webp new file mode 100644 index 00000000..e4bebdbf Binary files /dev/null and b/assets/stickers/11183.webp differ diff --git a/assets/stickers/11184.webp b/assets/stickers/11184.webp new file mode 100644 index 00000000..b5f6bf72 Binary files /dev/null and b/assets/stickers/11184.webp differ diff --git a/assets/stickers/11185.webp b/assets/stickers/11185.webp new file mode 100644 index 00000000..ad8b4ac7 Binary files /dev/null and b/assets/stickers/11185.webp differ diff --git a/assets/stickers/11186.webp b/assets/stickers/11186.webp new file mode 100644 index 00000000..01b7cbe2 Binary files /dev/null and b/assets/stickers/11186.webp differ diff --git a/assets/stickers/11187.webp b/assets/stickers/11187.webp new file mode 100644 index 00000000..a85482ab Binary files /dev/null and b/assets/stickers/11187.webp differ diff --git a/assets/stickers/11188.webp b/assets/stickers/11188.webp new file mode 100644 index 00000000..8faa2276 Binary files /dev/null and b/assets/stickers/11188.webp differ diff --git a/assets/stickers/11189.webp b/assets/stickers/11189.webp new file mode 100644 index 00000000..1a972496 Binary files /dev/null and b/assets/stickers/11189.webp differ diff --git a/assets/stickers/11190.webp b/assets/stickers/11190.webp new file mode 100644 index 00000000..e6ecbb47 Binary files /dev/null and b/assets/stickers/11190.webp differ diff --git a/assets/stickers/11191.webp b/assets/stickers/11191.webp new file mode 100644 index 00000000..6774cb29 Binary files /dev/null and b/assets/stickers/11191.webp differ diff --git a/assets/stickers/11192.webp b/assets/stickers/11192.webp new file mode 100644 index 00000000..43ccb06d Binary files /dev/null and b/assets/stickers/11192.webp differ diff --git a/assets/stickers/11193.webp b/assets/stickers/11193.webp new file mode 100644 index 00000000..1da88935 Binary files /dev/null and b/assets/stickers/11193.webp differ diff --git a/assets/stickers/11196.webp b/assets/stickers/11196.webp new file mode 100644 index 00000000..a4abe3a6 Binary files /dev/null and b/assets/stickers/11196.webp differ diff --git a/assets/stickers/11197.webp b/assets/stickers/11197.webp new file mode 100644 index 00000000..f63f2df2 Binary files /dev/null and b/assets/stickers/11197.webp differ diff --git a/assets/stickers/11198.webp b/assets/stickers/11198.webp new file mode 100644 index 00000000..23a11838 Binary files /dev/null and b/assets/stickers/11198.webp differ diff --git a/assets/stickers/11199.webp b/assets/stickers/11199.webp new file mode 100644 index 00000000..ff9f024f Binary files /dev/null and b/assets/stickers/11199.webp differ diff --git a/assets/stickers/11200.webp b/assets/stickers/11200.webp new file mode 100644 index 00000000..7f3c56b3 Binary files /dev/null and b/assets/stickers/11200.webp differ diff --git a/assets/stickers/11201.webp b/assets/stickers/11201.webp new file mode 100644 index 00000000..5914e56b Binary files /dev/null and b/assets/stickers/11201.webp differ diff --git a/assets/stickers/11202.webp b/assets/stickers/11202.webp new file mode 100644 index 00000000..b8a5254b Binary files /dev/null and b/assets/stickers/11202.webp differ diff --git a/assets/stickers/11203.webp b/assets/stickers/11203.webp new file mode 100644 index 00000000..501767d9 Binary files /dev/null and b/assets/stickers/11203.webp differ diff --git a/assets/stickers/11204.webp b/assets/stickers/11204.webp new file mode 100644 index 00000000..f83e002f Binary files /dev/null and b/assets/stickers/11204.webp differ diff --git a/assets/stickers/11205.webp b/assets/stickers/11205.webp new file mode 100644 index 00000000..f63377ee Binary files /dev/null and b/assets/stickers/11205.webp differ diff --git a/assets/stickers/11206.webp b/assets/stickers/11206.webp new file mode 100644 index 00000000..9799fbec Binary files /dev/null and b/assets/stickers/11206.webp differ diff --git a/assets/stickers/11207.webp b/assets/stickers/11207.webp new file mode 100644 index 00000000..71b165a5 Binary files /dev/null and b/assets/stickers/11207.webp differ diff --git a/assets/stickers/11208.webp b/assets/stickers/11208.webp new file mode 100644 index 00000000..5f06f642 Binary files /dev/null and b/assets/stickers/11208.webp differ diff --git a/assets/stickers/11209.webp b/assets/stickers/11209.webp new file mode 100644 index 00000000..edc71499 Binary files /dev/null and b/assets/stickers/11209.webp differ diff --git a/assets/stickers/11210.webp b/assets/stickers/11210.webp new file mode 100644 index 00000000..18ab370f Binary files /dev/null and b/assets/stickers/11210.webp differ diff --git a/assets/stickers/11211.webp b/assets/stickers/11211.webp new file mode 100644 index 00000000..016cafc3 Binary files /dev/null and b/assets/stickers/11211.webp differ diff --git a/assets/stickers/11212.webp b/assets/stickers/11212.webp new file mode 100644 index 00000000..aa7edbac Binary files /dev/null and b/assets/stickers/11212.webp differ diff --git a/assets/stickers/11213.webp b/assets/stickers/11213.webp new file mode 100644 index 00000000..dbdcc26b Binary files /dev/null and b/assets/stickers/11213.webp differ diff --git a/assets/stickers/11214.webp b/assets/stickers/11214.webp new file mode 100644 index 00000000..1990b6a0 Binary files /dev/null and b/assets/stickers/11214.webp differ diff --git a/assets/stickers/11215.webp b/assets/stickers/11215.webp new file mode 100644 index 00000000..3c1adea5 Binary files /dev/null and b/assets/stickers/11215.webp differ diff --git a/assets/stickers/11216.webp b/assets/stickers/11216.webp new file mode 100644 index 00000000..c8fdf67c Binary files /dev/null and b/assets/stickers/11216.webp differ diff --git a/assets/stickers/11217.webp b/assets/stickers/11217.webp new file mode 100644 index 00000000..02b7df36 Binary files /dev/null and b/assets/stickers/11217.webp differ diff --git a/assets/stickers/11218.webp b/assets/stickers/11218.webp new file mode 100644 index 00000000..b09fcf1f Binary files /dev/null and b/assets/stickers/11218.webp differ diff --git a/assets/stickers/11219.webp b/assets/stickers/11219.webp new file mode 100644 index 00000000..59b35c98 Binary files /dev/null and b/assets/stickers/11219.webp differ diff --git a/assets/stickers/11220.webp b/assets/stickers/11220.webp new file mode 100644 index 00000000..31fe5df1 Binary files /dev/null and b/assets/stickers/11220.webp differ diff --git a/assets/stickers/11221.webp b/assets/stickers/11221.webp new file mode 100644 index 00000000..f87f22fe Binary files /dev/null and b/assets/stickers/11221.webp differ diff --git a/assets/stickers/11222.webp b/assets/stickers/11222.webp new file mode 100644 index 00000000..6c8d6a3b Binary files /dev/null and b/assets/stickers/11222.webp differ diff --git a/assets/stickers/11223.webp b/assets/stickers/11223.webp new file mode 100644 index 00000000..5c332ba5 Binary files /dev/null and b/assets/stickers/11223.webp differ diff --git a/assets/stickers/11224.webp b/assets/stickers/11224.webp new file mode 100644 index 00000000..5cf86f81 Binary files /dev/null and b/assets/stickers/11224.webp differ diff --git a/assets/stickers/11225.webp b/assets/stickers/11225.webp new file mode 100644 index 00000000..aac5f2b7 Binary files /dev/null and b/assets/stickers/11225.webp differ diff --git a/assets/stickers/11226.webp b/assets/stickers/11226.webp new file mode 100644 index 00000000..21205b01 Binary files /dev/null and b/assets/stickers/11226.webp differ diff --git a/assets/stickers/11227.webp b/assets/stickers/11227.webp new file mode 100644 index 00000000..92817c9c Binary files /dev/null and b/assets/stickers/11227.webp differ diff --git a/assets/stickers/11228.webp b/assets/stickers/11228.webp new file mode 100644 index 00000000..ab37a2f8 Binary files /dev/null and b/assets/stickers/11228.webp differ diff --git a/assets/stickers/11229.webp b/assets/stickers/11229.webp new file mode 100644 index 00000000..9dccc808 Binary files /dev/null and b/assets/stickers/11229.webp differ diff --git a/assets/stickers/11230.webp b/assets/stickers/11230.webp new file mode 100644 index 00000000..6d43cc8a Binary files /dev/null and b/assets/stickers/11230.webp differ diff --git a/assets/stickers/11231.webp b/assets/stickers/11231.webp new file mode 100644 index 00000000..abd275a0 Binary files /dev/null and b/assets/stickers/11231.webp differ diff --git a/assets/stickers/11232.webp b/assets/stickers/11232.webp new file mode 100644 index 00000000..4a9a47b8 Binary files /dev/null and b/assets/stickers/11232.webp differ diff --git a/assets/stickers/11233.webp b/assets/stickers/11233.webp new file mode 100644 index 00000000..c351254e Binary files /dev/null and b/assets/stickers/11233.webp differ diff --git a/assets/stickers/11234.webp b/assets/stickers/11234.webp new file mode 100644 index 00000000..67d53761 Binary files /dev/null and b/assets/stickers/11234.webp differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index edb72dda..bd308ae2 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 1fbc5177..1a162d87 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index ca9e3721..00838315 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 303cb329..a3864218 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 40feb7d1..585db57b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@2x.png index bff889f3..0e14cd69 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@3x.png index 34022cd1..5ae664ba 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index 6b4aeb0e..ebb2e5c9 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 51d58e66..bfbfc0b0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 51d58e66..bfbfc0b0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 389539df..35d7017d 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@2x.png index 3010aa30..8c710693 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@3x.png index ebe161de..6876753c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-68x68@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-68x68@2x.png index ce07d612..6ae8a179 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-68x68@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-68x68@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index afcf4ddd..3b9063d8 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 2ab2bae9..a168a0fb 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-1024x1024@1x.png index edb72dda..bd308ae2 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@2x.png index 1fbc5177..1a162d87 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@3x.png index ca9e3721..00838315 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@2x.png index 303cb329..a3864218 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@3x.png index 40feb7d1..585db57b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@2x.png index bff889f3..0e14cd69 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@3x.png index 34022cd1..5ae664ba 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@2x.png index 6b4aeb0e..ebb2e5c9 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@3x.png index 51d58e66..bfbfc0b0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@2x.png index 51d58e66..bfbfc0b0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@3x.png index 389539df..35d7017d 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@2x.png index 3010aa30..8c710693 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@3x.png index ebe161de..6876753c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-68x68@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-68x68@2x.png index ce07d612..6ae8a179 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-68x68@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-68x68@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-76x76@2x.png index afcf4ddd..3b9063d8 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-83.5x83.5@2x.png index 2ab2bae9..a168a0fb 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-1024x1024@1x.png index 5501bd41..4bd93f6d 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@2x.png index 4103744e..b8cd4605 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@3x.png index 4c49f73b..c5e4c5a4 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@2x.png index 83630a8b..5414c88e 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@3x.png index c4d10753..5f3ea328 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@2x.png index d65cb088..501fb4f5 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@3x.png index b53f0fc5..af4e0fb1 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@2x.png index 977a72ad..edb46366 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@3x.png index 84997e59..40476fe3 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@2x.png index 84997e59..40476fe3 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@3x.png index d5a23a63..d426a1bf 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@2x.png index e815a3dd..0eadfb96 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@3x.png index e0e59086..508218d3 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-68x68@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-68x68@2x.png index 8925d1da..35173fb9 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-68x68@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-68x68@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-76x76@2x.png index 6d7345ac..135394c6 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-83.5x83.5@2x.png index ea034c24..4ef28a39 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-83.5x83.5@2x.png differ diff --git a/lib/presentation/screens/my_collection_screen.dart b/lib/presentation/screens/my_collection_screen.dart index e3c17c2b..f135abe1 100644 --- a/lib/presentation/screens/my_collection_screen.dart +++ b/lib/presentation/screens/my_collection_screen.dart @@ -495,17 +495,16 @@ class _MyCollectionScreenState extends State { uniqueItems: data.summaries.length, totalCollected: totalCollected, totalAvailable: totalAvailable, - onOpenHistory: _openHistory, - onRefresh: _refresh, ), - _CollectionProgressSection(items: data.progress), - _SourceHighlightsSection( - items: data.sourceHighlights, + _CollectionInsightsPanel( + progressItems: data.progress, + sourceItems: data.sourceHighlights, onItemTap: _openSourceHighlight, ), Expanded( child: _InventoryTab( summaries: filteredSummaries, + allSummaries: data.summaries, totalCount: data.summaries.length, search: _inventorySearch, selectedCategory: _inventoryCategory, @@ -658,16 +657,12 @@ class _CollectionOverview extends StatelessWidget { final int uniqueItems; final int totalCollected; final int totalAvailable; - final VoidCallback onOpenHistory; - final VoidCallback onRefresh; const _CollectionOverview({ required this.totalEntries, required this.uniqueItems, required this.totalCollected, required this.totalAvailable, - required this.onOpenHistory, - required this.onRefresh, }); @override @@ -680,48 +675,26 @@ class _CollectionOverview extends StatelessWidget { padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), child: Card( child: Padding( - padding: const EdgeInsets.all(14), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + child: Wrap( + spacing: 10, + runSpacing: 10, children: [ - Wrap( - spacing: 12, - runSpacing: 12, - children: [ - _StatChip( - icon: Icons.inventory_2_outlined, - label: 'Collected entries', - value: '$totalEntries', - ), - _StatChip( - icon: Icons.collections_bookmark_outlined, - label: 'Unique items', - value: '$uniqueItems', - ), - _StatChip( - icon: Icons.checklist_outlined, - label: 'Overall completion', - value: - '$totalCollected / $totalAvailable (${(completion * 100).floor()}%)', - ), - ], + _StatChip( + icon: Icons.inventory_2_outlined, + label: 'Entries', + value: '$totalEntries', ), - const SizedBox(height: 12), - Wrap( - spacing: 10, - runSpacing: 10, - children: [ - OutlinedButton.icon( - onPressed: onOpenHistory, - icon: const Icon(Icons.history), - label: const Text('Recent Activity'), - ), - OutlinedButton.icon( - onPressed: onRefresh, - icon: const Icon(Icons.refresh), - label: const Text('Refresh Collection'), - ), - ], + _StatChip( + icon: Icons.collections_bookmark_outlined, + label: 'Unique', + value: '$uniqueItems', + ), + _StatChip( + icon: Icons.checklist_outlined, + label: 'Complete', + value: + '$totalCollected/$totalAvailable (${(completion * 100).floor()}%)', ), ], ), @@ -731,45 +704,130 @@ class _CollectionOverview extends StatelessWidget { } } -class _CollectionProgressSection extends StatelessWidget { - final List<_CollectionProgressItem> items; +class _CollectionInsightsPanel extends StatefulWidget { + final List<_CollectionProgressItem> progressItems; + final List<_SourceProgressItem> sourceItems; + final ValueChanged<_SourceProgressItem> onItemTap; - const _CollectionProgressSection({required this.items}); + const _CollectionInsightsPanel({ + required this.progressItems, + required this.sourceItems, + required this.onItemTap, + }); + + @override + State<_CollectionInsightsPanel> createState() => + _CollectionInsightsPanelState(); +} + +class _CollectionInsightsPanelState extends State<_CollectionInsightsPanel> { + bool _expanded = false; @override Widget build(BuildContext context) { - if (items.isEmpty) { + if (widget.progressItems.isEmpty && widget.sourceItems.isEmpty) { return const SizedBox.shrink(); } + final progressCount = widget.progressItems.length; + final sourceCount = widget.sourceItems.length; + return Padding( - padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), + padding: const EdgeInsets.fromLTRB(12, 8, 12, 0), child: Card( - child: Padding( - padding: const EdgeInsets.all(14), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Collection Progress', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700), + child: Column( + children: [ + InkWell( + borderRadius: BorderRadius.circular(8), + onTap: () { + setState(() { + _expanded = !_expanded; + }); + }, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 10, + ), + child: Row( + children: [ + const Icon(Icons.insights_outlined, size: 20), + const SizedBox(width: 10), + Expanded( + child: Text( + sourceCount == 0 + ? 'Progress by category' + : 'Progress by category and source', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontWeight: FontWeight.w700), + ), + ), + Text( + '$progressCount groups' + '${sourceCount == 0 ? '' : ' • $sourceCount sources'}', + style: const TextStyle( + color: Colors.white60, + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(width: 6), + Icon( + _expanded ? Icons.expand_less : Icons.expand_more, + color: Colors.white70, + ), + ], + ), ), - const SizedBox(height: 12), - Wrap( - spacing: 10, - runSpacing: 10, - children: items - .map((item) => _ProgressTile(item: item)) - .toList(), + ), + if (_expanded) ...[ + const Divider(height: 1), + _CollectionProgressSection(items: widget.progressItems), + _SourceHighlightsSection( + items: widget.sourceItems, + onItemTap: widget.onItemTap, ), ], - ), + ], ), ), ); } } +class _CollectionProgressSection extends StatelessWidget { + final List<_CollectionProgressItem> items; + + const _CollectionProgressSection({required this.items}); + + @override + Widget build(BuildContext context) { + if (items.isEmpty) { + return const SizedBox.shrink(); + } + + return Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Collection Progress', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700), + ), + const SizedBox(height: 12), + Wrap( + spacing: 10, + runSpacing: 10, + children: items.map((item) => _ProgressTile(item: item)).toList(), + ), + ], + ), + ); + } +} + class _SourceHighlightsSection extends StatelessWidget { final List<_SourceProgressItem> items; final ValueChanged<_SourceProgressItem> onItemTap; @@ -786,35 +844,30 @@ class _SourceHighlightsSection extends StatelessWidget { } return Padding( - padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), - child: Card( - child: Padding( - padding: const EdgeInsets.all(14), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Best Source Progress', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700), - ), - const SizedBox(height: 4), - const Text( - 'Your most completed containers and collection sources.', - style: TextStyle(color: Colors.white70, fontSize: 12), - ), - const SizedBox(height: 12), - ...items.map( - (item) => Padding( - padding: const EdgeInsets.only(bottom: 10), - child: _SourceHighlightTile( - item: item, - onTap: () => onItemTap(item), - ), - ), + padding: const EdgeInsets.fromLTRB(12, 0, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Best Source Progress', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700), + ), + const SizedBox(height: 4), + const Text( + 'Your most completed containers and collection sources.', + style: TextStyle(color: Colors.white70, fontSize: 12), + ), + const SizedBox(height: 12), + ...items.map( + (item) => Padding( + padding: const EdgeInsets.only(bottom: 10), + child: _SourceHighlightTile( + item: item, + onTap: () => onItemTap(item), ), - ], + ), ), - ), + ], ), ); } @@ -1067,8 +1120,9 @@ class _SecondaryScreenHint extends StatelessWidget { } } -class _InventoryTab extends StatelessWidget { +class _InventoryTab extends StatefulWidget { final List summaries; + final List allSummaries; final int totalCount; final String search; final String selectedCategory; @@ -1084,6 +1138,7 @@ class _InventoryTab extends StatelessWidget { const _InventoryTab({ required this.summaries, + required this.allSummaries, required this.totalCount, required this.search, required this.selectedCategory, @@ -1098,15 +1153,50 @@ class _InventoryTab extends StatelessWidget { required this.onItemTap, }); + @override + State<_InventoryTab> createState() => _InventoryTabState(); +} + +class _InventoryTabState extends State<_InventoryTab> { + late final TextEditingController _searchController; + bool _filtersExpanded = false; + + @override + void initState() { + super.initState(); + _searchController = TextEditingController(text: widget.search); + } + + @override + void didUpdateWidget(covariant _InventoryTab oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.search != _searchController.text) { + _searchController.text = widget.search; + } + } + + @override + void dispose() { + _searchController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { final categoryValues = - summaries.map((item) => item.filterCategory).toSet().toList()..sort(); - final rarityValues = summaries.map((item) => item.rarity).toSet().toList() - ..sort(); + widget.allSummaries.map((item) => item.filterCategory).toSet().toList() + ..sort(); + final rarityValues = + widget.allSummaries.map((item) => item.rarity).toSet().toList()..sort(); final categoryOptions = ['ALL', ...categoryValues]; final rarityOptions = ['ALL', ...rarityValues]; + final activeFilterCount = [ + widget.selectedCategory != 'ALL', + widget.selectedRarity != 'ALL', + widget.selectedStatTrak != 'ALL', + widget.selectedSort != 'LATEST', + ].where((active) => active).length; return CustomScrollView( slivers: [ @@ -1126,151 +1216,197 @@ class _InventoryTab extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextFormField( - initialValue: search, - decoration: const InputDecoration( - hintText: 'Search your collection...', - prefixIcon: Icon(Icons.search), - isDense: true, - ), - onChanged: onSearchChanged, - ), - const SizedBox(height: 10), - Wrap( - spacing: 10, - runSpacing: 10, + Row( children: [ - SizedBox( - width: fieldWidth, - child: DropdownButtonFormField( - initialValue: selectedCategory, - decoration: const InputDecoration( - labelText: 'Category', - isDense: true, - ), - items: categoryOptions - .map( - (option) => DropdownMenuItem( - value: option, - child: Text( - option == 'ALL' - ? 'All' - : _categoryLabelFor(option), + Expanded( + child: TextField( + controller: _searchController, + decoration: InputDecoration( + hintText: 'Search your collection...', + prefixIcon: const Icon(Icons.search), + suffixIcon: widget.search.isEmpty + ? null + : IconButton( + tooltip: 'Clear', + onPressed: () { + _searchController.clear(); + widget.onSearchChanged(''); + }, + icon: const Icon(Icons.clear), ), - ), - ) - .toList(), - onChanged: (value) { - if (value != null) { - onCategoryChanged(value); - } - }, - ), - ), - SizedBox( - width: fieldWidth, - child: DropdownButtonFormField( - initialValue: selectedRarity, - decoration: const InputDecoration( - labelText: 'Rarity', isDense: true, ), - items: rarityOptions - .map( - (option) => DropdownMenuItem( - value: option, - child: Text( - option == 'ALL' - ? 'All' - : _rarityLabel(option), - ), - ), - ) - .toList(), - onChanged: (value) { - if (value != null) { - onRarityChanged(value); - } - }, + onChanged: widget.onSearchChanged, ), ), - SizedBox( - width: fieldWidth, - child: DropdownButtonFormField( - initialValue: selectedStatTrak, - decoration: const InputDecoration( - labelText: 'StatTrak', - isDense: true, + const SizedBox(width: 8), + IconButton.filledTonal( + tooltip: 'Filters', + onPressed: () { + setState(() { + _filtersExpanded = !_filtersExpanded; + }); + }, + icon: Badge.count( + count: activeFilterCount, + isLabelVisible: activeFilterCount > 0, + child: Icon( + _filtersExpanded + ? Icons.tune + : Icons.tune_outlined, ), - items: const [ - DropdownMenuItem( - value: 'ALL', - child: Text('All'), - ), - DropdownMenuItem( - value: 'ONLY', - child: Text('Only StatTrak'), - ), - DropdownMenuItem( - value: 'NONE', - child: Text('No StatTrak'), - ), - ], - onChanged: (value) { - if (value != null) { - onStatTrakChanged(value); - } - }, ), ), ], ), - const SizedBox(height: 10), + const SizedBox(height: 8), Row( children: [ Expanded( - child: DropdownButtonFormField( - initialValue: selectedSort, - decoration: const InputDecoration( - labelText: 'Sort by', - isDense: true, + child: Text( + '${widget.summaries.length} / ${widget.totalCount} items', + style: const TextStyle( + color: Colors.white60, + fontSize: 12, + fontWeight: FontWeight.w600, ), - items: const [ - DropdownMenuItem( - value: 'LATEST', - child: Text('Latest'), - ), - DropdownMenuItem( - value: 'MOST_OWNED', - child: Text('Most collected'), + ), + ), + if (activeFilterCount > 0) + Text( + '$activeFilterCount active filter' + '${activeFilterCount == 1 ? '' : 's'}', + style: const TextStyle( + color: Colors.white60, + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + if (_filtersExpanded) ...[ + const SizedBox(height: 10), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + SizedBox( + width: fieldWidth, + child: DropdownButtonFormField( + initialValue: widget.selectedCategory, + decoration: const InputDecoration( + labelText: 'Category', + isDense: true, ), - DropdownMenuItem( - value: 'BEST_FLOAT', - child: Text('Best float'), + items: categoryOptions + .map( + (option) => DropdownMenuItem( + value: option, + child: Text( + option == 'ALL' + ? 'All' + : _categoryLabelFor(option), + ), + ), + ) + .toList(), + onChanged: (value) { + if (value != null) { + widget.onCategoryChanged(value); + } + }, + ), + ), + SizedBox( + width: fieldWidth, + child: DropdownButtonFormField( + initialValue: widget.selectedRarity, + decoration: const InputDecoration( + labelText: 'Rarity', + isDense: true, ), - DropdownMenuItem( - value: 'A_Z', - child: Text('Name A-Z'), + items: rarityOptions + .map( + (option) => DropdownMenuItem( + value: option, + child: Text( + option == 'ALL' + ? 'All' + : _rarityLabel(option), + ), + ), + ) + .toList(), + onChanged: (value) { + if (value != null) { + widget.onRarityChanged(value); + } + }, + ), + ), + SizedBox( + width: fieldWidth, + child: DropdownButtonFormField( + initialValue: widget.selectedStatTrak, + decoration: const InputDecoration( + labelText: 'StatTrak', + isDense: true, ), - ], - onChanged: (value) { - if (value != null) { - onSortChanged(value); - } - }, + items: const [ + DropdownMenuItem( + value: 'ALL', + child: Text('All'), + ), + DropdownMenuItem( + value: 'ONLY', + child: Text('Only StatTrak'), + ), + DropdownMenuItem( + value: 'NONE', + child: Text('No StatTrak'), + ), + ], + onChanged: (value) { + if (value != null) { + widget.onStatTrakChanged(value); + } + }, + ), ), + ], + ), + const SizedBox(height: 10), + DropdownButtonFormField( + initialValue: widget.selectedSort, + decoration: const InputDecoration( + labelText: 'Sort by', + isDense: true, ), - const SizedBox(width: 12), - Text( - '${summaries.length} / $totalCount', - style: const TextStyle( - color: Colors.white54, - fontSize: 12, - fontWeight: FontWeight.w600, + items: const [ + DropdownMenuItem( + value: 'LATEST', + child: Text('Latest'), ), - ), - ], - ), + DropdownMenuItem( + value: 'MOST_OWNED', + child: Text('Most collected'), + ), + DropdownMenuItem( + value: 'BEST_FLOAT', + child: Text('Best float'), + ), + DropdownMenuItem( + value: 'A_Z', + child: Text('Name A-Z'), + ), + ], + onChanged: (value) { + if (value != null) { + widget.onSortChanged(value); + } + }, + ), + ], ], ); }, @@ -1279,7 +1415,7 @@ class _InventoryTab extends StatelessWidget { ), ), ), - if (summaries.isEmpty) + if (widget.summaries.isEmpty) const SliverFillRemaining( hasScrollBody: false, child: _EmptyCollectionState( @@ -1297,10 +1433,11 @@ class _InventoryTab extends StatelessWidget { (context, index) => index.isOdd ? const SizedBox(height: 10) : _InventoryCard( - summary: summaries[index ~/ 2], - onTap: () => onItemTap(summaries[index ~/ 2]), + summary: widget.summaries[index ~/ 2], + onTap: () => + widget.onItemTap(widget.summaries[index ~/ 2]), ), - childCount: summaries.length * 2 - 1, + childCount: widget.summaries.length * 2 - 1, ), ), ), diff --git a/lib/presentation/widgets/generic_glossary_screen.dart b/lib/presentation/widgets/generic_glossary_screen.dart index 0c88baec..59a65b63 100644 --- a/lib/presentation/widgets/generic_glossary_screen.dart +++ b/lib/presentation/widgets/generic_glossary_screen.dart @@ -38,6 +38,7 @@ class GenericGlossaryScreen extends StatefulWidget { } class _GenericGlossaryScreenState extends State> { + late final Future<_GenericGlossaryData> _future; final TextEditingController _searchController = TextEditingController(); final CollectionTrackingService _collectionTracking = CollectionTrackingService(); @@ -46,6 +47,7 @@ class _GenericGlossaryScreenState extends State> { @override void initState() { super.initState(); + _future = _loadData(); _searchController.addListener(() { setState(() { _query = _searchController.text.trim().toLowerCase(); @@ -64,7 +66,7 @@ class _GenericGlossaryScreenState extends State> { return Scaffold( appBar: AppBar(title: Text(widget.title)), body: FutureBuilder<_GenericGlossaryData>( - future: _loadData(), + future: _future, builder: (context, snapshot) { if (snapshot.connectionState != ConnectionState.done) { return const Center(child: CircularProgressIndicator()); diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png index edb72dda..bd308ae2 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png index 3010aa30..8c710693 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png index 6e0ade97..5289b209 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png index fd825208..f878f662 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png index 5ddb4d10..4c62ded7 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png index ddbdba6e..f1f48729 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png index 8db08ac1..bfc0af0c 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/tool/importer/src/config.dart b/tool/importer/src/config.dart index d2e45315..a382d148 100644 --- a/tool/importer/src/config.dart +++ b/tool/importer/src/config.dart @@ -761,6 +761,7 @@ const containerReleaseDateOverrides = { 'Warhammer 40,000 Imperium Sticker Capsule': '2025-05-22', 'Warhammer 40,000 Traitor Astartes Sticker Capsule': '2025-05-22', 'Warhammer 40,000 Xenos Sticker Capsule': '2025-05-22', + 'Jackass Sticker Capsule': '2026-07-03', 'Collectible Pins Capsule Series 1': '2016-06-01', 'Collectible Pins Capsule Series 2': '2016-09-28', 'Collectible Pins Capsule Series 3': '2018-03-01', diff --git a/tool/importer/src/dart_backend.dart b/tool/importer/src/dart_backend.dart index 29b5b0b4..e45041f0 100644 --- a/tool/importer/src/dart_backend.dart +++ b/tool/importer/src/dart_backend.dart @@ -386,6 +386,7 @@ class DartImporterBackend implements ImporterBackend { relativeDir: 'assets/containers', id: containerId, existingRelativePath: existingCase?['containerImage']?.toString(), + refreshWhenNoExisting: true, ); final patchCollectionSource = containerType == 'PATCH_COLLECTION' ? resolvePatchCollectionSource(crateName) @@ -810,6 +811,7 @@ class DartImporterBackend implements ImporterBackend { id: containerId, existingRelativePath: existingCaseMeta?['containerImage'] ?.toString(), + refreshWhenNoExisting: true, ); newCases[containerId] = { 'id': containerId, @@ -961,6 +963,7 @@ class DartImporterBackend implements ImporterBackend { id: containerId, existingRelativePath: existingCaseMeta?['containerImage'] ?.toString(), + refreshWhenNoExisting: true, ); newCases[containerId] = { 'id': containerId, @@ -2412,12 +2415,33 @@ class DartImporterBackend implements ImporterBackend { required String id, String? existingRelativePath, CompressionMode? compressionModeOverride, + bool refreshWhenNoExisting = false, }) async { final existing = (existingRelativePath ?? '').trim(); if (existing.isNotEmpty && File(existing).existsSync()) { return existing; } + if (refreshWhenNoExisting && existing.isEmpty) { + if (imageUrl != null && imageUrl.isNotEmpty) { + for (final ext in ['.webp', '.png', '.jpg', '.svg']) { + final file = File('$dirPath/$id$ext'); + if (file.existsSync()) { + await file.delete(); + } + } + + final ext = await _io.downloadOptimizedAsset( + imageUrl, + '$dirPath/$id', + compressionModeOverride: compressionModeOverride, + ); + if (ext != null) { + return '$relativeDir/$id$ext'; + } + } + } + for (final ext in ['.webp', '.png', '.jpg', '.svg']) { final file = File('$dirPath/$id$ext'); if (file.existsSync()) { diff --git a/tool/importer/src/io_utils.dart b/tool/importer/src/io_utils.dart index da90bbfa..6b48af5e 100644 --- a/tool/importer/src/io_utils.dart +++ b/tool/importer/src/io_utils.dart @@ -270,7 +270,7 @@ class IoUtils { try { await inputFile.writeAsBytes(bytes); await webpFile.parent.create(recursive: true); - final result = await Process.run(cwebpPath, [ + final process = await Process.start(cwebpPath, [ '-lossless', '-z', (compressionModeOverride ?? compressionMode) == @@ -283,11 +283,21 @@ class IoUtils { '-o', webpFile.path, ]); - if (result.exitCode == 0 && webpFile.existsSync()) { + final stderrOutput = StringBuffer(); + process.stderr.transform(utf8.decoder).listen(stderrOutput.write); + process.stdout.drain(); + final exitCode = await process.exitCode.timeout( + const Duration(seconds: 15), + onTimeout: () { + process.kill(); + return -1; + }, + ); + if (exitCode == 0 && webpFile.existsSync()) { return '.webp'; } stderr.writeln( - '[WARN] cwebp failed for $url -> $pathWithoutExt: ${result.stderr}', + '[WARN] cwebp failed for $url -> $pathWithoutExt: $stderrOutput', ); } finally { if (inputFile.existsSync()) { diff --git a/web/favicon.png b/web/favicon.png index 6e0ade97..5289b209 100644 Binary files a/web/favicon.png and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png index ebe161de..6876753c 100644 Binary files a/web/icons/Icon-192.png and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png index ddbdba6e..f1f48729 100644 Binary files a/web/icons/Icon-512.png and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png index ebe161de..6876753c 100644 Binary files a/web/icons/Icon-maskable-192.png and b/web/icons/Icon-maskable-192.png differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png index ddbdba6e..f1f48729 100644 Binary files a/web/icons/Icon-maskable-512.png and b/web/icons/Icon-maskable-512.png differ diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index cbe93d37..7c1dd530 100644 Binary files a/windows/runner/resources/app_icon.ico and b/windows/runner/resources/app_icon.ico differ