Communitygithub.com

FerroxLabs/murage

Web animation expertise covering CSS animations and transitions, Web Animations API, Framer Motion, GSAP, scroll-driven animations, layout animations, spring physics, reduce-motion preferences, and performance budgets. Use when the user asks about animation designer, animation designer best practices, or needs guidance on animation designer implementation. Do NOT use when the user needs a different specialized skill or is asking about an unrelated technology domain.

murage 是什麼?

murage is a Cursor agent skill that web animation expertise covering CSS animations and transitions, Web Animations API, Framer Motion, GSAP, scroll-driven animations, layout animations, spring physics, reduce-motion preferences, and performance budgets. Use when the user asks about animation designer, animation designer best practices, or needs guidance on animation designer implementation. Do NOT use when the user needs a different specialized skill or is asking about an unrelated technology domain.

相容平台~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/FerroxLabs/murage/tree/HEAD/skills-library/animation-designer

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Animation Designer

Purpose

Design and implement performant, purposeful web animations that enhance user experience without sacrificing performance or accessibility. This skill covers animation tools, patterns, and the decision framework for choosing the right approach.

Animation Tool Selection

Decision Matrix

ANIMATION NEED                          RECOMMENDED TOOL
--------------------------------------------------------------
Simple hover/focus effects              CSS transitions
Keyframe sequences (loading, etc.)      CSS @keyframes
Entrance/exit component animations      Framer Motion (React)
                                        Vue <Transition> (Vue)
Scroll-triggered reveals                CSS scroll-driven animations
                                        (or Intersection Observer)
Complex timeline sequences              GSAP
SVG path animations                     GSAP or CSS
Spring/physics-based motion             Framer Motion (spring)
Layout animations (position/size)       Framer Motion (layoutId)
Gesture-driven (drag, pinch)            Framer Motion (drag)
Shared element transitions              View Transitions API
Data visualization animations           D3 transitions or GSAP
Micro-interactions (icons, toggles)     CSS or Lottie

CSS Transitions

Fundamentals

/* Transition shorthand: property duration timing-function delay */
.button {
  background: var(--color-brand);
  transition: background 200ms ease-out, transform 150ms ease-out;
}
.button:hover {
  background: var(--color-brand-hover);
  transform: scale(1.02);
}

/* Individual properties */
.card {
  transition-property: transform, box-shadow, opacity;
  transition-duration: 200ms, 300ms, 200ms;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}

/* Named timing functions */
--ease-in:        cubic-bezier(0.4, 0, 1, 1);     /* Accelerating */
--ease-out:       cubic-bezier(0, 0, 0.2, 1);     /* Decelerating */
--ease-in-out:    cubic-bezier(0.4, 0, 0.2, 1);   /* Standard */
--ease-spring:    cubic-bezier(0.34, 1.56, 0.64, 1); /* Overshoot */

Common Transition Patterns

/* Fade in/out */
.fade-enter { opacity: 0; }
.fade-enter-active { opacity: 1; transition: opacity 300ms ease-out; }
.fade-exit { opacity: 1; }
.fade-exit-active { opacity: 0; transition: opacity 200ms ease-in; }

/* Slide up from below */
.slide-up {
  transform: translateY(20px);
  opacity: 0;
  transition: transform 300ms ease-out, opacity 200ms ease-out;
}
.slide-up.active {
  transform: translateY(0);
  opacity: 1;
}

