1仕組みと動作原理
インタラクションアニメーションに厳格な時間枠とコンポジタ制約(100–250ms、transform/opacityのみ操作、押下時即座に0.96、非対称な出入り)を定め、操作感を検証可能なパラメータに落とし込む
Duration: UI micro-interactions live in **100–250ms**. Anything over ~400ms feels laggy for a click response.
Framer Motion側はジェスチャー、スプリング、AnimatePresenceの3要素を骨格とし、スプリングはstiffnessとdampingの直感的な2つのパラメータで調整する
whileTap={{ scale: 0.96 }}
レイアウトアニメーションはFramer Motionの最大の武器:layoutが位置やサイズの変化を自動的にtransformへと変換し、layoutIdがコンポーネント間の共有要素(magic move)遷移を実現する
{!open && <motion.div layoutId="card" onClick={() => setOpen(true)} />}
ピュアCSSでも出入り(display切り替えを含む)が可能:@starting-styleで初回レンダリングの初期値を提供し、transition-behavior: allow-discreteで離散プロパティのトランジションを可能にする
transition-behavior: allow-discrete;
ローディングから成功・失敗への遷移を画面の切り替えではなく同一オブジェクトの連続状態(ボタンがスピナーからチェックマークに変形)として扱い、reduced-motionガードを必須とする
Loading → success → error should be one continuous motion (e.g. a button morphs spinner → checkmark), not a jump cut.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| package | motion(Framer Motion,v11+ 以 motion/react 导入) |
| network | 交付页从 CDN 取 React 与 motion(正文点名 esm.sh;产物期引用,不判级) |
| api | 现代 CSS 原语:@starting-style、transition-behavior: allow-discrete、@property、popover/dialog 的 overlay 离散属性 |
| cli | npx / Playwright(宿主侧截图工具)与仓库根 scripts/ 助手(seek-shot.sh、contact-sheet.sh 依赖 ffmpeg) |
4推奨統制措置と判定根拠
- 网络端点: 外部ネットワークアクセスの宣言: 実行時の外部通信ゼロ。成果物ページはCDNからReactとmotionを取得(本文でesm.shを指定。成果物フェーズでの参照であり評価対象外)
- 本地工作目录: ファイルI/Oと成果物出力: 当該スキルディレクトリへの書き込みゼロ。成果物はエージェントが出力する自己完結型の1つの.html(ピュアCSSまたはCDN経由のインラインtype=module)
5二重目の独立検証
- [unlocatable] transition-behavior: allow-discrete 与 @starting-style 的支持面 — SKILL.md 写 Baseline in Chrome/Edge/Safari、references 写 Baseline-available in current Chrome/Edge/Safari/Firefox——两处描述不同(SKILL.md 未含 Firefox),且均无源码内依据。正文要求读者 verify @starting-style and allow-discrete for your support floor,即文档自己把核实责任交给使用者,故按文档声明记录并在 risks 提示。
- [ok] layout 造成圆角与文字变形的告诫是否与配方一致 — SKILL.md 的 Gotcha 段与 references 的 magic-move/layout 小节都提示需子元素反向缩放或改用 layout="position";references 另给 useMotionValue 加 useSpring 的免重渲染建议,互不矛盾。
- [ok] 验收方式与动效性质是否匹配(状态驱动 vs 时间驱动) — SKILL.md 明写 A micro-interaction's frames are its states (idle / hover / pressed / open) 并给 ?state= 方案,同时保留 CSS 循环动画的 animationDelay 加 paused 冻结写法,两路都对得上其讨论的动效类型。
- [discrepancy] Packaged helper 的路径基准与语义 — SKILL.md 写 scripts/seek-shot.sh anim.html 0 1.5 3(秒制、时间冻结),但本 skill 的验收是状态冻结(?state=open),helper 与之不匹配;且 scripts/ 在仓库根,单装形态下相对路径亦不成立。
6結論
17fbed1b9f12f5ad…