GSAP Instructions
This page explains every GSAP effect built into the custom code, the attributes that control it, and how to edit or remove each one. All effects are controlled by data-* attributes — no code editing needed to turn things on or off.
This page explains every GSAP effect built into the custom code, the attributes that control it, and how to edit or remove each one. All effects are controlled by data-* attributes — no code editing needed to turn things on or off.
data-work-wrapper — the hover area (e.g. a work/project row).
data-work-tag — the small label/tag inside it that follows the cursor.
data-text-path — the <textPath> element containing the moving text.
data-motion-path — the SVG path the text travels along.
As the user scrolls, the text slides along the path (startOffset), looping across roughly 82% of the path length. Requires the text path to sit inside an SVG, with a [data-work-wrapper] ancestor acting as the scroll trigger.
data-work-wrapper — scroll trigger for the reveal.
data-work-image-wrapper — the image element that gets clipped.
The image starts clipped into an angled shape, straightens into a full rectangle as it scrolls through view, then clips into an angled shape again on exit — a scrub-linked reveal/conceal.
data-gsap-stagger-loop — add to any text element (heading, label, etc.).
Splits the text into words/characters and loops it through three vertical positions (yPercent: 0 → -100 → -200) with staggered timing, repeating infinitely.
data-gallery-grid — the grid container (also gets pinned via its parent).
data-gallery-grid-image — each image tile in the grid.
data-gallery-grid-overlay — overlay element(s) that fade in over the grid.
data-gallery-title — heading text, split and animated character by character.
data-gallery-button — button that fades/slides in last.
This is a pinned scroll sequence: the grid is pinned in place while images fly in from random positions with a 3D rotation, followed by the overlay fading in, the title characters staggering up from below, then the button appearing.
For effects without exposed variables, change the numbers directly in the code.
Duration / stagger / delay / ease — example from the looping text stagger:
tl.to(splitText.chars, {
yPercent: -100,
delay: 1, // seconds to hold before moving
ease: 'power2.out',
stagger: { amount: 0.5 } // total time spread across all characters
});
To speed the loop up, lower delay and stagger.amount. To make it snappier, swap power2.out for power1.out or none.
ScrollTrigger — controls when and how an effect plays:
scrollTrigger: {
trigger: item,
start: "top bottom", // when it begins
end: "bottom top", // when it finishes
scrub: 0.5, // ties progress to scroll (smoothing amount)
}
scrub links the animation directly to scroll position — a number (e.g. 0.3) adds smoothing; remove it for a one-shot play-on-enter animation instead.
Pinned gallery length — how long the grid stays pinned while it animates:
scrollTrigger: {
trigger: grid,
start: 'center center',
end: '+=250%', // lower = shorter pin, higher = longer pin
scrub: 0.3,
}
To remove an effect from a single element: delete its data-* attribute in the Designer. No code changes needed — the script checks for the attribute before initializing.
1.
Open the custom code in Site Settings.
2.
Find the matching call inside DOMContentLoaded, e.g.:
if (gsap.utils.toArray('[data-gsap-stagger-loop]').length > 0) {
animateStaggerLoop('[data-gsap-stagger-loop]', 0.2);
}
3.
Comment it out:
// if (gsap.utils.toArray('[data-gsap-stagger-loop]').length > 0) {
// animateStaggerLoop('[data-gsap-stagger-loop]', 0.2);
// }
Each function only runs if its trigger attribute is found on the page, so disabling the call removes the effect everywhere with nothing left to clean up.
The cursor tag, curved text, and clip-path reveal all rely on their [data-work-wrapper] ancestor — removing that wrapper breaks all three at once.
SplitText re-splits on every page load; if fonts load late, characters may briefly appear unstyled before document.fonts.ready fires.
The gallery grid pins its parent element, not the grid itself — if the layout looks wrong, check the parent's height and overflow settings.