motion-craft
Skill1 starsChanged 11 days agoMITView on GitHub
Use for any website with animation or scroll effects. Rules for smooth 60fps motion, scroll choreography, and cursor effects. Prevents laggy or generic animation.
8 other projects use a version of this.
Adopted by
Most recently taken up by
- YardonYan/ui-design-skillstheir own version, first seen Nov 15, 2026
- XuHo-IT/Content-Agent-Kittheir own version, first seen Nov 8, 2026
- EnamTiga/motion-crafttheir own version, first seen Nov 8, 2026
- sithumdgomez/claude-skillstheir own version, first seen Oct 11, 2026
- aegntic/video-shotcrafttheir own version, first seen Oct 9, 2026
- jakubsuplicki/codumenttheir own version, first seen Oct 4, 2026
Other versions8 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 8
- jakubsuplicki/codument★ 48same name
- augchan42/inkstone★ 5same name
- XuHo-IT/Content-Agent-Kit★ 3same name
- aegntic/video-shotcraft★ 1same name
- EnamTiga/motion-craft★ 1same name
- propiter/motion-craft★ 1same name
- sithumdgomez/claude-skills★ 0same name
- YardonYan/ui-design-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository17 other files it gives its agents.
- AGENTS.mdAGENTS.md
- rules/AGENTS.mdAGENTS.md
- adapters/claude.mdCLAUDE.md
- asset-intakeSkill
- client-collabSkill
- design-tasteSkill
- diff-guardSkill
- no-slop-startSkill
- orchestratorSkill
- plannerSkill
- prompt-optimizerSkill
- reference-teardownSkill
- reviewerSkill
- scene-3dSkill
- storyboardSkill
- teach-modeSkill
- visual-qaSkill
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 8 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 7 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 13
Use scrub: 1 (or 0.6 to 1.2) on scrubbed triggers for built-in smoothing.
- Distinctive: line 14
Add will-change: transform only on elements animating continuously.
- Distinctive: line 15
Avoid backdrop-filter on large or many elements.
- Distinctive: line 16
No layout reads (getBoundingClientRect, offsetHeight) inside per-frame code.
- Distinctive: line 19
Do not create more than about 30 ScrollTriggers.
- Distinctive: line 20
Call ScrollTrigger.refresh() after fonts and images load.
- Distinctive: line 68
Every step has real content in the DOM: a title, one or two sentences, and a visual or number.
- Distinctive: line 73
After building, call ScrollTrigger.refresh() and verify by scrolling to the center of each step.
“Common” is measured: kept by at least 6 in 10 of the 7 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Motion Craft
Load after design-taste. Smooth beats flashy: a laggy effect is worse than no effect.
1. Performance rules (hard)
- Animate only transform and opacity (plus clip-path and CSS variables read by shaders). Never animate width, height, top, left, margin, box-shadow, filter blur on large areas.
- ONE animation loop: Lenis drives scroll, gsap.ticker calls lenis.raf(time*1000), gsap.ticker.lagSmoothing(0), and lenis.on("scroll", ScrollTrigger.update). Three.js renders inside the same ticker. Never run a second requestAnimationFrame loop.
- Use scrub: 1 (or 0.6 to 1.2) on scrubbed triggers for built-in smoothing.
- Add will-change: transform only on elements animating continuously. Remove it after.
- Avoid backdrop-filter on large or many elements. Max 1 to 2 small glass panels. Safari struggles.
- No layout reads (getBoundingClientRect, offsetHeight) inside per-frame code. Cache values on resize.
- Split text into lines/words once at load. Never re-split during scroll.
- Images: set width and height, use loading="lazy" below the fold. Compress.
- Do not create more than about 30 ScrollTriggers. Use timelines with one trigger each.
- Call ScrollTrigger.refresh() after fonts and images load.
2. Easing and rhythm
- Entrances: power3.out or expo.out, 0.8 to 1.2s. Stagger 0.05 to 0.12s.
- Scrubbed motion: ease "none" with scrub smoothing, never bouncy.
- Vary effects per section. Same fade-up everywhere reads as a template.
- Hold moments: pin a section so the user can absorb one big idea.
3. Scroll choreography (use at least 5, including 1 and 2)
- Pinned storyline: a pinned section where scroll drives a multi-step timeline (object transforms, copy swaps, numbers change).
- Scene-linked scroll: scroll progress drives the 3D camera and objects (see scene-3d).
- Line/word mask reveals for headlines (overflow hidden, y from 110%).
- Clip-path image wipes and scale-down reveals (inset() to 0).
- Horizontal scroll gallery inside a pinned section.
- Velocity skew: skewY or scale of marquee text based on scroll velocity, clamped.
- Multi-layer parallax (3 depths minimum).
- Section background color shifts through a CSS variable tied to scroll.
- Number counters and SVG path drawing on scroll.
- Sticky stacking cards that scale back as the next arrives. Plan one or two per section in DESIGN.md. Do not use all in one section.
4. Cursor effects (desktop only, skip on touch via matchMedia("(pointer: fine)"))
Pick at least 2:
- Custom cursor dot plus ring that follows with lerp (ring lags behind).
- Cursor grows or changes label on hover ("View", "Drag", "Play").
- Magnetic buttons: element moves slightly toward cursor, springs back.
- Spotlight or glow following the cursor via CSS variables (--x, --y).
- Tilt cards in 3D on hover (rotateX/Y from pointer, perspective).
- Light trail on a small canvas, max 20 points, auto-fades. Hide the native cursor only if the custom one works. Keep it under 1ms per frame.
Element-by-element motion (every element gets a decision)
- Headlines: line-mask reveal on enter. Optionally scrub word opacity from 20% to 100% across scroll.
- Paragraphs: fade-up by line, y 16 to 24px, stagger 0.03s.
- Eyebrow labels and numbers: slide in from the side while a hairline draws (scaleX 0 to 1).
- Cards: staggered entrance from varied directions. Hover: lift y -6px, tilt up to 6 degrees following the pointer, inner image scale 1.06, accent shift. Press state.
- Images: clip-path inset wipe, inner scale 1.2 to 1, and 8 to 12% parallax inside the frame.
- Buttons: magnetic pull, fill sweep via a translated pseudo-element, arrow nudge, visible focus ring.
- Nav: hides on scroll down, returns on scroll up, active indicator slides between links, compacts after the hero.
- Lists and menus: row hover draws an underline or shows a preview image that follows the cursor.
- Numbers: count up with tabular-nums. SVG strokes draw on scroll.
- Marquees: speed tied to scroll velocity, clamped.
- Section transitions: background color shift or a wipe. No hard cuts. No two adjacent sections reuse the same entrance.
- Footer: giant wordmark reveal.
- Page load: preloader of 1.2s maximum with progress, then the hero sequence.
- Cursor: starts hidden (opacity 0), appears on the first pointermove at the real pointer position. Never render it at 0,0.
Pinned and stepped sequences: completeness (hard rules)
- Every step has real content in the DOM: a title, one or two sentences, and a visual or number. No empty steps, no placeholder or lorem text, no empty containers.
- Stack all steps in one grid cell. Without JS they read as normal blocks. JS hides non-active steps after init.
- Build the step timeline with explicit fromTo tweens for every step in and out, never .from() that depends on the previous state. Use labels. Make step 1 enter and exit like the others.
- Pin length is steps x 100vh at most. No dead scroll: no stretch longer than 1 viewport where nothing visible changes.
- Progress indicators show the active step and total (for example 02 / 04).
- After building, call ScrollTrigger.refresh() and verify by scrolling to the center of each step.
5. Accessibility and fallback
- prefers-reduced-motion: disable pinning, parallax, scrubbing and cursor effects. Keep simple fades.
- Content must be readable with JS animation failing (elements visible by default, hidden only after JS adds a class).
6. Final check
- Only transform/opacity animated in scroll code.
- One shared ticker for Lenis, GSAP and Three.js.
- No large backdrop-filter.
- 5+ distinct scroll effects, including one pinned storyline.
- 2+ cursor effects, off on touch.
- Reduced-motion path works.
- Opened in a browser: scrolling feels smooth, no frame hitching. If it hitches, remove the heaviest effect first.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

