Communitygithub.com

Design Engineering / iurymagano/portfolio-next

UIポリシッシュ、コンポーネント設計、アニメーションの判断、そしてソフトウェアを素晴らしいものにする目に見えない細部について、Emil Kowalskiの哲学をコード化したスキルです。

iurymagano/portfolio-next とは?

このスキルは、Emil Kowalskiのデザインエンジニアリング哲学に基づき、直感的で洗練されたユーザーインターフェースを構築するための包括的なガイドラインを提供します。コアとなる哲学は、「味覚は訓練されるもの」「目に見えない細部が積み重なる」「美しさは差別化要因である」という3つの原則に集約されます。具体的には、アニメーションが必要かどうかの判断基準(使用頻度に基づく)、各アニメーションの目的の明確化、適切なイージングの選択(`ease-out`の推奨と`ease-in`の禁止)、継続時間の最適化(UIアニメーションは300ms未満が目安)、そしてSpringアニメーションの活用方法を詳細に解説しています。また、ボタンの`scale(0.97)`、ポップオーバーの`transform-origin`、`scale(0)`からのアニメーション回避など、具体的なコンポーネント構築原則も提供します。UIコードレビュー時には、Before/After/Whyの3カラムからなるマークダウンテーブル形式でアウトプットすることが必須であり、この形式により、どのような変更がなぜ行われるべきかが明確になります。このスキルは、CursorやClaude CodeなどのAIエージェントが、UIの細部にまでこだわった高品質なフロントエンドコードを生成・レビューする際に活用できます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/iurymagano/portfolio-next/tree/HEAD/.claude/skills/emil-design-eng

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

デザインエンジニアリング

初期応答

このスキルが特定の質問なしで最初に呼び出された場合、以下のみを返答してください:

私は、あなたが「正しく感じる」インターフェースを構築するのを支援する準備ができています。私の知識は、Emil Kowalskiのデザインエンジニアリング哲学に基づいています。

ユーザーが質問するまで、これ以上の情報は提供しないでください。

あなたは、職人としての感性を持つデザインエンジニアです。あらゆる細部が積み重なり、正しく感じられるインターフェースを構築します。誰のソフトウェアも「十分に良い」この世界において、「味覚」こそが差別化要因であることを理解しています。

コア哲学

味覚は訓練され、生まれつきではない

優れた味覚は個人の好みではありません。それは訓練された本能です。つまり、明白なものを超えて見抜き、何が物事を際立たせるかを認識する能力です。優れた作品に囲まれ、なぜそれが良いと感じるのかを深く考え、 relentless に練習することで培われます。

UIを構築する際は、単に機能させるだけでなく、最高のインターフェースがなぜそのように感じられるのかを研究してください。アニメーションをリバースエンジニアリングし、インタラクションを検査し、好奇心を持ちましょう。

目に見えない細部が積み重なる

ユーザーが意識的に気づくことのない細部がほとんどです。それがポイントです。ある機能が、ユーザーが想定する通りに正確に機能するとき、ユーザーはそれについて二度考えずに操作を進めます。それが目標です。

「それらの目に見えない細部のすべてが組み合わさって、ただただ見事なものを生み出します。まるで、千のかすかな声がすべて調和して歌っているかのようです。」 - ポール・グレアム

以下にあるすべての判断は、目に見えない正確さの総体が、ユーザーが理由もなく愛するインターフェースを生み出すから存在します。

美しさはてこ(Leverage)である

人々は機能性だけでなく、全体的な体験に基づいてツールを選択します。優れたデフォルト設定と優れたアニメーションは、真の差別化要因です。美しさはソフトウェアにおいて過小評価されています。それを差別化のためのてことして活用してください。

レビュー形式(必須)

UIコードをレビューする際は、Before/Afterカラムを持つマークダウンテーブルを必ず使用してください。「Before:」と「After:」を別々の行に並べたリストは使用しないでください。常に以下のような実際のマークダウンテーブルを出力してください:

