Depth, not breadth.

A deep, stand-alone collection built around one system. Two Kits so far: Reveal, preloaders and hero sections as one mixable system, and Menu, ten site navigation menus as one system. React, Vue, HTML / CSS / JS. Not for Webflow.

See the Menu Kit

Learn the vocabulary.

Definitions and examples for the GSAP and animation concepts behind production motion. Free, citable, and cross-linked with the components that use each idea.

Open concepts
GSAP component for Vue

Horizontal Case Study in Vue.

A case-study section that turns scrolling down into a sideways walk through a project, laid out like a magazine: an intro, stills of different sizes hanging from one top line, a chapter note and a closing quote. Each panel reveals once as it slides in: the image wipes up into its frame and settles from a soft zoom, and the text rises line by line. The stills then drift a little slower than the strip, while a counter and a hairline keep your place. On phones it stacks into a column with the same reveal.

Install Horizontal Case Study in your Vue project

Horizontal Case Study ships as a copy-paste Vue 3 single-file component. The only dependency is GSAP - Vue's reactivity and lifecycle hooks replace the React useGSAP adapter, so no extra package is needed.

BASH

Where it goes in your Vue app

Horizontal Case Study is a leaf-level interactive component. Drop it into any page, layout, or other component. It works in Vue 3 + Vite, Nuxt, and any standalone Vue setup.

In Nuxt, no special handling is needed - the component is client-safe and self-cleaning. If you want to ensure it never runs on the server (rare), wrap your usage in <ClientOnly>.

The component uses the <script setup> composition API and TypeScript-friendly defineProps.

Vue-specific gotchas

GSAP cleanup in onUnmounted, not onBeforeUnmount

Use onUnmounted to kill tweens and ScrollTriggers. onBeforeUnmount fires while the DOM is still mounted, but onUnmounted is the more idiomatic place for animation cleanup in Vue 3.

Template refs are .value, not .current

const el = ref(null); access as el.value (not el.current like React). Pass el.value into gsap.to / gsap.from targets.

Register plugins once, outside setup

Plugin registration (gsap.registerPlugin(ScrollTrigger, ...)) can run at module top level in Vue 3 + Vite because the build is client-first. In Nuxt with SSR, wrap in if (process.client) or place inside onMounted.
FAQ

Common questions

Does Horizontal Case Study work in Nuxt?
Yes. Drop it into any page or component. The component is client-safe; Nuxt handles the SSR boundary automatically. If you want explicit client-only rendering, wrap in .
Does Horizontal Case Study work with Vue 2?
No - the component uses the Vue 3 Composition API and