Replace level-up text modal with confetti glass popover (L2+) #508
No reviewers
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:open_issues
agents
agent:security_audit
agent:verify
area
timecurve
arena
arena-v2
audit
block:feature_review
block:security
bug
contracts
design
devops
docs
documentation
enhancement
epic
feature
frontend
indexer
low priority
megaeth
operations
ops
performance
QA
qa checklist
referrals
removal
security
smart-contracts
tech-debt
testing
time-arena
timecurve
visual-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
code/yieldomega!508
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-335-level-up-celebration-popover"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Replaces the auto-triggered level-up text modal with a glass confetti popover for Level 2+ unlocks on play
/(#335).LevelUpCelebrationPopover— cyberminimalist glass panel, subtlecanvas-confettiburst (≤2s), headline Level Up, concise unlock line (≤80 chars).useArenaLevelUpCelebration+detectUnseenLevelUpFeaturewire auto-open fromArenaSimplePagefor L2–L5 only; L1 / wallet connect alone does not celebrate.FeatureMechanicModalunchanged for explicit?help (full mechanic copy preserved).markFeatureTutorialSeen/ localStorage keys unchanged — repeats do not spam.prefers-reduced-motion: confetti omitted; popover remains.INV-FRONTEND-335-LEVEL-UP-CELEBRATION, arena-views §335.Acceptance checklist
data-testid="level-up-celebration"visibledetectUnseenLevelUpFeature(undefined, 1)+arenaLevelUpCelebration.test.tsLevelUpCelebrationPopover.test.tsx(data-reduced-motion="true", no confetti canvas)GlassPanel+.level-up-celebration__*CSS tokens; screenshots belowcd frontend && npm run typecheck && npm run lint && npm testThird-party verification
git checkout issue-335-level-up-celebration-popoverbash scripts/start-local-anvil-stack.sh --no-frontend(or full QA stack)cd frontend && ANVIL_E2E=1 VITE_E2E_MOCK_WALLET=1 npm run build && npm run preview -- --host 127.0.0.1 --port 4173cd frontend && node scripts/capture-level-up-celebration-screenshots.mjs— writes PNGs under/tmp/yieldomega-level-up-screenshots-335/cd frontend && npm run typecheck && npm run lint && npm testANVIL_E2E=1 bash scripts/e2e-anvil.sh(wallet write path)/, buy to cross L2; confirm popover once; click?on a mechanic — fullFeatureMechanicModalstill opens.Test plan notes
arenaLevelUpCelebration.test.ts,LevelUpCelebrationPopover.test.tsxmentioned in issue #335
Security review — MR !508
Commit reviewed:
859b4a9ff1ed689d674407f536a9109043392217Scope: Frontend level-up UX —
LevelUpCelebrationPopover,useArenaLevelUpCelebration,arenaLevelUpCelebration,ArenaSimplePagewiring, CSS, docs/invariants, dev screenshot script (capture-level-up-celebration-screenshots.mjs). No contract/indexer/backend changes.Outcome:
FINDINGS: 0medium+ — Security review: no medium+ findings on this diff.Method
playerLevel(indexer →useArenaPlayerLevel/clampPlayerLevel) throughdetectUnseenLevelUpFeature→levelUpCelebrationUnlockLine→ JSX render andcanvas-confettiburst.FeatureMechanicModalpath removed fromArenaSimplePage.Areas reviewed (no issues at medium+)
unlockLineis a closedswitchonArenaFeatureKeywith static strings; rendered as React text children ({unlockLine}), notdangerouslySetInnerHTML. Feature keys derive only fromfeatureKeyForUnlockLevel(levels 2–5), not raw indexer strings.useArenaPlayerLevelclamps level to 1–5 beforelevelBigintreaches the celebration hook; no unbounded loop or arbitrary key injection from poisonedstats.level.canvas-confettialready used (TimerHeroParticles) with sameuseWorker: truepattern.execSync/castagainst local.env.local+ Anvil — developer-only QA tooling; not a production attack surface (would require compromising the operator’s local env).Inline threads: none (no medium+ findings).
added 9 commits
main2c5b37ee- Merge origin/main into issue-335-level-up-celebration-popoverCompare with previous version
Resolved merge conflicts with
main.Conflict:
frontend/src/pages/arena/ArenaSimplePage.tsximport block — keptshouldShowLevelLockfrom main (warbow level-lock UI) while retaining the MR’sLevelUpCelebrationPopover/useArenaLevelUpCelebrationpath (noreadFeatureTutorialSeenauto-modal).Checks:
cd frontend && npm run typecheck && npm run lint && npm test— PASS.Security review — MR !508
Commit reviewed:
2c5b37ee4c2f8b829d3ce92d8a56076fe26e16ffScope: Frontend level-up UX —
LevelUpCelebrationPopover,useArenaLevelUpCelebration,arenaLevelUpCelebration,ArenaSimplePagewiring, CSS, docs/invariants, dev screenshot script (capture-level-up-celebration-screenshots.mjs). No contract/indexer/backend changes. Re-reviewed after merge frommain(prior review on859b4a9f).Outcome:
FINDINGS: 0medium+ — Security review: no medium+ findings on this diff.Method
playerLevel(indexer →useArenaPlayerLevel/clampPlayerLevel) →detectUnseenLevelUpFeature→levelUpCelebrationUnlockLine→ JSX render andcanvas-confettiburst.FeatureMechanicModalpath inArenaSimplePage.Areas reviewed (no issues at medium+)
unlockLineis a closedswitchonArenaFeatureKeywith static strings; rendered as React text children ({unlockLine}), notdangerouslySetInnerHTML. Feature keys derive only fromfeatureKeyForUnlockLevel(levels 2–5), not raw indexer strings.useArenaPlayerLevelclamps level to 1–5 beforelevelBigintreaches the celebration hook; loop indetectUnseenLevelUpFeatureis bounded (≤4 iterations). No arbitrary key injection from poisonedstats.level.canvas-confettialready used (TimerHeroParticles) with sameuseWorker: truepattern.execSync/castagainst local.env.local+ Anvil — developer-only QA tooling; not a production attack surface (would require compromising the operator’s local env).Inline threads: none (no medium+ findings).
mentioned in commit
1411dc491b