skills: adopt GSAP Layer 3 + Layer 2 animation-runtime routing
Mirror the official GSAP AI skills (greensock/gsap-skills, MIT) into .agents/skills/ and add the Layer 2 wiring that makes them discoverable from a fresh context. GSAP covers animation needs that Remotion primitives strain at: per-character text reveals (SplitText), SVG shape morphs (MorphSVG), curved camera paths (MotionPath), stroke-reveal line drawing (DrawSVG), layout-to-layout flight (Flip), and custom bezier easings (CustomEase). Also becomes mandatory day-1 knowledge if we wire in HyperFrames later (HF uses GSAP timelines as its native animation runtime). Layer 3 adds (.agents/skills/): - gsap-core, gsap-timeline, gsap-plugins, gsap-utils - gsap-react, gsap-performance - gsap-scrolltrigger, gsap-frameworks (situational) - gsap/README.md — OpenMontage-specific framing and Remotion-safe usage Layer 2 wiring (the discovery triggers): - skills/meta/animation-runtime-selector.md — NEW routing meta-skill. Decision matrix covering Remotion primitives, GSAP plugins, framer- motion, Lottie, Manim, D3, TerminalScene. Enforces the "keep it simple" bias: reach for GSAP only when the plugin genuinely earns its bundle weight. - skills/pipelines/explainer/asset-director.md — references GSAP for kinetic typography, multi-step choreography, SVG line draws. - skills/pipelines/animation/asset-director.md — references GSAP for logo morphs, motion paths, FLIP transitions, custom easings. - skills/pipelines/cinematic/asset-director.md — references GSAP for cinematic camera moves, per-char title reveals, prestige easings. - AGENT_GUIDE.md — adds a categorized Layer 3 skills table so a fresh- context agent can find the right skill by what they're trying to do, plus a pointer to animation-runtime-selector.md for routing. Determinism: every GSAP use inside Remotion must drive timeline progress from useCurrentFrame(), never requestAnimationFrame. Three Remotion-safe patterns are documented in both the gsap/README and the selector skill. Attribution: https://github.com/greensock/gsap-skills (MIT).
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
---
|
||||
name: gsap-timeline
|
||||
description: Official GSAP skill for timelines — gsap.timeline(), position parameter, nesting, playback. Use when sequencing animations, choreographing keyframes, or when the user asks about animation sequencing, timelines, or animation order (in GSAP or when recommending a library that supports timelines).
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# GSAP Timeline
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
Apply when building multi-step animations, coordinating several tweens in sequence or parallel, or when the user asks about timelines, sequencing, or keyframe-style animation in GSAP.
|
||||
|
||||
**Related skills:** For single tweens and eases use **gsap-core**; for scroll-driven timelines use **gsap-scrolltrigger**; for React use **gsap-react**.
|
||||
|
||||
## Creating a Timeline
|
||||
|
||||
```javascript
|
||||
const tl = gsap.timeline();
|
||||
tl.to(".a", { x: 100, duration: 1 })
|
||||
.to(".b", { y: 50, duration: 0.5 })
|
||||
.to(".c", { opacity: 0, duration: 0.3 });
|
||||
```
|
||||
|
||||
By default, tweens are **appended** one after another. Use the **position parameter** to place tweens at specific times or relative to other tweens.
|
||||
|
||||
## Position Parameter
|
||||
|
||||
Third argument (or position property in vars) controls placement:
|
||||
|
||||
- **Absolute**: `1` — start at 1 second.
|
||||
- **Relative (default)**: `"+=0.5"` — 0.5s after end; `"-=0.2"` — 0.2s before end.
|
||||
- **Label**: `"labelName"` — at that label; `"labelName+=0.3"` — 0.3s after label.
|
||||
- **Placement**: `"<"` — start when recently-added animation starts; `">"` — start when recently-added animation ends (default); `"<0.2"` — 0.2s after recently-added animation start.
|
||||
|
||||
Examples:
|
||||
|
||||
```javascript
|
||||
tl.to(".a", { x: 100 }, 0); // at 0
|
||||
tl.to(".b", { y: 50 }, "+=0.5"); // 0.5s after last end
|
||||
tl.to(".c", { opacity: 0 }, "<"); // same start as previous
|
||||
tl.to(".d", { scale: 2 }, "<0.2"); // 0.2s after previous start
|
||||
```
|
||||
|
||||
## Timeline Defaults
|
||||
|
||||
Pass defaults into the timeline so all child tweens inherit:
|
||||
|
||||
```javascript
|
||||
const tl = gsap.timeline({ defaults: { duration: 0.5, ease: "power2.out" } });
|
||||
tl.to(".a", { x: 100 }).to(".b", { y: 50 }); // both use 0.5s and power2.out
|
||||
```
|
||||
|
||||
## Timeline Options (constructor)
|
||||
|
||||
- **paused: true** — create paused; call `.play()` to start.
|
||||
- **repeat**, **yoyo** — same as tweens; apply to whole timeline.
|
||||
- **onComplete**, **onStart**, **onUpdate** — timeline-level callbacks.
|
||||
- **defaults** — vars merged into every child tween.
|
||||
|
||||
## Labels
|
||||
|
||||
Add and use labels for readable, maintainable sequencing:
|
||||
|
||||
```javascript
|
||||
tl.addLabel("intro", 0);
|
||||
tl.to(".a", { x: 100 }, "intro");
|
||||
tl.addLabel("outro", "+=0.5");
|
||||
tl.to(".b", { opacity: 0 }, "outro");
|
||||
tl.play("outro"); // start from "outro"
|
||||
tl.tweenFromTo("intro", "outro"); // pauses the timeline and returns a new Tween that animates the timeline's playhead from intro to outro with no ease.
|
||||
```
|
||||
|
||||
## Nesting Timelines
|
||||
|
||||
Timelines can contain other timelines.
|
||||
|
||||
```javascript
|
||||
const master = gsap.timeline();
|
||||
const child = gsap.timeline();
|
||||
child.to(".a", { x: 100 }).to(".b", { y: 50 });
|
||||
master.add(child, 0);
|
||||
master.to(".c", { opacity: 0 }, "+=0.2");
|
||||
```
|
||||
|
||||
## Controlling Playback
|
||||
|
||||
- **tl.play()** / **tl.pause()**
|
||||
- **tl.reverse()** / **tl.progress(1)** then **tl.reverse()**
|
||||
- **tl.restart()** — from start.
|
||||
- **tl.time(2)** — seek to 2 seconds.
|
||||
- **tl.progress(0.5)** — seek to 50%.
|
||||
- **tl.kill()** — kill timeline and (by default) its children.
|
||||
|
||||
## Official GSAP Best practices
|
||||
|
||||
- ✅ Prefer timelines for sequencing
|
||||
- ✅ Use the **position parameter** (third argument) to place tweens at specific times or relative to labels.
|
||||
- ✅ Add **labels** with `addLabel()` for readable, maintainable sequencing.
|
||||
- ✅ Pass **defaults** into the timeline constructor so child tweens inherit duration, ease, etc.
|
||||
- ✅ Put ScrollTrigger on the timeline (or top-level tween), not on tweens inside a timeline.
|
||||
|
||||
## Do Not
|
||||
|
||||
- ❌ Chain animations with **delay** when a **timeline** can sequence them; prefer `gsap.timeline()` and the position parameter for multi-step animation.
|
||||
- ❌ Forget to pass **defaults** (e.g. `defaults: { duration: 0.5, ease: "power2.out" }`) when many child tweens share the same duration or ease.
|
||||
- ❌ Forget that **duration** on the timeline constructor is not the same as tween duration; timeline “duration” is determined by its children.
|
||||
- ❌ Nest animations that contain a ScrollTrigger; ScrollTriggers should only be on top-level Tweens/Timelines.
|
||||
Reference in New Issue
Block a user