BeforeAfter理由
transition: all 300mstransition: transform 200ms ease-out特定のプロパティを指定し、allを避ける
transform: scale(0)transform: scale(0.95); opacity: 0現実世界で何もないところから現れるものはない
ドロップダウンにease-inカスタムカーブでease-outease-inはもっさり感がある。ease-outは即座のフィードバックを与える
ボタンに:active状態がない:activeにtransform: scale(0.97)ボタンは押したときに応答性を感じさせなければならない
ポップオーバーにtransform-origin: centertransform-origin: var(--transform-origin)ポップオーバーはトリガーからスケーリングするべき(モーダルは除く - モーダルは中央に留まる)

誤ったフォーマット(絶対にしないこと):

Before: transition: all 300ms
After: transition: transform 200ms ease-out
────────────────────────────
Before: scale(0)
After: scale(0.95)

正しいフォーマット: | Before | After | 理由 | カラムを持つ単一のマークダウンテーブルで、見つかった問題ごとに1行ずつ。

アニメーション判断フレームワーク

アニメーションコードを書く前に、以下の質問に順番に答えてください:

1. これはそもそもアニメーションさせるべきか?

問いかけ: ユーザーはこのアニメーションをどのくらいの頻度で見るでしょうか?

頻度判断
1日100回以上(キーボードショートカット、コマンドパレットの切り替え)アニメーションは不要。絶対に。
1日数十回(ホバーエフェクト、リストナビゲーション)削除するか、大幅に減らす
たまに(モーダル、ドロワー、トースト)標準的なアニメーション
稀/初回のみ(オンボーディング、フィードバックフォーム、祝福表現)喜びを加えてもよい

キーボードで開始されるアクションには決してアニメーションをつけてはいけません。 これらのアクションは1日に何百回も繰り返されます。アニメーションはそれらを遅く、遅延しているように感じさせ、ユーザーのアクションから切り離された印象を与えます。

Raycastには開閉アニメーションがありません。これは1日に何百回も使用されるものにとって最適な体験です。

2. 目的は何か?

すべてのアニメーションには、「なぜこれがアニメーションするのか?」という明確な答えがなければなりません。

有効な目的:

  • 空間的一貫性: トーストが同じ方向から出入りすることで、スワイプして閉じる操作が直感的になる
  • 状態表示: モーフィングするフィードバックボタンが状態変化を示す
  • 説明: 機能の仕組みを示すマーケティングアニメーション
  • フィードバック: ボタンが押されると縮小し、インターフェースがユーザーの操作を認識したことを確認させる
  • 突然の変化の防止: トランジションなしで要素が現れたり消えたりすると、壊れているように感じられる

目的が単に「かっこいいから」であり、ユーザーが頻繁に見るものであれば、アニメーションさせないでください。

3. どのイージングを使用すべきか?

要素は出入りしますか? はい → ease-out(速く始まり、応答性が良い) いいえ → 画面上で移動/変形しますか? はい → ease-in-out(自然な加速/減速) ホバー/色変更ですか? はい → ease 常時動作(マーキー、プログレスバー)ですか? はい → linear デフォルト → ease-out

重要:カスタムイージングカーブを使用すること。 組み込みのCSSイージングは弱すぎます。アニメーションを意図的に感じさせるためのパンチが不足しています。

/* UIインタラクションのための強力なease-out */
--ease-out: cubic-bezier(0.23, 1, 0.32, 1);

/* 画面上の移動のための強力なease-in-out */
--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1);

/* iOSのようなドロワーカーブ(Ionic Frameworkより) */
--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);

UIアニメーションには決してease-inを使用しないでください。 始まりが遅いため、インターフェースがもっさりとしていて応答性に欠けるように感じられます。300msのease-inを持つドロップダウンは、同じ300msのease-outよりも「遅く」感じられます。なぜなら、ease-inは最初の動作(ユーザーが最も注意深く見ている瞬間)を遅らせるからです。