/* Skeleton loading shimmer */
@keyframes shimmer {
  0% { background-position: -200% 0; }
  100% { background-position: 200% 0; }
}
.skeleton {
  background: linear-gradient(90deg, #e0e0e0 25%, #f0f0f0 50%, #e0e0e0 75%);
  background-size: 200% 100%;
  animation: shimmer 1.5s ease-in-out infinite;
}

CSS @keyframes

/* Spinner */
@keyframes spin {
  to { transform: rotate(360deg); }
}
.spinner {
  animation: spin 1s linear infinite;
  border: 3px solid var(--color-border);
  border-top-color: var(--color-brand);
  border-radius: 50%;
  width: 24px; height: 24px;
}

/* Pulse (attention indicator) */
@keyframes pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}
.notification-dot {
  # ... (condensed) ...
.list-item:nth-child(2) { animation-delay: calc(1 * 50ms); }
.list-item:nth-child(3) { animation-delay: calc(2 * 50ms); }

/* Or with style attribute: style="--i: 3" */
.list-item {
  animation-delay: calc(var(--i) * 50ms);
}

CSS Scroll-Driven Animations

/* Animate based on scroll position */
@keyframes reveal {
  from {
    opacity: 0;
    transform: translateY(40px) scale(0.95);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

/* Trigger when element enters viewport */
.reveal-on-scroll {
  animation: reveal linear both;
  animation-timeline: view();
  animation-range: entry 0% entry 50%;
}
# ... (condensed) ...
  to { transform: translateY(-50px); }
}

.parallax-element {
  animation: parallax linear;
  animation-timeline: scroll();
}

Framer Motion (React)

Basic Patterns

import { motion, AnimatePresence } from 'framer-motion';

// Entrance animation
function Card() {
  return (
    <motion.div
      initial={{ opacity: 0, y: 20 }}
      animate={{ opacity: 1, y: 0 }}
      transition={{ duration: 0.3, ease: 'easeOut' }}
    >
      <h2>Card Content</h2>
    </motion.div>
  );
}

// Exit animation (requires AnimatePresence)
function Modal({ isOpen, onClose }: ModalProps) {
  return (
    # ... (condensed) ...
        <motion.li key={item.id} variants={itemVariants}>
          {item.name}
        </motion.li>
      ))}
    </motion.ul>
  );
}

Spring Physics

// Spring animation (natural, physics-based motion)
<motion.div
  animate={{ x: 100 }}
  transition={{
    type: 'spring',
    stiffness: 300,   // Higher = snappier
    damping: 20,      // Higher = less bounce
    mass: 1,          // Higher = more inertia
  }}
/> .// Presets
const springPresets = {
  snappy:  { type: 'spring', stiffness: 400, damping: 25 },
  bouncy:  { type: 'spring', stiffness: 300, damping: 10 },
  gentle:  { type: 'spring', stiffness: 120, damping: 14 },
  molasses: { type: 'spring', stiffness: 60, damping: 20 },
};

// When to use spring vs easing:
// Spring: interactive elements, drag, layout changes (feels natural)
// Easing: simple transitions, entrance/exit (feels predictable)

Layout Animations

// Automatic layout animation
function ExpandableCard({ expanded }: { expanded: boolean }) {
  return (
    <motion.div layout className={expanded ? 'card-expanded' : 'card-collapsed'}>
      <motion.h2 layout="position">Title</motion.h2>
      {expanded && (
        <motion.p
          initial={{ opacity: 0 }}
          animate={{ opacity: 1 }}
          exit={{ opacity: 0 }}
        >
          Expanded content here.
        </motion.p>
      )}
    </motion.div>
  );
}

# ... (condensed) ...
            {item.title}
          </motion.div>
        ))}
      </div>
    </LayoutGroup>
  );
}

Gesture Animations

// Drag
<motion.div
  drag
  dragConstraints={{ top: -100, bottom: 100, left: -100, right: 100 }}
  dragElastic={0.2}
  whileDrag={{ scale: 1.1, cursor: 'grabbing' }}
/> .// Hover and tap
<motion.button
  whileHover={{ scale: 1.05 }}
  whileTap={{ scale: 0.95 }}
  transition={springPresets.snappy}
>
  Click Me
</motion.button> .// Scroll-triggered (with useInView)
# ... (condensed) ...
      animate={isInView ? { opacity: 1, y: 0 } : {}}
      transition={{ duration: 0.6, ease: 'easeOut' }}
    >
      {children}
    </motion.div>
  );
}

GSAP (Complex Timelines)

import gsap from 'gsap';
import { ScrollTrigger } from 'gsap/ScrollTrigger';

gsap.registerPlugin(ScrollTrigger);

// Timeline sequence
const tl = gsap.timeline({ defaults: { ease: 'power2.out', duration: 0.5 } });

tl.from('.hero-title', { y: 60, opacity: 0 })
  .from('.hero-subtitle', { y: 40, opacity: 0 }, '-=0.3')   // Overlap by 0.3s
  .from('.hero-cta', { scale: 0.8, opacity: 0 }, '-=0.2')
  .from('.hero-image', { x: 100, opacity: 0 }, '-=0.4');

