motion-advanced

Advanced motion patterns for React / Next.js — drag & drop, gestures, text animations, SVG path drawing, custom hooks, imperative sequences (useAnimate), loaders, and the full API decision tree. Requires motion-foundations. Use when building drag and drop, gestures, text or SVG animation, or imperat

By affaan-m · 2,949 installs

npx skills add affaan-m/ecc --skill motion-advanced

Source repository · Upstream listing

Motion Advanced Complex, interactive, and physics based animation patterns. Requires motion foundations to be set up first. Use these when motion patterns is not enough. When to Activate Building drag to dismiss sheets, swipe gestures, or reorderable lists Animating text word by word, character by character, or as a live counter Drawing SVG paths, morphing icons, or animating circular progress Writing a custom animation hook ( useScrollReveal , magnetic button, cursor follower) Sequencing multi step animations imperatively with useAnimate Building spinners, shimmer skeletons, pulse indicators, or loading button states Outputs This skill produces: Drag interactions: draggable cards, drag to dismiss sheets, Reorder.Group lists Gesture hooks: swipe detection, long press, pinch outline Text animation components: word reveal, character typewriter, number counter SVG animation: path draw on, icon morph, stroke progress ring Custom hooks: useScrollReveal , useHoverScale , useNavigationDirection , useInViewOnce Imperative sequences via useAnimate with interrupt safe async/await Loader components: spinner, shimmer, pulse dot, progress bar, button loading state Principles Physics based motion ( useSpring , springs. ) always feels more natural than duration based for direct manipulation. useMotionValue + useTransform computes derived values without triggering re renders. useAnimate sequences are imperative and interrupt safe — calling animate() mid flight cancels the previous animation automatically. Motion values ( useMotionValue , useSpring ) are SSR safe and do not cause hydration errors. Rules 1. Drag interactions must be tested on touch devices , not just mouse. drag prop works on both but feel and threshold differ. 2. Infinite animations must pause when document.visibilityState === "hidden" . Background tabs must not consume GPU/CPU. 3. Swipe threshold must be explicit. Never infer intent from velocity alone; combine offset + velocity checks. 4. useAnimate scope ref must be attached to a mounted DOM element. Calling animate() before mount throws silently. 5. Motion values must not be recreated on render. useMotionValue(0) inside a component body is correct; new MotionValue(0) in a render is not. 6. All token values are imported from motion foundations . No inline numbers. 7. Custom hooks must handle cleanup. Every window.addEventListener needs a matching removeEventListener in the useEffect return. 8. SVG morphing requires equal path command counts. Paths with different command structures snap instead of interpolating. Decision Guidance Choosing the right advanced API Scenario API Drag with physics on release drag + dragTransition: springs.release Ordered drag to reorder list Reorder.Group + Reorder.Item Dismiss on drag offset drag="y" + onDragEnd offset check Swipe left/right drag="x" + onDragEnd offset check Long press useLongPress hook Value smoothed over time useSpring Value derived from another useTransform Multi step sequence useAnimate with async/await One shot imperative animation animate() from motion Text entering word by word Stagger on inline block spans SVG drawing on pathLength 0 → 1 SVG morph d attribute tween (equal commands) Circular progress strokeDashoffset tween When to use useSpring vs a spring transition useSpring transition: springs. Use for Cursor follower, pointer tracked values Discrete state changes Updates Continuous, on every frame Triggered by state change Interrupt Smooth — physics picks up from velocity Restarts from current value Core Concepts useMotionValue + useTransform Reactive computation without re renders: useAnimate Returns [scope, animate] . The scope ref must be attached to a DOM element. animate() calls are interrupt safe — calling mid flight cancels the previous run. Code Examples Draggable card Drag to dismiss sheet Reorderable list Swipe detection Long press hook Word by word reveal Number counter SVG path draw on Stroke progress ring useScrollReveal hook Cursor follower Shimmer skeleton Button loading state Infinite animation with visibility pause End to End Example Drag to dismiss sheet with shimmer content, loading state, and reduced motion support — combining useMotionValue , useTransform , useSafeMotion , AnimatePresence , and tokens from motion foundations : Constraints / Non Goals This skill does not cover: Token and spring definitions → see motion foundations Standard UI patterns (button, modal, stagger, page transitions) → see motion patterns CSS only animations or Tailwind animate without motion/react Canvas or WebGL based animation (Three.js, Pixi, etc.) Full drag and drop systems with external state managers (dnd kit, react beautiful dnd) Game loop or frame by frame animation Anti Patterns Anti pattern Rule violated Fix drag tested only on desktop Rule 1 Test on touch emulator and real device animate={{ repeat: Infinity }} with no pause Rule 2 Add visibilitychange listener onDragEnd checking only offset, not velocity Rule 3 Check both info.offset and info.velocity animate(scope, ...) before useEffect Rule 4 Call animate() only after mount const x = new MotionValue(0) in render Rule 5 Use const x = useMotionValue(0) transition={{ duration: 1.2 }} inline Rule 6 Use motionTokens.duration.crawl useEffect without cleanup Rule 7 Return removeEventListener / controls.stop SVG morph between paths with different commands Rule 8 Normalize path commands before animating Related Skills motion foundations — defines all tokens, springs, useSafeMotion , and SSR guards imported here. Must be set up before using this skill. motion patterns — handles standard UI patterns (button, modal, stagger, page transitions, scroll reveals). Use it before reaching for the advanced patterns here.