How it moves.

Every animation on this template is either a native IX3 interaction or one small, labelled GSAP block. This page explains each one: what it does, where it is used and exactly what to change.

Start

Before you edit

  • Where the code lives: GSAP 3, ScrollTrigger, SplitText and ScrambleText are loaded by Webflow's built-in GSAP integration (Site settings → GSAP, with those three plugins switched on); nothing loads from a CDN. Site settings → Custom code: Head code holds font smoothing and hides the page for a split second until the preloader or page transition is ready (so nothing flashes), showing it within 3 seconds at most. Footer code holds only the MONOFORM script (blocks G1–G32); if a plugin is switched off in Site settings → GSAP, the page stays static instead of breaking.
  • Styling is native: every colour, size and state is a class or Variable in the Designer. GSAP only animates — change looks in the Style panel, change motion here.
  • State classes: navbar_component is-scrolled and is-hidden are added by G4. They are not applied in the Designer, so do not delete them with “Clean up unused styles”.
  • Preview: custom code does not run in the Designer canvas. Check effects on the published site.
  • Reduced motion: visitors with “reduce motion” turned on get no GSAP effects and IX3 skips its animations.
GSAP

How to Edit GSAP Animations — Element map

Each GSAP effect is one labelled block in the footer code. This map shows which element or custom attribute each block controls.

G1 · Scroll helpers
a[href="#top"] / <html>

The site uses native browser scrolling. G1 locks scrolling while the preloader plays and makes “Back to top” links glide up.

Every page. Sticky elements use CSS position: sticky on their class in the Designer.

G2 · Preloader
.preloader_component (Global UI)

Every time the Home page loads, a counter runs 0 → 100, then the panel slides up and the hero intro (G5) plays.

Global UI component. Hidden (display: none) in the Designer; GSAP shows it.

G3 · Page transitions
.transition_panel (Global UI)

Off by default. Set PAGE_TRANSITIONS = true and internal links slide the panel over the page before the next page opens.

All internal links. New-tab, mailto:, tel: and #anchor links are skipped.

G4 · Navbar on scroll
.navbar_component

Adds the combo class is-scrolled after 8px and is-hidden when scrolling down past 400px.

Navbar component. Style both combo classes in the Designer.

G5 · Page intro
[data-animate="load-lines"] / [data-animate="load-fade"] / .hero-inline_image-wrapper

Hero headings rise line by line from a mask with a slight tilt, the pill image in the Home headline grows open, then load-fade content follows.

Every page hero. Runs after the preloader / transition.

G6 · Split lines
[data-animate="split-lines"]

Headings rise line by line when they scroll into view.

Section headings on every page.

G7 · Fade up
[data-animate="fade-up"]

Content fades in while moving up 60px.

Paragraphs, buttons, cards.

G8 · Stagger
[data-animate="stagger"]

The direct children appear one after another.

Stats, values, team, offices grids.

G9 · Image reveal
[data-animate="reveal"]

Image wrappers wipe up while the image zooms out from 135%.

Cards, team, gallery, offices, featured post.

G10 · Text scrub
[data-animate="text-scrub"]

Words brighten from 15% to 100% opacity while scrolling.

Home intro statement, About story.

G11 · Parallax
[data-animate="parallax"]

Images drift −6% → 6% inside their wrapper.

Hero images, project gallery.

G12 · Clip expand
[data-animate="clip-expand"] / "clip-expand-full"

Hero images open from the sides (or from the clip-path set on the class to full bleed) while scrolling.

Home hero, About hero, Project and Article templates.

G13 · Footer wordmark
[data-animate="wordmark"]

The big footer letters rise one by one.

Footer component.

G14 · Stacking cards & sticky columns
.process_card (sticky in the Designer)

Process cards stick with CSS sticky; as the next card slides over, the one below scales to 92% and dims (desktop only).

Home → How we work · About story · FAQ · Article sidebar · this page's menu.

G15 · Velocity marquee
[data-animate="marquee"]

The logo row loops forever and speeds up with scroll velocity.

Home → logos.

G16 · Velocity skew
.work-card_image-wrapper

Project images lean with fast scrolling, then settle.

Home → Selected work, Work page.

G17 · Count-up
.stats_number

Whole numbers count up from 0 when they appear.

Home and About stats.

G18 · Scramble labels
.section-label_component .text-style-tagline