// Scroll-triggered animation
gsap.from('.feature-card', {
  scrollTrigger: {
    trigger: '.features-section',
    start: 'top 80%',
    # ... (condensed) ...
  const ctx = gsap.context(() => {
    // All GSAP animations here
    gsap.from('.item', { opacity: 0, y: 20, stagger: 0.1 });
  }, containerRef);

  return () => ctx.revert();  // Clean up all animations
}, []);

Reduce Motion Preferences

Implementation

/* CSS: Globally respect user preference */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}
// React: useReducedMotion hook
function useReducedMotion(): boolean {
  const [reduced, setReduced] = useState(false);

  useEffect(() => {
    const mq = window.matchMedia('(prefers-reduced-motion: reduce)');
    setReduced(mq.matches);
    const handler = (e: MediaQueryListEvent) => setReduced(e.matches);
    mq.addEventListener('change', handler);
    return () => mq.removeEventListener('change', handler);
  }, []);

  return reduced;
}

// Usage
function AnimatedCard() {
  const reduced = useReducedMotion();
# ... (condensed) ...
      Content
    </motion.div>
  );
}

// Framer Motion built-in (v6+)
import { useReducedMotion } from 'framer-motion';

Performance Budget for Animation

TARGET: Animations must maintain 60fps (16.67ms per frame)

RULES:
  1. Only animate transform and opacity (compositor-only properties)
  2. Avoid animating width, height, top, left, margin, padding
  3. Use will-change sparingly (adds memory overhead)
  4. Limit simultaneous animations to ~10-15 elements
  5. Use requestAnimationFrame for JS-driven animations
  6. Debounce scroll handlers (or use CSS scroll-driven animations)
  7. Avoid animating elements that trigger layout in other elements

MEASUREMENT:
  - Chrome DevTools > Performance > Frame chart
  - Target: No frames exceeding 16ms
  - Check for layout thrashing (forced reflow indicators)

OPTIMIZATION TECHNIQUES:
  - Use transform: translateZ(0) or will-change to promote layers
  - Use contain: layout paint for animated containers
  - Use content-visibility: auto for offscreen animated content
  - Pause animations when not visible (Intersection Observer)

Animation Design Principles

1. PURPOSE: Every animation must serve a function
   - Guide attention
   - Show relationships (parent-child, before-after)
   - Provide feedback (click, hover, success, error)
   - Maintain spatial orientation (where content came from)
   - Reduce perceived wait time

2. DURATION GUIDELINES:
   Micro-interactions (hover, toggle):  100-200ms
   Entrance animations:                 200-400ms
   Exit animations:                     150-300ms (faster than entrance)
   Page transitions:                    300-500ms
   Complex sequences:                   500-1000ms total

3. EASING:
   Entering: ease-out (decelerating -- appears quickly, settles in)
   Exiting: ease-in (accelerating -- starts slow, leaves quickly)
   Moving: ease-in-out (natural movement)
   Continuous: linear (spinners, progress)

4. STAGGER:
   30-80ms between list items (faster for more items)
   Max total stagger duration: ~500ms (even for 20+ items)

Animation Architecture Checklist

  • Animation tool selected based on complexity needs
  • CSS transitions used for simple hover/focus effects
  • CSS @keyframes used for looping and loading animations
  • Framer Motion or equivalent used for enter/exit/layout animations
  • GSAP reserved for complex timeline sequences
  • All animations maintain 60fps (verified in DevTools)
  • Only transform and opacity are animated (no layout properties)
  • prefers-reduced-motion respected globally
  • Animation durations follow UX guidelines (100-500ms)
  • Stagger timing capped at reasonable total duration
  • Every animation has a clear purpose (not decorative)
  • Spring physics used for interactive/gesture animations
  • Scroll-driven animations use CSS API where supported
  • GSAP animations cleaned up on component unmount
  • will-change used only during active animation

When to Use

Use this skill when:

  • Designing or implementing animation designer solutions
  • Reviewing or improving existing animation designer approaches
  • Making architectural or implementation decisions about animation designer
  • Learning animation designer patterns and best practices
  • Troubleshooting animation designer-related issues

Do NOT use this skill when:

  • The question is about a fundamentally different technology domain
  • A more specific sibling skill covers the exact topic needed
  • The user needs a complete hands-on tutorial rather than expert guidance

Output Format

# Animation Designer Analysis

