From 1e06ee34f2be6015fa6b02d06dfd257a258285a1 Mon Sep 17 00:00:00 2001 From: Hugo Montenegro Date: Sat, 11 Apr 2026 09:57:39 +0100 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20v4=20polish=20=E2=80=94=20mobile=20n?= =?UTF-8?q?avbar,=20icons,=20modals,=20semantic=20unlimited?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Post-squash-merge fixes on top of the v4 feature branch: - Mobile header: hide profile+settings below sm (sidebar-only) - Trophy → BarChart2 for game results toggle - Sidebar statistics → ChartNoAxesCombined icon - Streak badge opens modal on all pages (not just game pages) - StreakModal: sign-in CTA, shared StreakCalendar component - SettingsModal: use login modal instead of direct Google auth - Profile: remove passkey button, scroll to #badges hash - Homepage: remove misleading per-card streak - Semantic: unlimited mode (random target), Keep Playing/Play Again - Semantic: daily revisit auto-opens modal, fix map clipping - Page keys include play type for proper remount - "Unlimited" accent color in header subtitle --- .github/workflows/test.yml | 9 + CONTRIBUTING.md | 1 + components/app/AppHeader.vue | 19 +- components/app/AppShell.vue | 6 +- components/app/AppSidebar.vue | 6 +- components/app/SidebarItem.vue | 2 + components/game/SettingsModal.vue | 15 +- components/game/StreakModal.vue | 218 ++-------------- components/semantic/SemanticStatsModal.vue | 53 ++-- components/shared/StreakCalendar.vue | 280 +++++++++++++++++++++ composables/useSemanticGame.ts | 5 +- nuxt.config.ts | 7 + package.json | 2 +- pages/[lang]/semantic.vue | 24 +- pages/[lang]/speed.vue | 2 +- pages/index.vue | 17 +- pages/profile.vue | 234 ++--------------- server/api/[lang]/semantic/start.post.ts | 5 +- server/utils/prisma.ts | 3 + tests/setup-server.ts | 18 +- utils/streak-dates.ts | 20 +- 21 files changed, 466 insertions(+), 480 deletions(-) create mode 100644 components/shared/StreakCalendar.vue diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c3c6cc7c..6baa627a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -80,6 +80,9 @@ jobs: - name: Install dependencies run: pnpm install + - name: Generate Prisma client + run: pnpm db:generate + - name: Build Nuxt (pre-compiled server avoids 50s+ Nitro JIT) run: pnpm build @@ -106,6 +109,9 @@ jobs: - name: Install dependencies run: pnpm install + - name: Generate Prisma client + run: pnpm db:generate + - name: Build Nuxt run: pnpm build @@ -142,5 +148,8 @@ jobs: - name: Install dependencies run: pnpm install + - name: Generate Prisma client + run: pnpm db:generate + - name: Build run: pnpm build diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8181a4e8..74e57126 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -172,6 +172,7 @@ All SEO content (FAQ, HowTo, tips, value props, section headings) lives in the ` ## Don't +- **NEVER push to `main` without explicit user permission.** `main` auto-deploys to production on Render. Every push causes a multi-minute 502 outage for hundreds of active users. Work on feature branches; the user decides when to merge. - Change the daily word algorithm — breaks word selection globally - Add console.logs to production code - Modify `.nuxt/` or `.output/` manually (auto-generated) diff --git a/components/app/AppHeader.vue b/components/app/AppHeader.vue index abbaa5b6..a688d038 100644 --- a/components/app/AppHeader.vue +++ b/components/app/AppHeader.vue @@ -64,7 +64,11 @@ border: 1px solid rgba(0, 0, 0, 0.1); " /> - {{ subtitle }} + + @@ -84,13 +88,14 @@ aria-label="Game results" @click="$emit('results')" > -