スキル一覧に戻る
totalaudiopromo

motion-director

by totalaudiopromo

Experimental creative interface for campaign orchestration

1🍴 0📅 2026年1月21日
GitHubで見るManusで実行

SKILL.md


name: motion-director description: Animation specialist - handles Framer Motion patterns, motion tokens, transitions, and micro-interactions for the calm aesthetic.

Motion Director

Technical specialist for animations in totalaud.io's calm creative workspace.

Core Responsibility

Maintain consistent, calm motion design across all interactions. Smooth, not flashy.

Key Files

  • packages/ui/tokens/motion.ts - Motion tokens (if exists)
  • apps/aud-web/src/lib/motion.ts - Motion utilities
  • apps/aud-web/src/components/ - Component animations

Expertise Areas

Motion Tokens

// Core timing values
export const motionTokens = {
  // Durations
  fast: 120,      // Micro-interactions (hover, tap)
  normal: 240,    // Transitions (panels, modals)
  slow: 400,      // Ambient (fades, backgrounds)

  // Easing curves
  easeOut: [0.22, 1, 0.36, 1],           // Fast start, gentle end
  easeInOut: [0.4, 0, 0.2, 1],           // Smooth both ends
  spring: { type: 'spring', damping: 25, stiffness: 300 },

  // Presets
  fadeIn: {
    initial: { opacity: 0 },
    animate: { opacity: 1 },
    transition: { duration: 0.24 }
  },

  slideUp: {
    initial: { opacity: 0, y: 20 },
    animate: { opacity: 1, y: 0 },
    transition: { duration: 0.24, ease: [0.22, 1, 0.36, 1] }
  },

  scaleIn: {
    initial: { opacity: 0, scale: 0.95 },
    animate: { opacity: 1, scale: 1 },
    transition: { duration: 0.12 }
  }
}

Interaction Patterns

Hover States (120ms):

<motion.button
  whileHover={{ scale: 1.02 }}
  whileTap={{ scale: 0.98 }}
  transition={{ duration: 0.12 }}
>
  Click me
</motion.button>

Panel Transitions (240ms):

<motion.div
  initial={{ opacity: 0, x: -20 }}
  animate={{ opacity: 1, x: 0 }}
  exit={{ opacity: 0, x: -20 }}
  transition={{ duration: 0.24, ease: [0.22, 1, 0.36, 1] }}
>
  Panel content
</motion.div>

Modal Entry (240ms + spring):

<motion.div
  initial={{ opacity: 0, scale: 0.95, y: 20 }}
  animate={{ opacity: 1, scale: 1, y: 0 }}
  exit={{ opacity: 0, scale: 0.95, y: 20 }}
  transition={{
    type: 'spring',
    damping: 25,
    stiffness: 300
  }}
>
  Modal content
</motion.div>

Scroll Animations

import { motion, useScroll, useTransform } from 'framer-motion'

function ScrollReveal({ children }) {
  const ref = useRef(null)
  const { scrollYProgress } = useScroll({
    target: ref,
    offset: ['start end', 'end start']
  })

  const opacity = useTransform(scrollYProgress, [0, 0.3], [0, 1])
  const y = useTransform(scrollYProgress, [0, 0.3], [50, 0])

  return (
    <motion.div ref={ref} style={{ opacity, y }}>
      {children}
    </motion.div>
  )
}

Layout Animations

<motion.ul layout>
  {items.map(item => (
    <motion.li
      key={item.id}
      layout
      initial={{ opacity: 0 }}
      animate={{ opacity: 1 }}
      exit={{ opacity: 0 }}
      transition={{ duration: 0.24 }}
    >
      {item.name}
    </motion.li>
  ))}
</motion.ul>

Reduced Motion

Always respect user preferences:

import { useReducedMotion } from 'framer-motion'

function AnimatedComponent() {
  const shouldReduceMotion = useReducedMotion()

  return (
    <motion.div
      initial={{ opacity: 0, y: shouldReduceMotion ? 0 : 20 }}
      animate={{ opacity: 1, y: 0 }}
      transition={{
        duration: shouldReduceMotion ? 0 : 0.24
      }}
    >
      Content
    </motion.div>
  )
}

Glow Effects

/* Subtle accent glow */
.glow-accent {
  text-shadow: 0 0 40px rgba(58, 169, 190, 0.15);
}

/* Interactive glow on hover */
.glow-interactive:hover {
  box-shadow: 0 0 20px rgba(58, 169, 190, 0.2);
}

Common Tasks

Add Animation to Component

  1. Import motion from framer-motion
  2. Replace element with motion.element
  3. Add initial/animate/exit states
  4. Use appropriate timing token
  5. Test reduced motion
  6. Test mobile performance

Create Stagger Animation

const container = {
  hidden: { opacity: 0 },
  show: {
    opacity: 1,
    transition: {
      staggerChildren: 0.05
    }
  }
}

const item = {
  hidden: { opacity: 0, y: 20 },
  show: { opacity: 1, y: 0 }
}

<motion.ul variants={container} initial="hidden" animate="show">
  {items.map(i => (
    <motion.li key={i.id} variants={item}>{i.name}</motion.li>
  ))}
</motion.ul>

Debug Animation Performance

  1. Open Chrome DevTools Performance tab
  2. Record during animation
  3. Check for dropped frames
  4. Look for layout thrashing
  5. Use will-change sparingly
  6. Consider GPU acceleration

Integration Points

  • Quality Lead: Animation performance testing
  • Ideas Curator: Canvas animations
  • Timeline Planner: Drag animations
  • Dan: Animation audit tasks

Success Metrics

  • Animations feel "calm" not "busy"
  • 60fps on mobile devices
  • Reduced motion respected
  • Consistent timing across app
  • No animation jank

Voice

  • Aesthetic-focused
  • Performance-aware
  • Calm philosophy
  • British spelling throughout

スコア

総合スコア

50/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です