gsap · mindrally — скилл для Claude Code: анимации на GSAP без просадок
Задаёт агенту правила анимаций на GSAP: трансформы вместо left/top, stagger, таймлайны, ScrollTrigger. Пригодится, когда интерфейс дёргается на слабом железе.
npx skills add Mindrally/skills --skill gsap -a claude-codeЧто делает gsap
Скилл превращает агента в инструктора по GSAP. Внутри — набор правил: как импортировать библиотеку и регистрировать плагины, когда брать gsap.to(), gsap.from() или gsap.fromTo(), как собирать последовательности в таймлайны с метками и перекрытием шагов.
Отдельный блок про производительность. Анимировать советует через x, y, rotation и scale, а не через left и top, потому что трансформы уходят на GPU. Для списков — stagger, для длинных страниц — ScrollTrigger.batch(), для просадок CPU — gsap.ticker.lagSmoothing(). Селекторы велит кэшировать: повторный document.querySelector на каждом вызове — лишняя работа.
Есть разделы про React и SVG. В React предлагает хук useGSAP из @gsap/react со scope на контейнер и очистку таймлайна через tl.kill() при размонтировании. Если анимации на странице нет вообще, скилл только добавит агенту контекст, которого проект не использует.
Какие задачи решает
- убрать дёргание анимации на слабом устройстве
- собрать последовательность появления блоков через таймлайн
- привязать движение элемента к прокрутке страницы
- почистить таймлайны при размонтировании компонента в React
- анимировать обводку SVG-иконки
Примеры запросов агенту
- Сделай появление карточек товара через gsap с stagger, чтобы они не вылетали все сразу
- Перепиши анимацию скролла на ScrollTrigger с pin для секции с преимуществами
- В React-компоненте заведи useGSAP со scope и убери таймлайн при unmount
Как установить gsap
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill gsap -a claude-code2Вручную: положить файлы
~/.claude/skills/gsap/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/gsap/
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill gsap -a codex2Вручную: положить файлы
.agents/skills/gsap/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill gsap -a cursor2Вручную: положить файлы
.cursor/skills/gsap/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install Mindrally/skills gsap2Вручную: положить файлы
.github/skills/gsap/SKILL.md1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill gsap -a gemini-cli2Командой платформы
gemini skills install https://github.com/Mindrally/skills --path gsapВручную: положить файлы
.devin/skills/gsap/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill gsap -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора160
Другие версии gsap
Похожие
Рядом в теме «Фронтенд и UI»
Всё по теме «Фронтенд и UI» →Вопросы о gsap
Как установить gsap в Claude?
Выполните npx skills add Mindrally/skills --skill gsap -a claude-code. Файл скилла окажется в ~/.claude/skills/gsap/SKILL.md.
Что делает скилл gsap?
Даёт агенту правила написания анимаций на GreenSock Animation Platform: таймлайны, stagger, ScrollTrigger, работа с трансформами и очистка в React.
Нужен ли GSAP в проекте, чтобы скилл сработал?
Да, скилл описывает код на GSAP и его плагинах, включая ScrollTrigger и MotionPathPlugin. Без библиотеки в проекте применять эти правила не к чему.
Исходный текст
SKILL.md · Apache-2.0
---
name: gsap
description: Expert guidelines for building high-performance animations with GSAP (GreenSock Animation Platform)
metadata:
maintainer: Mindrally
source: https://github.com/Mindrally/skills
---
# GSAP Animation Guidelines
You are an expert in GSAP (GreenSock Animation Platform), JavaScript, and web animation performance. Follow these guidelines when creating animations.
## Core Principles
### Import and Setup
```javascript
// Modern ES Module import
import gsap from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
// Register plugins
gsap.registerPlugin(ScrollTrigger);
```
### Use gsap.to(), gsap.from(), and gsap.fromTo()
```javascript
// Animate TO a state
gsap.to(".element", { x: 100, duration: 1 });
// Animate FROM a state
gsap.from(".element", { opacity: 0, y: 50, duration: 0.5 });
// Animate FROM one state TO another
gsap.fromTo(".element",
{ opacity: 0 },
{ opacity: 1, duration: 0.5 }
);
```
## Performance Optimization
### Leverage Hardware Acceleration
```javascript
// Use transforms instead of positional properties
gsap.to(".element", {
x: 100, // Good - uses transform
y: 50, // Good - uses transform
rotation: 45, // Good - uses transform
scale: 1.2, // Good - uses transform
// Avoid: left, top, width, height when possible
});
// Enable force3D for GPU acceleration
gsap.to(".element", {
x: 100,
force3D: true // Ensures GPU acceleration
});
```
### Use will-change Wisely
```javascript
// Apply will-change before animation
element.style.willChange = "transform";
gsap.to(element, {
x: 100,
onComplete: () => {
element.style.willChange = "auto"; // Remove after animation
}
});
```
### Stagger for Multiple Elements
```javascript
// Always use stagger for multiple elements
gsap.to(".items", {
opacity: 1,
y: 0,
stagger: 0.1, // Prevents all elements animating at once
duration: 0.5
});
// Advanced stagger options
gsap.to(".grid-items", {
scale: 1,
stagger: {
each: 0.1,
from: "center",
grid: "auto"
}
});
```
### Use Lag Smoothing
```javascript
// Prevent animation stuttering during CPU spikes
gsap.ticker.lagSmoothing(1000, 16);
```
## Timeline Best Practices
### Use Timelines for Complex Sequences
```javascript
const tl = gsap.timeline({
defaults: { duration: 0.5, ease: "power2.out" }
});
tl.to(".header", { y: 0, opacity: 1 })
.to(".content", { y: 0, opacity: 1 }, "-=0.3") // Overlap
.to(".footer", { y: 0, opacity: 1 }, "-=0.3");
```
### Use Labels for Organization
```javascript
const tl = gsap.timeline();
tl.addLabel("start")
.to(".intro", { opacity: 1 })
.addLabel("middle")
.to(".main", { x: 100 })
.addLabel("end")
.to(".outro", { opacity: 0 });
// Jump to label
tl.play("middle");
```
### Control Timelines
```javascript
const tl = gsap.timeline({ paused: true });
// Methods
tl.play();
tl.pause();
tl.reverse();
tl.restart();
tl.seek(1.5); // Go to 1.5 seconds
tl.progress(0.5); // Go to 50%
```
## ScrollTrigger Best Practices
### Basic ScrollTrigger Setup
```javascript
gsap.to(".element", {
x: 500,
scrollTrigger: {
trigger: ".element",
start: "top center",
end: "bottom center",
scrub: true,
markers: false // Enable for debugging only
}
});
```
### Pin Elements Properly
```javascript
ScrollTrigger.create({
trigger: ".panel",
pin: true,
start: "top top",
end: "+=500",
pinSpacing: true
});
```
### Batch ScrollTriggers for Performance
```javascript
ScrollTrigger.batch(".items", {
onEnter: (elements) => {
gsap.to(elements, {
opacity: 1,
y: 0,
stagger: 0.1
});
}
});
```
## React Integration
### Use useGSAP Hook
```javascript
import { useGSAP } from "@gsap/react";
function Component() {
const containerRef = useRef(null);
useGSAP(() => {
gsap.to(".box", { x: 100 });
}, { scope: containerRef }); // Scopes selectors to container
return <div ref={containerRef}>...</div>;
}
```
### Cleanup Animations
```javascript
useGSAP(() => {
const tl = gsap.timeline();
tl.to(".element", { x: 100 });
return () => {
tl.kill(); // Clean up on unmount
};
}, []);
```
## Selector Optimization
### Cache DOM Selectors
```javascript
// Bad - queries DOM on every call
gsap.to(".element", { x: 100 });
gsap.to(".element", { y: 50 });
// Good - cache the reference
const element = document.querySelector(".element");
gsap.to(element, { x: 100 });
gsap.to(element, { y: 50 });
```
### Use gsap.utils for Efficiency
```javascript
// Convert NodeList to Array
const items = gsap.utils.toArray(".items");
// Create reusable selector
const select = gsap.utils.selector(container);
gsap.to(select(".box"), { x: 100 });
```
## Easing
### Use Appropriate Eases
```javascript
// Common eases for UI
gsap.to(".element", { x: 100, ease: "power2.out" }); // Decelerate
gsap.to(".element", { x: 100, ease: "power2.in" }); // Accelerate
gsap.to(".element", { x: 100, ease: "power2.inOut" }); // Both
// Bounce and elastic for playful UI
gsap.to(".element", { y: 0, ease: "bounce.out" });
gsap.to(".element", { scale: 1, ease: "elastic.out(1, 0.3)" });
```
## SVG Animation
### Animate SVG Properties
```javascript
gsap.to("path", {
strokeDashoffset: 0,
duration: 2,
ease: "none"
});
gsap.to("circle", {
attr: { r: 50, cx: 200 },
duration: 1
});
```
## Complex Animations
### Use MotionPath for Path Animation
```javascript
import { MotionPathPlugin } from "gsap/MotionPathPlugin";
gsap.registerPlugin(MotionPathPlugin);
gsap.to(".element", {
motionPath: {
path: "#path",
align: "#path",
autoRotate: true
},
duration: 5
});
```
## Debugging
### Use Markers During Development
```javascript
ScrollTrigger.defaults({
markers: process.env.NODE_ENV === "development"
});
```
### Debug Timeline Progress
```javascript
tl.eventCallback("onUpdate", () => {
console.log(tl.progress());
});
```
## Best Practices Summary
1. Always use transforms over positional properties
2. Use stagger for animating multiple elements
3. Leverage timelines for complex sequences
4. Cache DOM selectors
5. Use useGSAP hook in React
6. Clean up animations on component unmount
7. Enable lag smoothing for smooth playback
8. Test on actual devices, especially mobile
© Mindrally · Apache-2.0 · Mindrally/skills