install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/pproenca/dot-skills/emilkowal-animations" ~/.claude/skills/comeonoliver-skillshub-emilkowal-animations && rm -rf "$T"
manifest:
skills/pproenca/dot-skills/emilkowal-animations/SKILL.mdsource content
Emil Kowalski Animation Best Practices
Comprehensive animation guide for web interfaces based on Emil Kowalski's teachings, open-source libraries (Sonner, Vaul), and his animations.dev course. Contains 43 rules across 7 categories, prioritized by impact.
When to Apply
Reference these guidelines when:
- Adding animations to React components
- Choosing easing curves or timing values
- Implementing gesture-based interactions (swipe, drag)
- Building toast notifications or drawer components
- Optimizing animation performance
- Ensuring animation accessibility
Rule Categories by Priority
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Easing Selection | CRITICAL | |
| 2 | Timing & Duration | CRITICAL | |
| 3 | Property Selection | HIGH | |
| 4 | Transform Techniques | HIGH | |
| 5 | Interaction Patterns | MEDIUM-HIGH | |
| 6 | Strategic Animation | MEDIUM | |
| 7 | Accessibility & Polish | MEDIUM | |
Quick Reference
1. Easing Selection (CRITICAL)
- Use ease-out as your default easingease-out-default
- Use custom cubic-bezier over built-in CSSease-custom-curves
- Use ease-in-out for on-screen movementease-in-out-onscreen
- Use spring animations for natural motionease-spring-natural
- Use iOS-style easing for drawer componentsease-ios-drawer
- Match easing to animation contextease-context-matters
2. Timing & Duration (CRITICAL)
- Keep UI animations under 300mstiming-300ms-max
- Faster animations improve perceived performancetiming-faster-better
- Use asymmetric timing for press and releasetiming-asymmetric
- Delay initial tooltips, instant subsequent onestiming-tooltip-delay
- Use 500ms duration for drawer animationstiming-drawer-500ms
3. Property Selection (HIGH)
- Animate only transform and opacityprops-transform-opacity
- Use hardware-accelerated animations when main thread is busyprops-hardware-accelerated
- Use will-change to prevent 1px shiftprops-will-change
- Avoid CSS variables for drag animationsprops-avoid-css-variables
- Use clip-path for layout-free revealsprops-clip-path-performant
4. Transform Techniques (HIGH)
- Scale buttons to 0.97 on presstransform-scale-097
- Never animate from scale(0)transform-never-scale-zero
- Use percentage values for translateYtransform-percentage-translate
- Make animations origin-awaretransform-origin-aware
- Scale transforms affect childrentransform-scale-children
- Use preserve-3d for 3D transform effectstransform-3d-preserve
5. Interaction Patterns (MEDIUM-HIGH)
- Make animations interruptibleinteract-interruptible
- Use momentum-based dismissalinteract-momentum-dismiss
- Damp drag at boundariesinteract-damping
- Resolve scroll and drag conflictsinteract-scroll-drag-conflict
- Implement velocity-aware snap pointsinteract-snap-points
- Allow upward drag with frictioninteract-friction-upward
- Use pointer capture for drag operationsinteract-pointer-capture
6. Strategic Animation (MEDIUM)
- Never animate keyboard-initiated actionsstrategy-keyboard-no-animate
- Consider interaction frequency before animatingstrategy-frequency-matters
- Every animation must have a purposestrategy-purpose-required
- Provide immediate feedback on all actionsstrategy-feedback-immediate
- Marketing sites are the exceptionstrategy-marketing-exception
7. Accessibility & Polish (MEDIUM)
- Respect prefers-reduced-motionpolish-reduced-motion
- Use opacity as reduced motion fallbackpolish-opacity-fallback
- Use useReducedMotion hook in Framer Motionpolish-framer-hook
- Don't remove all animation for reduced motionpolish-dont-remove-all
- Use blur to bridge animation statespolish-blur-bridge
- Use clip-path for tab transitionspolish-clip-path-tabs
- Implement toast stacking with scale and offsetpolish-toast-stacking
- Trigger scroll animations at appropriate thresholdpolish-scroll-reveal
- Fill gaps between hoverable elementspolish-hover-gap-fill
- Stagger child animations for orchestrationpolish-stagger-children
Key Values Reference
| Value | Usage |
|---|---|
| iOS-style drawer/sheet animation |
| Button press feedback |
| Minimum enter scale (never scale(0)) |
| Standard UI transition |
| Maximum duration for UI animations |
| Drawer animation duration |
| Velocity threshold for momentum dismiss |
| Scroll-reveal viewport threshold |
| Toast stack offset |
Reference Files
| File | Description |
|---|---|
| references/_sections.md | Category definitions and ordering |
| assets/templates/_template.md | Template for new rules |
| metadata.json | Version and reference information |