This guide explains where to find the code, how to customize animation parameters like timing and easing, and how to completely remove the script if needed.
To locate and edit the animation scripts in your project:
“Before </body> tag” section



animations functions and how to edit and remove them.
introAnim() function Runs the site intro on page load, animating the nav logo into place and revealing the hero content. Behavior differs on mobile vs desktop.
// Nav logo letter stagger and speed (default: 0.1s stagger, 0.6s duration, desktop only)
introTl.fromTo(navText.chars, { yPercent: 120 }, { yPercent: 0, stagger: 0.1, duration: 0.6 });
// Nav logo scale down speed (default: 0.5s)
introTl.to(navLogoWrapper, { y: 0, duration: 0.5 });
// Nav items blur in duration (default: uses power2 ease, no explicit duration set)
introTl.to(navBlurItems, { opacity: 1, filter: "blur(0px)", ease: "power2" }, "-=.15");
introAnim() call in the DOMContentLoaded listener.gsap.set(".section.about", { opacity: 0 }) line,Nav logo and menu items appear instantly in their final position.
heroGalleryAnim() function Loops through hero gallery images with a reveal transition, syncing the title and year text to fade with each slide change.
// Slide reveal speed (default: 0.8s)
loopTl.to(incomingEls, { clipPath: "inset(0%)", duration: 0.8, ease: "expo.inOut" });
// Title and year fade speed (default: 0.25s)
loopTl.to([titles[currentIndex], years[currentIndex]], { opacity: 1, scale: 1, duration: 0.25 });
// Hold time on each slide before advancing (default: 1.5s)
loopTl.to({}, {}, "+=1.5");heroGalleryAnim() call in the DOMContentLoaded listener.Gallery stays frozen on its first slide. Titles and years remain static with no fade transitions.
signRevealAnim() function Reveals sign elements with a diagonal clip path wipe as they scroll into view.
// Reveal speed (default: 2.5s)
gsap.to(sign, { clipPath: "polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)", duration: 2.5 });
// Scroll trigger start point (default: "top bottom")
scrollTrigger: { trigger: sign, start: "top bottom" }signRevealAnim() call in the window.addEventListener("load", ...) block..sign-reveal elements to their final clip path state in Webflow, or add gsap.set(".sign-reveal", { clipPath: "polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)" }); so they don't stay hidden.Sign elements stay hidden (clipped to nothing) unless the fallback set above is added, in which case they appear instantly in their final revealed state.
buttonAnim() function Fills buttons with an overlay on hover, expanding on mouse enter and retracting on mouse leave.
// Fill speed (default: 0.4s)
gsap.to(overlay, { width: "100%", duration: 0.4, ease: "power2" });
// Applies to both .button and .button-submit-wrapper elements
gsap.utils.toArray(".button, .button-submit-wrapper")buttonAnim() call in the DOMContentLoaded listener.Button overlay no longer fills on hover.
textSlideUp() function Splits text blocks into lines and slides each line up into view as it scrolls into the viewport.
// Line stagger and speed (default: 0.08s stagger, 0.6s duration)
gsap.from(splitAllText.lines, { yPercent: 120, stagger: 0.08, duration: 0.6 });
// Scroll trigger start point (default: "top 85%" desktop, "top 90%" below desktop)
scrollTrigger: { start: belowDesktop ? "top 90%" : "top 85%" }textSlideUp() call inside the mm.add(breakpoints, ...) block.Text blocks appear instantly in their final position instead of sliding up. Lines are no longer split.
Do create Backup of this project right after you've purchased it so you can always revert back in case something goes wrong. Here's how to do it.
Always test changes on a duplicated version of your project. Animation values like duration, ease, and stagger can significantly affect the user experience. Experiment and preview in Webflow!
To give you more confidence and control in your deployment, Webflow launched site previews with custom code. This allows you to preview the effects of any custom code before publishing it on your Webflow site — including animations written with GSAP.