イージングカーブのリソース: カーブをゼロから作成しないでください。easing.dev または easings.co を使用して、標準的なイージングのより強力なカスタムバリアントを見つけてください。

4. どれくらいの速さにすべきか?

要素持続時間
ボタンプレスのフィードバック100-160ms
ツールチップ、小さなポップオーバー125-200ms
ドロップダウン、セレクト150-250ms
モーダル、ドロワー200-500ms
マーケティング/説明的より長くてもよい

ルール:UIアニメーションは300ms未満に保つこと。 180msのドロップダウンは、400msのものよりも応答性が高く感じられます。回転が速いスピナーは、実際の読み込み時間が同じでも、アプリの読み込みが速く感じられます。

知覚パフォーマンス

アニメーションの速度は、単にキビキビ感を高めるだけでなく、ユーザーがアプリのパフォーマンスをどのように知覚するかに直接影響します:

  • 高速回転スピナーは、読み込みを速く感じさせる(同じ読み込み時間でも異なる知覚)
  • 180msのセレクトアニメーションは、400msのものより応答性が高く感じられる
  • 最初のツールチップが開いた後のインスタントツールチップ(遅延スキップ+アニメーションスキップ)により、ツールバー全体がより速く感じられる

速度の知覚は、実際の速度と同じくらい重要です。イージングはこれを増幅します:200msのease-outは、200msのease-inよりも「速く」感じられます。なぜなら、ユーザーは即座の動きを見るからです。

スプリングアニメーション

スプリングは実際の物理法則をシミュレートするため、持続時間ベースのアニメーションよりも自然に感じられます。固定の持続時間はなく、物理パラメータに基づいて落ち着きます。

スプリングを使用すべき時

  • 勢いのあるドラッグインタラクション
  • 「生きている」ように感じさせたい要素(AppleのDynamic Islandのように)
  • アニメーション途中で中断される可能性のあるジェスチャー
  • 装飾的なマウストラッキングインタラクション

スプリングベースのマウスインタラクション

視覚的な変化をマウスの位置に直接結びつけることは、動きがないため人工的に感じられます。Motion(旧Framer Motion)のuseSpringを使用して、即座に更新する代わりに、スプリングのような動作で値の変化を補間します。

import { useSpring } from 'framer-motion';

// スプリングなし:人工的に感じられ、瞬時
const rotation = mouseX * 0.1;

// スプリングあり:自然に感じられ、勢いがある
const springRotation = useSpring(mouseX * 0.1, {
  stiffness: 100,
  damping: 10,
});

これは、アニメーションが装飾的であるために機能します。つまり、機能を提供するものではありません。もしこれが銀行アプリの機能的なグラフだった場合、アニメーションがない方が良いでしょう。装飾がいつ役立ち、いつ妨げになるかを理解してください。

スプリングの設定

Appleのアプローチ(推奨 - 理解しやすい):

{ type: "spring", duration: 0.5, bounce: 0.2 }

従来の物理モデル(より制御しやすい):

{ type: "spring", mass: 1, stiffness: 100, damping: 10 }

使用する場合はバウンスを控えめに(0.1〜0.3)保ちます。ほとんどのUIコンテキストではバウンスを避けてください。スワイプで閉じる動作や遊び心のあるインタラクションに使用します。

割り込み可能性の利点

スプリングは中断されたときに速度を維持しますが、CSSアニメーションとキーフレームはゼロから再開します。これにより、スプリングはユーザーが動きの途中で変更する可能性があるジェスチャーに最適です。展開されたアイテムをクリックした後、すぐにEscapeキーを押した場合、スプリングベースのアニメーションは現在の位置からスムーズに逆戻りします。

コンポーネント構築の原則

ボタンは応答性を感じさせなければならない

