motion-site
Build motion-rich websites and sections as running code: WebGL hero, particles, scroll-driven 3D, GLSL shader backgrounds, liquid glass (Three.js/R3F + GSAP + Lenis), plus a light CSS/Framer-Motion ti
SKILL.mdskills/motion-site/SKILL.md
GitHub<objective>
Build the motion-heavy web genre that `impeccable` does not reach — WebGL hero
sections, particle fields that morph, scroll-driven 3D, GLSL shader backgrounds,
liquid glass, kinetic type — and ship it as **running code**, not a prompt and
not a spec. Output: real files (a self-contained HTML page, or React / R3F
component files for an existing project) that open and move, with the mandatory
reduced-motion and mobile fallbacks already wired.
Two tiers, chosen per effect:
- webgl — Three.js / React-Three-Fiber + GLSL + GSAP ScrollTrigger + Lenis. Particles, shaders, scroll-linked 3D cameras, transmission/glass, postprocessing.
- light — CSS / SVG / GSAP / Framer Motion. Scroll reveals, parallax, text kinetics, marquees, magnetic buttons, gradient-mesh backgrounds. No GPU scene.
Two scopes: a single section (hero / CTA / background / 3D viewer), or a full page composed of motion sections over one smooth-scroll spine.
This skill does NOT:
- own layout, typography, information architecture, UX copy, or design systems —
that is
impeccable. motion-site drops the moving layer into a page impeccable shaped, or builds the motion page and hands typographic polish back to impeccable. - render video files — that is
reel-builder/video-prompt(those are not interactive and not web). motion-site output is live in a browser. - call any paid API. It writes code and runs locally; there is nothing to bill.</objective>
ROLE
Read the brief → fix scope (section vs page), tier (webgl vs light), target (html vs react), and the effect archetype → load the matching technique reference plus the craft floor → build it bespoke → verify in one bounded pass by eye → hand over running files and how to open them.
You are a creative WebGL/motion engineer, not a template vendor. The archetype catalog is a vocabulary to pick a direction fast, then build for this brief — never paste a canned demo.
PIPELINE
Read the brief. Extract: scope, the effect(s) wanted, the vibe / brand / palette, the real content (copy, logo, product), and hard constraints — performance target, must-work-on-mobile, reduced-motion, existing stack.
Detect the target. Scan cwd: a
package.jsonwithreact/next/ a Vite React setup →target: react, and write components into that project's conventions. Otherwise →target: html, one self-contained file with CDN import maps. State the pick;--targetoverrides. See references/stack.md.Pick the tier. Per effect, from references/tier-picker.md. Use webgl only where it earns the GPU: particle fields, shader/fluid backgrounds, 3D models or characters, scroll-driven cameras, displacement, transmission glass. Use light for reveals, parallax, kinetic type, marquees, magnetic hovers, gradient mesh. State which tier and why;
--tieroverrides,--no-3dforces light.Pick the direction + load references. Choose an archetype from the catalog in tier-picker.md, load its technique reference(s), and always load references/craft-floor.md and references/stack.md before writing code.
Build bespoke. Wire the stack once (one renderer, one
requestAnimationFrameloop), implement the effect for this brief, and wire the non-negotiables in the same pass:prefers-reduced-motionfallback, a low-end / mobile fallback,dispose()on unmount, DPR capped ≤ 2, offscreen canvas paused. The craft floor is not a later audit — it is built in now.Compose (page scope only). Per references/compose-page.md: one smooth-scroll spine (Lenis), section rhythm (not every section is a canvas — quiet sections carry the loud ones), a single shared WebGL canvas behind the page where possible, and a loader that gates heavy assets without blocking first paint.
Verify once, by eye. Open / serve it. Watch for jank, layout shift, a stuck loader; confirm the reduced-motion path renders a real static state and the mobile fallback holds. Fix everything found in one batch, re-check at most once, then stop. No open-ended re-roll loop — name the frame to redo and redo that one. (See CONSTRAINTS.)
Hand over. Write to
./generated/motion-site/<slug>/(or into the detected project after confirming). Report in two lines: tier · target · libraries with pinned versions · how to open it · what the user must still supply (real logo, glTF model, HDRI, fonts). See references/run.md.
MODES
motion-site <brief>— build. Scope/tier/target inferred, stated, overridable.motion-site <brief> --scope section|page— one section, or a composed page.motion-site <brief> --tier webgl|light|auto— force the tier (autodefault).motion-site <brief> --target html|react|auto— force the output format.motion-site <brief> --effect <archetype>— force a direction. Catalog:particle-self·scroll-3d·fluid-gradient·aurora·liquid-glass·metaball·noise-field·starfield·kinetic-type·marquee·magnetic·sticky-gallery·image-distortion·3d-viewer·3d-character.motion-site <brief> --ref <path|url>— match the vibe of a reference image or site.motion-site <brief> --no-3d— force the light tier.motion-site <brief> --variants N— N distinct directions of the same section (N ≤ 3).motion-site <brief> --preview— also open / serve it (or publish as an artifact) so you can see it move.motion-site audit <path>— read-only craft-floor check of existing motion / WebGL code (perf, dispose, DPR, reduced-motion, a11y). Produces a report, changes nothing. See references/craft-floor.md.
REFERENCES (load on demand)
| File | When to load |
|---|---|
| references/stack.md | Always at build — stack wiring for both targets, CDN import maps, Lenis↔GSAP↔ScrollTrigger sync, version pinning |
| references/tier-picker.md | Always at step 3 — webgl-vs-light rules + the archetype catalog (direction → tier → which reference) |
| references/craft-floor.md | Always before writing code, and for audit — perf budget, dispose, DPR, reduced-motion, mobile, a11y, the absolute bans |
| references/scroll-3d.md | Scroll-driven 3D — camera rigs, section pinning, scroll-linked timelines, the particle-self scroll pattern |
| references/particles.md | Particle systems — instanced points, GPGPU/FBO simulation, shape-morph, mouse repulsion, point shaders |
| references/shaders.md | GLSL — fragment-shader backgrounds (gradient flow, noise, fluid, metaballs), vertex displacement, fresnel, uniforms, shaderMaterial wiring |
| references/materials-3d.md | 3D models / characters / liquid glass — glTF + draco, HDRI env, MeshTransmissionMaterial, distortion, model perf |
| references/postprocessing.md | Bloom · chromatic aberration · DOF · grain · god rays — EffectComposer / @react-three/postprocessing budgets |
| references/light-motion.md | The light tier — GSAP reveals, SplitText kinetics, parallax, marquee, magnetic, sticky gallery, SVG draw/morph, gradient mesh, Framer Motion, CSS scroll-driven animations, View Transitions |
| references/compose-page.md | Scope page — smooth-scroll spine, section rhythm, one shared canvas, loader/preload, scroll performance |
| references/run.md | Preview / handover — serve the HTML or publish as an artifact, run the React dev server, the audit report shape |
EXAMPLES
See examples/before-after.md — calibration pairs: a vague "animated hero"
brief resolved into a tiered build decision, a particle-self morph, a scroll-3D
section, a fluid-gradient background, a light-tier kinetic-type hero, and an
audit finding list.
CONSTRAINTS
- The craft floor is built in, not bolted on. Every build ships, in the first
pass: a real
prefers-reduced-motionstatic state (not a frozen first frame — a composed still), a mobile / low-end fallback (heavy WebGL downgrades to a poster or the light tier on small screens andSave-Data),dispose()of geometries / materials / textures / renderer on unmount, DPR capped atmin(devicePixelRatio, 2), one sharedrequestAnimationFrameloop, and the canvas paused when offscreen (IntersectionObserver). No seizure-risk flashing (> 3 Hz high-contrast). See references/craft-floor.md. - Verify in bounded passes, not a loop. Build fully, inspect once by eye, fix everything that pass shows in one batch, confirm with at most one more look, then stop. Open-ended self-QA burns time doing worse what one honest look does. When a specific frame or section is wrong, redo that one — do not re-roll the whole build.
- Motion serves the brief. Pick the quietest technique that lands the effect. A CSS gradient and a blur can beat a GPGPU fluid sim; reach for the GPU only when the effect needs it. Don't make every section a canvas.
- Don't duplicate impeccable. No design-system extraction, critique scoring, or typographic playbooks here — that is impeccable's. motion-site owns the moving layer and the motion-page composition. If the brief is really a layout / copy / IA request with no motion genre in it, say so and route to impeccable.
- Pin versions; load from allowed CDNs only. HTML target loads from cdnjs,
jsdelivr, or unpkg at an exact pinned version (≥ 2 weeks old). Never a bare
threeorthree@0. See references/stack.md. - Real content, honest placeholders. Use the user's copy / logo / product when given. For assets they must supply (glTF, HDRI, licensed fonts), wire a labeled placeholder and list it in the handover — never ship a broken import.
- Output stays in one place.
./generated/motion-site/<slug>/by default; write into the user's project only after confirming. No scattered one-off helper scripts.
INVOCATION HINTS
Use this skill when the user says any of:
- "animated / motion landing page", "make the site move", "awwwards-style site"
- "particle hero", "particles that form a logo / shape", "particle background"
- "scroll-driven 3D", "3D that moves as you scroll", "pin the section and animate"
- "shader background", "fluid / gradient / noise / aurora background", "metaballs"
- "liquid glass", "glassmorphism that refracts", "transmission material"
- "3D product viewer", "spin the model", "glTF on the page", "3D character"
- "kinetic typography", "text that animates / splits / reveals on scroll"
- "smooth scroll", "Lenis", "GSAP ScrollTrigger site", "sticky scroll gallery"
- "magnetic buttons", "marquee", "image distortion gallery", "WebGL hero"
- "audit this WebGL / Three.js / motion code for performance"
RU triggers (use the skill when the user writes any of):
- «анимированный лендинг», «оживи сайт», «сайт как на awwwards», «лендинг с анимацией»
- «партикловый hero», «частицы собираются в логотип / фигуру», «фон из частиц»
- «скролл-3D», «3D крутится при скролле», «запинь секцию и анимируй»
- «шейдерный фон», «флюид / градиентный / нойз / aurora фон», «метаболлы»
- «жидкое стекло», «стекло которое преломляет», «transmission материал»
- «3D-вьювер товара», «покрути модель», «glTF на странице», «3D-персонаж»
- «кинетическая типографика», «текст анимируется / разбивается при скролле»
- «плавный скролл», «Lenis», «сайт на GSAP ScrollTrigger», «липкая галерея»
- «магнитные кнопки», «бегущая строка», «галерея с искажением», «WebGL hero»
- «проверь этот WebGL / Three.js код на производительность»
For a layout, copy, IA, or static-design request with no motion genre — use
impeccable. For a video file — use reel-builder. motion-site is for code that
moves in the browser.