Loading...
Loading...
Implement, review, and measure UI motion. Reconstruct easing, springs and gestures from a recording using bundled frame extraction, tracking and curve-fitting tools when available.
npx skill4agent add nexu-io/open-design ui-animationui-designui-designanimate-text| File | Read when |
|---|---|
| references/decision-framework.md | Default: deciding whether/why to animate, picking easing character; also the Discovery sweep ("where should this animate") |
| references/spring-animations.md | Spring physics, Motion |
| references/component-patterns.md | Buttons, toasts, crossfades, list stagger and removal, hover, step forms, Motion layout morphs and auto height, 3D |
| references/clip-path-techniques.md | clip-path for reveals, tabs, hold-to-delete, comparison sliders |
| references/gesture-drag.md | Drag, swipe-to-dismiss, momentum, pointer capture, velocity handoff, momentum projection, rotary/knob drag, detents, carousel |
| references/scroll-animations.md | Scroll-triggered reveals, scrubbed/scroll-driven animation ( |
| references/performance-deep-dive.md | Jank, CSS vs JS, WAAPI, CSS variables trap, Framer Motion caveats |
| references/debugging-symptoms.md | An animation feels off and the cause isn't named: symptom-indexed tables for sluggish, robotic, cheap, jumpy, and misfiring motion |
| references/svg-animation.md | Animating vector art: line drawing ( |
| references/review-format.md | Reviewing animation code: ten standards (each with flag-on-sight triggers), Before/After/Why table, Block/Approve verdict |
| references/contextual-animations.md | Contextual icon swaps, word-level stagger entrances, peripheral de-emphasis, fixed-offset exits |
| references/transition-recipes.md | Installing a CSS transition: container morph, card resize, badge, dropdown and tooltip (with library origin variables), modal (with |
| references/measurement-guide.md | Reverse-engineer: what to measure, eye vs script, reading |
| references/curve-fitting.md | Reverse-engineer: reading |
| references/code-output.md | Reverse-engineer: emitting code for CSS, Motion/Framer Motion, SwiftUI, React Native, UIKit |
| references/choreography.md | Reverse-engineer: multi-element/multi-phase motion: staggers, blur-before-move, per-edge settling |
| references/vocabulary.md | Naming a motion effect the user describes vaguely ("what's it called when...") |
| references/interface-sfx.md | Click sounds, interface audio, UI SFX, haptic-plus-sound, or "why is the web afraid of sound" |
requestAnimationFrame:activetouch-action: manipulation@starting-styledata-mountedfilter: blur(2px)transformopacitycolorbackground-coloropacitywidthheighttoplefttransition: allfilter<g>transform-box: fill-box; transform-origin: centertransform: scale()widthheight[data-theme-switching] * { transition: none !important }void document.body.offsetHeightnext-themesdisableTransitionOnChange| Element | Duration | Easing |
|---|---|---|
| Button press feedback | 100-160ms | |
| Tooltips, small popovers | 125-200ms | |
| Dropdowns, selects | 150-250ms | |
| Modals, drawers | 200-350ms | |
| Move/slide on screen | 200-300ms | |
| Page transitions | 250-400ms | enter or move curve |
| Hover (colour/opacity), one control | 200ms | |
| Hover (transform/scale) | 100-150ms | enter curve |
| Illustrative/marketing | Up to 1000ms | Spring or custom |
cubic-bezier(0.22, 1, 0.36, 1)cubic-bezier(0.25, 1, 0.5, 1)cubic-bezier(0.32, 0.72, 0, 1)cubic-bezier(0.19, 1, 0.22, 1)cubic-bezier(0.25, 0.46, 0.45, 0.94)cubic-bezier(0.645, 0.045, 0.355, 1)ease-ineaseease-out| UI pattern | Recipe |
|---|---|
| Trigger + floating dot/count | Notification badge |
| Trigger grows into the surface it opens | Container morph |
| Trigger + anchored surface | Menu dropdown |
| Centred surface on top of page | Modal dialog |
| Panel sliding into existing container | Panel reveal |
| List ↔ detail or wizard steps | Page side-by-side slides |
| Element dimension changes | Card resize |
| Text updating in place | Text state swap |
| Two icons in same slot | Icon swap |
| Number arriving on its own | Number pop-in |
| Number the user is driving | Odometer digit roll |
| Confirmation / success moment | Success celebration |
| Hovering item in horizontal stack | Avatar group hover |
| Form validation error | Error state shake |
transform-origincenterscale(0.9-0.96)scale(0)@media (hover: hover) and (pointer: fine)hover:@media (hover: hover)IntersectionObserverwill-changetransformopacitytransformxytransformrequestAnimationFrametransitionendlinear@media (prefers-reduced-motion)<MotionConfig reducedMotion="user">useReducedMotion()* { transition: none !important }framer-motionmotionmotion/reactAnimation progress:
- [ ] Step 1: Decide whether the interaction should animate
- [ ] Step 2: Choose purpose, easing, and duration
- [ ] Step 3: Pick the implementation style
- [ ] Step 4: Load the relevant component or technique reference
- [ ] Step 5: Validate timing, interruption, and device behaviorwidthheighttoplefttransition: alltransform-originwill-changeprefers-reduced-motionanimation-play-state: pauseddisplay: nonereferences/decision-framework.mdscripts/scripts/ffmpegffprobeopencv-pythonnumpyscipyReverse-engineer progress:
- [ ] Step 1: Extract frames + contact sheet (per direction if open differs from close)
- [ ] Step 2: Vision pass: identify element, effects, phases
- [ ] Step 3: Decide precision (eye-only vs scripted)
- [ ] Step 4: Track motion and fit curves (if escalating)
- [ ] Step 5: Annotate choreography (delays, asymmetry)
- [ ] Step 6: Emit code for the target(s)
- [ ] Step 7: Validate against the recordingpython3 scripts/extract_frames.py <video> <outdir>--start--duration--fpsffprobecontact_sheet.pngreferences/measurement-guide.mdpython3 scripts/track_motion.py <outdir>metrics.json--bbox X,Y,W,Hpython3 scripts/fit_curves.py <outdir>/metrics.json--fpsreferences/curve-fitting.mdreferences/choreography.mdreferences/code-output.mdtransformopacityextract_frames.pytransformopacityfilterfit_curves.py--fps 30duration_msmetrics.jsonreferences/choreography.mderrorproduct-designui-designui-designanimate-text