Creative frontend core
Skill Sheshiyer/skill-clusters/skills/creative-frontend-core
Shared reference for the creative-frontend cluster: the in-browser-vs-video decision matrix, in-browser tool selection, prefers-reduced-motion baseline, GPU/performance budget, Astro hydration boundaries for animation, and version matrix. USE WHEN deciding how to implement web motion/animation/video, or for the cross-cutting rules every spoke (GSAP, Anime.js, web-motion-library, Remotion) shares.From its SKILL.md
npx -y skills add Sheshiyer/skill-clusters --skill creative-frontend-coreAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 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.
SKILL.md
5.5 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it
Creative Frontend Core
Shared rules for the creative-frontend cluster. The orchestrator and every spoke reference
this — it holds the cross-cutting decisions so nothing is duplicated or contradicted.
1. Decision matrix — in-browser vs render-time (video)
| Question | If YES |
|---|---|
| Does it respond to user input (scroll, hover, click, drag) in real time? | in-browser |
Must the artifact be a file (.mp4/.webm/.gif) to upload/embed? | Remotion |
| Needs deterministic frame timing, audio sync, or pixel-perfect output? | Remotion |
| One-off hero/section effect on a live page? | in-browser |
| Needs N data-driven variants (per-user, per-product, per-locale)? | Remotion (programmatic) |
| Must work with JS disabled / degrade gracefully? | in-browser (CSS-first) or a pre-rendered video |
When both apply (interactive page that also ships a video), do both: build the page in-browser, render the video with Remotion, embed it.
2. In-browser tool selection
| Need | Use | Spoke |
|---|---|---|
| Scroll-linked: pin, scrub, parallax, reveal, horizontal-scroll | GSAP ScrollTrigger | astro-gsap-scrolltrigger |
| Timeline/sequence, SVG draw & morph, stagger grids, tween JS objects | Anime.js | animejs |
| Simple enter/exit, state change, page-to-page morph | CSS transitions / Astro View Transitions | astro-framework |
| Drop-in hero / landing / 3D / WebGL / Framer-Motion component | Pre-built library | web-motion-library |
Reach for CSS / View Transitions first; escalate to GSAP/Anime.js only when the effect needs scroll-linking, sequencing, or fine timeline control.
3. Reduced motion (non-negotiable a11y baseline)
Gate every non-essential animation behind reduced-motion and provide a static end-state:
- CSS: wrap motion in
@media (prefers-reduced-motion: no-preference) { … }. - GSAP: use
gsap.matchMedia()with a"(prefers-reduced-motion: reduce)"branch that sets the final state instantly. - Anime.js: check
window.matchMedia('(prefers-reduced-motion: reduce)').matchesand skip or jump to the end. - Remotion: accept a
reducedMotionprop / offer a still poster frame for embeds.
Essential motion (e.g., a loading spinner conveying state) may remain, but minimize it.
4. Performance budget
- Animate compositor-only properties:
transformandopacity. Never animate layout properties (width,height,top,left,margin,padding) — they trigger layout/paint and thrash. - Use
will-changesparingly and remove it after the animation; permanentwill-changewastes memory. - Target 60fps (≈16ms/frame); keep per-frame JS under ~4ms. Profile with DevTools Performance + the FPS meter.
- Defer animation scripts off the critical path (see hydration below). Lazy-load heavy libs (GSAP plugins, three.js) only on routes that use them.
5. Astro hydration boundaries for animation
Where animation code runs matters as much as what it does:
- Plain
<script>in.astro— bundled, runs once on initial load. Good for global GSAP init. But under View Transitions it does not re-run on client-side nav. - Framework island directive — pick by position/urgency:
client:load— above-the-fold hero that must animate immediately.client:visible— below-the-fold; animate when scrolled into view (best default for reveals).client:idle— non-urgent ambient motion.client:only— client-only libraries (some WebGL/three.js) that can't SSR.
- View Transitions gotchas (when
<ClientRouter />is enabled):- Re-init scroll/timeline logic on
astro:page-load(fires on first load and after each nav); callScrollTrigger.refresh()after layout settles. - Clean up on
astro:before-swap— kill ScrollTriggers/timelines to prevent duplicates and leaks. - Use
transition:persistfor elements whose animation state must survive navigation.
- Re-init scroll/timeline logic on
6. Version / install matrix
| Spoke | Install | Notes |
|---|---|---|
| GSAP | gsap (+ gsap/ScrollTrigger, registered via gsap.registerPlugin) | Free tier covers ScrollTrigger; SplitText et al. now free in recent versions. |
| Anime.js | animejs | v3 (anime()) vs v4 (new createTimeline/import API) differ — confirm version; the animejs spoke covers both. |
| Remotion | remotion + @remotion/cli (+ @remotion/lambda / @remotion/cloudrun for scaled renders) | Renders need a bundler step; Lambda/Cloud Run incur real cost+time — confirm scope first. |
| Astro | astro + integrations (@astrojs/react etc.); <ClientRouter /> for view transitions | Match integration versions to the Astro major. |
7. Shared guardrails
- Compositor-only props (
transform/opacity); no layout-animating. - Always provide a reduced-motion path and a sensible static fallback.
- Re-init and clean up animations across Astro view transitions — no duplicate ScrollTriggers, no leaks.
- Don't ship
will-changepermanently. - Confirm scope and expected cost/time before heavy Remotion renders (Lambda/Cloud Run).
- Prefer CSS/View Transitions before adding a JS animation dependency.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.