framer-motion-gestures — скилл для Claude Code: жесты в Framer Motion
Скилл для анимаций жестов в Framer Motion: перетаскивание, панорамирование, нажатие, наведение, фокус. Пригодится, когда собираешь интерактивные элементы и нужны подсказки по пропсам и ограничениям.
npx skills add C-Jeril/framer-motion-skills --skill framer-motion-gestures -a claude-codeЧто делает framer-motion-gestures
Скилл описывает, как включать жесты в Framer Motion. Перетаскивание задаётся пропсом drag со значением "x", "y" или true, границы движения — через dragConstraints в виде объекта с left, right, top, bottom или через ref на контейнер. Для отдачи за края есть dragElastic, для инерции после отпускания — dragMomentum и dragTransition с пружиной.
Кроме drag в скилле разобраны whileTap, whileHover и whileFocus, колбэки onDrag, onDragStart, onDragEnd, onHoverStart, onHoverEnd. В колбэки приходит объект с точкой, скоростью и смещением от старта. Панорамирование описано как низкоуровневое отслеживание указателя без инерции — в отличие от drag с визуальной отдачей и ограничениями.
Есть раздел с ошибками: не ставить drag без dragConstraints, если элемент должен оставаться в границах, не задирать dragElastic и не анимировать конфликтующие свойства вроде scale и x одновременно. События drag срабатывают только после того, как указатель пройдёт порог смещения — это повод проверить логику, если обработчик молчит на мелких движениях. Скилл входит в набор framer-motion-skills, рядом с ним идут скиллы для базовой анимации, вариантов и layout-анимаций.
Какие задачи решает
- включить перетаскивание элемента по одной оси
- удержать перетаскиваемый блок внутри контейнера
- добавить отдачу и возврат при выходе за границы
- настроить пружину для инерции после отпускания
- повесить анимацию на нажатие, наведение или фокус
Примеры запросов агенту
- Сделай карточку с drag="x" и ограничениями по ширине контейнера
- Добавь whileTap и whileHover кнопке с масштабированием
- Настрой dragTransition с пружиной для перетаскиваемого блока
Как установить framer-motion-gestures
1Через Skills CLI (Vercel)
npx skills add C-Jeril/framer-motion-skills --skill framer-motion-gestures -a claude-code2Вручную: положить файлы
~/.claude/skills/framer-motion-gestures/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/framer-motion-gestures/
1Через Skills CLI (Vercel)
npx skills add C-Jeril/framer-motion-skills --skill framer-motion-gestures -a codex2Вручную: положить файлы
.agents/skills/framer-motion-gestures/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add C-Jeril/framer-motion-skills --skill framer-motion-gestures -a cursor2Вручную: положить файлы
.cursor/skills/framer-motion-gestures/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install C-Jeril/framer-motion-skills framer-motion-gestures2Вручную: положить файлы
.github/skills/framer-motion-gestures/SKILL.md1Через Skills CLI (Vercel)
npx skills add C-Jeril/framer-motion-skills --skill framer-motion-gestures -a gemini-cli2Командой платформы
gemini skills install https://github.com/C-Jeril/framer-motion-skills --path skills/framer-motion-gesturesВручную: положить файлы
.devin/skills/framer-motion-gestures/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add C-Jeril/framer-motion-skills --skill framer-motion-gestures -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о framer-motion-gestures
Как установить framer-motion-gestures в Claude?
Выполни npx skills add C-Jeril/framer-motion-skills --skill framer-motion-gestures -a claude-code. Скилл окажется в ~/.claude/skills/framer-motion-gestures/SKILL.md.
Что делает framer-motion-gestures?
Даёт агенту справочник по жестам Framer Motion: пропсы drag, ограничения, инерция, а также whileTap, whileHover и whileFocus с их колбэками.
Чем drag отличается от pan в этом скилле?
Drag — это перетаскивание с визуальной отдачей, инерцией и ограничениями. Pan описан как низкоуровневое отслеживание указателя без инерции.
Исходный текст
SKILL.md · MIT
---
name: framer-motion-gestures
description: Official Framer Motion skill for gesture animations — drag, pan, tap, hover, focus, touch animations. Use when building interactive elements with drag, pan, tap, hover, or touch gestures, or when asking about Framer Motion drag constraints, gesture handlers, or interactive animations.
license: MIT
---
# Framer Motion Gestures
## When to Use This Skill
Apply when implementing gesture-driven animations: drag, pan, tap, hover, focus, or touch interactions. When the user asks about drag-and-drop, interactive elements, or gesture-based UI in Framer Motion.
**Related skills:** For core animation use **framer-motion-core**; for variants use **framer-motion-variants**; for layout animations use **framer-motion-layout**.
## Drag
Enable dragging with the `drag` prop:
```jsx
<motion.div
drag="x"
dragConstraints={{ left: -100, right: 100 }}
whileDrag={{ scale: 1.1, cursor: "grabbing" }}
/>
```
### Drag Props
| Prop | Type | Description |
|------|------|-------------|
| **drag** | `bool \| "x" \| "y"` | Enable drag on axis |
| **dragConstraints** | `object \| RefObject` | Movement constraints |
| **dragMomentum** | `boolean` | Continue momentum after release (default: true) |
| **dragElastic** | `number \| object` | Elasticity of bounds (default: 0) |
| **dragTransition** | `Transition` | Spring config for momentum |
| **whileDrag** | `MotionProps` | Animation while dragging |
| **onDrag** | `function` | Callback during drag |
| **onDragStart** | `function` | Callback when drag starts |
| **onDragEnd** | `function` | Callback when drag ends |
### Drag Constraints
```jsx
<motion.div
drag
dragConstraints={{
left: -100,
right: 100,
top: -50,
bottom: 50
}}
/>
```
### Ref-based Constraints
```jsx
function Draggable() {
const constraintsRef = useRef(null);
return (
<>
<motion.div
ref={constraintsRef}
style={{
width: 500,
height: 500,
backgroundColor: "#eee"
}}
/>
<motion.div
drag
dragConstraints={constraintsRef}
/>
</>
);
}
```
## Pan
Pan is similar to drag but for pointer/touch:
```jsx
<motion.div
drag="x"
onDrag={(e, info) => {
console.log("Position:", info.point);
console.log("Velocity:", info.velocity);
}}
/>
```
### Pan vs Drag
- **Drag**: Mouse/touch with visual feedback, momentum, and constraints
- **Pan**: Lower-level pointer tracking without momentum
## Tap (whileTap)
Animation when pressed:
```jsx
<motion.button
whileTap={{ scale: 0.95, opacity: 0.8 }}
whileHover={{ scale: 1.05 }}
>
Click me
</motion.button>
```
## Hover (whileHover)
Animation on hover:
```jsx
<motion.div
whileHover={{ scale: 1.1, backgroundColor: "#ff0000" }}
style={{ width: 100, height: 100, backgroundColor: "#00ff00" }}
/>
```
### onHoverStart / onHoverEnd
```jsx
<motion.div
onHoverStart={() => console.log("Hover started")}
onHoverEnd={() => console.log("Hover ended")}
/>
```
## Focus (whileFocus)
Animation when focused (keyboard):
```jsx
<motion.input
whileFocus={{ scale: 1.05, borderColor: "#00ff00" }}
style={{ borderWidth: 2 }}
/>
```
## Drag with Spring Physics
```jsx
<motion.div
drag="x"
dragConstraints={{ left: -200, right: 200 }}
dragTransition={{
type: "spring",
stiffness: 300,
damping: 20,
mass: 1
}}
/>
```
## Drag Controls with Constraints
```jsx
function DraggableBox() {
const constraintsRef = useRef(null);
return (
<>
<motion.div
ref={constraintsRef}
style={{
width: 500,
height: 500,
backgroundColor: "#f0f0f0"
}}
/>
{[1, 2, 3].map(i => (
<motion.div
key={i}
drag
dragConstraints={constraintsRef}
dragMomentum={false}
whileDrag={{ scale: 1.1 }}
/>
))}
</>
);
}
```
## Swipe Detection
```jsx
function Swipeable() {
const x = useMotionValue(0);
const { scrollYProgress } = useScroll();
const opacity = useTransform(x, [-100, 0, 100], [0, 1, 0]);
return (
<motion.div
style={{ x, opacity }}
drag="x"
dragConstraints={{ left: 0, right: 0 }}
dragElastic={1}
/>
);
}
```
## Gesture State Info
Callbacks receive `PointInfo` and `DragInfo`:
```jsx
onDrag={(e, info) => {
info.point // { x, y } position
info.velocity // { x, y } velocity
info.offset // { x, y } offset from start
}}
```
## Best practices
- ✅ Use **dragConstraints** to keep elements within bounds.
- ✅ Use **dragElastic** for bounce-back effects.
- ✅ Use **whileDrag** for visual feedback during drag.
- ✅ Use **dragMomentum** for natural continuation.
- ✅ Use **dragTransition** with spring for physics-based drag.
- ✅ Use refs for constraints when dragging within a container.
## Do Not
- ❌ Use `drag` without `dragConstraints` if the element should stay within bounds.
- ❌ Forget that drag events only fire after the pointer moves a threshold.
- ❌ Use excessive `dragElastic` — it can cause visual glitches.
- ❌ Animate conflicting properties during drag (e.g., scale and x).
### Learn More
https://www.framer.com/motion/gestures/
https://www.framer.com/motion/drag/
© C-Jeril · MIT · C-Jeril/framer-motion-skills