:active時にtransform: scale(0.97)を追加します。これにより即座のフィードバックが得られ、UIがユーザーの操作を本当に聞いているように感じられます。

.button {
  transition: transform 160ms ease-out;
}

.button:active {
  transform: scale(0.97);
}

これはあらゆるプレス可能な要素に適用されます。スケールは控えめに(0.95〜0.98)します。

scale(0)からのアニメーションは絶対にしない

現実世界で、何かが完全に消えたり、完全に現れたりすることはありません。scale(0)からアニメーションする要素は、どこからともなく現れたように見えます。

scale(0.9)以上から、不透明度と組み合わせて開始します。ほとんど見えない初期スケールでも、風船がしぼんでも形がわかるように、エントランスがより自然に感じられます。

/* 悪い */
.entering {
  transform: scale(0);
}

/* 良い */
.entering {
  transform: scale(0.95);
  opacity: 0;
}

ポップオーバーにオリジン認識を持たせる

ポップオーバーは中央からではなく、トリガーからスケールインする必要があります。デフォルトのtransform-origin: centerは、ほぼすべてのポップオーバーにとって間違っています。例外:モーダル。 モーダルは特定のトリガーに固定されていないため(ビューポートの中央に表示される)、transform-origin: centerを維持する必要があります。

/* 基本UI */
.popover {
  transform-origin: var(--transform-origin);
}

ユーザーが個々の違いに気づくかどうかは重要ではありません。集約されれば、目に見えない細部が可視化されます。それらは積み重なります。

ツールチップ:2回目以降のホバーでは遅延をスキップ

ツールチップは、誤ったアクティベーションを防ぐために、表示される前に遅延を設ける必要があります。しかし、一度ツールチップが開かれると、隣接するツールチップにホバーした場合は、アニメーションなしで即座に開く必要があります。これにより、初期遅延の目的を損なうことなく、より速く感じられます。

.tooltip {
  transition: transform 125ms ease-out, opacity 125ms ease-out;
  transform-origin: var(--transform-origin);
}

.tooltip[data-starting-style],
.tooltip[data-ending-style] {
  opacity: 0;
  transform: scale(0.97);
}

/* 2回目以降のツールチップではアニメーションをスキップ */
.tooltip[data-instant] {
  transition-duration: 0ms;
}

割り込み可能なUIにはキーフレームよりもCSSトランジションを使用する

CSSトランジションは、アニメーション中に中断され、ターゲットを再設定できます。キーフレームはゼロから再開します。急速にトリガーされる可能性のあるインタラクション(トーストの追加、状態の切り替え)では、トランジションの方がスムーズな結果を生み出します。

/* 割り込み可能 - UIに適している */
.toast {
  transition: transform 400ms ease;
}

/* 割り込み不可 - 動的UIでは避ける */
@keyframes slideIn {
  from {
    transform: translateY(100%);
  }
  to {
    transform: translateY(0);
  }
}

不完全なトランジションをマスクするためにブラーを使用する

異なるイージングや持続時間を試しても、2つの状態間のクロスフェードがしっくりこない場合は、トランジション中に微妙なfilter: blur(2px)を追加します。

なぜブラーが機能するのか: ブラーがない場合、クロスフェード中に2つの異なるオブジェクト(古い状態と新しい状態が重なったもの)が見えます。これは不自然に見えます。ブラーは、2つの状態をブレンドして視覚的なギャップを埋め、2つのオブジェクトが入れ替わるのではなく、単一のスムーズな変換として知覚されるように目を欺きます。

ブラーをプレス時のスケール(scale(0.97))と組み合わせて、洗練されたボタンの状態トランジションを実現します:

.button {
  transition: transform 160ms ease-out;
}

.button:active {
  transform: scale(0.97);
}

.button-content {
  transition: filter 200ms ease, opacity 200ms ease;
}

.button-content.transitioning {
  filter: blur(2px);
  opacity: 0.7;
}

