ux-friction — скилл для Claude Code: анимации, которые мешают
Скилл для диагностики анимаций, из-за которых пользователь ждёт, путается или бросает задачу. Пригодится, когда интерфейс тормозит из-за переходов.
npx skills add dylantarre/animation-principles --skill ux-friction -a claude-codeЧто делает ux-friction
Скилл разбирает анимацию по принципам и для каждого находит типовую причину сбоя. Слишком долгий переход — не совпадает с намерением пользователя. Действие без предупреждения — нет подготовки перед заметным изменением. Резкая остановка — элемент не успевает «осесть». Важное изменение происходит вне зоны внимания — взгляд не ведут за движением. Анимация без причины — пользователь спрашивает, зачем это подпрыгивает.
Внутри — список признаков проблемы: пользователи ждут окончания анимации, не понимают, что произошло, кликают повторно, бросают задачу. Дальше идут быстрые правки: сделать анимацию пропускаемой по клику, срезать длительность, добавить индикатор для всего, что длится дольше 400ms, убрать декоративные эффекты. В примере кода показано, как вернуть pointerEvents и как по клику завершить все анимации через getAnimations().
Есть чек-лист из восьми пунктов — от «можно ли взаимодействовать во время анимации» до проверки на нетерпеливых пользователях, которые быстро кликают. Скилл советует держать микро-взаимодействия в 100–200ms, а переходы — в 200–400ms. Если у вас анимация блокирует ввод, это повод проверить её в первую очередь.
Какие задачи решает
- найти анимацию, из-за которой пользователь ждёт окончания перехода
- объяснить, почему интерфейс не реагирует на повторные клики
- сократить длительность перехода под контекст
- добавить индикатор для долгой анимации
- убрать декоративное движение, которое сбивает с толку
Примеры запросов агенту
- Проверь анимацию модального окна по скиллу ux-friction: пользователи жалуются, что не понимают, что произошло
- Прогони переходы в списке задач через ux-friction и скажи, что сократить
- Почему клики во время анимации не срабатывают? Разбери по ux-friction
Как установить ux-friction
1Через Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill ux-friction -a claude-code2Вручную: положить файлы
~/.claude/skills/ux-friction/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/ux-friction/
1Через Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill ux-friction -a codex2Вручную: положить файлы
.agents/skills/ux-friction/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill ux-friction -a cursor2Вручную: положить файлы
.cursor/skills/ux-friction/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install dylantarre/animation-principles ux-friction2Вручную: положить файлы
.github/skills/ux-friction/SKILL.md1Через Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill ux-friction -a gemini-cli2Командой платформы
gemini skills install https://github.com/dylantarre/animation-principles --path skills/12-by-problem-type/ux-frictionВручную: положить файлы
.devin/skills/ux-friction/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill ux-friction -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о ux-friction
Как установить ux-friction в Claude?
Выполните npx skills add dylantarre/animation-principles --skill ux-friction -a claude-code. Скилл появится в ~/.claude/skills/ux-friction/SKILL.md.
Что делает ux-friction?
Диагностирует анимации, которые блокируют, путают или раздражают пользователя, и предлагает правки по принципам тайминга, подготовки, завершения, акцента и уместности.
Для каких платформ подходит скилл?
Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI и OpenCode — для каждой своя команда установки.
Исходный текст
SKILL.md · MIT
---
name: ux-friction
description: Use when animation causes user confusion, delays task completion, or creates frustration
---
# UX Friction
Diagnose animations that block, confuse, or frustrate users.
## Problem Indicators
- Users wait for animations to finish
- Confusion about what happened
- Repeated clicks/taps during animation
- Users skip or abandon tasks
- "Where did that go?" moments
## Diagnosis by Principle
### Timing
**Issue**: Animation too slow for the context
**Fix**: Match duration to user intent. Micro-interactions: 100-200ms. Transitions: 200-400ms. Never block input.
### Anticipation
**Issue**: Action happens without warning
**Fix**: Add subtle anticipation cues before significant changes. A button press should show feedback before the result.
### Follow Through
**Issue**: Animation ends abruptly
**Fix**: Let elements settle naturally. Sudden stops feel broken. Add slight overshoot and settle.
### Staging
**Issue**: Important changes happen outside focus
**Fix**: Draw attention to where change occurs. If content moves, guide the eye with motion.
### Appeal
**Issue**: Animation feels arbitrary
**Fix**: Every animation should have clear purpose. If users question "why does this bounce?", remove it.
## Quick Fixes
1. **Make animations skippable** - Click/tap should complete or skip
2. **Reduce duration by 30%** - Most animations are too slow
3. **Add progress indicators** - For anything over 400ms
4. **Animate in user's focus area** - Don't move things peripherally
5. **Remove decorative animations** - If it doesn't help, it hurts
## Troubleshooting Checklist
- [ ] Can users interact during animation?
- [ ] Is duration under 400ms for transitions?
- [ ] Does animation communicate state change?
- [ ] Is the animation skippable if lengthy?
- [ ] Does motion guide attention correctly?
- [ ] Is there feedback for user input?
- [ ] Would removing animation hurt understanding?
- [ ] Test with impatient users (click rapidly)
## Pattern
```js
// Allow interaction during animation
element.style.pointerEvents = 'auto';
// Make animation skippable
element.addEventListener('click', () => {
element.getAnimations().forEach(a => a.finish());
});
```
© dylantarre · MIT · dylantarre/animation-principles