Lenis and ScrollTrigger fight each other inside pinned sections
If you use Lenis smooth scroll with GSAP ScrollTrigger pinned sections,
you've probably seen the jitter.
Lenis interpolates/changes scroll position. It smooths the raw scroll input into a flowing value. ScrollTrigger reads that value to calculate scrub progress. The problem shows up inside pinned sections where scroll position maps directly to animation progress.
High Lenis lerp (like 0.85) = responsive but stuttery. The scroll value snaps close to the target, and ScrollTrigger gets jumpy position changes. Low lerp (like 0.12) = smooth but drifty. The scroll value takes so long to settle that the animation keeps gliding after you stop scrolling.
The fix I use now is switching Lenis lerp values dynamically. When the user scrolls into a pinned sequence section, bump lerp to 0.85 for direct control. When they leave, drop it back to 0.12 for that smooth feel everywhere else.
On the canvas side, I also added frame-level easing. You can suggest something better :)
Instead of jumping the displayed frame directly to the target frame index, the canvas interpolates toward it. The displayed frame glides to match the scroll position rather than popping. This absorbs the micro-jitter from Lenis's tick rate without adding visible delay.
Two layers of smoothing. Lenis smooths the scroll input; frame easing smooths the output. Between them, the animation looks continuous.