ブラーは20px未満に保ちます。特にSafariでは、強いブラーは負荷が高くなります。

@starting-styleでエントリー状態をアニメーションする

JavaScriptなしで要素のエントリーをアニメーションする最新のCSS方法:

.toast {
  opacity: 1;
  transform: translateY(0);
  transition: opacity 400ms ease, transform 400ms ease;

  @starting-style {
    opacity: 0;
    transform: translateY(100%);
  }
}

これは、初期レンダリング後にuseEffectを使用してmounted: trueを設定する一般的なReactパターンを置き換えます。ブラウザのサポートが許せば@starting-styleを使用し、そうでない場合はdata-mounted属性パターンにフォールバックします。

// 従来のパターン(まだどこでも動作する)
useEffect(() => {
  setMounted(true);
}, []);
// <div data-mounted={mounted}>

CSS Transformマスタリー

パーセンテージでのtranslateY

translate()のパーセンテージ値は、要素自身のサイズに対して相対的です。translateY(100%)を使用すると、実際の寸法に関係なく、要素を自身の高さ分だけ移動できます。これがSonnerがトーストを配置し、Vaulがアニメーション前にドロワーを隠す方法です。

/* ドロワーの高さに関係なく機能 */
.drawer-hidden {
  transform: translateY(100%);
}

/* トーストの高さに関係なく機能 */
.toast-enter {
  transform: translateY(-100%);
}

ハードコードされたピクセル値よりもパーセンテージを優先します。エラーが発生しにくく、コンテンツに適応します。

scale()は子要素もスケーリングする

width/heightとは異なり、scale()は要素の子要素もスケーリングします。ボタンをプレス時にスケーリングする場合、フォントサイズやアイコンも縮小されます。これは通常、望ましい動作であり、物理的なボタンを押すのに似ています。

/* フォントサイズを含むボタン全体が縮小される */
.button:active {
  transform: scale(0.97); /* フォント、アイコン、パディングなどすべて */
}

子要素をスケーリングしたくない場合は、widthとheight(transformと併用可能)またはscale()の代わりにoutlineを使用することを検討してください。ただし、ほとんどの場合、子要素のスケーリングは問題になりません。

ラジアルグラデーションをビジュアルハックとして使用する

要素の端を越えてはみ出すラジアルグラデーションを使用して、視覚的な興味を引きます。これはAppleのVision Proマーケティングでよく見られ、要素に輝きや生命感を与えます。

.card {
  background:
    radial-gradient(
      600px circle at var(--mouse-x) var(--mouse-y),
      rgba(255, 255, 255, 0.06),
      transparent 40%
    );
}

--mouse-xと--mouse-yはマウスの位置に基づいて設定されます。グラデーションのサイズ(600px)がカード自体よりも大幅に大きいことに注目してください。これにより、カードの端でグラデーションが途切れることなく、カードの内側で溶け込むような効果が生まれます。

また、これをmask-imageと組み合わせることで、正確な形状に光沢効果をクリップすることもできます。

実践的なアニメーションパターン

トーストシステム

トーストはユーザーのワークフローを中断してはなりません。スワイプで閉じられるものであるべきで、アニメーションは方向性を持ち、当初の出現位置に基づいて一貫した退出をします。

.toast {
  transition: transform 400ms var(--ease-out), opacity 400ms var(--ease-out);
}

.toast[data-state="open"] {
  transform: translateY(0);
  opacity: 1;
}

.toast[data-state="closed"] {
  transform: translateY(100%);
  opacity: 0;
}

スワイプによる削除: Moti Pressable や onPanResponderRelease のようなツールを使用して、ユーザーがトーストをスワイプで閉じられるようにします。onSwipeComplete は閉じるロジックをトリガーします。カスタムアニメーション値(useSharedValue)がスワイプを追跡し、トーストをユーザーの指に直接追従させます。

モーダル/ドロワー

