motion について
Motion を使う React チーム向けに、アクセシビリティや性能を考慮したアニメーション設計と実装を案内するスキルです。Motion 13.x と React ベースのフレームワークを対象にしています。
主な機能
- 01Motion API とセットアップの案内
- 02プロダクトモーションの設計原則
- 03視覚効果低減とアクセシビリティの確認
- 04性能とバンドルサイズの指針
- 05実装と QA のレシピ
活用シーン
- 01画面遷移の設計
- 02ジェスチャーやスクロール連動の実装
- 03アニメーションのアクセシビリティと性能の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dobroslavradosavljevic/ skills --skill motionインストール後、Claude Code で/motionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/accessibility.mdcomponent-recipes.mddeliverables-qa.mdfoundations.mdpackages-react.mdperformance.mdproduction-a11y.mdsetup-react-core.mdsource-map.mdvalues-scroll-layout.mdview-animations.mdweb-implementation.md詳細
Motion
Motion for React(motion/旧称 Framer Motion)と、プロダクトのモーションデザイン(目的、トークン、アクセシビリティ、パフォーマンス)にこのスキルを使用します。記憶に頼らず、最新の motion.dev React docs を優先してください。説明は [email protected](最新 13.5.0)に合わせます。
対象範囲: React と React ベースのフレームワークのみ(Next.js、Vite+React、Remix など)。Motion for Vue、バニラ JavaScript のみのページ、React Native は実装しないでください。
すべてのホバーに Motion が必要なわけではありません。一般的なデザイン基準は維持し、プロジェクトですでに Motion を使用している場合、または CSS では実現しにくい入退場、レイアウト、ジェスチャー、スクロール連動のモーションが必要な場合に Motion を使用してください。
コア原則(常に適用)
アニメーションを提案または実装する前に、次の問いに答えてください。
- インターフェースでは何が変わりましたか?
- なぜ変わりましたか?
- 変わった要素はどこから来て、どこへ向かいますか?
- ユーザーに次に何に注目してもらうべきですか?
- 装飾のために待たずに、ユーザーは作業を続けられますか?
- モーションを低減した場合、どのように置き換えますか?
- このアニメーションはコンポジター上で動作しますか。それともレイアウトやペイントを発生させますか?
満たさない場合は、削除するか簡素化してください。そのうえで、最小限のツールを選びます。CSS → motion/react-mini/LazyMotion → 完全版の motion/react → スクリーンショットのようなモーフィングが適している場合に限り AnimateView/animateView(View Transitions)。
ワークフロー
- React の対象を確認します。
motion/reactまたはmotion/react-client(Next App Router)を使用してください。bun add motionを推奨します。新しい React UI ではframer-motion、motion-v、バニラ CDN Motion を生成しないでください。 - source-map.md でバージョン、エントリーポイント、ドキュメント URL を最新のものに更新します。13.x を対象とします。13.0 以降では、Emotion/Styled Components に
isValidPropの明示的な指定、または合成順序の逆転が必要です。packages-react.md を参照してください。 - foundations.md を参照し、プロダクトのモーションに関する判断(目的、トークン、時間/イージング)を適用します。
- 宣言的 API(
motion.*、variants、transitions、arc()、ジェスチャー、AnimatePresence、SVG)には、setup-react-core.md を使用します。 - MotionValues、
useAnimate、スクロール、レイアウト/layoutId、Reorder、および関連フックには、values-scroll-layout.md を使用します。 animateView("motion"から)または React のAnimateViewコンポーネント(motion/react-animate-view、React 19.3 以降)による View Transitions には、view-animations.md を使用します。- Next/RSC、Mini、LazyMotion のサイズ調整、移行、Motion+ には、packages-react.md を使用します。
- LazyMotion のレシピ、
MotionConfig、モーションの低減、パフォーマンス、テスト、AI が陥りやすい誤りには、production-a11y.md を使用します。 - Motion を使用しない場合の CSS/WAAPI/FLIP/View Transitions/スクロール駆動 CSS には、web-implementation.md を使用します。
- UI パターンのレシピには、component-recipes.md を使用します。
- 監査、引き継ぎ、QA には、deliverables-qa.md を使用します。これらが主な対象となる場合は、accessibility.md と performance.md も読み込んでください。
実装上の判断
- 標準のインポート:
import { motion, AnimatePresence } from "motion/react"。Next App Router:import * as motion from "motion/react-client"または"use client"。 - ルートに
<MotionConfig reducedMotion="user">を設定します。ライブラリのデフォルトは"never"で、明示的に有効にするまで OS の設定は無視されます。 - transform / opacity を優先し、サイズや位置の変化には
layout/layoutIdを使用します(animateの width/height は使いません)。必要に応じてlayout="x"/layout="y"/layout="position"で軸を固定します。 - 条件分岐の外側に
AnimatePresenceを配置し、安定したkeys を使用します。mode="wait"は子要素が 1 つの場合に限ります。 - 新しいコードでは、従来の
staggerChildrenよりもdelayChildren: stagger(...)を優先します。 - 曲線に沿った移動には
transition={{ path: arc() }}またはtransition.layout.pathを使用します。ミニ版のanimate()は使いません。 - カスタムコンポーネントでは
motion.create(Component)を一度だけ呼び出します(レンダー内では呼び出しません)。ref を転送してください。Motion 13 では、MotionConfig isValidProp={isPropValid}を指定しない限り、Emotion の prop フィルタリングが行われると想定しないでください。 - 高頻度のスクロール/ドラッグには、毎フレーム
useStateを使うのではなく、MotionValues とstyleを使用します。 - バンドル:
LazyMotion+motion/react-mのmを使用します。domAnimationとdomMax(layout/drag)を使い分けます。 - Mini(
motion/react-mini)ではx/yなどの独立した transform は使用できません。完全版のuseAnimateまたは CSS のtransformを使用してください。 - View Transitions:
motion/react-animate-viewのAnimateView(13.4 以降は無料。React/React DOM 19.3+ が必要で、状態変更はstartTransition内で行います)、または古い React では"motion"の命令型animateViewを使用します。OSS で Motion+ /motion-plusが利用できると想定しないでください。 - Reorder: 上書きする場合を除き
axisは省略します。グリッドでは"xy"を指定します。RTL に対応しています。
検証
framer-motion/motion-vではなく、motion/react(またはmotion/react-client/react-m/react-mini/react-animate-view)からインポートしていること。- reduced-motion の経路をテストしていること(
MotionConfigおよび/またはuseReducedMotion)。 - 終了アニメーション:presence でラップし、キーを指定していること。タスクの速度に応じて、中断や
transitionが適切であること。 - レイアウト:
popLayoutには static ではない親要素を指定し、必要に応じてlayoutScroll/layoutRootを設定していること。 - テスト:
transition={{ duration: 0 }}またはfalseを使用します。必要に応じて、スタイルをアサートする前にframe.postRenderを待機してください。 - 完全版の
motionを追加する場合は、LazyMotion/mini と比較してバンドルを確認すること。 - 13.0 以降の CSS-in-JS:DOM に style props が漏れていないこと(または
isValidProp/ 逆方向の合成を使用していること)。