mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-10 22:20:14 +00:00
* 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>
81 lines
1.6 KiB
Markdown
81 lines
1.6 KiB
Markdown
# GSAP with React
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
npm install gsap @gsap/react
|
|
```
|
|
|
|
## useGSAP() Hook (Preferred)
|
|
|
|
```javascript
|
|
import { useGSAP } from "@gsap/react";
|
|
gsap.registerPlugin(useGSAP);
|
|
|
|
const containerRef = useRef(null);
|
|
useGSAP(
|
|
() => {
|
|
gsap.to(".box", { x: 100 });
|
|
},
|
|
{ scope: containerRef },
|
|
);
|
|
```
|
|
|
|
- Pass **scope** (ref) so selectors are scoped to the component.
|
|
- Cleanup runs automatically on unmount.
|
|
- Use **contextSafe** for callbacks created after useGSAP executes:
|
|
|
|
```javascript
|
|
useGSAP(
|
|
(context, contextSafe) => {
|
|
const onClick = contextSafe(() => {
|
|
gsap.to(ref.current, { rotation: 180 });
|
|
});
|
|
ref.current.addEventListener("click", onClick);
|
|
return () => ref.current.removeEventListener("click", onClick);
|
|
},
|
|
{ scope: container },
|
|
);
|
|
```
|
|
|
|
## Dependency Array and revertOnUpdate
|
|
|
|
```javascript
|
|
useGSAP(
|
|
() => {
|
|
/* gsap code */
|
|
},
|
|
{
|
|
dependencies: [endX],
|
|
scope: container,
|
|
revertOnUpdate: true, // reverts + re-runs on dependency change
|
|
},
|
|
);
|
|
```
|
|
|
|
## gsap.context() in useEffect (Fallback)
|
|
|
|
When @gsap/react isn't available:
|
|
|
|
```javascript
|
|
useEffect(() => {
|
|
const ctx = gsap.context(() => {
|
|
gsap.to(".box", { x: 100 });
|
|
}, containerRef);
|
|
return () => ctx.revert();
|
|
}, []);
|
|
```
|
|
|
|
Always return `ctx.revert()` in cleanup.
|
|
|
|
## SSR (Next.js)
|
|
|
|
GSAP runs in the browser. Keep all GSAP code inside useGSAP or useEffect.
|
|
|
|
## Do Not
|
|
|
|
- Target by selector without a scope — always pass scope.
|
|
- Skip cleanup — always revert context or kill tweens on unmount.
|
|
- Run GSAP during SSR.
|
|
- Register plugins inside components that re-render — register once at app level.
|