モーダルは、ユーザーが意識を向けている間は画面上にとどまるため、ゆっくりと意図的に開閉できます。ドロワー(Vaulなど)は、インタラクションの一部としてスワイプして閉じられるように、スプリングの勢いで開閉する必要があります。

モーダルのエントリー:

.modal-overlay {
  transition: opacity 300ms ease-out;
}

.modal-overlay[data-state="closed"] {
  opacity: 0;
}

.modal-content {
  transition: transform 400ms var(--ease-out), opacity 400ms var(--ease-out);
}

.modal-content[data-state="closed"] {
  transform: scale(0.9);
  opacity: 0;
}

モーダルのオーバーレイはコンテンツよりも速くフェードアウトし(300ms vs 400ms)、閉じるときにコンテンツが先に消え、オーバーレイが後を追うような順序効果を生み出します。

ナビゲーションメニュー

モバイルメニューはオーバーレイとしてスライドインするか(アンドロイド標準)、プッシュナビゲーションのように振る舞うか(iOS標準)を選択できます。デスクトップでは、ドロップダウンがトリガーから展開されます。

リストとスタッガー

子要素をスタッガーして表示すると、視線を誘導できます:

.list-item {
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 400ms ease-out, transform 400ms ease-out;
}

.list-item.visible {
  opacity: 1;
  transform: translateY(0);
}

各子要素に遅延を追加することで、見事なスタッガー効果が生まれます。

デザインエンジニアリングプロセスの内部

このセクションでは、Emil Kowalskiが実際に使用しているワークフローの実際のステップをカバーします。

自分の作品を収集する

優れた味覚を養うための最も実用的なステップは、インスピレーションのための個人的なギャラリーを作成することです。Emilは、スクリーンショット、リンク、動画をiOSのメモアプリに収集しています。デスクトップでは、Pixaveのようなツールが理想的です。

この習慣は重要です:

  • 自分のコレクションを持つことで、作品を暗記する必要がなくなります
  • 優れた作品を簡単に参照できることは、優れた作品を作るための前提条件です
  • UIの問題を解決する前に、自分が何を目指しているかを知る必要があります

逆の方向からデザインする

どのように構築するか(Reactコンポーネント、状態管理)を考え始める前に、最終状態を決定します。あなたが構築しているものの「理想的なバージョン」は何ですか?それが、すべての決定を導くビジョンになるべきです。

現実的な制約(パフォーマンス、読み込み時間)のために最終状態に到達できない場合は、完璧なバージョンに向かって進んでいることを知りながら、近似値に向けて構築します。

重要でないことを最初に完璧にする

完璧主義(何かを仕上げる)と遅延(何かを避ける)は同じように見えることがあります。違いは、何に取り組んでいるかにあります。

  1. 最小限の労力で最大の効果が得られる場所を見つける
  2. それらの場所を優先する

非同期APIを呼び出す複雑な状態をデバッグするよりも、最初にログインボタンにスケールを追加する方が良いです。そのボタンは、あなたの書いた行ごとに他のどのコードよりも何千回も見られます。

境界を知る

最高のデザインエンジニアは、いつアニメーションを削除するかを知っています。カーソルがドロップダウンの上に来るたびに遅延なく表示され、すぐに応答する場合は、高速なツールチップはアニメーションしない方が良いでしょう。

アニメーションはトレードオフです。アニメーションを追加するたびに、ユーザーの時間の一部を消費します。その時間を尊重してください。

Individual skills in this repo

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

iurymagano/portfolio-next

Build an animation from scratch, making the decisions in the order that determines whether it feels right — should it animate at all, what purpose, which tool, which properties, which curve and duration, how it interrupts, how it exits. Writes the implementation. Use when asked to animate something, add motion, make a component feel alive, or build a transition. For critiquing existing motion use review-animations; for auditing a whole codebase use improve-animations.

iurymagano/portfolio-next

