Skill

animation-motion-design

Install
1
Install the plugin
$
npx claudepluginhub yonatangross/orchestkit --plugin ork

Want just this skill?

Add to a custom plugin, then install with one command.

Description

Animation and motion design patterns using Motion library (formerly Framer Motion) and View Transitions API. Use when implementing component animations, page transitions, micro-interactions, gesture-driven UIs, or ensuring motion accessibility with prefers-reduced-motion.

Tool Access

This skill is limited to using the following tools:

ReadGlobGrepWebFetchWebSearch
Supporting Assets
View in Repository
references/animation-presets-library.md
references/micro-interactions-catalog.md
references/motion-vs-view-transitions.md
rules/_sections.md
rules/_template.md
rules/motion-accessibility.md
rules/motion-exit.md
rules/motion-gestures.md
rules/motion-layout.md
rules/motion-performance.md
rules/view-transitions-api.md
test-cases.json
Skill Content

Animation & Motion Design

Patterns for building performant, accessible animations using Motion (formerly Framer Motion, 18M+ weekly npm downloads) and the View Transitions API (cross-browser support in 2026). Covers layout animations, gesture interactions, exit transitions, micro-interactions, and motion accessibility.

Quick Reference

RuleFileImpactWhen to Use
Layout Animationsrules/motion-layout.mdHIGHShared layout transitions, FLIP animations, layoutId
Gesture Interactionsrules/motion-gestures.mdHIGHDrag, hover, tap with spring physics
Exit Animationsrules/motion-exit.mdHIGHAnimatePresence, unmount transitions
View Transitions APIrules/view-transitions-api.mdHIGHPage navigation, cross-document transitions
Motion Accessibilityrules/motion-accessibility.mdCRITICALprefers-reduced-motion, cognitive load
Motion Performancerules/motion-performance.mdHIGH60fps, GPU compositing, layout thrash

Total: 6 rules across 3 categories

Decision Table — Motion vs View Transitions API

ScenarioRecommendationWhy
Component mount/unmountMotionAnimatePresence handles lifecycle
Page navigation transitionsView Transitions APIBuilt-in browser support, works with any router
Complex interruptible animationsMotionSpring physics, gesture interruption
Simple crossfade between pagesView Transitions APIZero JS bundle cost
Drag/reorder interactionsMotiondrag prop with layout animations
Shared element across routesView Transitions APIviewTransitionName CSS property
Scroll-triggered animationsMotionuseInView, useScroll hooks
Multi-step orchestrated sequencesMotionstaggerChildren, variants

Quick Start

Motion — Component Animation

import { motion, AnimatePresence } from "motion/react"

const fadeInUp = {
  initial: { opacity: 0, y: 20 },
  animate: { opacity: 1, y: 0 },
  exit: { opacity: 0, y: -10 },
  transition: { type: "spring", stiffness: 300, damping: 24 },
}

function Card({ item }: { item: Item }) {
  return (
    <motion.div {...fadeInUp} layout layoutId={item.id}>
      {item.content}
    </motion.div>
  )
}

function CardList({ items }: { items: Item[] }) {
  return (
    <AnimatePresence mode="wait">
      {items.map((item) => (
        <Card key={item.id} item={item} />
      ))}
    </AnimatePresence>
  )
}

View Transitions API — Page Navigation

// React Router v7+ with View Transitions
import { Link, useNavigate } from "react-router"

function NavLink({ to, children }: { to: string; children: React.ReactNode }) {
  return <Link to={to} viewTransition>{children}</Link>
}

// CSS for the transition
// ::view-transition-old(root) { animation: fade-out 200ms ease; }
// ::view-transition-new(root) { animation: fade-in 200ms ease; }

Motion — Accessible by Default

import { useReducedMotion } from "motion/react"

function AnimatedComponent() {
  const shouldReduceMotion = useReducedMotion()

  return (
    <motion.div
      animate={{ x: 100 }}
      transition={shouldReduceMotion
        ? { duration: 0 }
        : { type: "spring", stiffness: 300, damping: 24 }
      }
    />
  )
}

Rule Details

Layout Animations (Motion)

FLIP-based layout animations with the layout prop and shared layout transitions via layoutId.

Load: rules/motion-layout.md

Gesture Interactions (Motion)

Drag, hover, and tap interactions with spring physics and gesture composition.

Load: rules/motion-gestures.md

Exit Animations (Motion)

AnimatePresence for animating components as they unmount from the React tree.

Load: rules/motion-exit.md

View Transitions API

Browser-native page transitions using document.startViewTransition() and framework integrations.

Load: rules/view-transitions-api.md

Motion Accessibility

Respecting user motion preferences and reducing cognitive load with motion sensitivity patterns.

Load: rules/motion-accessibility.md

Motion Performance

GPU compositing, avoiding layout thrash, and keeping animations at 60fps.

Load: rules/motion-performance.md

Key Principles

  1. 60fps or nothing — Only animate transform and opacity (composite properties). Never animate width, height, top, or left.
  2. Centralized presets — Define animation variants in a shared file, not inline on every component.
  3. AnimatePresence for exits — React unmounts instantly; wrap with AnimatePresence to animate out.
  4. Spring over duration — Springs feel natural and are interruptible. Use stiffness/damping, not duration.
  5. Respect user preferences — Always check prefers-reduced-motion and provide instant alternatives.

Performance Budget

MetricTargetMeasurement
Transition duration< 400msUser perception threshold
Animation propertiestransform, opacity onlyDevTools > Rendering > Paint flashing
JS bundle (Motion)~16KB gzippedImport only what you use
First paint delay0msAnimations must not block render
Frame drops< 5% of framesPerformance API: PerformanceObserver

Anti-Patterns (FORBIDDEN)

  • Animating layout properties — Never animate width, height, margin, padding directly. Use transform: scale() instead.
  • Missing AnimatePresence — Components unmount instantly without it; exit animations are silently lost.
  • Ignoring prefers-reduced-motion — Causes vestibular disorders for ~35% of users with motion sensitivity.
  • Inline transition objects — Creates new objects every render, breaking React memoization.
  • duration-based springs — Motion springs use stiffness/damping, not duration. Mixing causes unexpected behavior.
  • Synchronous startViewTransition — Always await or handle the promise from document.startViewTransition().

Detailed Documentation

ResourceDescription
references/motion-vs-view-transitions.mdComparison table, browser support, limitations
references/animation-presets-library.mdCopy-paste preset variants for common patterns
references/micro-interactions-catalog.mdButton press, toggle, checkbox, loading, success/error

Related Skills

  • ork:ui-components — shadcn/ui component patterns and CVA variants
  • ork:responsive-patterns — Responsive layout and container query patterns
  • ork:performance — Core Web Vitals and runtime performance optimization
  • ork:accessibility — WCAG compliance, ARIA patterns, screen reader support
Stats
Stars128
Forks14
Last CommitMar 21, 2026
Actions

Similar Skills