feature-analyzer
Turn ideas into fully formed designs and specs through natural collaborative dialogue. Use when planning new features, designing…
GSAP + Remotion integration for professional motion graphics video production. Timeline orchestration, text splitting, SVG morphing, advanced easing, and reusable effect presets.
$ npx -y skills add notedit/happy-skills --skill gsap-animation --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/gsap-animationContext preview
The summary Claude sees to decide when to auto-load this skill.
GSAP + Remotion integration for professional motion graphics video production. Timeline orchestration, text splitting, SVG morphing, advanced easing, and reusable effect presets.
name: gsap-animation description: GSAP + Remotion integration for professional motion graphics video production. Timeline orchestration, text splitting, SVG morphing, advanced easing, and reusable effect presets. metadata: tags: gsap, remotion, motion-graphics, animation, video, text-animation, svg, timeline, easing
Use this skill when creating Remotion video compositions that need **GSAP's advanced animation capabilities** beyond Remotion's built-in `interpolate()` and `spring()`.
**Use GSAP when you need:**
**Use Remotion native `interpolate()` when:**
**GSAP Licensing:** All plugins are **100% free** since Webflow's 2024 acquisition (SplitText, MorphSVG, DrawSVG, etc.).
---
# In a Remotion project npm install gsap
// src/gsap-setup.ts -- import once at entry point
import gsap from 'gsap';
import { SplitText } from 'gsap/SplitText';
import { MorphSVGPlugin } from 'gsap/MorphSVGPlugin';
import { DrawSVGPlugin } from 'gsap/DrawSVGPlugin';
import { MotionPathPlugin } from 'gsap/MotionPathPlugin';
import { ScrambleTextPlugin } from 'gsap/ScrambleTextPlugin';
import { CustomEase } from 'gsap/CustomEase';
import { CustomBounce } from 'gsap/CustomBounce';
import { CustomWiggle } from 'gsap/CustomWiggle';
gsap.registerPlugin(
SplitText, MorphSVGPlugin, DrawSVGPlugin, MotionPathPlugin,
ScrambleTextPlugin, CustomEase, CustomBounce, CustomWiggle,
);
export { gsap };---
The bridge between GSAP and Remotion. Creates a paused timeline, seeks it to `frame / fps` every frame.
import { useCurrentFrame, useVideoConfig } from 'remotion';
import gsap from 'gsap';
import { useRef, useEffect } from 'react';
function useGSAPTimeline(
buildTimeline: (tl: gsap.core.Timeline, container: HTMLDivElement) => void
) {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const containerRef = useRef<HTMLDivElement>(null);
const tlRef = useRef<gsap.core.Timeline | null>(null);
useEffect(() => {
if (!containerRef.current) return;
const ctx = gsap.context(() => {
const tl = gsap.timeline({ paused: true });
buildTimeline(tl, containerRef.current!);
tlRef.current = tl;
}, containerRef);
return () => { ctx.revert(); tlRef.current = null; };
}, []);
useEffect(() => {
if (tlRef.current) tlRef.current.seek(frame / fps);
}, [frame, fps]);
return containerRef;
}**For SplitText (needs font loading):**
import { delayRender, continueRender } from 'remotion';
function useGSAPWithFonts(
buildTimeline: (tl: gsap.core.Timeline, container: HTMLDivElement) => void
) {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const containerRef = useRef<HTMLDivElement>(null);
const tlRef = useRef<gsap.core.Timeline | null>(null);
const [handle] = useState(() => delayRender());
useEffect(() => {
document.fonts.ready.then(() => {
if (!containerRef.current) return;
const ctx = gsap.context(() => {
const tl = gsap.timeline({ paused: true });
buildTimeline(tl, containerRef.current!);
tlRef.current = tl;
}, containerRef);
continueRender(handle);
return () => { ctx.revert(); };
});
}, []);
useEffect(() => {
if (tlRef.current) tlRef.current.seek(frame / fps);
}, [frame, fps]);
return containerRef;
}---
const TextReveal: React.FC<{ text: string }> = ({ text }) => {
const containerRef = useGSAPWithFonts((tl, container) => {
const split = SplitText.create(container.querySelector('.heading')!, {
type: 'chars,words,lines', mask: 'lines',
});
tl.from(split.chars, {
y: 100, opacity: 0, duration: 0.6, stagger: 0.03, ease: 'power2.out',
});
});
return (
<AbsoluteFill style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
<div ref={containerRef}>
<h1 className="heading" style={{ fontSize: 80, fontWeight: 'bold' }}>{text}</h1>
</div>
</AbsoluteFill>
);
};**Patterns:** | Pattern | SplitText Config | Animation | |---------|-----------------|-----------| | Line reveal | `type: "lines", mask: "lines"` | `from lines: { y: "100%" }` | | Char cascade | `type: "chars"` | `from chars: { y: 50, opacity: 0, rotationX: -90 }` | | Word scale | `type: "words"` | `from words: { scale: 0, opacity: 0 }` | | Char + color | `type: "chars"` | `.from(chars, { y: 50 }).to(chars, { color: "#f00" })` |
> **Determinism warning:** ScrambleText uses internal random character selection. Use `--concurrency=1` when rendering to guarantee frame-perfect reproducibility across renders.
const containerRef = useGSAPTimeline((tl, container) => {
tl.to(container.querySelector('.text')!, {
duration: 2,
scrambleText: { text: 'DECODED', chars: '01', revealDelay: 0.5, speed: 0.3 },
});
});**Char sets:** `"upperCase"`, `"lowerCase"`, `"upperAndLowerCase"`, `"01"`, or custom string.
Colored rectangles scale in behind specific words. Uses SplitText for word-level positioning, then absolutely-positioned `<div>` boxes at lower z-index.
const TextHighligh
Turn ideas into fully formed designs and specs through natural collaborative dialogue. Use when planning new features, designing…
Guided feature development with codebase understanding and architecture focus. Use for implementing features systematically:…
Execute implementation tasks from design documents using markdown checkboxes. Use when (1) implementing features from…
AI-Native Issue-Driven development workflow. From GitHub Issue to merged PR: parse issue, explore codebase, design technical…
Analyze product screenshots to extract feature lists and generate development task checklists. Use when: (1) Analyzing competitor…
Generate article cover images with 5 dimensions (type, palette, rendering, text, mood). Supports cinematic (2.35:1), widescreen…