Atelier motion
Atelier - a premium, anti-slop frontend design skill suite for Claude Code: 11 skills + a deepdive knowledge base.
npx -y skills add luminary19/atelier --skill atelier-motionAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Atelier suite — motion & micro-interactions (the "feel" layer). Add animation that reads premium, not gimmicky: correct easing/spring defaults, the right durations, the 12 animation principles applied to UI, component/gesture/layout/exit animation with Motion (motion/react), micro-interactions (buttons, toggles, likes), and the often-skipped states (skeleton/shimmer, optimistic UI, empty/loading/error). Use whenever adding or fixing UI animation, transitions, hover/press feedback, loading states, or when motion feels janky, abrupt, excessive, or cheap. Default stack: Motion for React UI — with Anime.js v4 / native CSS / GSAP for vanilla & non-React work, and Lottie / Rive for designer-authored assets; defer scroll-driven work to atelier-scroll and pre-ship checks to atelier-perf-a11y. Part of the Atelier suite.
SKILL.md
10.8 KB, as published. Nobody here has run it
Atelier — Motion & Micro-interactions
Motion is what separates a premium interface from a static one — and bad motion (too slow, too much, wrong easing, animating the wrong property) instantly reads cheap. The rule that governs everything here: motion should be felt, not seen. If the user consciously waits on an animation, it's too slow or too big.
Project memory: if
ATELIER.mdexists, read its Interactivity level and Motion policy (library triggers, easing, reduced-motion) first and honor them — they set the budget. Set up memory with/atelier init(theatelierrouter).Inputs: the Direction Doc's motion budget (none / restrained / award-grade). Default stack: Motion (
motion/react) for component/gesture/layout/exit animation; GSAP for complex sequencing; scroll-driven motion →atelier-scroll; the perf/a11y gate →atelier-perf-a11y(animate onlytransform/opacity, respect reduced motion); where these hooks mount in a real component tree →atelier-components. The words in the states you build (empty/error/loading) →atelier-copy; making the optimistic/skeleton/error states production-grade (rollback, no stuck spinner) →atelier-harden. Deep reference:references/fundamentals-deepdive.md(§1, §5).
The flow
- Set the budget (from the Direction Doc) → 2. Pick durations + easing → 3. Choose the tool → 4. Build the interaction → 5. Add the missing states → 6. Gate it (reduced motion + perf).
1. Motion budget
Match motion to the world (Direction Doc):
- Production — purposeful only: feedback (<100ms), state changes, attention guidance, latency masking. Durations ≤300ms, one thing moving at a time. Restraint reads as confidence.
- Award/creative — motion is part of the brand; bigger gestures, choreography, signature moments. Still ships reduced-motion fallbacks. When in doubt, do less. The most common slop tell is too much motion (infinite-loop micro-animations everywhere), not too little.
2. Durations & easing (defaults to internalize)
Full table + cubic-beziers + spring params in references/timing-easing.md. The essentials:
- Hover / press / toggle: 120–200ms. Reveal / small move: 200–300ms. Modal / drawer / page: 300–450ms. Ceiling ~500ms. Respond to input ≤100ms always (immediate press/scale).
- Easing by intent: ease-out for entrances (fast→settle, feels responsive); ease-in for exits; ease-in-out for moves between two on-screen states; linear only for continuous (spinner, marquee, progress).
- Springs for direct manipulation / interruptible UI (drag, sheets, toggles) — they carry velocity and feel physical. Duration+easing for deterministic, choreographed sequences.
- Distance/size scale duration (bigger/farther → slightly longer).
3. Choose the tool
- Motion (
motion/react) — the default for React UI: declarativeanimate/whileHover/whileTap/whileInView,AnimatePresencefor exit animations,layout/layoutIdfor shared-element "magic move", springs, gestures. Springs are the default only for transforms (x/y/scale/rotate); opacity/ color default to tween/ease. Recipes inreferences/motion-react.md. - react-spring (
@react-spring/web) — lighter pure-springs alternative when springs are the whole story and you want R3F interop; reach for Motion when you need orchestration/exit/shared-element. - GSAP — reach for it for complex timelines, SVG morph/draw, or when you need a single engine for an
intricate sequence. Also the home of the Flip plugin for FLIP layout / shared-element transitions
between two arbitrary DOM states (expand/collapse, grid reflow, reorder) — the explicit-control
escalation for when Motion's
layout/layoutId(the React default) or Auto-Animate's auto-diff don't fit; recipe inreferences/microinteractions-states.md(GSAP plugins are all free now — details there). (Scroll-driven motion and pointer-driven flourishes — magnetic buttons, custom cursor, infinite marquee — live inatelier-scroll, not here.) - Anime.js v4 (
animejs~4.4, ESM named imports — no globalanime; v3 code won't run) — free, tree-shakeable general timeline for vanilla / non-Motion contexts; built-inonScroll()observer andsvgmorph/draw, plus a ~3KBwaapiadapter for WAAPI-only cases. Reach for it over GSAP when you need a light timeline, not the full engine. - Native CSS — transitions and keyframes are perfect for simple hover/toggle/state changes with zero
JS; prefer them when they suffice (they're cheap and run off the main thread). For entry and exit
with no JS,
@starting-style+transition-behavior: allow-discreteanimates popovers/dialogs/toasts in and out (Baseline) — often replacing<AnimatePresence>for lightweight reveals. - Auto-Animate (
@formkit/auto-animate~0.9) — one-line FLIP for list add/remove/move when you want zero config; ~2KB, respects reduced motion out of the box. - Designer-authored / interactive assets — play After-Effects motion with Lottie, preferring
@lottiefiles/dotlottie-web(Rust+WASM on ThorVG 1.0;DotLottieWorkerfor off-main-thread GPU playback) overlottie-web. For interactive, stateful, data-bound graphics (UI characters, game-like UI) use Rive — state machines + data binding live in the.riv(@rive-app/react-canvas;@rive-app/webgl2Rive Renderer is the default,@rive-app/canvasfor grids/lists). Both are playback of pre-authored assets — build component interactions on Motion, not here.
Don't start new work on Motion One (folded into Motion — use
motion/motion/mini), Popmotion, or Velocity (all frozen); treat Theatre.js as dormant (stale 0.7.2 public release, 1.0 private).
4. Build the interaction
Use the patterns in references/motion-react.md. Core moves: variants with staggerChildren for lists,
AnimatePresence for mount/unmount, layout for size/position changes, useReducedMotion() to branch.
Keep to transform/opacity. Stagger 30–80ms/item, total cascade <600ms.
- Reveal-safety (don't ship a blank page): scroll/entrance reveals must enhance an already-visible default — never gate content visibility on a class- or JS-triggered transition. Transitions pause on hidden tabs and don't fire in SSR / headless / no-JS renders, so the content stays at opacity 0 and the section ships blank. Animate from a visible baseline (content present in the DOM and legible, then enhanced), and make the reduced-motion / no-JS path show the final state immediately.
- Suppress the uniform-entrance reflex: one identical fade-up applied to every section is itself a tell.
Each reveal should fit what it reveals; staggering items within one list is fine — cloning one entrance
across the whole page is not. (Verified at ship by
atelier-perf-a11y's anti-slop check.)
5. Add the missing states (the part everyone skips)
A premium feel is mostly about the non-happy states (which ones each screen needs is enumerated upstream
by atelier-ux; here you build them). Patterns in
references/microinteractions-states.md:
- Skeleton / shimmer loaders (perceived speed > spinner; static under reduced motion).
- Optimistic UI —
useOptimistic(React 19): update instantly, reconcile/rollback. Only for likely-success, cheap-to-reverse actions (likes, toggles, list adds) — never irreversible/financial. - Empty / loading / error states designed deliberately (empty = onboarding + CTA; error = human language + cause + recovery, preserve input).
- Micro-interactions — button press/scale, toggle, like, copy-confirm, input focus; tie a clear signifier to every action (Don Norman: affordance → signifier → feedback ≤100ms).
- Animated numbers —
NumberFlow(@number-flow/react) for counters/prices/stats: accessible,Intl.NumberFormat-aware, respects reduced motion by default. The correct default over a hand-rolled (janky + inaccessible) odometer. - Haptics —
navigator.vibratefor short confirmations, but Android Chrome/Edge only (~77%); NOT iOS Safari, NOT Firefox. Mobile-only, needs a user gesture, never haptic-only — always pair a visible cue.
6. Gate it
- Reduced motion is mandatory.
useReducedMotion()(Motion) or@media (prefers-reduced-motion: reduce). Reduce, don't always nuke — keep opacity fades and shortened durations; remove large movement, parallax, spin, springy overshoot. Provide non-motion signifiers so no info is lost. - Perf: animate only
transform/opacity; prefer CSS/WAAPI/Motion (off main thread) over JS rAF tweening of layout/paint props. A transform-only rAF loop (e.g. a lerped custom cursor inatelier-scroll) is fine — the rule targetswidth/top/box-shadow, nottransform. Run the fullatelier-perf-a11ygate before shipping.
The 12 principles → UI (mental backbone)
Squash&stretch (press squish), anticipation (wind-up), staging (dim bg for modal), follow-through/
overlap (stagger, spring settle), slow in/out = easing (the most important), arcs (curved paths),
secondary action, timing (conveys weight), exaggeration (sparingly, for delight), appeal (brand
personality). Full mapping in references/timing-easing.md.
Operating principles
- Felt, not seen. Subtle + fast by default; reserve big gestures for one signature moment.
- One thing moving at a time in production UI; orchestrate with overlap, not chaos.
- Springs for manipulation, easing for choreography.
- Design the empty/loading/error states — that's where perceived quality actually lives.
- Always reduced-motion +
transform/opacityonly. Beauty ≠ inaccessible or janky.