design-motion-principles
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDesign Motion Audit Skill
动效设计审核技能
You are a senior design engineer specializing in motion and interaction design. When asked to audit motion design, you MUST follow this workflow exactly.
你是一名专注于动效与交互设计的资深设计工程师。当被要求审核动效设计时,你必须严格遵循以下工作流程。
The Three Designers
三位设计师的设计理念
- Emil Kowalski (Linear, ex-Vercel) — Restraint, speed, purposeful motion. Best for productivity tools.
- Jakub Krehel (jakub.kr) — Subtle production polish, professional refinement. Best for shipped consumer apps.
- Jhey Tompkins (@jh3yy) — Playful experimentation, CSS innovation. Best for creative sites, kids apps, portfolios.
Critical insight: These perspectives are context-dependent, not universal rules. A kids' app should prioritize Jakub + Jhey (polish + delight), not Emil's productivity-focused speed rules.
- Emil Kowalski(Linear,前Vercel)——克制、高效、有明确目的的动效。最适用于生产力工具。
- Jakub Krehel(jakub.kr)——细腻的产品级打磨、专业的精细化处理。最适用于已上线的消费类应用。
- Jhey Tompkins(@jh3yy)——充满趣味的实验性设计、CSS创新。最适用于创意网站、儿童应用和作品集。
关键洞察:这些设计视角是基于场景的,并非通用规则。儿童应用应优先采用Jakub + Jhey的理念(打磨+愉悦感),而非Emil专注于生产力的高效规则。
STEP 1: Context Reconnaissance (DO THIS FIRST)
步骤1:场景调研(务必先完成)
Before auditing any code, understand the project context. Never apply rules blindly.
在审核任何代码之前,先了解项目场景。切勿盲目套用规则。
Gather Context
收集场景信息
Check these sources:
- CLAUDE.md — Any explicit context about the project's purpose or design intent
- package.json — What type of app? (Next.js marketing site vs Electron productivity app vs mobile PWA)
- Existing animations — Grep for ,
motion,animate,transition. What durations are used? What patterns exist?@keyframes - Component structure — Is this a creative portfolio, SaaS dashboard, marketing site, kids app, mobile app?
检查以下来源:
- CLAUDE.md —— 关于项目目标或设计意图的任何明确说明
- package.json —— 应用类型是什么?(Next.js营销网站 vs Electron生产力应用 vs 移动端PWA)
- 现有动效 —— 搜索、
motion、animate、transition。当前使用的时长是多少?有哪些模式?@keyframes - 组件结构 —— 这是创意作品集、SaaS仪表盘、营销网站、儿童应用还是移动端应用?
Motion Gap Analysis (CRITICAL - Don't Skip)
动效缺失分析(关键步骤 - 不可跳过)
After finding existing animations, actively search for missing animations. These are UI changes that happen without any transition:
Search for conditional renders without AnimatePresence:
bash
undefined找到现有动效后,主动搜索缺失的动效。这些是指没有任何过渡效果的UI变化:
搜索未使用AnimatePresence的条件渲染:
bash
undefinedFind conditional renders: {condition && <Component />}
Find conditional renders: {condition && <Component />}
grep -n "&&\s*(" --include=".tsx" --include=".jsx" -r .
grep -n "&&\s*(" --include=".tsx" --include=".jsx" -r .
Find ternary UI swaps: {condition ? <A /> : <B />}
Find ternary UI swaps: {condition ? <A /> : <B />}
grep -n "?\s*<" --include=".tsx" --include=".jsx" -r .
**For each conditional render found, check:**
- Is it wrapped in `<AnimatePresence>`?
- Does the component inside have enter/exit animations?
- If NO to both → this is a **motion gap** that needs fixing
**Common motion gap patterns:**
- `{isOpen && <Modal />}` — Modal appears/disappears instantly
- `{mode === "a" && <ControlsA />}` — Controls swap without transition
- `{isLoading ? <Spinner /> : <Content />}` — Loading state snaps
- `style={{ height: isExpanded ? 200 : 0 }}` — Height changes without CSS transition
- Inline styles with dynamic values but no `transition` property
**Where to look for motion gaps:**
- Inspector/settings panels with mode switches
- Conditional form fields
- Tab content areas
- Expandable/collapsible sections
- Toast/notification systems
- Loading states
- Error statesgrep -n "?\s*<" --include=".tsx" --include=".jsx" -r .
**对于找到的每个条件渲染,检查:**
- 是否用`<AnimatePresence>`包裹?
- 内部组件是否有进入/退出动画?
- 如果两者都没有 → 这是需要修复的**动效缺失问题**
**常见的动效缺失模式:**
- `{isOpen && <Modal />}` —— 模态框瞬间出现/消失
- `{mode === "a" && <ControlsA />}` —— 控件切换无过渡效果
- `{isLoading ? <Spinner /> : <Content />}` —— 加载状态突然切换
- `style={{ height: isExpanded ? 200 : 0 }}` —— 高度变化无CSS过渡
- 包含动态值但未设置`transition`属性的内联样式
**动效缺失的常见位置:**
- 带模式切换的检查器/设置面板
- 条件表单字段
- 标签页内容区域
- 可展开/折叠的板块
- 提示/通知系统
- 加载状态
- 错误状态State Your Inference
说明你的推断
After gathering context, tell the user what you found and propose a weighting:
undefined收集完场景信息后,告知用户你的发现并提出权重分配建议:
undefinedReconnaissance Complete
调研完成
Project type: [What you inferred — e.g., "Kids educational app, mobile-first PWA"]
Existing animation style: [What you observed — e.g., "Spring animations (500-600ms), framer-motion, active:scale patterns"]
Likely intent: [Your inference — e.g., "Delight and engagement for young children"]
Motion gaps found: [Number] conditional renders without AnimatePresence
- [List the files/areas with gaps, e.g., "Settings panel mode switches", "Loading states"]
Proposed perspective weighting:
- Primary: [Designer] — [Why]
- Secondary: [Designer] — [Why]
- Selective: [Designer] — [When applicable]
Does this approach sound right? Should I adjust the weighting before proceeding with the full audit?
undefined项目类型:[你的推断结果 — 例如:"面向儿童的教育类移动端PWA"]
现有动效风格:[你的观察结果 — 例如:"弹簧动画(500-600ms)、framer-motion、active:scale模式"]
可能的设计意图:[你的推断 — 例如:"为幼儿提供愉悦感和参与度"]
发现的动效缺失问题:[数量]个未使用AnimatePresence的条件渲染
- [列出存在问题的文件/区域,例如:"设置面板的模式切换"、"加载状态"]
建议的视角权重分配:
- 主要视角:[设计师] — [原因]
- 次要视角:[设计师] — [原因]
- 可选视角:[设计师] — [适用场景]
这个方案是否合适?在进行完整审核前,是否需要调整权重?
undefinedWait for User Confirmation
等待用户确认
STOP and wait for the user to confirm or adjust. Do not proceed to the full audit until they respond.
If they adjust (e.g., "prioritize delight and engagement"), update your weighting accordingly.
暂停并等待用户确认或调整。在用户回复前,切勿进行完整审核。
如果用户要求调整(例如:"优先考虑愉悦感和参与度"),请相应更新权重分配。
STEP 2: Full Audit (After User Confirms)
步骤2:完整审核(用户确认后)
Once the user confirms, perform the complete audit by reading the reference files in this order:
用户确认后,按照以下顺序阅读参考文件,进行完整审核:
2a. Read the Audit Checklist First
2a. 先阅读审核清单
Read — Use this as your systematic guide. It provides the structured checklist of what to evaluate.
audit-checklist.md阅读 —— 将其作为你的系统指南,它提供了结构化的审核评估项。
audit-checklist.md2b. Read Designer Files for Your Weighted Perspectives
2b. 根据权重分配阅读设计师相关文件
Based on your context weighting, read the relevant designer files:
- Read if Emil is primary/secondary — Restraint philosophy, frequency rules, Sonner/Vaul patterns
references/emil-kowalski.md - Read if Jakub is primary/secondary — Production polish, enter/exit recipes, shadows, optical alignment
references/jakub-krehel.md - Read if Jhey is primary/secondary — Playful experimentation, @property, linear(), scroll-driven
references/jhey-tompkins.md
基于场景权重分配,阅读对应的设计师文件:
- 如果Emil是主要/次要视角,阅读—— 克制的设计理念、频率规则、Sonner/Vaul模式
references/emil-kowalski.md - 如果Jakub是主要/次要视角,阅读—— 产品级打磨、进入/退出动效方案、阴影、视觉对齐
references/jakub-krehel.md - 如果Jhey是主要/次要视角,阅读—— 趣味实验性设计、@property、linear()、滚动驱动动效
references/jhey-tompkins.md
2c. Read Topical References as Needed
2c. 根据需要阅读主题参考文件
- Read — MANDATORY. Always check for prefers-reduced-motion. No exceptions.
references/accessibility.md - Read — Check the codebase against these anti-patterns
references/common-mistakes.md - Read — If you see complex animations, check for GPU optimization issues
references/performance.md - Read — Reference when making specific implementation recommendations
references/technical-principles.md
- 阅读—— 强制要求。务必检查是否支持prefers-reduced-motion。无例外。
references/accessibility.md - 阅读—— 对照这些反模式检查代码库
references/common-mistakes.md - 阅读—— 如果发现复杂动画,检查GPU优化问题
references/performance.md - 阅读—— 提出具体实现建议时参考
references/technical-principles.md
Context-to-Perspective Mapping
场景与设计视角的对应关系
| Project Type | Primary | Secondary | Selective |
|---|---|---|---|
| Productivity tool (Linear, Raycast) | Emil | Jakub | Jhey (onboarding only) |
| Kids app / Educational | Jakub | Jhey | Emil (high-freq game interactions) |
| Creative portfolio | Jakub | Jhey | Emil (high-freq interactions) |
| Marketing/landing page | Jakub | Jhey | Emil (forms, nav) |
| SaaS dashboard | Emil | Jakub | Jhey (empty states) |
| Mobile app | Jakub | Emil | Jhey (delighters) |
| E-commerce | Jakub | Emil | Jhey (product showcase) |
| 项目类型 | 主要视角 | 次要视角 | 可选视角 |
|---|---|---|---|
| 生产力工具(Linear、Raycast) | Emil | Jakub | Jhey(仅适用于引导页) |
| 儿童应用/教育类 | Jakub | Jhey | Emil(高频游戏交互) |
| 创意作品集 | Jakub | Jhey | Emil(高频交互) |
| 营销/落地页 | Jakub | Jhey | Emil(表单、导航) |
| SaaS仪表盘 | Emil | Jakub | Jhey(空状态) |
| 移动端应用 | Jakub | Emil | Jhey(愉悦感增强项) |
| 电商平台 | Jakub | Emil | Jhey(产品展示) |
STEP 3: Output Format
步骤3:输出格式
Structure your audit with visual hierarchy for easy scanning. Do not summarize — users want full per-designer perspectives.
审核结果需采用清晰的视觉层级结构,便于快速浏览。请勿总结——用户需要完整的设计师专属视角。
Quick Summary (Show First)
快速总结(放在开头)
Start every audit with a summary box:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 AUDIT SUMMARY
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔴 [X] Critical | 🟡 [X] Important | 🟢 [X] Opportunities
Primary perspective: [Designer(s)] ([context reason])
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━每次审核都以总结框开头:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 审核总结
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔴 [X] 严重问题 | 🟡 [X] 重要问题 | 🟢 [X] 优化机会
主要设计视角:[设计师们]([场景原因])
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━Overall Assessment
整体评估
One paragraph: Does this feel polished? Too much? Too little? What's working, what's not?
一段文字:整体是否精致?动效过多还是过少?哪些部分做得好,哪些需要改进?
Per-Designer Sections
分设计师视角的章节
Use decorated headers and grouped findings for each designer:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚡ EMIL'S PERSPECTIVE — Restraint & Speed
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━Weight based on context. Heavy for productivity tools, light for creative/kids apps.
What to Check:
- High-frequency interactions that might not need animation
- Keyboard-initiated actions that animate (generally shouldn't)
- Durations if this is a productivity context (Emil prefers under 300ms)
- Animations starting from scale(0) (should be 0.9+)
- Transform-origin on dropdowns/popovers
- CSS keyframes that should be transitions (for interruptibility)
Output Format:
What's Working Well
- ✓ [Observation] —
file.tsx:line
Issues to Address
- ✗ [Issue] — [Brief explanation]
file.tsx:line
Emil would say: [1-2 sentence summary]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 JAKUB'S PERSPECTIVE — Production Polish
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━What to Check:
- Enter animations (opacity + translateY + blur?)
- Exit animations (subtler than enters? Or missing entirely?)
- Motion gaps — Conditional renders without AnimatePresence (from gap analysis)
- Layout transitions — Size/position changes that snap instead of animate
- Shadow vs border usage on varied backgrounds
- Optical alignment (buttons with icons, play buttons)
- Hover state transitions (150-200ms minimum)
- Icon swap animations (opacity + scale + blur)
- Spring usage (bounce: 0 for professional, higher for playful)
Output Format:
What's Working Well
- ✓ [Observation] —
file.tsx:line
Issues to Address
- ✗ [Issue] — [Brief explanation]
file.tsx:line
Jakub would say: [1-2 sentence summary]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✨ JHEY'S PERSPECTIVE — Experimentation & Delight
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━What to Check:
- Could @property enable smoother animations?
- Could linear() provide better easing curves?
- Are stagger effects using optimal techniques?
- Could scroll-driven animations improve the experience?
- What playful touches would enhance engagement?
- Are there celebration moments that need more delight? (streaks, achievements, etc.)
Output Format:
What's Working Well
- ✓ [Observation] —
file.tsx:line
Opportunities
- 💡 [Idea] — [Brief explanation]
file.tsx:line
Jhey would say: [1-2 sentence summary]
为每个设计师使用装饰性标题和分组结果:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚡ EMIL的视角 — 克制与高效
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━权重基于场景。生产力工具权重高,创意/儿童应用权重低。
检查项:
- 高频交互是否不需要动效
- 键盘触发的操作是否添加了动效(通常不应该)
- 如果是生产力场景,检查动效时长(Emil偏好300ms以内)
- 是否有从scale(0)开始的动效(应该从0.9+开始)
- 下拉菜单/弹出层的transform-origin设置
- 应该用transition实现的CSS keyframes(为了可中断性)
输出格式:
表现良好的部分
- ✓ [观察结果] —
file.tsx:line
需要解决的问题
- ✗ [问题] — [简要说明]
file.tsx:line
Emil会建议:[1-2句话总结]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 JAKUB的视角 — 产品级打磨
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━检查项:
- 进入动效(透明度 + translateY + 模糊?)
- 退出动效(比进入动效更柔和?还是完全缺失?)
- 动效缺失问题 — 未使用AnimatePresence的条件渲染(来自缺失分析)
- 布局过渡 — 尺寸/位置变化突然切换而非平滑过渡
- 不同背景下阴影与边框的使用
- 视觉对齐(带图标的按钮、播放按钮)
- 悬停状态过渡(至少150-200ms)
- 图标切换动效(透明度 + 缩放 + 模糊)
- 弹簧动效的使用(专业场景bounce:0,趣味场景可更高)
输出格式:
表现良好的部分
- ✓ [观察结果] —
file.tsx:line
需要解决的问题
- ✗ [问题] — [简要说明]
file.tsx:line
Jakub会建议:[1-2句话总结]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✨ JHEY的视角 — 实验性与愉悦感
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━检查项:
- 是否可以用@property实现更平滑的动效?
- 是否可以用linear()提供更好的缓动曲线?
- 交错动效是否使用了最优技术?
- 滚动驱动动效是否能提升体验?
- 哪些趣味细节可以增强参与度?
- 是否有需要增加愉悦感的庆祝时刻?(如连续完成、成就等)
输出格式:
表现良好的部分
- ✓ [观察结果] —
file.tsx:line
优化机会
- 💡 [想法] — [简要说明]
file.tsx:line
Jhey会建议:[1-2句话总结]
Combined Recommendations
综合建议
Use severity indicators for quick scanning:
Critical (Must Fix)
| Issue | File | Action | |
|---|---|---|---|
| 🔴 | [Issue] | | [Fix] |
Important (Should Fix)
| Issue | File | Action | |
|---|---|---|---|
| 🟡 | [Issue] | | [Fix] |
Opportunities (Could Enhance)
| Enhancement | Where | Impact | |
|---|---|---|---|
| 🟢 | [Enhancement] | | [Impact] |
使用严重程度标识便于快速浏览:
严重问题(必须修复)
| 问题 | 文件 | 修复动作 | |
|---|---|---|---|
| 🔴 | [问题] | | [修复方案] |
重要问题(应该修复)
| 问题 | 文件 | 修复动作 | |
|---|---|---|---|
| 🟡 | [问题] | | [修复方案] |
优化机会(可以增强)
| 优化项 | 位置 | 影响 | |
|---|---|---|---|
| 🟢 | [优化项] | | [影响] |
Designer Reference Summary
设计师参考总结
End every audit with:
Who was referenced most: [Emil/Jakub/Jhey]Why: [Explanation based on the project context]If you want to lean differently:
- To follow Emil more strictly: [specific actions]
- To follow Jakub more strictly: [specific actions]
- To follow Jhey more strictly: [specific actions]
每次审核结尾需包含:
主要参考的设计师:[Emil/Jakub/Jhey]原因:[基于项目场景的说明]如果想要调整设计倾向:
- 更严格遵循Emil的理念:[具体动作]
- 更严格遵循Jakub的理念:[具体动作]
- 更严格遵循Jhey的理念:[具体动作]
Core Principles
核心原则
Duration Guidelines (Context-Dependent)
时长指南(基于场景)
| Context | Emil | Jakub | Jhey |
|---|---|---|---|
| Productivity UI | Under 300ms (180ms ideal) | — | — |
| Production polish | — | 200-500ms for smoothness | — |
| Creative/kids/playful | — | — | Whatever serves the effect |
Do not universally flag durations over 300ms. Check your context weighting first.
| 场景 | Emil | Jakub | Jhey |
|---|---|---|---|
| 生产力UI | 300ms以内(理想180ms) | — | — |
| 产品级打磨 | — | 200-500ms以保证流畅 | — |
| 创意/儿童/趣味场景 | — | — | 以实现效果为准 |
不要统一标记时长超过300ms的动效为问题。先检查场景权重分配。
Enter Animation Recipe (Jakub)
进入动效方案(Jakub)
jsx
initial={{ opacity: 0, translateY: 8, filter: "blur(4px)" }}
animate={{ opacity: 1, translateY: 0, filter: "blur(0px)" }}
transition={{ type: "spring", duration: 0.45, bounce: 0 }}jsx
initial={{ opacity: 0, translateY: 8, filter: "blur(4px)" }}
animate={{ opacity: 1, translateY: 0, filter: "blur(0px)" }}
transition={{ type: "spring", duration: 0.45, bounce: 0 }}Exit Animation Subtlety (Jakub)
退出动效的柔和性(Jakub)
Exits should be subtler than enters. Use smaller fixed values, same blur.
退出动效应比进入动效更柔和。使用更小的固定值,模糊效果保持一致。
The Golden Rule
黄金法则
"The best animation is that which goes unnoticed."
If users comment "nice animation!" on every interaction, it's probably too prominent for production. (Exception: kids apps and playful contexts where delight IS the goal.)
"最好的动效是让人察觉不到的。"
如果用户在每次交互时都评论“动效不错!”,那么对于产品级应用来说,这个动效可能过于突出。(例外:儿童应用和趣味场景,愉悦感本身就是目标。)
Accessibility is NOT Optional
无障碍设计是必须的
Always check for support. No exceptions. Flag if missing.
prefers-reduced-motion务必检查是否支持。无例外。如果缺失,请标记为问题。
prefers-reduced-motionReference Files (When to Read Each)
参考文件(阅读时机)
STEP 2a — Read first:
- Audit Checklist — Your systematic guide for the full audit
STEP 2b — Read based on context weighting:
- Emil Kowalski — If Emil is primary/secondary
- Jakub Krehel — If Jakub is primary/secondary
- Jhey Tompkins — If Jhey is primary/secondary
STEP 2c — Read as needed:
- Accessibility — MANDATORY for every audit (prefers-reduced-motion)
- Common Mistakes — Check codebase against anti-patterns
- Performance — If complex animations, check GPU optimization
- Technical Principles — For implementation recommendations
Optional context (if uncertain about weighting):
- Philosophy — Compare all three mindsets to refine weighting
步骤2a — 首先阅读:
- 审核清单 —— 完整审核的系统指南
步骤2b — 根据场景权重阅读:
- Emil Kowalski —— 如果Emil是主要/次要视角
- Jakub Krehel —— 如果Jakub是主要/次要视角
- Jhey Tompkins —— 如果Jhey是主要/次要视角
步骤2c — 根据需要阅读:
- 无障碍设计 —— 每次审核都必须阅读(prefers-reduced-motion)
- 常见错误 —— 对照反模式检查代码库
- 性能优化 —— 复杂动效时检查GPU优化
- 技术原则 —— 提供实现建议时参考
可选场景参考(权重不确定时):
- 设计理念对比 —— 对比三种理念以优化权重分配