emilkowal-animations
pproenca/dot-skills
Emil Kowalski's animation best practices for React, CSS, and Framer Motion.
What is emilkowal-animations?
A comprehensive guide with 58 rules across 8 categories for building performant, accessible animations in web interfaces. Use when implementing transitions, easing, gestures, toasts, drawers, or any motion-based UI.
- Provides 58 prioritized animation rules organized by impact (easing, timing, property selection, transforms, interactions, strategy, accessibility, Tailwind v4)
- Covers easing selection with custom curves, spring configurations, and context-aware choices
- Defines critical timing constraints (300ms max for UI, 500ms for drawers, asymmetric press/release)
- Guides property selection for performance (transform and opacity only, hardware acceleration, will-change)
- Documents interaction patterns including interruptible animations, momentum-based dismissal, and gesture handling
- Includes accessibility best practices (prefers-reduced-motion, opacity fallbacks, gentle motion retention)
How to install emilkowal-animations
npx skills add https://github.com/pproenca/dot-skills --skill emilkowal-animationsHow to use emilkowal-animations
- 1.Reference the rule categories by priority when starting an animation task
- 2.Look up the specific rule prefix (ease-, timing-, props-, transform-, interact-, strategy-, polish-, tw-) matching your need
- 3.Apply the rule to your implementation (CSS, React, Framer Motion, or Tailwind v4)
- 4.For Tailwind v4 projects, use the tw- category rules to express principles with proper utilities
- 5.Test animations in slow motion and review with fresh eyes before shipping
- 6.Verify accessibility with prefers-reduced-motion and pointer media queries
Use cases
- Implementing toast notifications or drawer components with proper easing and timing
- Optimizing button press feedback with scale transforms and asymmetric timing
- Building gesture-based interactions (swipe, drag) with momentum and damping
- Choosing between CSS, Framer Motion, or Tailwind v4 for animation implementation
- Reviewing animations for performance, accessibility, and purposefulness before shipping
- React developers building interactive UI components
- Frontend engineers optimizing animation performance
- Designers and developers implementing gesture-based interactions
- Teams using Framer Motion, Sonner, or Vaul libraries
- Projects adopting Tailwind CSS v4 with animation utilities
emilkowal-animations FAQ
Use it when writing, reviewing, or implementing animations in React, CSS, or Framer Motion, especially for transitions, easing, gestures, toasts, drawers, or any motion-based UI.
Easing selection (use ease-out by default, custom curves over built-in CSS) and timing (keep UI animations under 300ms, use 500ms for drawers) are marked CRITICAL and have the highest impact.
Yes. Category 8 provides Tailwind v4-specific utilities (tw- prefix) to express the animation principles, but the raw CSS and Framer Motion rules remain the source of truth.
Respect prefers-reduced-motion by using opacity fallbacks, the useReducedMotion hook in Framer Motion, and keeping gentle animations rather than removing all motion.
Animate only transform and opacity, use hardware acceleration when the main thread is busy, and avoid animating CSS variables during drag operations.
Full instructions (SKILL.md)
Source of truth, from pproenca/dot-skills.
name: emilkowal-animations description: Emil Kowalski's animation best practices for web interfaces. Use when writing, reviewing, or implementing animations in React, CSS, or Framer Motion. Triggers on tasks involving transitions, easing, gestures, toasts, drawers, or motion.
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 58 rules across 8 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
- Expressing any of the above with Tailwind CSS v4 utilities (see the
tw-category)
Rule Categories by Priority
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Easing Selection | CRITICAL | ease- |
| 2 | Timing & Duration | CRITICAL | timing- |
| 3 | Property Selection | HIGH | props- |
| 4 | Transform Techniques | HIGH | transform- |
| 5 | Interaction Patterns | MEDIUM-HIGH | interact- |
| 6 | Strategic Animation | MEDIUM | strategy- |
| 7 | Accessibility & Polish | MEDIUM | polish- |
| 8 | Tailwind v4 Utilities | MEDIUM | tw- |
Quick Reference
1. Easing Selection (CRITICAL)
ease-out-default- Use ease-out as your default easingease-custom-curves- Use custom cubic-bezier over built-in CSSease-in-out-onscreen- Use ease-in-out for on-screen movementease-spring-natural- Use spring animations for natural motionease-spring-config- Configure springs with duration and bounceease-ios-drawer- Use iOS-style easing for drawer componentsease-context-matters- Match easing to animation context
2. Timing & Duration (CRITICAL)
timing-300ms-max- Keep UI animations under 300mstiming-faster-better- Faster animations improve perceived performancetiming-asymmetric- Use asymmetric timing for press and releasetiming-tooltip-delay- Delay initial tooltips, instant subsequent onestiming-drawer-500ms- Use 500ms duration for drawer animations
3. Property Selection (HIGH)
props-transform-opacity- Animate only transform and opacityprops-hardware-accelerated- Use hardware-accelerated animations when main thread is busyprops-will-change- Use will-change to prevent 1px shiftprops-avoid-css-variables- Avoid CSS variables for drag animationsprops-clip-path-performant- Use clip-path for layout-free reveals
4. Transform Techniques (HIGH)
transform-scale-097- Scale buttons to 0.97 on presstransform-never-scale-zero- Never animate from scale(0)transform-percentage-translate- Use percentage values for translateYtransform-origin-aware- Make animations origin-awaretransform-scale-children- Scale transforms affect childrentransform-3d-preserve- Use preserve-3d for 3D transform effectstransform-starting-style- Animate enter states with @starting-style
5. Interaction Patterns (MEDIUM-HIGH)
interact-interruptible- Make animations interruptibleinteract-momentum-dismiss- Use momentum-based dismissalinteract-damping- Damp drag at boundariesinteract-scroll-drag-conflict- Resolve scroll and drag conflictsinteract-snap-points- Implement velocity-aware snap pointsinteract-friction-upward- Allow upward drag with frictioninteract-pointer-capture- Use pointer capture for drag operationsinteract-multitouch- Ignore extra touch points during draginteract-touch-hover- Gate hover animations behind a pointer media query
6. Strategic Animation (MEDIUM)
strategy-keyboard-no-animate- Never animate keyboard-initiated actionsstrategy-frequency-matters- Consider interaction frequency before animatingstrategy-purpose-required- Every animation must have a purposestrategy-feedback-immediate- Provide immediate feedback on all actionsstrategy-marketing-exception- Marketing sites are the exceptionstrategy-cohesion- Match motion to the component's personalitystrategy-review-fresh-eyes- Review animations in slow motion and the next day
7. Accessibility & Polish (MEDIUM)
polish-reduced-motion- Respect prefers-reduced-motionpolish-opacity-fallback- Use opacity as reduced motion fallbackpolish-framer-hook- Use useReducedMotion hook in Framer Motionpolish-dont-remove-all- Keep gentle animation for reduced motionpolish-blur-bridge- Use blur to bridge animation statespolish-clip-path-tabs- Use clip-path for tab transitionspolish-toast-stacking- Implement toast stacking with scale and offsetpolish-scroll-reveal- Trigger scroll animations at appropriate thresholdpolish-hover-gap-fill- Fill gaps between hoverable elementspolish-stagger-children- Stagger child animations for orchestration
8. Tailwind v4 Utilities (MEDIUM)
Express the principles above with proper Tailwind CSS v4 utilities. Applies only to Tailwind v4 projects; the raw-CSS and Framer Motion rules above remain the source of truth.
tw-ease-duration-defaults- Set ease-out and a sub-300ms duration explicitlytw-custom-easing-theme- Register custom easing curves as @theme tokenstw-press-scale- Use active:scale-[0.97] for button press feedbacktw-asymmetric-timing- Split press and release timing with active:durationtw-starting-enter- Animate enter states with the starting: varianttw-reduced-motion- Gate movement behind motion-safe / motion-reducetw-origin-aware- Set transform-origin with origin-* utilitiestw-will-change- Scope will-change-transform to the active gesture
Key Values Reference
| Value | Usage |
|---|---|
cubic-bezier(0.23, 1, 0.32, 1) | Strong ease-out for UI interactions |
cubic-bezier(0.77, 0, 0.175, 1) | Strong ease-in-out for on-screen movement |
cubic-bezier(0.32, 0.72, 0, 1) | iOS-style drawer/sheet animation |
scale(0.97) | Button press feedback |
scale(0.95) | Minimum enter scale (never scale(0)) |
200ms ease-out | Standard UI transition |
300ms | Maximum duration for UI animations |
500ms | Drawer animation duration |
0.11 px/ms | Velocity threshold for momentum dismiss |
100px | Scroll-reveal viewport threshold |
14px | Toast stack offset |
Duration by Element
Pick duration by how often the element is seen and how much it moves. Keep UI animations under 300ms.
| Element | Duration |
|---|---|
| Button press feedback | 100–160ms |
| Tooltips, small popovers | 125–200ms |
| Dropdowns, selects | 150–250ms |
| Modals, drawers | 200–500ms |
| Marketing / explanatory | Can be longer |
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 |
Related skills
More from pproenca/dot-skills and the wider catalog.

zod
Zod schema validation best practices for type safety, parsing, and error handling.

clean-architecture
Clean Architecture principles and best practices for designing maintainable, testable software systems.

react-hook-form
Performance optimization guide for React Hook Form client-side forms with 45 rules across 8 categories.

vitest
Vitest testing framework patterns for test setup, async testing, mocking with vi.*, snapshots, and test performance (formerly test-vitest). This skill should be used when writing or debugging Vitest tests. This skill does NOT cover TDD methodology (use test-tdd skill), API mocking with MSW (use test-msw skill), or Jest-specific APIs.

nuqs
nuqs (type-safe URL query state) best practices for Next.js and other React frameworks. This skill should be used when writing, reviewing, or refactoring code that uses nuqs for URL state management. Triggers on tasks involving useQueryState, useQueryStates, search params, URL state, query parameters, nuqs parsers, limitUrlUpdates, Standard Schema, NuqsAdapter, or Next.js routing with state.

code-simplifier
Code simplification skill for improving clarity, consistency, and maintainability while preserving exact behavior. Use when simplifying code, reducing complexity, cleaning up recent changes, applying refactoring patterns, or improving readability. Triggers on tasks involving code cleanup, simplification, refactoring, or readability improvements.