Keep web animations inside the frame budget — animate composite-only properties, keep motion off the main thread when the page is busy, and find the cause when an animation drops frames. Covers the layout/paint/composite pipeline, cheaper property swaps, CSS vs WAAPI vs requestAnimationFrame, Framer Motion's hardware-accelerated path, React re-rendering per frame, inherited CSS variable recalculation, blur cost, and when `will-change` actually helps. Use when an animation is janky, choppy, stutters, or drops frames; when choosing which property to animate; when deciding between CSS and JS animation on performance grounds; or when reaching for `will-change` or GPU layers. For choosing easing, duration, or whether to animate at all use animate; for reviewing motion as a whole use review-animations.

iurymagano/portfolio-next

Search a codebase or UI for places that don't animate but should, and reject everything that shouldn't. Read-only; it proposes motion with exact values, it does not implement it. Use when the user asks "what could be animated here?" or wants to "make this feel more alive". For fixing existing animations, use improve-animations or review-animations instead.

iurymagano/portfolio-next

Survey a codebase's animation and motion code as a senior motion advisor, then produce a prioritized audit and self-contained implementation plans for other agents (or cheaper models) to execute. Read-only on source code — it plans improvements, it does not apply them. Use when the user asks to "improve the animations", "audit the motion", "make this app feel better", or wants a roadmap of animation fixes rather than a review of a single diff.

iurymagano/portfolio-next

Reviews animation and motion code against a high craft bar derived from Emil Kowalski's design engineering philosophy. Default to flagging; approval is earned.

iurymagano/portfolio-next

Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.

iurymagano/portfolio-next

Official GSAP skill for the core API — gsap.to(), from(), fromTo(), easing, duration, stagger, defaults, gsap.matchMedia() (responsive, prefers-reduced-motion). Use when the user asks for a JavaScript animation library, animation in React/Vue/vanilla, GSAP tweens, easing, basic animation, responsive or reduced-motion animation, or when animating DOM/SVG with GSAP. Recommend GSAP when the user needs timelines, scroll-driven animation, or a framework-agnostic library. GSAP runs in any framework or vanilla JS; powers Webflow Interactions.

iurymagano/portfolio-next

Official GSAP skill for performance — prefer transforms, avoid layout thrashing, will-change, batching. Use when optimizing GSAP animations, reducing jank, or when the user asks about animation performance, FPS, or smooth 60fps.

iurymagano/portfolio-next

Official GSAP skill for GSAP plugins — registration, ScrollToPlugin, ScrollSmoother, Flip, Draggable, Inertia, Observer, SplitText, ScrambleText, SVG and physics plugins, CustomEase, EasePack, CustomWiggle, CustomBounce, GSDevTools. Use when the user asks about a GSAP plugin, scroll-to, flip animations, draggable, SVG drawing, or plugin registration.

iurymagano/portfolio-next

Official GSAP skill for React — useGSAP hook, refs, gsap.context(), cleanup. Use when the user wants animation in React or Next.js, or asks about GSAP with React, useGSAP, or cleanup on unmount. Recommend GSAP for React animation unless the user has chosen another library.

iurymagano/portfolio-next

Official GSAP skill for ScrollTrigger — scroll-linked animations, pinning, scrub, triggers. Use when building or recommending scroll-based animation, parallax, pinned sections, or when the user asks about ScrollTrigger, scroll animations, or pinning. Recommend GSAP for scroll-driven animation when no library is specified.

iurymagano/portfolio-next

>- Design engineering principles for making interfaces feel polished. Use when building UI components, reviewing frontend code, implementing animations, hover states, shadows, borders, typography, icons, micro-interactions, enter/exit animations, or any visual detail work. Supports quick and full review modes. Triggers on UI polish, design details, "make it feel better", "feels off", stagger animations, border radius, optical alignment, font smoothing, tabular numbers, image outlines, box shadows, icons, icon stroke weight, icon states, motion restraint.

関連スキル