From fffed80faabbd11d33ca752d24e8a998972fb6b0 Mon Sep 17 00:00:00 2001 From: Pihkaal Date: Tue, 20 Jan 2026 19:18:12 +0100 Subject: [PATCH] feat(achievements): implement achievements screen --- app/components/Achievements/BottomScreen.vue | 91 +++++++++++++ .../Notification.vue} | 4 +- app/components/Achievements/TopScreen.vue | 123 +++++++++++++++++ app/components/Home/BottomScreen/Buttons.vue | 20 +-- app/pages/index.vue | 3 +- app/stores/achievementsScreen.ts | 124 ++++++++++++++++++ app/types/app.d.ts | 8 +- app/utils/achievements.ts | 30 +++++ i18n/locales/en.json | 3 + .../notification-logo.webp} | Bin public/nds/images/achievements/quit.webp | Bin 0 -> 172 bytes .../bottom-screen/buttons/achievements.webp | Bin 0 -> 64 bytes .../home/bottom-screen/buttons/alarm.webp | Bin 66 -> 0 bytes 13 files changed, 394 insertions(+), 12 deletions(-) create mode 100644 app/components/Achievements/BottomScreen.vue rename app/components/{Common/AchievementNotification.vue => Achievements/Notification.vue} (94%) create mode 100644 app/components/Achievements/TopScreen.vue create mode 100644 app/stores/achievementsScreen.ts create mode 100644 app/utils/achievements.ts rename public/nds/images/{common/achievement-notification-logo.webp => achievements/notification-logo.webp} (100%) create mode 100644 public/nds/images/achievements/quit.webp create mode 100644 public/nds/images/home/bottom-screen/buttons/achievements.webp delete mode 100644 public/nds/images/home/bottom-screen/buttons/alarm.webp diff --git a/app/components/Achievements/BottomScreen.vue b/app/components/Achievements/BottomScreen.vue new file mode 100644 index 0000000..00ba1bd --- /dev/null +++ b/app/components/Achievements/BottomScreen.vue @@ -0,0 +1,91 @@ + diff --git a/app/components/Common/AchievementNotification.vue b/app/components/Achievements/Notification.vue similarity index 94% rename from app/components/Common/AchievementNotification.vue rename to app/components/Achievements/Notification.vue index 978abda..0e4e1f0 100644 --- a/app/components/Common/AchievementNotification.vue +++ b/app/components/Achievements/Notification.vue @@ -12,7 +12,7 @@ const x = ref(LOGICAL_WIDTH); const isAnimating = ref(false); const PADDING = 4; -const LOGO_SIZE = assets.images.common.achievementNotificationLogo.rect.height; +const LOGO_SIZE = assets.images.achievements.notificationLogo.rect.height; const NOTIF_WIDTH = 120; const NOTIF_HEIGHT = LOGO_SIZE + PADDING * 2; const NOTIF_Y = 3; @@ -66,7 +66,7 @@ const processQueue = () => { onRender((ctx) => { if (!currentAchievement.value) return; - const logo = assets.images.common.achievementNotificationLogo; + const logo = assets.images.achievements.notificationLogo; // shadow ctx.fillStyle = "rgba(0, 0, 0, 0.3)"; diff --git a/app/components/Achievements/TopScreen.vue b/app/components/Achievements/TopScreen.vue new file mode 100644 index 0000000..a61e728 --- /dev/null +++ b/app/components/Achievements/TopScreen.vue @@ -0,0 +1,123 @@ + diff --git a/app/components/Home/BottomScreen/Buttons.vue b/app/components/Home/BottomScreen/Buttons.vue index 3ff28fd..161ea30 100644 --- a/app/components/Home/BottomScreen/Buttons.vue +++ b/app/components/Home/BottomScreen/Buttons.vue @@ -15,12 +15,16 @@ const { selected, selectorPosition } = useButtonNavigation({ theme: [0, 167, 31, 26], settings: [112, 167, 31, 26], - alarm: [225, 167, 31, 26], + achievements: [225, 167, 31, 26], }, initialButton: "projects", onButtonClick: (button) => { - if (button === "theme" || button === "alarm") - throw new Error(`Not implemented: ${button}`); + if (button === "theme") throw new Error(`Not implemented: ${button}`); + + if (button === "achievements") { + store.animateOutro("achievements"); + return; + } store.animateOutro(button); }, @@ -47,9 +51,9 @@ const { selected, selectorPosition } = useButtonNavigation({ settings: { left: "theme", up: "last", - right: "alarm", + right: "achievements", }, - alarm: { + achievements: { left: "settings", }, }, @@ -168,9 +172,9 @@ onRender((ctx) => { />