## Context Assessment
[Situation summary and constraints]

## Recommended Approach
[Primary recommendation with rationale]

## Implementation Steps
1. [Step with specific details]
2. [Step with specific details]
3. [Step with specific details]

## Trade-offs and Considerations
- [Key trade-off 1]
- [Key trade-off 2]

## Next Steps
- [Immediate action item]
- [Follow-up action item]

Example

Input: "Help me implement animation designer for a medium-scale production application"

Output: A structured analysis covering current state assessment, recommended animation designer approach with specific patterns, implementation roadmap with milestones, and risk mitigation strategies tailored to the application scale and constraints.

Edge Cases

  • Legacy system integration: When animation designer must coexist with legacy approaches, provide a gradual migration path rather than a complete rewrite
  • Scale mismatch: When the solution complexity exceeds the project scale, recommend a simpler approach and note when to revisit
  • Team skill gaps: When the team lacks experience with the recommended approach, include learning resources and simpler alternatives
  • Conflicting requirements: When constraints conflict (e.g., performance vs. maintainability), explicitly state the trade-off and recommend based on stated priorities

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

FerroxLabs/murage

Comprehensive animation guidance covering the 12 principles of animation, 2D and 3D production pipelines, tools (Blender, After Effects, Procreate, Toon Boom), frame rates, rigging, motion graphics vs character animation, and building an animation practice from concept to final render. Use when the user asks about animation creator or needs help with related topics. Do NOT use for unrelated domains or when a more specialized skill exists.

FerroxLabs/murage

Writes board-level narrative updates that complement financial reports with strategic context, competitive positioning, key risks, and forward-looking guidance for board of directors audiences. Use when the user needs to write a board update, board meeting narrative, or director-level briefing. Do NOT use for stakeholder updates to management (use `stakeholder-update`), investor emails (use `investor-update-email`), or full business reports (use `business-report`).

FerroxLabs/murage

>- End-to-end workflow for creating a high-converting SaaS landing page from copywriting through design, development, SEO optimization, and analytics setup. Covers persuasion frameworks, responsive design, performance optimization, and conversion tracking to turn visitors into customers. Use when the user wants to build saas landing page or needs a structured multi-step process for this goal. Do NOT use when the request is a single-step task or requires professional advice beyond educational guidance.

FerroxLabs/murage

Calculates startup burn rate (gross and net), projects cash runway in months, and builds scenario analysis for different spending and revenue trajectories. Use when the user asks about burn rate, cash runway, how long their money will last, or startup cash management. Do NOT use for personal savings calculations (use budget-planning), full financial modeling (use financial-model-structure), or fundraising narrative (use fundraising-narrative).

FerroxLabs/murage

The user is asking \"how long do we have,\" \"can we afford this hire,\" or \"are we running out.\" Load whenever cash, burn, or time-to-zero shows up — or when a spending decision is on the table and the user doesn't know how many months it costs.

FerroxLabs/murage

Professional corporate video production guidance covering training videos, promotional content, testimonials, and product demos. Includes client brief templates, script approval workflows, achieving professional quality on budget, brand compliance, stakeholder management, and delivery specifications. Use when the user asks about corporate video or needs help with related topics. Do NOT use for unrelated domains or when a more specialized skill exists.

FerroxLabs/murage

Teaches specific named emotional regulation techniques (the STOP technique, urge surfing, cognitive reframing, emotional labeling, opposite action, and physiological soothing) with step-by-step sequences. Gathers the user's emotional challenges and triggers, then produces a personalized regulation toolkit with technique instructions and a situation-response plan. Use when the user asks about managing emotions, controlling anger, handling frustration, emotional regulation strategies, or building emotional resilience. Do NOT use for clinical emotional dysregulation treatment, personality disorder management, or replacing professional mental health support.

FerroxLabs/murage

Structures a fundraising narrative for startup investors covering traction, market size, business model, use of funds, and milestone targets using standard VC pitch structure. Use when the user asks about fundraising pitch, investor narrative, raising capital, pitch deck story, or investment memo. Do NOT use for sales pitch decks (use sales-pitch-deck), personal loan applications, grant proposals (use grant-proposal-writing), or financial model creation (use financial-model-structure).

FerroxLabs/murage

