* refactor(skills): consolidate 15 skills into 3 for better trigger reliability Merge 9 GSAP skills (core, timeline, scrolltrigger, plugins, utils, react, frameworks, performance, effects) and 6 HyperFrames skills (compose, captions, tts, audio-reactive, marker-highlight, cli) into 3 consolidated skills: - `gsap` — core API + timelines + performance in SKILL.md; scrolltrigger, plugins, utils, react, frameworks, effects in references/ - `hyperframes` — composition authoring rules in SKILL.md; captions, tts, audio-reactive, marker-highlight in references/ - `hyperframes-cli` — CLI commands (init, lint, preview, render, etc.) Why: With 15 separate skills, agents must correctly trigger the right subset for any task. "Create an animated video with captions" needed 6+ skills to fire — each with ~90% trigger accuracy means ~53% chance of getting all of them. With 3 skills, that same task needs just `hyperframes` + `gsap` (~90% both fire). Progressive disclosure still works via references/ files loaded on demand. Also fixes: CLAUDE.md referenced `window.__GSAP_TIMELINE` (incorrect) — corrected to `window.__timelines`. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(cli): add --skip-skills flag to init command Allow skipping the AI coding skills installation prompt during `hyperframes init` with `--skip-skills`. Useful when skills are already installed or when the user wants to scaffold without them. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(skills): address code review feedback on consolidation Restore content lost during over-compression: - captions: fix overflow to `visible` (not hidden — clips glow effects), add container pattern warning, scale headroom formula, and self-lint placement guidance - audio-reactive: restore sampling frequency pattern (per-frame tl.call loop vs single tween) and textShadow-on-container gotcha - effects/typewriter: restore word rotation, appending words, spacing with static text, and multi-line cursor handoff patterns - effects/audio-visualizer: restore spatial mapping conventions, fetch vs inline loading, WebGL/DOM rendering approaches, and canvas layering - hyperframes-cli: restore --strict-all flag in render flags table Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(cli): update build:copy and template for consolidated skill names - build:copy: reference skills/hyperframes, skills/hyperframes-cli, skills/gsap instead of the old 15 skill directory names - _shared/CLAUDE.md template: update skill table to consolidated names Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4.9 KiB
GSAP Plugins
Register each plugin once before use:
import gsap from "gsap";
import { ScrollToPlugin } from "gsap/ScrollToPlugin";
import { Flip } from "gsap/Flip";
gsap.registerPlugin(ScrollToPlugin, Flip);
Table of Contents
- ScrollToPlugin
- ScrollSmoother
- Flip
- Draggable + Inertia
- Observer
- SplitText
- ScrambleText
- DrawSVG
- MorphSVG
- MotionPath
- CustomEase / EasePack
- Physics2D / PhysicsProps
- GSDevTools
- PixiPlugin
ScrollToPlugin
Animate scroll position (window or scrollable element).
gsap.to(window, { scrollTo: { y: "#section", offsetY: 50 }, duration: 1 });
gsap.to(scrollContainer, { scrollTo: { x: "max" }, duration: 1 });
ScrollSmoother
Smooth scroll wrapper. Requires ScrollTrigger + specific DOM structure (#smooth-wrapper > #smooth-content).
Flip
FLIP layout transitions: capture state, change DOM, animate from old to new.
const state = Flip.getState(".item");
// change DOM (reorder, add/remove, change classes)
Flip.from(state, { duration: 0.5, ease: "power2.inOut" });
Options: absolute, nested, scale, simple, duration, ease.
Draggable
Makes elements draggable/spinnable/throwable.
gsap.registerPlugin(Draggable, InertiaPlugin);
Draggable.create(".box", { type: "x,y", bounds: "#container", inertia: true });
Draggable.create(".knob", { type: "rotation" });
Types: "x", "y", "x,y", "rotation", "scroll". Options: bounds, inertia, edgeResistance, cursor, drag callbacks.
Inertia (InertiaPlugin)
Momentum after release with Draggable, or track velocity of any property:
InertiaPlugin.track(".box", "x");
gsap.to(obj, { inertia: { x: "auto" } });
Observer
Normalized pointer/scroll input across devices. Use for swipe/gesture detection.
Observer.create({
target: "#area",
onUp: () => {},
onDown: () => {},
tolerance: 10,
});
SplitText
Split text into chars, words, lines for per-unit animation.
const split = SplitText.create(".heading", { type: "words, chars" });
gsap.from(split.chars, { opacity: 0, y: 20, stagger: 0.03 });
// later: split.revert()
Key options: type (comma-separated: chars/words/lines), charsClass/wordsClass/linesClass, aria ("auto"/"hidden"/"none"), autoSplit + onSplit(self) for font-safe re-splitting, mask (lines/words/chars for reveal effects), tag, ignore, smartWrap, propIndex.
Tips: Split only what's animated. For custom fonts, use autoSplit: true with onSplit(). Avoid text-wrap: balance.
ScrambleText
Scramble/glitch text effect.
gsap.to(".text", { scrambleText: { text: "New message", chars: "01", revealDelay: 0.5 } });
DrawSVG
Animate SVG stroke reveal (stroke-dashoffset/dasharray). Element must have stroke and stroke-width.
gsap.from("#path", { drawSVG: 0, duration: 1 }); // nothing to full stroke
gsap.to("#path", { drawSVG: "20% 80%", duration: 1 }); // partial segment
drawSVG value = visible segment: "start end" in % or length. Single value (e.g. 0) means start is 0.
MorphSVG
Morph one SVG shape into another. Handles different point counts.
MorphSVGPlugin.convertToPath("circle, rect, ellipse, line");
gsap.to("#diamond", { morphSVG: "#lightning", duration: 1 });
// object form: { shape, type: "rotational", shapeIndex, smooth, curveMode }
Use shapeIndex: "log" to find optimal value. type: "rotational" avoids kinks.
MotionPath
Animate along an SVG path.
gsap.to(".dot", {
motionPath: { path: "#path", align: "#path", alignOrigin: [0.5, 0.5], autoRotate: true },
});
CustomEase/EasePack
Custom curves beyond built-in eases:
const ease = CustomEase.create("name", ".17,.67,.83,.67");
// or SVG path data for complex curves
const hop = CustomEase.create("hop", "M0,0 C0,0 0.056,0.442 ...");
EasePack adds SlowMo, RoughEase, ExpoScaleEase. CustomWiggle for oscillation. CustomBounce for configurable bounces.
Physics
Physics2D
gsap.to(".ball", { physics2D: { velocity: 250, angle: 80, gravity: 500 }, duration: 2 });
PhysicsProps
gsap.to(".obj", {
physicsProps: { x: { velocity: 100, end: 300 }, y: { velocity: -50, acceleration: 200 } },
duration: 2,
});
GSDevTools
Timeline scrubbing UI for development. Do not ship to production.
GSDevTools.create({ animation: tl });
PixiPlugin
Integrates GSAP with PixiJS display objects.
gsap.to(sprite, { pixi: { x: 200, scale: 1.5 }, duration: 1 });
Do Not
- Use a plugin without registering it first.
- Ship GSDevTools to production.
- Forget to revert SplitText instances on unmount.