# Gsap Frameworks
> Skill oficial de GSAP para Vue, Svelte y otros frameworks no-React: ciclo de vida, escopado de selectores y limpieza al desmontar. Para React usa gsap-react.
Fuente: https://skillsagentes.com/skills/greensock/gsap-skills/gsap-frameworks
Markdown: https://skillsagentes.com/skills/greensock/gsap-skills/gsap-frameworks.md
Repositorio: https://github.com/greensock/gsap-skills
Autor: greensock
Licencia: MIT
Actualizado: hace 5 meses
Coste de contexto: 89 tok instalada, 2.7k tok al activarse, 2.7k tok con todos los archivos del bundle
Bundle: 1 archivo, 10 KB
Permisos que pide: ninguno declarado
## Instalación
Un skill son archivos markdown: los mismos archivos valen para cualquier agente y lo único que cambia es el directorio de destino, es decir la bandera `--agent`. Añade `-g` para instalarlo en todos los proyectos de la máquina.
```bash
# Claude Code
npx -y skills add greensock/gsap-skills --skill gsap-frameworks --agent claude-code
# Cursor
npx -y skills add greensock/gsap-skills --skill gsap-frameworks --agent cursor
# Codex
npx -y skills add greensock/gsap-skills --skill gsap-frameworks --agent codex
# Gemini CLI
npx -y skills add greensock/gsap-skills --skill gsap-frameworks --agent gemini
# Windsurf
npx -y skills add greensock/gsap-skills --skill gsap-frameworks --agent windsurf
# Cline
npx -y skills add greensock/gsap-skills --skill gsap-frameworks --agent cline
```
## Qué hace
- Guía el uso de GSAP en Vue, Nuxt y Svelte con el patrón gsap.context(scope) para crear animaciones y ScrollTriggers en el mount y revertirlos en el unmount
- Muestra cómo escopar selectores al elemento raíz del componente para no afectar otras partes de la página
- Da un patrón de composable en Nuxt 4 para registrar y lazy-loadear plugins de GSAP
## Cuándo usarla
- Al escribir o revisar código GSAP en Vue, Nuxt, Svelte o SvelteKit
- Cuando se pregunta por GSAP junto a onMounted, onMount u onDestroy
- Al necesitar limpiar animaciones o ScrollTriggers al destruir un componente
## Cuándo no
- Para React, donde corresponde usar el skill gsap-react (useGSAP, gsap.context())
## Qué la activa
- "¿Cómo animo un componente con GSAP en Vue 3?"
- "Necesito usar ScrollTrigger en Nuxt con lazy loading de plugins"
- "¿Cómo limpio las animaciones de GSAP al destruir un componente Svelte?"
- "Quiero escopar selectores GSAP dentro de un componente Vue"
## Antes de instalar
- Requiere la librería GSAP instalada y, en Nuxt, opcionalmente un composable propio para registrar/lazy-loadear plugins.
## Archivos
- SKILL.md — 10 KB
## SKILL.md
Reproducido tal cual desde greensock/gsap-skills bajo MIT. Esta sección es el documento original y está en inglés.
# 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 `.box` and 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.
```javascript
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 `.item` are 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 `
```
## 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:
```typescript
// 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 = Awaited>;
type PluginExport = PluginModule[K & keyof PluginModule];
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(plugin: K): Promise> {
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()`:
```javascript
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.”
```javascript
```
- ✅ **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)** — `.box` is only searched inside `containerRef`.
- ❌ 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).
## Dónde encaja
- Categoría: [Herramientas para desarrolladores](https://skillsagentes.com/categorias/herramientas-desarrollo.md) — Skills que cambian cómo tu agente escribe, revisa y despliega código.
- Creador: [greensock](https://skillsagentes.com/creators/greensock.md) — 8 skills en el directorio
- [Todas las skills](https://skillsagentes.com/skills.md)
- [Ranking de instalaciones](https://skillsagentes.com/ranking.md)
## Otras skills del mismo repositorio
- [Gsap Plugins](https://skillsagentes.com/skills/greensock/gsap-skills/gsap-plugins.md): Skill oficial de GSAP para plugins de GSAP — registro, ScrollToPlugin, ScrollSmoother, Flip, Draggable, Inertia, Observer, SplitText, ScrambleText, SVG y plugins de física, CustomEase, EasePack, CustomWiggle, CustomBounce, GSDevTools.
- [Gsap Core](https://skillsagentes.com/skills/greensock/gsap-skills/gsap-core.md): Skill oficial de GSAP para la API core — gsap.to(), from(), fromTo(), easing, duration, stagger, defaults y gsap.matchMedia() para animación responsive y prefers-reduced-motion.
- [Gsap Utils](https://skillsagentes.com/skills/greensock/gsap-skills/gsap-utils.md): Skill oficial de GSAP para gsap.utils — clamp, mapRange, normalize, interpolate, random, snap, toArray, wrap, pipe y otras utilidades auxiliares.
- [Gsap Performance](https://skillsagentes.com/skills/greensock/gsap-skills/gsap-performance.md): Skill oficial de GSAP sobre rendimiento: preferir transforms, evitar layout thrashing, will-change y batching. Útil al optimizar animaciones, reducir jank o lograr 60fps fluidos.
- [Gsap Timeline](https://skillsagentes.com/skills/greensock/gsap-skills/gsap-timeline.md): Skill oficial de GSAP para timelines: gsap.timeline(), parámetro de posición, anidamiento y reproducción. Úsalo al secuenciar animaciones o coordinar keyframes.
---
Skills Agentes · [Índice de páginas en markdown](https://skillsagentes.com/sitemap.md) · [Inicio](https://skillsagentes.com/index.md)