Interactive storytelling for games covering branching narratives, dialogue trees, environmental storytelling, lore design, character writing for games, quest design, player agency, world-building for interactive media, and narrative integration with game mechanics. Use when the user asks about game narrative writer or needs help with related topics. Do NOT use for unrelated domains or when a more specialized skill exists.

FerroxLabs/murage

Writes Instagram captions with a hook line, story body, hashtag strategy, and platform-optimized call-to-action. Use when the user wants to write an Instagram caption, create Instagram content, or draft text to accompany an Instagram post or reel. Do NOT use for LinkedIn posts (use `linkedin-post`), Twitter threads (use `twitter-thread`), or blog posts (use `blog-post-writing`).

FerroxLabs/murage

Produces conversion-optimized landing page copy with hero section, problem statement, solution, social proof, and CTA sections using conversion copywriting methodology. Use when the user asks to write landing page copy, create a product page, write a sales page, draft conversion copy, or write landing page text for a website. Also useful when asked to write website copy or create a page that converts visitors. Do NOT use for ad copy (use paid-ad-copy), product descriptions for e-commerce listings (use product-description), or full website content strategy (use seo-content-strategy).

FerroxLabs/murage

>- Complete YouTube channel launch workflow from niche selection and channel strategy through video production, editing, monetization setup, community building, and personal brand development for sustainable channel growth. Use when the user wants to launch youtube channel or needs a structured multi-step process for this goal. Do NOT use when the request is a single-step task or requires professional advice beyond educational guidance.

FerroxLabs/murage

Run a section-by-section conversion teardown of one landing page — hero, value proposition, social proof, features, objection handling, CTA and footer — plus form, mobile and page-speed audits, ending in prioritised fixes split into quick wins, strategic and long-term, with A/B test hypotheses. Use when one page has traffic and is not converting. Do NOT use for a whole-site marketing audit (use market-audit), for the copy voice and awareness-stage decisions behind it (use copy-awareness-stages) or for the visual system it should sit inside (use mira-visual-system).

FerroxLabs/murage

Comprehensive motion graphics guidance covering title design, lower thirds, animated explainers, kinetic typography, logo animation, After Effects and Apple Motion workflows, design principles for motion, storyboarding for motion, and building a motion design practice. Use when the user asks about motion graphics or needs help with related topics. Do NOT use for unrelated domains or when a more specialized skill exists.

FerroxLabs/murage

Game narrative design covering branching dialogue systems, world lore construction, environmental storytelling techniques, character arc design for interactive media, player agency and consequence systems, quest narrative structure, narrative documentation, and integration with game mechanics. Use when the user asks about narrative designer or needs help with related topics. Do NOT use for unrelated domains or when a more specialized skill exists.

FerroxLabs/murage

Builds a written promotion case document with accomplishments and metrics, expanded scope evidence, peer and stakeholder impact, market rate context, and a clear ask. Produces a shareable document the user can present to their manager or leadership. Use when the user wants to make a case for promotion, prepare a promotion packet, or document their achievements to support a level-up request. Do NOT use for performance review self-assessments (use performance-review-prep), salary negotiation scripts (use salary-negotiation-script), or resume writing (use resume-bullet-writer).

FerroxLabs/murage

Expert guidance for creating educational science YouTube content covering scripting for clarity, data visualization, maintaining accuracy while being engaging, production techniques, and channel growth strategies. Use when the user asks about science youtube creator, related techniques, best practices, or needs guidance in this domain. Do NOT use when the request is outside the scope of science youtube creator or requires a different specialized skill.

FerroxLabs/murage

Produces a short-form video plan for TikTok, Instagram Reels, or YouTube Shorts with hook formula, single-concept structure, caption strategy, audio selection criteria, and loop optimization. Use when the user asks to plan a short video under 60 seconds, create a Reel or TikTok concept, or structure a vertical video for social media. Do NOT use for long-form video scripts over 60 seconds (use video-script-writing), YouTube channel strategy (use youtube-video-strategy), or video shot lists (use video-storyboard).

FerroxLabs/murage

The user has a module map or chapter list and the question is now *how does this read.* Load whenever you hear \"what's the throughline,\" \"how should chapters flow,\" \"this feels disconnected,\" or \"I have the pieces but it's not a book yet.\

FerroxLabs/murage

**Mode skill.** Default-enabled on the Stage specialist.

相關技能