Part of #796 — Gamify: editor half. Depends on E-P1. Pairs with qtmesh-cloud#80/#85.
Goal
Show the user their progress inside the editor, so discovery and streaks are felt in-context — not only when they visit the website.
Surface
- In the existing
CloudAccountMenuButton popover (and optionally WelcomeScreenController): a compact status block — level + XP ring, current streak (flame + "N-day streak"), and 1–2 nearest unlockable achievements (closest locked, non-hidden, with a small progress bar).
- On unlocking during a session (from the flush response, E-P1): one restrained toast, themed via
ThemeManager, dismissible, prefers-reduced-motion-safe. Never more than one at a time — queue and coalesce.
- "See all achievements" → opens
/u/:userSlug via CloudDeepLink.
Data
GET /v1/me/stats on login and on a periodic/refresh trigger; cache locally so the surface renders instantly and works offline (shows last-known).
Acceptance criteria
Part of #796 — Gamify: editor half. Depends on E-P1. Pairs with qtmesh-cloud#80/#85.
Goal
Show the user their progress inside the editor, so discovery and streaks are felt in-context — not only when they visit the website.
Surface
CloudAccountMenuButtonpopover (and optionallyWelcomeScreenController): a compact status block — level + XP ring, current streak (flame + "N-day streak"), and 1–2 nearest unlockable achievements (closest locked, non-hidden, with a small progress bar).ThemeManager, dismissible,prefers-reduced-motion-safe. Never more than one at a time — queue and coalesce./u/:userSlugviaCloudDeepLink.Data
GET /v1/me/statson login and on a periodic/refresh trigger; cache locally so the surface renders instantly and works offline (shows last-known).Acceptance criteria