Small mono labels decode like a terminal.

Every section label.

G19 · Scroll theme
[data-theme="dark"]

The page cross-fades to the Theme ‘Dark mode’ colours while a marked section is centred.

Home → How we work · About → Awards · Project → Results.

G20 · Badge & status pulse
[data-animate="badge"] / .status-pill_pulse

The round badge spins and adds rotation on scroll; the green status dot pulses.

Home hero.

G21 · Footer parallax
.footer_component › .padding-global

Footer content rises slightly slower than the page.

Footer component.

G22 · Cursor follower
.cursor_component (Global UI) / [data-cursor]

On mouse devices a dot follows the pointer; over [data-cursor] elements it grows into a labelled disc.

Work cards (View), blog cards (Read), next project (Next).

G23 · Hover effects
HOVERS table (cards, buttons, services, logo, back link)

Image zoom on cards, arrow rotation + fill, rolling button text, button icon nudge, logo spin.

Every page (mouse devices).

G24 · Services hover preview
.services_preview / .services_item

A floating image follows the cursor over the services list and tilts with its speed; image N matches row N.

Home → What we do (desktop).

G25 · Magnetic buttons
.button / .button-circle / [data-magnetic]

Buttons are pulled toward the pointer and spring back with an elastic ease. Strength is set by MAGNETIC (0 = off).

Every button on mouse devices. Add the custom attribute data-magnetic to make any other element magnetic.

G26 · Layout refresh
.w-tab-link / page height

When the page height changes without a window resize (for example switching a category tab), every scroll trigger is recalculated so effects below it, like the footer wordmark (G13) and footer parallax (G21), still play at the right moment.

Work and Blog category filters. Runs automatically; nothing to set up.

G27 · Handwriting
[data-animate="handwrite"]

The word is written on like a pen, the way the iPhone “hello” appears: its outline is traced from left to right, then the ink fills in. The word stays normal text in the Designer, so type any word and it will be handwritten in the span’s own font. Speed is set by HANDWRITE_SECONDS. Inside a load-lines heading it plays with the page intro (G5); anywhere else it plays when scrolled into view. Avoid split-lines headings.

The hand-script word in the H1 on Home, Work, Blog, About and Contact. To add it elsewhere, select a span and add the custom attribute data-animate = handwrite.

G28 · Footer wordmark fit
.footer_wordmark

GSAP sizes the big Monoform wordmark so it always spans exactly 100% of the container on every screen, then fits it again after the letters are split for G13. Change the word in the Designer and it still fits.

Footer component, every page. Runs for everyone, including reduced motion.

G29 · Project gallery slots
.project-gallery_cell

Each gallery slot is bound to a CMS image field. When a field is left empty, GSAP hides that slot so the gallery never shows a blank tile.

Project pages. Fill or clear the image fields in the Images group of each project. Runs for everyone, including reduced motion.

G30 · Results star
.stats_number (★)

Type a ★ in a project result value (e.g. 4.8★) and GSAP swaps it for an outlined star drawn to match the Geist font: cap height, matching stroke weight, sitting on the baseline. Screen readers hear “4.8 stars”.

Project pages → results strip. Runs for everyone, including reduced motion.

G31 · Form choice chips
.form_checkbox (is-checked)

Each checkbox or radio chip gets the combo class is-checked (on the chip and its input) while it is selected, with a small press bounce. Style the selected look on form_checkbox › is-checked and form_checkbox-input › is-checked; radios use the is-radio combo for a round indicator.

Contact form → I’m interested in, Budget.

G32 · Progressive blur fade
.progresive-blur / .footer_bottom

The blur fixed to the bottom of the screen slides down out of view when you scroll into the footer’s bottom row (links and copyright), and slides back as soon as you scroll up, so the end of every page is never blurred.

Global UI, every page. Edit the blur strength on the blur-layer classes in the Designer.

GSAP

Customizing key variables

Global speed & easing

The key variables at the top of the script control every effect.

const EASE = "expo.out"; // default easing for reveals const THEME_SPEED = 0.8; // G19 dark/light cross-fade in seconds const MARQUEE_SECONDS = 38; // G15 time for one marquee loop const PRELOADER_SECONDS = 2.1; // G2 counter duration const HOVER_SECONDS = 0.8; // G23 image zoom on card hover const MAGNETIC = 0.3; // G25 button pull (0 = off) const HANDWRITE_SECONDS = 1.5; // G27 time to write a handwritten word
Sticky elements

