perf(landing): slash continuous GPU cost for butter-smooth scrolling
The rAF/ref scroll fade wasn't the real bottleneck — the landing ran two GPU-saturating things every frame, even idle: - MarbleField is a full-viewport WebGL shader (5-octave fbm, double domain warp) on an unthrottled rAF loop at up to 1.5x DPR. - A backdrop-blur pane sat over that live canvas (re-blur every frame), and the aurora animated background-position on 300%-size, 40-64px-blurred layers (continuous repaints) plus mix-blend-soft-light. Changes: - Marble: render the backing store at ~0.6x scale, DPR capped at 1 (~5x fewer fragments); cap the loop to ~30fps; skip all shader work while the tab is hidden or the user is scrolling. Look is unchanged (it sits under a soft wash). - Drop the backdrop-blur frost pane → a plain translucent wash (the low-res marble already reads soft). - Aurora: make the two base gradient layers static (kills the background-position repaints) and drop mix-blend-soft-light. Life now comes only from the transform/opacity orbs, sheen and bloom, which composite cheaply. - Remove will-change:opacity from the two full-viewport hero layers (it forced giant permanent compositor layers and hurt more than helped). - Pause the aurora's compositor animations (and the marble) while actively scrolling via an html[data-scrolling] flag, resuming ~140ms after scroll stops. Net: near-zero idle cost and the GPU is free during scroll. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>