Repository navigation
feat(app): animate the Go upsell hero in the free-limit dialog - #57694
Conversation
|
Follow-up to review ( Pixel-ratio changes under reduced motion. The hero now watches Frame cost. The grid is now written as pixels (whole-pixel squares, the same as the old Measured headless on the Pro: same page, DPR 2, 60 fps virtual clock, main-thread time per frame including a forced raster. Each number is the median of 3 runs per renderer, alternated old/new. Worker load averages were 12–40, so absolute numbers are noisy; the ratios held across runs.
Intro p95 is still about 8–11 ms on this loaded worker. The warp streaks take most of it, and their cost grows with stroke length, so it can't go lower without changing the look. Look. I rendered both renderers on the same clock at 12 timestamps across the intro and the loop, composited over the dialog surface. Mean difference is 0.1/255, max 3.7/255, and under 0.04% of channels differ by more than 2/255. |
Issue for this PR
Follow-up to #57466
Type of change
What does this PR do?
Adds an animated GO hero above the title of the free-limit (Go upsell) dialog. It plays the Lightspeed intro (energy gathers, the field warps, GO arrives), then hands off to the Ripple loop instead of continuing the warp. The warp's brake becomes Ripple's first ring: that ring's speed is the loop's drift plus a share of the warp's speed, so it slows with the brake and keeps going as a loop ring with no cut. The loop rings keep its cadence.
DialogUsageExceededtakes an optionalhero. Only the free-limit dialog passes one; the account rate-limit dialog doesn't change.How did you verify your code works?
go-upsell-hero-art.test.ts: under reduced motion it draws one still frame and requests no animation frames. On unmount it cancels the pending frame, removes its listeners and stops drawing.bun run typecheckinpackages/app.Screenshots / recordings
Before
After (dark, 6.5 s at 60 fps: Lightspeed intro, the brake ring, then the Ripple loop)
go-hero-after.mp4
Checklist