The process cards, About story column, FAQ header, article sidebar and this menu stay in view with native CSS sticky. Change their Position and Top offset in the Style panel.

Position: Sticky · Top: calc(nav height + 2rem)
Preloader on every page

The preloader only plays on the Home page. In G2 change one line to show it on every page.

const showPreloader = !!preloader; // was: preloader && isHome&& firstVisit;
Page transitions on / off (G3)

Page transitions are off. Set the key variable to true to turn on the panel wipe between pages; give a link the custom attribute data-no-transition to skip it.

const PAGE_TRANSITIONS = true; // default: false const MAGNETIC = 0.3; // G25 button pull, 0 = off
Stacking depth (G14)

Change how far the previous card shrinks and dims. Keep both start values.

gsap.fromTo(card, { scale: 1, filter: "brightness(1)" }, { scale: 0.92, filter: "brightness(0.7)", … })
Make any element sticky

No code needed: in the Style panel set Position to Sticky and a Top offset. The parent must be taller than the element.

Position: Sticky · Top: 6.5rem
Skew strength (G16)

Smaller divisor = stronger lean; the clamp limits the angle in degrees.

const skew = gsap.utils.clamp(-5, 5, self.getVelocity() / -350);
Dark sections (G19)

Add the custom attribute to any section. Colours come from Variables → Theme → Dark mode.

data-theme = "dark"
Cursor label (G22)

Add the custom attribute to any element to show a word in the cursor disc.

data-cursor = "View"
Hover zoom & motion (G23)

Each row of the HOVERS table is [hovered element, child that moves, values on hover, seconds]. Change a value or delete a row.

[".work-card_component", ".work-card_image", { scale: 1.05 }, HOVER_SECONDS], [".button", ".button-icon", { x: 3, y: -3 }, 0.5],
Services preview images (G24)

Images live in the hidden .services_preview element on the Home page. Keep them in the same order as the services rows.

.services_preview › .services_preview-image (1 per service row)
Reveal speed (G9)

Wipe and zoom durations, and how far the image starts zoomed in.

tl.fromTo(el, { clipPath: "inset(100% 0% 0% 0%)" }, { …, duration: 1.4 }); tl.fromTo(img, { scale: 1.35 }, { scale: 1, duration: 1.8 }, 0);
GSAP

Removing GSAP animations

  1. Open Site settings → Custom code → Footer code.
  2. To remove one effect, delete its whole block — from the comment line /* G… */ down to the line before the next /* G… */ comment. Every block is independent.
  3. To remove all GSAP animations, delete the five GSAP <script src> lines and the MONOFORM script. The site keeps working: content is visible, the IX3 menu and FAQ still run, sticky columns keep working.
  4. If you remove G2/G3, you can delete the Preloader and Transition elements inside the Global UI component (they are hidden by default).
  5. Publish the site. GSAP never runs inside the Designer canvas, so always check effects on the published or staging site.
IX3

Native interactions

The click interactions run on Webflow Interactions — edit them visually in the Interactions panel. All scroll and hover motion is GSAP (see the element map above): give any element a data-animate value from the map to add that effect.

Menu
Click
navbar_menu-button opens / closes the mobile menu and turns the icon into a cross
FAQ
Click
faq_question opens its answer (height auto) and rotates the plus icon
CMS

Projects & Articles

  • Featured: the Featured switch puts a project on the Home page (up to 4) and pins one article to the top of the blog.
  • Filters: the Work and Blog pages use native Tabs. Each tab holds a Collection List filtered by Category — to add a category, add an option to the Category field, duplicate a tab and change its list filter.
  • Next project / Related articles: choose them per item with the Reference fields “Next project” and “Related articles”.
  • Every field has help text in the CMS editor explaining what it controls.
SVG

Inline SVG code

  • Icons (arrows, plus, menu, social) are inline SVGs with the class icon-svg. They use currentColor, so they follow the text colour of their parent. To swap one, replace the SVG code inside the element.
  • Hero badge (Home) is an SVG with a circular path and text on it. Edit the words inside the textPath element; keep the “ • ” separators so the text wraps evenly around the circle.
  • Logo mark in the navbar and page transition is an SVG; replace it with your own mark at the same size (1.5rem / 3rem).