cinematic-gsap-lenis-motion-system
Create premium cinematic web motion systems with GSAP, ScrollTrigger, and Lenis. Use for luxury editorial websites, creative studio portfolios, Awwwards-style interactions, smooth scroll reveals, staggered text, parallax, pinned sections, magnetic hover states, custom cursors, and mouse-reactive layered movement.
Install
npx skills add https://github.com/MengTo/Skills --skill cinematic-gsap-lenis-motion-systemCinematic GSAP Lenis Motion System
Use When
- The site needs a full premium motion language, not one isolated animation.
- Smooth scrolling, scroll reveals, pinned scenes, parallax, hover motion, and cursor behavior should feel connected.
- The target feel is luxury editorial, Apple-level polish, creative studio portfolio, or immersive cinematic storytelling.
- The stack can use GSAP, ScrollTrigger, and Lenis.
Motion Taste
- Smooth, elegant, slightly delayed, and intentional.
- Staggered motion should guide reading order.
- Layered movement should create depth without making the interface feel busy.
- ScrollTrigger should start scenes when they enter the viewport, not react to every tiny scroll.
- Prefer subtlety over intensity.
Avoid:
- Bounce, elastic, springy, or playful motion.
- Fast abrupt transitions.
- Large scale jumps.
- Over-animated UI.
- Flashy gaming-style effects.
Base Tokens
- Eases:
power3.out,power4.out,expo.out. - Scroll scrub:
scrub: 0.8to1.4for cinematic delay. - Reveals:
0.75sto1.1s. - Hover:
0.35sto0.6s. - Cursor lag:
0.25sto0.45s. - Text stagger: words
0.035sto0.07s, lines0.08sto0.14s. - Card stagger:
0.06sto0.1s. - Reveal trigger:
start: "top 82%". - Pin handoff:
anticipatePin: 1.
Setup
Install:
Initialize once, after the DOM exists. Lenis drives its RAF through the GSAP ticker so ScrollTrigger and smooth scroll stay synced.
Markup API
Use small data attributes so the motion system can be reused across pages.
CSS Foundation
Staggered Text Reveals
Use masked containers for premium text. Prefer manual line wrappers when exact line breaks matter. Use word splitting for flexible responsive text.
Line markup when exact line breaks matter:
Scroll Reveals
Create a small reveal preset map. Use autoAlpha, transforms, and light blur. Use blur sparingly on large elements.
Clip Image Reveals
Parallax Motion
Use speed differences instead of dramatic movement. Backgrounds move slower than content. Foreground accents move slightly faster.
Pinned Scroll Sections
Use pinned sections for story moments only. Keep scroll-synced movement linear, then layer eased reveal tweens inside the scene.
Sticky storytelling pattern:
Premium Hover Interactions
Use GSAP quickTo for magnetic motion so hover follows the pointer without re-creating tweens on every event.
Hover recipes:
- Magnetic buttons: translate
x/yonly, keep scale under1.03. - Magnetic cards: add
rotateX/rotateYunder4deg. - Image zoom:
scale: 1to1.06, duration0.7s, easepower3.out. - Grayscale to color: transition filter only on small/medium media.
- Animated arrows: move icon
x: 0tox: 6, fade the duplicate arrow in. - Directional hover: calculate pointer entry side, but keep movement under
16px.
Custom Cursor
Use a cursor follower as atmosphere, not decoration. Hide it on touch devices.
Mouse-Reactive Layers
Use one pointer listener per section. Depth should be barely visible.
Choreography Rules
- Hero: background or media starts first, headline lines second, supporting copy third, CTA last.
- Sections: label first, heading second, media third, cards/details last.
- Pinned scenes: one idea per viewport. Avoid stacking too many simultaneous transforms.
- Parallax: background slower, foreground slightly faster, text mostly stable.
- Cursor and hover effects should support navigation intent, not fight it.
Performance Rules
- Animate
transform,opacity, and short-livedclip-path. - Use
filter: blur()only on text or small elements. - Keep pinned sections limited and test them on mobile.
- Add
will-changeonly to elements that actually animate. - Use
ScrollTrigger.refresh()after images, fonts, or layout shifts. - In React or SPA routes, wrap setup in
gsap.context()and callctx.revert()on cleanup. - Kill or revert ScrollTriggers on page transitions before initializing the next route.
Init Order
QA Checklist
- Text and content remain visible with JavaScript disabled.
- Reduced-motion users get static content and no smooth-scroll hijacking.
- Scroll reveals animate once unless the design explicitly asks for replay.
- Pinned sections do not overlap the next section.
- Hover and cursor interactions are disabled on touch.
- No layout properties are animated during scroll.
- The page still feels readable if all decorative motion is removed.