Gsap Frameworks
GSAP (GreenSock)OfficialPublished by GSAP (GreenSock)
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides patterns for integrating the GSAP animation library into component-based frameworks like Vue, Nuxt, and Svelte. It focuses on lifecycle management, ensuring animations are initialized only after the DOM is ready and properly cleaned up upon component destruction to prevent memory leaks or unintended behavior. It emphasizes the use of gsap.context for scoping selectors to specific component roots.
What it does
- Explains how to initialize GSAP animations within component lifecycle hooks like onMounted or onMount.
- Demonstrates how to use gsap.context to scope selectors to specific component DOM elements.
- Provides patterns for cleaning up animations and ScrollTriggers using ctx.revert() during component unmounting.
- Offers guidance on lazy-loading GSAP plugins in Nuxt applications to manage bundle size.
- Outlines best practices for avoiding global selector conflicts in component-based architectures.
When to use it
- When implementing GSAP animations in Vue, Nuxt, or Svelte projects.
- When you need to ensure animations are correctly scoped to a specific component's DOM subtree.
- When you need to manage the lifecycle of animations to prevent memory leaks during component destruction.
- When working with ScrollTrigger in a framework-specific environment.
Advantages
- Ensures animations are tied to the component lifecycle, preventing errors from missing DOM nodes.
- Prevents memory leaks and orphaned animations by providing clear cleanup patterns.
- Enables scoped animation targeting to avoid affecting elements outside the component.
- Provides framework-specific examples for Vue 3 and Svelte.
Usage examples
- “How do I animate a box in a Vue 3 component using GSAP?”
- The skill provides a pattern using onMounted to initialize a gsap.context and onUnmounted to call ctx.revert(), ensuring the animation is scoped to the component's container.
- “How do I clean up GSAP animations in Svelte?”
- The skill shows how to return a cleanup function from onMount that calls ctx.revert() to kill animations and ScrollTriggers when the component is destroyed.
- “How can I lazy load GSAP plugins in Nuxt 4?”
- The skill provides a composable example using a plugin map and an async lazyLoadPlugin function to register plugins dynamically.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/greensock/gsap-frameworks/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip gsap-frameworks.zip -d .agents/skills
Documentation by GSAP (GreenSock)
GSAP with Vue, Svelte, and Other Frameworks
When to Use This Skill
Apply when writing or reviewing GSAP code in Vue (or Nuxt), Svelte (or SvelteKit), or other component frameworks that use a lifecycle (mounted/unmounted). For React specifically, use gsap-react (useGSAP hook, gsap.context()).
Related skills: For tweens and timelines use gsap-core and gsap-timeline; for scroll-based animation use gsap-scrolltrigger; for React use gsap-react.
Principles (All Frameworks)
Create tweens and ScrollTriggers after the component’s DOM is available (e.g. onMounted, onMount).
Kill or revert them in the unmount (or equivalent) cleanup so nothing runs on detached nodes and there are no leaks.
Scope selectors to the component root so
.boxand similar only match elements inside that component, not the rest of the page.
Vue 3 (Composition API)
See examples/vue/ for a runnable Vite + Vue 3 project demonstrating these patterns.
Use onMounted to run GSAP after the component is in the DOM. Use onUnmounted to clean up.
import { onMounted, onUnmounted, ref } from "vue";
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
gsap.registerPlugin(ScrollTrigger); // once per app, e.g. in main.js
export default {
setup() {
const container = ref(null);
let ctx;
onMounted(() => {
if (!container.value) return;
ctx = gsap.context(() => {
gsap.to(".box", { x: 100, duration: 0.6 });
gsap.from(".item", { autoAlpha: 0, y: 20, stagger: 0.1 });
}, container.value);
});
onUnmounted(() => {
ctx?.revert();
});
return { container };
},
};✅ gsap.context(scope) — pass the container ref (e.g.
container.value) as the second argument so selectors like.itemare scoped to that root. All animations and ScrollTriggers created inside the callback are tracked and reverted when ctx.revert() is called.✅ onUnmounted — always call ctx.revert() so tweens and ScrollTriggers are killed and inline styles reverted.
Vue 3 (script setup)
Same idea with <script setup> and refs:
<script setup>
import { onMounted, onUnmounted, ref } from "vue";
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
const container = ref(null);
let ctx;
onMounted(() => {
if (!container.value) return;
ctx = gsap.context(() => {
gsap.to(".box", { x: 100 });
gsap.from(".item", { autoAlpha: 0, stagger: 0.1 });
}, container.value);
});
onUnmounted(() => {
ctx?.revert();
});
</script>
<template>
<div ref="container">
<div class="box">Box</div>
<div class="item">Item</div>
</div>
</template>Nuxt 4
See
examples/nuxt/for a runnable Nuxt 4 project with plugin registration, lazy loading, and SSR-safe patterns.
Use a reusable composable to register GSAP Plugins and also to lazy load Plugins that are not extensively used in your application:
// composables/useGSAP.ts
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
const PLUGINS = [
"CSSRulePlugin",
"CustomBounce",
"CustomEase",
"CustomWiggle",
"Draggable",
"DrawSVGPlugin",
"EaselPlugin",
"EasePack",
"Flip",
"GSDevTools",
"InertiaPlugin",
"MorphSVGPlugin",
"MotionPathHelper",
"MotionPathPlugin",
"Observer",
"Physics2DPlugin",
"PhysicsPropsPlugin",
"PixiPlugin",
"ScrambleTextPlugin",
"ScrollSmoother",
"ScrollToPlugin",
"ScrollTrigger",
"SplitText",
"TextPlugin",
] as const;
type Plugins = (typeof PLUGINS)[number];
// In order to dynamically load all the GSAP plugins
const pluginMap = {
CustomEase: () => import("gsap/CustomEase"),
Draggable: () => import("gsap/Draggable"),
CSSRulePlugin: () => import("gsap/CSSRulePlugin"),
EaselPlugin: () => import("gsap/EaselPlugin"),
EasePack: () => import("gsap/EasePack"),
Flip: () => import("gsap/Flip"),
MotionPathPlugin: () => import("gsap/MotionPathPlugin"),
Observer: () => import("gsap/Observer"),
PixiPlugin: () => import("gsap/PixiPlugin"),
ScrollToPlugin: () => import("gsap/ScrollToPlugin"),
ScrollTrigger: () => import("gsap/ScrollTrigger"),
TextPlugin: () => import("gsap/TextPlugin"),
DrawSVGPlugin: () => import("gsap/DrawSVGPlugin"),
Physics2DPlugin: () => import("gsap/Physics2DPlugin"),
PhysicsPropsPlugin: () => import("gsap/PhysicsPropsPlugin"),
ScrambleTextPlugin: () => import("gsap/ScrambleTextPlugin"),
CustomBounce: () => import("gsap/CustomBounce"),
CustomWiggle: () => import("gsap/CustomWiggle"),
GSDevTools: () => import("gsap/GSDevTools"),
InertiaPlugin: () => import("gsap/InertiaPlugin"),
MorphSVGPlugin: () => import("gsap/MorphSVGPlugin"),
MotionPathHelper: () => import("gsap/MotionPathHelper"),
ScrollSmoother: () => import("gsap/ScrollSmoother"),
SplitText: () => import("gsap/SplitText"),
} as const;
type PluginMap = typeof pluginMap;
type Plugins = keyof PluginMap;
// Resolves the module type for a given key, then picks the named export matching the key
// this allows to have the type definitions for autocomplete in your code editor
type PluginModule<K extends Plugins> = Awaited<ReturnType<PluginMap[K]>>;
type PluginExport<K extends Plugins> = PluginModule<K>[K & keyof PluginModule<K>];
export default function () {
// Register all the GSAP Plugins you want at this point
gsap.registerPlugin(ScrollTrigger);
/*
If you want to lazy load some of the plugins that are
not widely used in your app (for example in just a couple
of components or a single route), you can use this method
*/
async function lazyLoadPlugin<K extends Plugins>(plugin: K): Promise<PluginExport<K>> {
const loader = pluginMap[plugin];
const m = await loader();
const p = (m as any)[plugin];
gsap.registerPlugin(p);
return p;
}
return {
gsap,
ScrollTrigger,
lazyLoadPlugin,
};
}Access in components via useGSAP():
const { gsap, ScrollTrigger, lazyLoadPlugin } = useGSAP();✅
useGSAP()provides typed access to the gsap instance and lazy load method.✅ Lazy-load any plugin (SplitText, MorphSVG, etc.) that is not widely used in your app to reduce initial bundle size.
✅ Use gsap.context(scope) and onUnmounted → ctx.revert() in components, same as Vue 3.
Svelte
Use onMount to run GSAP after the DOM is ready. Use the returned cleanup function from onMount (or track the context and clean up in a reactive block / component destroy) to revert. Svelte 5 uses a different lifecycle; the same principle applies: create in “mounted” and revert in “destroyed.”
<script>
import { onMount } from "svelte";
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
let container;
onMount(() => {
if (!container) return;
const ctx = gsap.context(() => {
gsap.to(".box", { x: 100 });
gsap.from(".item", { autoAlpha: 0, stagger: 0.1 });
}, container);
return () => ctx.revert();
});
</script>
<div bind:this={container}>
<div class="box">Box</div>
<div class="item">Item</div>
</div>✅ bind:this={container} — get a reference to the root element so you can pass it to gsap.context(scope).
✅ return () => ctx.revert() — Svelte’s onMount can return a cleanup function; call ctx.revert() there so cleanup runs when the component is destroyed.
Scoping Selectors
Do not use global selectors that can match elements outside the current component. Always pass the scope (container element or ref) as the second argument to gsap.context(callback, scope) so that any selector run inside the callback is limited to that subtree.
✅ gsap.context(() => { gsap.to(".box", ...) }, containerRef) —
.boxis only searched insidecontainerRef.❌ Running gsap.to(".box", ...) without a context scope in a component can affect other instances or the rest of the page.
ScrollTrigger Cleanup
ScrollTrigger instances are created when you use the scrollTrigger config on a tween/timeline or ScrollTrigger.create(). They are included in gsap.context() and reverted when you call ctx.revert(). So:
Create ScrollTriggers inside the same gsap.context() callback you use for tweens.
Call ScrollTrigger.refresh() after layout changes (e.g. after data loads) that affect trigger positions; in Vue/Svelte that often means after the DOM updates (e.g. nextTick in Vue, tick in Svelte, or after async content load).
When to Create vs Kill
| Lifecycle | Action |
|---|---|
| Mounted | Create tweens and ScrollTriggers inside gsap.context(scope). |
| Unmount / Destroy | Call ctx.revert() so all animations and ScrollTriggers in that context are killed and inline styles reverted. |
Do not create GSAP animations in the component’s setup or in a synchronous top-level script that runs before the root element exists. Wait for onMounted / onMount (or equivalent) so the container ref is in the DOM.
Do Not
❌ Create tweens or ScrollTriggers before the component is mounted (e.g. in setup without onMounted); the DOM nodes may not exist yet.
❌ Use selector strings without a scope (pass the container to gsap.context() as the second argument) so selectors don’t match elements outside the component.
❌ Skip cleanup; always call ctx.revert() in onUnmounted / onMount’s return so animations and ScrollTriggers are killed when the component is destroyed.
❌ Register plugins inside a component body that runs every render (it doesn't hurt anything, it's just wasteful); register once at app level.
Learn More
gsap-react skill for React-specific patterns (useGSAP, contextSafe).
Files
- ATTRIBUTION.mdAdded by AutoGineer835 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md10.4 KiB
ATTRIBUTION.md
Attribution
This folder is an unmodified copy of the Agent Skill "gsap-frameworks", distributed by AutoGineer (https://autogineer.com/agent-skills).
Commit: aed9cfd3277740755f6bfc1155c7aa645403b760
Published by: GSAP (GreenSock) (https://github.com/greensock)
Publisher: GSAP (GreenSock) (https://github.com/greensock)
Licence: MIT License (https://spdx.org/licenses/MIT.html)
Licence evidence: declared in the frontmatter ("license: MIT")
Retrieved: 2026-11-07
The skill's own files are unmodified copies. AutoGineer is not affiliated with or endorsed by the author or the publisher.
Files added by AutoGineer
ATTRIBUTION.md: this file, written by AutoGineer
LICENSE: copied from LICENSE
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- GSAP (GreenSock)
- Publisher
- GSAP (GreenSock) (Official)
- Source
- greensock/gsap-skills · skills/gsap-frameworks · commit aed9cfd
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by GSAP (GreenSock) or GSAP (GreenSock).
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download gsap-frameworks.zip