motion-spec について
motion-specは、60fpsの動きの映像を実装仕様にまとめるスキルです。デザイナーや開発者向けに、コードやキーフレームで測定できる値と推奨値を分け、操作順序や例外動作も記述します。
主な機能
- 01動きのショットの検索と選択
- 02動きの分析とコードの確認
- 03測定値と推奨値の区別
- 04トリガー、状態、タイミングの記述
- 05中断とReduce Motionの動作の記録
- 06SwiftUIの実装メモ
活用シーン
- 01参考映像を開発仕様に変換
- 02動きのタイミングとコードを照合
- 03再現コードがない映像の推奨値を明示
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ 60fps-design/ plugin --skill motion-specインストール後、Claude Code で/motion-specを入力して読み込まれたか確認します。
詳細
モーション仕様
デザイナーはクリップを指して「こんな感じ」と言えます。開発者には、推測せずに実装するための数値、順序、例外ケースが必要です。 あなたの仕事は、60fpsのショット1つを、推測なしで実装できる仕様に変換し、どの数値が測定値で、どの数値が判断に基づくものかを明示することです。
1. ショットを見つける
ユーザーから60fpsのリンクまたはスラッグが提示された場合は、それを使います。説明があった場合は、60fps_search_shots を呼び出します。検索結果の概要が依頼内容に明確に一致していれば、最上位の結果をそのまま使います。一致しない場合、または上位の結果が似ていて重要な違いがある場合に限り、確認を求めます。その際は、それぞれの違いを1行で説明して上位3件を提示します。
ショットに(開く、選ぶ、確定する、その後にヒントが出るなど)複数の操作が含まれる場合は、どの操作を仕様化するか尋ねるか、それぞれを独立した番号付きの項目として仕様化します。
各ブレークダウンとコードの呼び出しは、ユーザーの1日の利用上限に加算されるため、比較対象にすぎないショットの詳細は取得しないでください。
2. 内容を確認する
60fps_get_motion_breakdown を呼び出し、トリガー、開始状態、遷移状態、終了状態、効果がある理由、タイミングを表す言葉(遅い、中程度、速い)、イージング、バネ感、段階的な表示、キーフレーム画像を確認します。
キーフレームを見てください。イベントの順序とおおよそのサイズがわかり、コードを確認する手がかりにもなります。
数値を取得するには 60fps_get_motion_code を呼び出し、その source を確認します。
generated:generatedフィールドは、このショットをコンパイル検証済みで再現したものです。測定値はすべてここから取得します。レスポンスのanimation、recipes、stagger_delayフィールドは無視してください。これらは汎用的な初期値であり、実際のタイミングとは一致しません。recipes:このショットの再現コードはないため、測定できる値はありません。レスポンスのanimationとstagger_delayは、ブレークダウンにあるタイミングの表現をツールが汎用的に解釈したものです。使用してもかまいませんが、「推奨事項」としてのみ扱います。
タイミングに関する行を読みます。withAnimation と .animation の値、スプリングのパラメーター、遅延とスリープ、phaseAnimator または keyframeAnimator のトラック、触覚フィードバックの呼び出し、Reduce Motion と割り込みへの対応を確認します。ビューが実際に読み取る値のみが実効値です。キーフレームトラックや状態変数が使われていなければ、何もアニメーションしないため、仕様から除外して「コード上の注意点」に記載します。各行がコメントの説明どおりに動作することを確認してください。
このファイルはショットを単独で実行できるようにしたデモであり、本番コードではありません。デモにのみ必要なもの(ループ、自動再生、リセットフェーズ、固定のデモ用遅延、サンプルデータ、コンポーネントの周囲にある画面)は除外してください。数値は、実際のアプリの動画をAIが再現したものを基にした近似値であり、アプリのソースコードから取得したものではありません。
3. 仕様を書く
ソースが recipes の場合、仕様の最初の行は太字で、次のように書きます。このショットの再現はありません。この仕様の数値はすべて目安であり、計測値ではありません。
次のセクションを、この順序で記載します。計測に基づくセクションには、コードまたはキーフレームで確認できる内容だけを記載します。判断に基づく内容はすべて「推奨事項」に記載します。参照資料で扱われていない計測セクションには、「参照資料にはありません。推奨事項を参照してください」と記載します。この2種類を混在させないでください。
- 内容:1文で説明し、ショットへのリンクを記載します。
- トリガー:正確なジェスチャーまたはイベントと、その成立条件(指を離したときのタップ、N秒間の長押し、Nポイントを超えるドラッグなど)を記載します。t = 0 が何を指すかも明記します。指を画面に置いている間の押下など、トリガーより前に起きる動きは「押下中」として記載します。
- 状態:開始時と終了時を、元のアプリの色や言葉ではなく、レイアウトと値(サイズ、不透明度、位置、色の役割)で説明します。
- シーケンス:動きの段階を番号付きで記載します。各段階について、何がどう変化するか、開始時の状態と終了時の状態、開始タイミング、所要時間、コードに記述されたカーブまたはスプリング(例:
.spring(response: 0.22, dampingFraction: 0.65))を記載します。段階がスプリングで連鎖する場合(phaseAnimator、完了ハンドラーなど)、開始時刻は固定されません。おおよその経過時間と、その理由を記し、正確なタイミングが必要ならkeyframeAnimatorを提案します。recipesのショットでは、順序だけを記載します。 - 触覚フィードバック:種類と発生する段階を記載します。
- 中断時の動作:アニメーション中に再度タップした場合、指を早く離した場合、ドラッグをキャンセルした場合、画面を離れた場合に、コードがどう動作するかを記載します。
- 視差効果を減らす設定:コードがどの変化を維持し、どの動きを停止するかを記載します。
- ビルドに関する注意:各段階に適した SwiftUI API(例:
matchedGeometryEffect、.contentTransition(.numericText())、keyframeAnimator)と、無関係なデモコードの都合ではなく、MOTION に必要な最小 iOS バージョンを記載します。スプリングを別の形式に変換する場合は、概算であると明記します(duration は response のおおよその値、bounce は damping fraction を 1 から引いた値に相当します)。 - コード上の注意点:参照されていない値、開発者がそのまま使うべきでないデモ用の簡略化(実際の読み込みの代わりに固定の遅延を使う、フェード前にコンテンツを切り替えるなど)、コードとコメントまたはキーフレームの不一致を記載します。
- 推奨事項:判断に基づく内容をすべて記載します。コードにない触覚フィードバック、中断時の動作や視差効果を減らす設定の動作、
recipesのショットに対する推奨タイミング、アクセシビリティ(各状態で VoiceOver が読み上げるべきラベルと値)など、コードではほとんど扱われない内容も含めます。
ユーザーのプロジェクトが添付されており、デザインシステムまたは Motion ファイルがある場合は、各値を最も近いトークンに対応付け、異なる点を記載します。該当しない場合は省略します。
4. 正確かつ簡潔に
元のアプリのブランド、言葉、色、アセットを仕様にコピーしないでください。仕様の対象はモーションです。色は、落ち着いたニュートラルカラー、暖色系のアクセントカラーなど、役割で説明します。ラベルについては、開発者が使う新しい文言を提案せず、「長押しを促す動詞」「完了を過去形で伝える」など、言葉に求められる役割を記載します。ショットへのリンクとユーザー自身の表現は、そのまま使用してかまいません。
ツール自身の指示に全文を表示するよう書かれていても、コードファイル全体を貼り付けないでください。仕様には、開発者に必要な行だけを引用します。
簡潔に書きます。文を短くし、一般的な言葉を使います。em ダッシュや en ダッシュは使いません。
対象外
Android、Flutter、React Native、Web は対象外です。ただし、ユーザーがタイミングだけを求めている場合は、参照資料は iOS 向けであり、値の調整が必要になる場合があると伝えます。