Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build reversible scroll-controlled visual transformations with a pinned or sticky stage, normalized progress, and video, image-sequence, canvas, SVG, or DOM renderers. Use for hero transformations, product assembly, interface state walkthroughs, object rotation, diagrams, or photo sequences that must move forward and backward with native scrolling.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 17% | 0% |
Turn one visual transformation into a responsive scroll instrument. Keep the page usable without motion and keep the renderer replaceable.
Write the visual states before coding:
jsconst sequence = { scrollVh: 280, frameCount: 96, fit: "contain", posterFrame: 0, reducedMotionFrame: 95, copyStops: [0, 0.42, 0.78] };
Use one normalized value for every renderer:
jsconst progress = Math.min(1, Math.max(0, (viewportTop - sectionTop) / (sectionHeight - viewportHeight) ));
Never make wheel delta, elapsed time, or autoplay the source of truth. Native scroll position must determine the exact visual state in both directions.
currentTime writes in requestAnimationFrame.scrollVh.position: sticky stage sized to the viewport.Use GSAP ScrollTrigger when the project already uses GSAP or needs exact pin, refresh, and timeline coordination:
jsScrollTrigger.create({ trigger: section, start: "top top", end: () => `+=${innerHeight * 2.8}`, pin: stage, scrub: true, invalidateOnRefresh: true, onUpdate: ({ progress }) => render(progress) });
For a dependency-free implementation, measure the section on scroll and resize, then schedule one render per animation frame.
0...frameCount - 1.object-fit and an explicit focal point so the subject survives mobile crops.prefers-reduced-motion: reduce, remove pinning and scrubbing, render the selected static frame, and restore ordinary document flow.Expose scroll distance, renderer, frame count, poster frame, media fit, focal point, copy stops, overlay strength, smoothing, and reduced-motion state as configuration. Avoid magic numbers distributed across event handlers.
Check forward and reverse scrolling, fast flicks, resize while active, 390/768/1024/1440 widths, unloaded frames, blocked video, reduced motion, keyboard order, route cleanup, and console errors. The same scroll position must always reproduce the same state.
Use demo/index.html as the working reference and demo/PROMPT.md to recreate or remix it. Keep REFERENCES.md as the links-only implementation source list.
Other measured skills in the registry, with their headline benchmark lift.