animation-principles
This skill should be used when the user asks to "make this animation feel natural", "fix motion that feels stiff/floaty/cheap", "my animation looks robotic", "choose an easing curve", "how do I use the Graph Editor", "add overshoot or bounce", "Easy Ease isn't enough", "make snappy motion", "pick a duration for this transition", "stagger a list animation", "sync animation to a beat", or "review motion for good timing". It is the tech-agnostic foundation for deciding how something should move.
1How It Works & Mechanism
Tech-agnostic foundation: Independent of any specific tech stack, producing "concrete numbers" directly handed off to any implementation—durations, cubic-bezier curves, stagger offsets, and spring configurations.
It does not pick a tech stack; it produces concrete numbers (durations, cubic-bezier curves, stagger offsets, spring configs) ready to hand to any implementation.
Establish the Three Pillars (Emotional Intent / Visual Storytelling / Motion Craft) before deciding on any numbers; skipping this step leads to motion that is "technically correct but emotionally dead."
Every piece of motion should answer three questions *before* you pick a duration or curve.
Use the Three-Layer Motion Model (Primary / Secondary / Ambient) to explain "flatness," explicitly aligning with Hero / Support / Texture from the judgment-layer skill.
Flat motion = only the main thing moves. Believable motion runs three layers at once:
Position easing as the highest-leverage factor: reserve linear exclusively for continuous loops, mandate acceleration/deceleration for discrete events, and provide specific curves across entrance, exit, displacement, and brand categories.
Linear motion reads as robotic. Reserve `linear` for continuous loops (spinners, marquees, infinite scroll) only.
Divide durations into four tiers based on element scale (micro-interactions at 100-200ms → cinematic shots at 800-2000ms), and scale duration proportionally when distance or area changes.
Distance and size scale duration.
Utilize staggering and two variants of the 1/3 rule to prevent elements from "popping in all at once"—40-80ms for lists, 20-40ms for dense grids, capped by an overall 600-800ms ceiling.
Never reveal a list, grid, or group all at once — it reads as a single flat event. Stagger each child's start.
Use a diagnostic table to reverse-map symptoms to root causes (stiff / floaty / cheap / mechanical), turning reviews into actionable fix checklists.
- **Feels stiff/robotic** -> using `linear` or symmetric easing on an enter; switch to ease-out.
Map the manual keyframing path to After Effects Graph Editor: F9 Easy Ease is merely a 33% symmetrical baseline that must be crafted into an asymmetrical curve.
`F9` (Easy Ease) is only a 33% symmetric starting point — make it asymmetric.
2Core Capabilities
3External Dependencies
| Kind | Dependency / Endpoint |
|---|---|
| package | @react-spring/web(示例 spring 预设值,仅作参考实现) |
| package | SwiftUI / iOS 动画 API(示例 spring 写法,跨平台参考) |
| package | After Effects Graph Editor(手工缓动的落地工具) |
4Recommended Governance & Evidence
- SKILL.md: Pure prompt instructions and rule text, without script execution or external impacts
5Second-Pass Verification
- [ok] SKILL.md 的曲线值是否与 reference 一致(防两处打架) — SKILL.md 的 Quick reference(Enter `cubic-bezier(0.16, 1, 0.3, 1)`、Exit `(0.7, 0, 0.84, 0)`、Move `(0.65, 0, 0.35, 1)`、Branded `(0.34, 1.56, 0.64, 1)`)与 easing-curves.md 的分族库同型;但 reference 另列一套 Material 标准曲线(如 `0.2, 0, 0, 1`),两套体系并存且文档未给裁决规则——属文档分层而非矛盾,已在 risks 记录。
- [ok] 是否真的没有脚本或可执行资产 — 清点后目录内只有 5 个文件(SKILL.md、3 本 .md reference、1 个 0 字节 README),无 .js/.sh/.py/.json。
- [ok] 「技术无关」声明是否成立(有没有偷偷选边) — 自带代码示例覆盖 CSS 曲线、Framer Motion、react-spring、SwiftUI 与 AE 手工关键帧,且 SKILL.md 明确说「不选技术栈」;示例之间是并列参考,无强制依赖。
- [ok] 交叉引用是否指向真实存在的上游(本 pack 内) — 被引的 motion-art-direction(Hero/Support/Texture)与 shot-composition 都在同一仓库 skills/ 下存在;引用只做术语对齐,不要求安装额外 skill。
- [unlocatable] 「距离或面积翻倍加 30-50% 时长」等缩放系数的来源 — 这是经验规则,pin 仓库内无出处、无测量脚本、无数据文件。作为文档声明记录,不当作已核事实;实际项目应以感知测试校准。
6Verdict & Scenarios
069d807fa45f71f5…