Skip to content

Rounds 16-18 — native scroll (Lenis out), raster diet, scroll-frozen audio cosmetics#29

Merged
YamadaBlog merged 1 commit into
mainfrom
feat/round-16-18-native-scroll-raster-diet
Jun 12, 2026
Merged

Rounds 16-18 — native scroll (Lenis out), raster diet, scroll-frozen audio cosmetics#29
YamadaBlog merged 1 commit into
mainfrom
feat/round-16-18-native-scroll-raster-diet

Conversation

@YamadaBlog

Copy link
Copy Markdown
Owner

What

  • Native scroll — Lenis removed (permanent rAF + ~1 s easing = the reported sluggish feel; 2026 consensus + Apple practice = native). CSS scroll-behavior: smooth for anchors/tour (reduced-motion gated), tour glide fixed to behavior:'instant'.
  • Raster diet — hero backdrop pre-blurred offline (4.5 kB webp, npm run generate:backdrop), 7 gradient-layer blurs removed from the pinned reveal (screenshot pairs: indistinguishable), dead per-frame hooks removed, parallax event-driven, particles IO+30 Hz.
  • Pause/playing parityuseScrollActivity singleton freezes ambient pump + AudioBars + particles while the page scrolls. Same-run differential: scroll jank delta paused→playing +21pts → +8pts, idle parity.

Numbers (2K, headed GPU, same-run differentials)

idle paused/playing 0 %/0 % · read-pace full page paused 8 % · reveal flick p95 49.9 → 33.7 ms · input latency: native (was ~1 s Lenis easing)

Validation

ci exit=0 (88 tests, 0 vulns, src/lib untouched — byte-identical v2.3.5 ✓) · visual 2/2 · responsive 6/6 · Axe AA 2/2 · dist verified (no lenis, backdrops present) · an unproven micro-optimisation was tested and reverted (measurement honesty)

🤖 Generated with Claude Code

…cs (rounds 16-18)

Round 16 — scroll refonte (researched + measured) :
- Lenis REMOVED -> native scrolling. Its permanent rAF re-dispatched
  scroll through the main thread (jank-amplifier) and the ~1 s easing
  was the reported 'floaty/slow' feel. 2026 consensus (NN/g, Thought-
  works radar, Apple's own product pages) : native scroll + sticky +
  pre-rendered frames. Anchors/tour keep a glide via CSS
  scroll-behavior: smooth (reduced-motion gated) ; the tour's manual
  rAF glide now passes behavior:'instant' to avoid double-easing.
- dead useScrollProgress hooks removed (their only CSS consumer was
  deleted in round 12 — a forced layout per frame for nothing)
- useScrollParallax: permanent rAF -> scroll-event driven
- useAudioParticles: IntersectionObserver gate + 30 Hz
- hero backdrop pre-blurred offline (npm run generate:backdrop,
  sharp: svg -> 640px -> sigma28 + saturate/brightness baked -> webp
  4.5 kB) — retires the page's costliest live filter layer
  (blur(110px) on a viewport-sized surface). gitignore exception for
  the 2 derived webp (MIT svg sources, full rights chain).

Round 17 — reveal raster diet :
- 7 filter:blur(20-60px) removed from gradient-only glow layers (a
  radial gradient fading to transparent is already soft) ; worst was
  the halo MOVING with the scrub-tweened product every frame.
  Screenshot pairs: visually indistinguishable. Reveal flick p95
  49.9 -> 33.7 ms. A velocity-gate on act swaps was tested, measured
  inconclusive (machine variance +/-10pts), and REVERTED.

Round 18 — pause/playing parity :
- new useScrollActivity singleton (one passive listener, 160 ms
  settle) ; ambient pump (now 30 Hz), AudioBars canvas and particle
  field FREEZE while the page scrolls — a frozen canvas scrolls as a
  cached texture, and mid-scroll screenshots show the frozen pose is
  imperceptible. Same-run differential: scroll jank delta
  paused->playing +21pts -> +8pts ; idle parity.

Validation : ci exit=0 (88 tests, 0 vulns, lib byte-identical v2.3.5
untouched), visual 2/2, responsive 6/6, Axe AA 2/2, dist verified
(no lenis in bundle, baked backdrops present).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@YamadaBlog YamadaBlog merged commit 3bd3926 into main Jun 12, 2026
17 checks passed
@YamadaBlog YamadaBlog deleted the feat/round-16-18-native-scroll-raster-diet branch June 12, 2026 12:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant