@devflow-tools/plugin-animation 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +854 -19
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,eAAe,EAAE,aAi8B7B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -64,43 +64,878 @@ export const animationPlugin = {
|
|
|
64
64
|
workflow: {
|
|
65
65
|
steps: [],
|
|
66
66
|
templates: [
|
|
67
|
+
// ── 动画审计 ──
|
|
67
68
|
{
|
|
68
69
|
name: "animation-audit",
|
|
69
70
|
description: "动画审计:性能检查 → 可访问性 → 实现质量",
|
|
70
|
-
version: "
|
|
71
|
+
version: "2.0.0",
|
|
71
72
|
steps: [
|
|
72
|
-
{
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
{
|
|
74
|
+
id: "scan-animations",
|
|
75
|
+
title: "扫描项目中所有动画实现",
|
|
76
|
+
instruction: [
|
|
77
|
+
"## 扫描项目中所有动画实现",
|
|
78
|
+
"",
|
|
79
|
+
"定位项目中 CSS keyframes、CSS transition、Framer Motion、GSAP、Lottie 等所有动画代码。",
|
|
80
|
+
"",
|
|
81
|
+
"**执行动作**:",
|
|
82
|
+
"1. 扫描 CSS `@keyframes` 与 `animation:` 声明:",
|
|
83
|
+
" ```bash",
|
|
84
|
+
" grep -rnE '@keyframes|animation:|animation-name:' src/ --include='*.css' --include='*.scss' --include='*.module.css'",
|
|
85
|
+
" ```",
|
|
86
|
+
"2. 扫描 CSS `transition:` 声明:",
|
|
87
|
+
" ```bash",
|
|
88
|
+
" grep -rnE 'transition:' src/ --include='*.css' --include='*.scss' --include='*.module.css'",
|
|
89
|
+
" ```",
|
|
90
|
+
"3. 扫描 Framer Motion 用法(`motion.`、`AnimatePresence`、`useAnimation`):",
|
|
91
|
+
" ```bash",
|
|
92
|
+
" grep -rnE 'motion\\.|AnimatePresence|useAnimation|useMotionValue|useTransform|staggerChildren|whileHover|whileTap' src/ --include='*.tsx' --include='*.jsx' --include='*.ts'",
|
|
93
|
+
" ```",
|
|
94
|
+
"4. 扫描 GSAP 用法(`gsap.`、`TweenMax`、`TimelineMax`、`ScrollTrigger`):",
|
|
95
|
+
" ```bash",
|
|
96
|
+
" grep -rnE 'gsap\\.|TweenMax|TweenLite|TimelineMax|ScrollTrigger' src/ --include='*.ts' --include='*.tsx' --include='*.js'",
|
|
97
|
+
" ```",
|
|
98
|
+
"5. 扫描 Lottie 用法(`lottie-web`、`@lottiefiles/react-lottie-player`、`.json` 动画资源):",
|
|
99
|
+
" ```bash",
|
|
100
|
+
" grep -rnE 'lottie|@lottiefiles|dotlottie' src/ --include='*.ts' --include='*.tsx' --include='*.js'",
|
|
101
|
+
" find src/ -name '*.json' -path '*animation*' -o -name '*.json' -path '*lottie*'",
|
|
102
|
+
" ```",
|
|
103
|
+
"6. 记录每种动画实现的文件位置、行数、类型",
|
|
104
|
+
"",
|
|
105
|
+
"**产出格式**:",
|
|
106
|
+
"```",
|
|
107
|
+
"animation_inventory:",
|
|
108
|
+
" css_keyframes: [{ file: 'src/styles/hero.css', line: 12, name: 'fadeIn' }]",
|
|
109
|
+
" css_transitions: [{ file: 'src/components/Button.module.css', line: 5, property: 'background-color' }]",
|
|
110
|
+
" framer_motion: [{ file: 'src/components/Modal.tsx', line: 8, api: 'AnimatePresence' }]",
|
|
111
|
+
" gsap: [{ file: 'src/utils/intro.ts', line: 1, api: 'gsap.from' }]",
|
|
112
|
+
" lottie: [{ file: 'src/components/Loader.tsx', line: 3, json: 'src/assets/loader.json' }]",
|
|
113
|
+
"total_animations: 15",
|
|
114
|
+
"```",
|
|
115
|
+
].join("\n"),
|
|
116
|
+
suggestedTools: ["Bash", "Read"],
|
|
117
|
+
output: "项目中所有动画实现的分类清单(CSS/Framer/GSAP/Lottie)",
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
id: "check-gpu",
|
|
121
|
+
title: "检查动画是否使用 GPU 加速属性",
|
|
122
|
+
instruction: [
|
|
123
|
+
"## 检查动画是否使用 GPU 加速属性",
|
|
124
|
+
"",
|
|
125
|
+
"逐个检查 `scan-animations` 发现的动画,确认是否仅使用 `transform` 和 `opacity`(composite-only 属性)。",
|
|
126
|
+
"",
|
|
127
|
+
"**执行动作**:",
|
|
128
|
+
"1. 对每个 CSS `@keyframes` 块,检查动画属性是否在白名单内:",
|
|
129
|
+
" - ✅ 白名单(GPU composite-only):`transform`、`opacity`、`filter`、`backdrop-filter`",
|
|
130
|
+
" - ❌ 黑名单(CPU 触发 layout/paint):`width`、`height`、`top`、`right`、`bottom`、`left`、`margin`、`padding`、`background-position`、`color`",
|
|
131
|
+
" ```bash",
|
|
132
|
+
" # 查找 keyframes 中动画化了非 composite-only 属性",
|
|
133
|
+
" awk '/@keyframes/,/^}/' src/**/*.css | grep -nE 'width|height|top|left|right|bottom|margin|padding'",
|
|
134
|
+
" ```",
|
|
135
|
+
"2. 对每个 CSS `transition:`,检查过渡的属性名:",
|
|
136
|
+
" ```bash",
|
|
137
|
+
" grep -rnE 'transition:' src/ --include='*.css' --include='*.scss' | grep -vE 'transform|opacity'",
|
|
138
|
+
" ```",
|
|
139
|
+
"3. 对 Framer Motion,检查 `animate=` 与 `variants` 中使用的属性:",
|
|
140
|
+
" ```bash",
|
|
141
|
+
" grep -rnE 'animate=\\{|variants=\\{|x:|y:|scale:|rotate:|opacity:' src/ --include='*.tsx' --include='*.jsx'",
|
|
142
|
+
" # 警惕:width/height/top/left 在 framer 中也会触发 layout",
|
|
143
|
+
" grep -rnE 'animate=.*?(width|height|top|left)' src/ --include='*.tsx' --include='*.jsx'",
|
|
144
|
+
" ```",
|
|
145
|
+
"4. 检查 `will-change` 使用是否合理(仅用于即将动画的元素,不要常驻):",
|
|
146
|
+
" ```bash",
|
|
147
|
+
" grep -rnE 'will-change:' src/ --include='*.css' --include='*.scss'",
|
|
148
|
+
" ```",
|
|
149
|
+
"5. 每个违规动画标记为 high/medium/low 严重度(layout 触发 = high)",
|
|
150
|
+
"",
|
|
151
|
+
"**产出格式**:",
|
|
152
|
+
"```",
|
|
153
|
+
"gpu_audit:",
|
|
154
|
+
" compliant: [{ file: 'hero.css', line: 12, property: 'transform: translateY', status: 'gpu' }]",
|
|
155
|
+
" non_compliant: [{ file: 'card.css', line: 5, property: 'width', trigger: 'layout', severity: 'high' }]",
|
|
156
|
+
" will_change_misuse: [{ file: 'global.css', line: 1, issue: 'will-change on every element' }]",
|
|
157
|
+
"compliance_rate: '60%'",
|
|
158
|
+
"```",
|
|
159
|
+
].join("\n"),
|
|
160
|
+
suggestedTools: ["Bash", "Read"],
|
|
161
|
+
output: "GPU 加速合规清单、违规动画(触发 layout/paint)列表",
|
|
162
|
+
depends: ["scan-animations"],
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: "check-performance",
|
|
166
|
+
title: "检查动画 FPS 与 Paint 区域",
|
|
167
|
+
instruction: [
|
|
168
|
+
"## 检查动画是否保持 60fps 并分析 Paint 区域",
|
|
169
|
+
"",
|
|
170
|
+
"使用 Chrome DevTools 评估每个动画的运行时性能。",
|
|
171
|
+
"",
|
|
172
|
+
"**执行动作**:",
|
|
173
|
+
"1. 打开 Chrome DevTools → Rendering 面板,启用以下选项:",
|
|
174
|
+
" - 「Paint flashing」:显示重绘区域(绿色闪烁)",
|
|
175
|
+
" - 「FPS meter」:实时帧率显示",
|
|
176
|
+
" - 「Layer borders」:显示合成层边界",
|
|
177
|
+
"2. 触发每个动画,观察:",
|
|
178
|
+
" - FPS 是否稳定 ≥ 58fps(目标 60fps)",
|
|
179
|
+
" - 是否出现大面积绿色 paint flash",
|
|
180
|
+
" - 合成层数量是否合理(< 50 层)",
|
|
181
|
+
"3. 对可疑动画使用 Performance 面板录制:",
|
|
182
|
+
" - DevTools → Performance → Record(触发动画 5-10 秒)→ Stop",
|
|
183
|
+
" - 查看 Summary 饼图中 Purple(Scripting)和 Green(Paint)占比",
|
|
184
|
+
" - 目标:单帧 Main thread 耗时 ≤ 16ms",
|
|
185
|
+
"4. 使用 Layers 面板检查合成层:",
|
|
186
|
+
" - DevTools → More tools → Layers",
|
|
187
|
+
" - 检查动画元素是否被提升到独立合成层",
|
|
188
|
+
" - 若动画未提升且持续触发 paint,应添加 `will-change` 或 `transform: translateZ(0)`",
|
|
189
|
+
"5. Lottie 专项检查:",
|
|
190
|
+
" ```bash",
|
|
191
|
+
" find src/ -name '*.json' -path '*lottie*' -exec wc -c {} \\; | awk '$1 > 51200 {print \"Oversized: \"$2\" \"$1\" bytes\"}'",
|
|
192
|
+
" ```",
|
|
193
|
+
" - 检查 Lottie JSON 文件大小是否 > 50KB",
|
|
194
|
+
" - 检查 `renderer` 参数是否使用 `svg`(更省性能)而非 `canvas`",
|
|
195
|
+
"",
|
|
196
|
+
"**产出格式**:",
|
|
197
|
+
"```",
|
|
198
|
+
"performance_audit:",
|
|
199
|
+
" animations: [",
|
|
200
|
+
" { id: 'fadeIn', fps_avg: 60, paint_area: 'small', status: 'pass' },",
|
|
201
|
+
" { id: 'slideCard', fps_avg: 42, paint_area: 'full-screen', status: 'fail', reason: 'animates width' },",
|
|
202
|
+
" { id: 'lottie-loader', file_size_kb: 78, status: 'warn', reason: 'file > 50KB' }",
|
|
203
|
+
" ]",
|
|
204
|
+
" failing_count: 2",
|
|
205
|
+
" oversized_lottie: ['src/assets/hero.json (78KB)']",
|
|
206
|
+
"```",
|
|
207
|
+
].join("\n"),
|
|
208
|
+
suggestedTools: ["Bash", "Read"],
|
|
209
|
+
output: "每个动画的 FPS、Paint 区域、Lottie 文件大小审计结果",
|
|
210
|
+
depends: ["scan-animations"],
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
id: "check-accessibility",
|
|
214
|
+
title: "检查 prefers-reduced-motion 支持",
|
|
215
|
+
instruction: [
|
|
216
|
+
"## 检查 prefers-reduced-motion 媒体查询支持",
|
|
217
|
+
"",
|
|
218
|
+
"验证项目是否尊重用户的「减弱动态效果」系统偏好。",
|
|
219
|
+
"",
|
|
220
|
+
"**执行动作**:",
|
|
221
|
+
"1. 统计项目中 `prefers-reduced-motion` 的使用数量:",
|
|
222
|
+
" ```bash",
|
|
223
|
+
" grep -rn 'prefers-reduced-motion' src/ --include='*.css' --include='*.scss' --include='*.module.css'",
|
|
224
|
+
" ```",
|
|
225
|
+
"2. 对 Framer Motion 项目,检查是否使用 `useReducedMotion` hook:",
|
|
226
|
+
" ```bash",
|
|
227
|
+
" grep -rn 'useReducedMotion\\|reducedMotion' src/ --include='*.tsx' --include='*.jsx' --include='*.ts'",
|
|
228
|
+
" ```",
|
|
229
|
+
"3. 对 GSAP 项目,检查是否使用 `gsap.matchMedia()` 或 `prefers-reduced-motion` 判断:",
|
|
230
|
+
" ```bash",
|
|
231
|
+
" grep -rn 'matchMedia\\|reduced-motion' src/ --include='*.ts' --include='*.js'",
|
|
232
|
+
" ```",
|
|
233
|
+
"4. 比较「总动画数」vs「支持 reduced-motion 的动画数」,得出覆盖率",
|
|
234
|
+
"5. 评估每个动画的 reduced-motion 降级方案:",
|
|
235
|
+
" - 入场动画:改为 `opacity` 淡入(无位移/缩放)",
|
|
236
|
+
" - 循环动画:完全禁用或替换为静态状态",
|
|
237
|
+
" - 交互动效:保留基础 hover/focus 状态变化,禁用复杂过渡",
|
|
238
|
+
" - 滚动驱动动画:完全禁用",
|
|
239
|
+
"",
|
|
240
|
+
"**产出格式**:",
|
|
241
|
+
"```",
|
|
242
|
+
"accessibility_audit:",
|
|
243
|
+
" total_animations: 15",
|
|
244
|
+
" supports_reduced_motion: 4",
|
|
245
|
+
" coverage_rate: '27%'",
|
|
246
|
+
" missing_locations: [",
|
|
247
|
+
" { file: 'src/components/Hero.tsx', line: 8, animation: 'framer entrance', fallback: 'MISSING' },",
|
|
248
|
+
" { file: 'src/styles/card.css', line: 12, animation: '@keyframes fadeIn', fallback: 'MISSING' }",
|
|
249
|
+
" ]",
|
|
250
|
+
" recommended_fallbacks: [",
|
|
251
|
+
" { animation: 'slideIn', fallback: 'opacity: 0 -> 1 only' },",
|
|
252
|
+
" { animation: 'bounce', fallback: 'disable entirely' }",
|
|
253
|
+
" ]",
|
|
254
|
+
"```",
|
|
255
|
+
].join("\n"),
|
|
256
|
+
suggestedTools: ["Bash", "Read"],
|
|
257
|
+
output: "prefers-reduced-motion 覆盖率、缺失位置、建议降级方案",
|
|
258
|
+
depends: ["scan-animations"],
|
|
259
|
+
},
|
|
260
|
+
{ id: "generate-report", stepTemplate: "generate-report", depends: ["check-gpu", "check-performance", "check-accessibility"] },
|
|
261
|
+
{
|
|
262
|
+
id: "fix-animations",
|
|
263
|
+
title: "修复动画问题",
|
|
264
|
+
instruction: [
|
|
265
|
+
"## 修复动画问题(GPU 加速替代 + 减弱动画方案)",
|
|
266
|
+
"",
|
|
267
|
+
"根据 `generate-report` 中列出的问题,逐个修复。",
|
|
268
|
+
"",
|
|
269
|
+
"**执行动作**:",
|
|
270
|
+
"1. **CPU → GPU 替换**(对 `check-gpu` 中 non-compliant 项):",
|
|
271
|
+
" - `width/height` 动画 → 使用 `transform: scale()`",
|
|
272
|
+
" ```css",
|
|
273
|
+
" /* 修改前 */",
|
|
274
|
+
" .box { transition: width 300ms; }",
|
|
275
|
+
" .box.open { width: 400px; }",
|
|
276
|
+
" /* 修改后 */",
|
|
277
|
+
" .box { transform: scaleX(0.5); transform-origin: left; transition: transform 300ms ease-out; }",
|
|
278
|
+
" .box.open { transform: scaleX(1); }",
|
|
279
|
+
" ```",
|
|
280
|
+
" - `top/left/right/bottom` 动画 → 使用 `transform: translate()`",
|
|
281
|
+
" ```css",
|
|
282
|
+
" /* 修改前 */",
|
|
283
|
+
" .modal { transition: top 300ms; top: -100%; }",
|
|
284
|
+
" .modal.open { top: 0; }",
|
|
285
|
+
" /* 修改后 */",
|
|
286
|
+
" .modal { transform: translateY(-100%); transition: transform 300ms ease-out; }",
|
|
287
|
+
" .modal.open { transform: translateY(0); }",
|
|
288
|
+
" ```",
|
|
289
|
+
" - `margin/padding` 动画 → 使用 `transform: translate()`",
|
|
290
|
+
"2. **添加 will-change**(对 `check-performance` 中低 fps 项):",
|
|
291
|
+
" ```css",
|
|
292
|
+
" /* 仅在动画即将开始前启用 */",
|
|
293
|
+
" .animating { will-change: transform, opacity; }",
|
|
294
|
+
" /* 动画结束后移除 */",
|
|
295
|
+
" .animating.done { will-change: auto; }",
|
|
296
|
+
" ```",
|
|
297
|
+
"3. **添加 prefers-reduced-motion 降级**(对 `check-accessibility` 中缺失项):",
|
|
298
|
+
" ```css",
|
|
299
|
+
" @media (prefers-reduced-motion: reduce) {",
|
|
300
|
+
" *, *::before, *::after {",
|
|
301
|
+
" animation-duration: 0.01ms !important;",
|
|
302
|
+
" animation-iteration-count: 1 !important;",
|
|
303
|
+
" transition-duration: 0.01ms !important;",
|
|
304
|
+
" scroll-behavior: auto !important;",
|
|
305
|
+
" }",
|
|
306
|
+
" }",
|
|
307
|
+
" ```",
|
|
308
|
+
" - 对 Framer Motion 使用 `useReducedMotion()`:",
|
|
309
|
+
" ```tsx",
|
|
310
|
+
" const reduceMotion = useReducedMotion();",
|
|
311
|
+
" <motion.div animate={reduceMotion ? {} : { x: 100 }} />",
|
|
312
|
+
" ```",
|
|
313
|
+
"4. **React 退出动画**(对缺失退出动画的组件):",
|
|
314
|
+
" ```tsx",
|
|
315
|
+
" <AnimatePresence>",
|
|
316
|
+
" {isVisible && <motion.div exit={{ opacity: 0, y: -20 }} />}",
|
|
317
|
+
" </AnimatePresence>",
|
|
318
|
+
" ```",
|
|
319
|
+
"5. **Lottie 文件优化**(对 oversized 项):",
|
|
320
|
+
" - 使用 SVGO 压缩源 SVG 后重新导出",
|
|
321
|
+
" - 使用 `@lottiefiles/react-lottie-player` 的 `renderer: 'svg'`",
|
|
322
|
+
"",
|
|
323
|
+
"**产出格式**:",
|
|
324
|
+
"```",
|
|
325
|
+
"fixes_applied: [",
|
|
326
|
+
" { file: 'card.css', line: 5, fix_type: 'cpu_to_gpu', before: 'width', after: 'transform: scaleX' },",
|
|
327
|
+
" { file: 'Modal.tsx', line: 12, fix_type: 'reduced_motion', before: 'missing', after: 'useReducedMotion added' },",
|
|
328
|
+
" { file: 'Loader.tsx', line: 3, fix_type: 'lottie_optimize', before: '78KB', after: '42KB' }",
|
|
329
|
+
"]",
|
|
330
|
+
"total_fixes: 8",
|
|
331
|
+
"files_modified: ['src/styles/card.css', 'src/components/Modal.tsx']",
|
|
332
|
+
"```",
|
|
333
|
+
].join("\n"),
|
|
334
|
+
suggestedTools: ["Read", "Bash", "Write"],
|
|
335
|
+
output: "应用的修复清单(CPU→GPU、will-change、reduced-motion、Lottie 优化)",
|
|
336
|
+
depends: ["generate-report"],
|
|
337
|
+
},
|
|
78
338
|
],
|
|
79
339
|
triggers: [{ type: "cli", command: "audit:animation" }],
|
|
80
340
|
},
|
|
341
|
+
// ── 新建动画 ──
|
|
81
342
|
{
|
|
82
343
|
name: "new-animation",
|
|
83
344
|
description: "新建动画:需求分析 → 选型建议 → 实现 → 性能验证",
|
|
84
|
-
version: "
|
|
345
|
+
version: "2.0.0",
|
|
85
346
|
steps: [
|
|
86
|
-
{
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
347
|
+
{
|
|
348
|
+
id: "analyze-requirements",
|
|
349
|
+
title: "分析动画需求",
|
|
350
|
+
instruction: [
|
|
351
|
+
"## 分析动画需求",
|
|
352
|
+
"",
|
|
353
|
+
"明确动画的类型、触发时机、目标元素、时长与缓动。",
|
|
354
|
+
"",
|
|
355
|
+
"**执行动作**:",
|
|
356
|
+
"1. 确定动画类型(五选一或多选):",
|
|
357
|
+
" - **入场动画**:元素初次出现(`initial` → `animate`)",
|
|
358
|
+
" - **退场动画**:元素离开 DOM(React `AnimatePresence` + `exit`)",
|
|
359
|
+
" - **交互动效**:hover / tap / focus 反馈(`whileHover` / `whileTap`)",
|
|
360
|
+
" - **滚动驱动动画**:元素进入视口时触发动画(`whileInView` / `useScroll`)",
|
|
361
|
+
" - **编排动画**:多个子元素依次进入(`staggerChildren` / `stagger`)",
|
|
362
|
+
"2. 确定目标元素与动画范围:",
|
|
363
|
+
" ```bash",
|
|
364
|
+
" grep -rn '<ComponentName' src/ --include='*.tsx' --include='*.jsx' | head -20",
|
|
365
|
+
" ```",
|
|
366
|
+
"3. 确定时长规范:",
|
|
367
|
+
" - 过渡(hover / tap):200-300ms",
|
|
368
|
+
" - 入场(mount):300-500ms",
|
|
369
|
+
" - 退场(unmount):200-300ms(比入场略快)",
|
|
370
|
+
" - 编排总时长:< 1s",
|
|
371
|
+
"4. 确定缓动函数:",
|
|
372
|
+
" - 入场:`ease-out`(快速开始,缓慢到达)",
|
|
373
|
+
" - 退场:`ease-in`(缓慢开始,加速离开)",
|
|
374
|
+
" - 循环:`ease-in-out`",
|
|
375
|
+
" - 弹性:`cubic-bezier(0.34, 1.56, 0.64, 1)`",
|
|
376
|
+
"5. 确定是否需要响应 prefers-reduced-motion",
|
|
377
|
+
"",
|
|
378
|
+
"**产出格式**:",
|
|
379
|
+
"```",
|
|
380
|
+
"requirements:",
|
|
381
|
+
" animation_type: ['entrance', 'exit', 'interaction']",
|
|
382
|
+
" target_element: '.modal / <Modal /> component'",
|
|
383
|
+
" trigger: 'click / mount / hover'",
|
|
384
|
+
" duration: { entrance: '400ms', exit: '250ms', hover: '200ms' }",
|
|
385
|
+
" easing: { entrance: 'ease-out', exit: 'ease-in' }",
|
|
386
|
+
" orchestrated: false",
|
|
387
|
+
" scroll_driven: false",
|
|
388
|
+
" must_support_reduced_motion: true",
|
|
389
|
+
"```",
|
|
390
|
+
].join("\n"),
|
|
391
|
+
suggestedTools: ["Read", "Bash"],
|
|
392
|
+
output: "动画类型、目标元素、时长、缓动、触发方式的详细需求文档",
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
id: "suggest-approach",
|
|
396
|
+
title: "建议实现方案",
|
|
397
|
+
instruction: [
|
|
398
|
+
"## 建议实现方案(CSS / Framer Motion / GSAP / Lottie 选型)",
|
|
399
|
+
"",
|
|
400
|
+
"基于需求选择最合适的动画技术栈。",
|
|
401
|
+
"",
|
|
402
|
+
"**决策矩阵**:",
|
|
403
|
+
"| 需求场景 | 推荐方案 | 原因 |",
|
|
404
|
+
"|---|---|---|",
|
|
405
|
+
"| 简单的 hover / transition | **CSS transition** | 零依赖、compositor 执行、最轻量 |",
|
|
406
|
+
"| 复杂状态过渡 + 退出动画 + React | **Framer Motion** | 声明式 API、AnimatePresence、layout 动画 |",
|
|
407
|
+
"| 时间线编排 + 精确控制 | **GSAP** | Timeline API、ScrollTrigger、性能极佳 |",
|
|
408
|
+
"| 复杂插画 / 品牌动效 | **Lottie** | 设计稿导出、跨平台一致、矢量可缩放 |",
|
|
409
|
+
"| 滚动驱动视差 | **Framer Motion (useScroll)** 或 **GSAP ScrollTrigger** | 声明式 / 功能丰富 |",
|
|
410
|
+
"",
|
|
411
|
+
"**执行动作**:",
|
|
412
|
+
"1. 检查项目已有的动画依赖:",
|
|
413
|
+
" ```bash",
|
|
414
|
+
" grep -E 'framer-motion|gsap|lottie' package.json",
|
|
415
|
+
" ```",
|
|
416
|
+
"2. 根据决策矩阵选择方案,优先复用项目已有依赖",
|
|
417
|
+
"3. 若需新增依赖,评估包体积:",
|
|
418
|
+
" ```bash",
|
|
419
|
+
" # bundlephobia 查询(用 curl 模拟)",
|
|
420
|
+
" echo 'framer-motion: ~55KB gzip, gsap: ~25KB gzip, lottie-web: ~60KB gzip'",
|
|
421
|
+
" ```",
|
|
422
|
+
"4. 列出所选方案需要使用的 API 清单",
|
|
423
|
+
"",
|
|
424
|
+
"**产出格式**:",
|
|
425
|
+
"```",
|
|
426
|
+
"recommended_approach:",
|
|
427
|
+
" primary: 'Framer Motion'",
|
|
428
|
+
" rationale: 'React 项目,需要 AnimatePresence 处理退出动画,项目已安装'",
|
|
429
|
+
" apis_to_use: ['motion.div', 'AnimatePresence', 'variants', 'useReducedMotion']",
|
|
430
|
+
" alternative: 'CSS transition + @keyframes'",
|
|
431
|
+
" new_dependency: null",
|
|
432
|
+
" estimated_bundle_impact: '0KB (already installed)'",
|
|
433
|
+
"```",
|
|
434
|
+
].join("\n"),
|
|
435
|
+
suggestedTools: ["Read", "Bash"],
|
|
436
|
+
output: "推荐的动画技术方案、理由、API 清单",
|
|
437
|
+
depends: ["analyze-requirements"],
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
id: "implement-animation",
|
|
441
|
+
title: "实现动画",
|
|
442
|
+
instruction: [
|
|
443
|
+
"## 实现动画(含 GPU 加速 + 缓动 + 响应式)",
|
|
444
|
+
"",
|
|
445
|
+
"根据 `suggest-approach` 的方案实现动画代码。",
|
|
446
|
+
"",
|
|
447
|
+
"**执行动作**:",
|
|
448
|
+
"1. **CSS 实现**(若推荐方案为 CSS):",
|
|
449
|
+
" ```css",
|
|
450
|
+
" .element {",
|
|
451
|
+
" /* 初始状态 */",
|
|
452
|
+
" opacity: 0;",
|
|
453
|
+
" transform: translateY(20px);",
|
|
454
|
+
" /* 仅动画 composite-only 属性 */",
|
|
455
|
+
" transition: opacity 400ms ease-out, transform 400ms ease-out;",
|
|
456
|
+
" }",
|
|
457
|
+
" .element.visible {",
|
|
458
|
+
" opacity: 1;",
|
|
459
|
+
" transform: translateY(0);",
|
|
460
|
+
" }",
|
|
461
|
+
" ```",
|
|
462
|
+
"",
|
|
463
|
+
"2. **Framer Motion 实现**(若推荐方案为 Framer):",
|
|
464
|
+
" ```tsx",
|
|
465
|
+
" import { motion, AnimatePresence } from 'framer-motion';",
|
|
466
|
+
" import { useReducedMotion } from 'framer-motion';",
|
|
467
|
+
"",
|
|
468
|
+
" const reduceMotion = useReducedMotion();",
|
|
469
|
+
"",
|
|
470
|
+
" const variants = {",
|
|
471
|
+
" hidden: { opacity: 0, y: 20 },",
|
|
472
|
+
" visible: { opacity: 1, y: 0, transition: { duration: 0.4, ease: 'easeOut' } },",
|
|
473
|
+
" exit: { opacity: 0, y: -20, transition: { duration: 0.25, ease: 'easeIn' } },",
|
|
474
|
+
" };",
|
|
475
|
+
"",
|
|
476
|
+
" <AnimatePresence>",
|
|
477
|
+
" {isVisible && (",
|
|
478
|
+
" <motion.div",
|
|
479
|
+
" variants={variants}",
|
|
480
|
+
" initial={reduceMotion ? false : 'hidden'}",
|
|
481
|
+
" animate={reduceMotion ? { opacity: 1 } : 'visible'}",
|
|
482
|
+
" exit={reduceMotion ? { opacity: 0 } : 'exit'}",
|
|
483
|
+
" />",
|
|
484
|
+
" )}",
|
|
485
|
+
" </AnimatePresence>",
|
|
486
|
+
" ```",
|
|
487
|
+
"",
|
|
488
|
+
"3. **强制 GPU 加速**(对复杂动画):",
|
|
489
|
+
" ```css",
|
|
490
|
+
" .animated-element {",
|
|
491
|
+
" transform: translateZ(0); /* 强制提升为合成层 */",
|
|
492
|
+
" will-change: transform, opacity;",
|
|
493
|
+
" }",
|
|
494
|
+
" ```",
|
|
495
|
+
"",
|
|
496
|
+
"4. **编排动画**(多个子元素依次进入):",
|
|
497
|
+
" ```tsx",
|
|
498
|
+
" const container = {",
|
|
499
|
+
" hidden: { opacity: 0 },",
|
|
500
|
+
" visible: {",
|
|
501
|
+
" opacity: 1,",
|
|
502
|
+
" transition: { staggerChildren: 0.1 }",
|
|
503
|
+
" },",
|
|
504
|
+
" };",
|
|
505
|
+
" const item = {",
|
|
506
|
+
" hidden: { opacity: 0, y: 10 },",
|
|
507
|
+
" visible: { opacity: 1, y: 0 },",
|
|
508
|
+
" };",
|
|
509
|
+
" ```",
|
|
510
|
+
"",
|
|
511
|
+
"5. **禁止的写法**(会触发 layout):",
|
|
512
|
+
" - ❌ 不要动画 `width`、`height`、`top`、`left`、`margin`、`padding`",
|
|
513
|
+
" - ❌ 不要使用 `setInterval` / `requestAnimationFrame` 手动动画(CSS/Framer 在 compositor thread 执行,更快)",
|
|
514
|
+
" - ❌ 不要对每个子元素单独写 delay(使用 `staggerChildren`)",
|
|
515
|
+
"",
|
|
516
|
+
"6. 实现完成后运行构建验证:",
|
|
517
|
+
" ```bash",
|
|
518
|
+
" npm run build",
|
|
519
|
+
" ```",
|
|
520
|
+
"",
|
|
521
|
+
"**产出格式**:",
|
|
522
|
+
"```",
|
|
523
|
+
"implementation:",
|
|
524
|
+
" approach: 'Framer Motion'",
|
|
525
|
+
" files_created: ['src/components/AnimatedModal.tsx']",
|
|
526
|
+
" files_modified: ['src/components/Modal.tsx']",
|
|
527
|
+
" gpu_only: true",
|
|
528
|
+
" uses_animate_presence: true",
|
|
529
|
+
" uses_reduced_motion: true",
|
|
530
|
+
" build_status: 'pass'",
|
|
531
|
+
"```",
|
|
532
|
+
].join("\n"),
|
|
533
|
+
suggestedTools: ["Read", "Bash", "Write"],
|
|
534
|
+
output: "实现的动画代码文件、GPU 加速策略、构建状态",
|
|
535
|
+
depends: ["suggest-approach"],
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
id: "add-reduced-motion",
|
|
539
|
+
title: "添加 prefers-reduced-motion 降级",
|
|
540
|
+
instruction: [
|
|
541
|
+
"## 添加 prefers-reduced-motion 减弱动画",
|
|
542
|
+
"",
|
|
543
|
+
"确保动画尊重用户的系统偏好设置。",
|
|
544
|
+
"",
|
|
545
|
+
"**执行动作**:",
|
|
546
|
+
"1. 检查 `implement-animation` 是否已使用 `useReducedMotion`(Framer)或媒体查询(CSS)",
|
|
547
|
+
"2. **CSS 实现**的全局降级:",
|
|
548
|
+
" ```css",
|
|
549
|
+
" @media (prefers-reduced-motion: reduce) {",
|
|
550
|
+
" *,",
|
|
551
|
+
" *::before,",
|
|
552
|
+
" *::after {",
|
|
553
|
+
" animation-duration: 0.01ms !important;",
|
|
554
|
+
" animation-iteration-count: 1 !important;",
|
|
555
|
+
" transition-duration: 0.01ms !important;",
|
|
556
|
+
" scroll-behavior: auto !important;",
|
|
557
|
+
" }",
|
|
558
|
+
" }",
|
|
559
|
+
" ```",
|
|
560
|
+
"3. **Framer Motion 实现**的逐组件降级:",
|
|
561
|
+
" ```tsx",
|
|
562
|
+
" import { useReducedMotion } from 'framer-motion';",
|
|
563
|
+
"",
|
|
564
|
+
" function AnimatedComponent() {",
|
|
565
|
+
" const reduce = useReducedMotion();",
|
|
566
|
+
" return (",
|
|
567
|
+
" <motion.div",
|
|
568
|
+
" initial={reduce ? false : { opacity: 0, y: 20 }}",
|
|
569
|
+
" animate={{ opacity: 1, y: 0 }}",
|
|
570
|
+
" transition={reduce ? { duration: 0 } : { duration: 0.4 }}",
|
|
571
|
+
" />",
|
|
572
|
+
" );",
|
|
573
|
+
" }",
|
|
574
|
+
" ```",
|
|
575
|
+
"4. 验证降级效果:",
|
|
576
|
+
" - 在 macOS:系统设置 → 辅助功能 → 显示 → 减弱动态效果 → 开启",
|
|
577
|
+
" - 在 Chrome DevTools:Rendering → Emulate CSS media feature `prefers-reduced-motion: reduce`",
|
|
578
|
+
" - 触发动画,确认:无位移、无缩放、仅 opacity 淡入淡出或完全禁用",
|
|
579
|
+
"5. 统计动画中 reduced-motion 覆盖率:",
|
|
580
|
+
" ```bash",
|
|
581
|
+
" grep -rn 'useReducedMotion\\|prefers-reduced-motion' src/ | wc -l",
|
|
582
|
+
" ```",
|
|
583
|
+
"",
|
|
584
|
+
"**产出格式**:",
|
|
585
|
+
"```",
|
|
586
|
+
"reduced_motion_support:",
|
|
587
|
+
" strategy: 'useReducedMotion hook (Framer) + global @media fallback'",
|
|
588
|
+
" components_updated: ['AnimatedModal', 'HeroSection']",
|
|
589
|
+
" files_modified: ['src/components/AnimatedModal.tsx', 'src/styles/global.css']",
|
|
590
|
+
" coverage_rate: '100%'",
|
|
591
|
+
" fallback_behavior: 'opacity-only fade (no transform)'",
|
|
592
|
+
"```",
|
|
593
|
+
].join("\n"),
|
|
594
|
+
suggestedTools: ["Bash", "Read", "Write"],
|
|
595
|
+
output: "reduced-motion 降级代码、覆盖率统计",
|
|
596
|
+
depends: ["implement-animation"],
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
id: "performance-check",
|
|
600
|
+
title: "验证动画 60fps 性能",
|
|
601
|
+
instruction: [
|
|
602
|
+
"## 验证动画是否达到 60fps 且不触发 layout",
|
|
603
|
+
"",
|
|
604
|
+
"使用 DevTools 验证实现后的动画性能。",
|
|
605
|
+
"",
|
|
606
|
+
"**执行动作**:",
|
|
607
|
+
"1. 启动开发服务器:",
|
|
608
|
+
" ```bash",
|
|
609
|
+
" npm run dev -- --port 3000",
|
|
610
|
+
" ```",
|
|
611
|
+
"2. Chrome DevTools → Rendering → 启用:",
|
|
612
|
+
" - Paint flashing(检查重绘区域)",
|
|
613
|
+
" - FPS meter(实时帧率)",
|
|
614
|
+
" - Layer borders(合成层边界)",
|
|
615
|
+
"3. 触发每一个新实现的动画,记录:",
|
|
616
|
+
" - FPS 是否稳定 ≥ 58fps",
|
|
617
|
+
" - Paint 区域是否仅局限在动画元素本身(非全屏重绘)",
|
|
618
|
+
" - 合成层数量是否合理",
|
|
619
|
+
"4. 若 FPS < 58:",
|
|
620
|
+
" - 检查是否动画了 layout 属性(回到 `implement-animation` 修复)",
|
|
621
|
+
" - 添加 `will-change: transform, opacity` 提示合成层提升",
|
|
622
|
+
" - 减少同时动画的元素数量",
|
|
623
|
+
"5. Performance 面板录制(5-10s)验证:",
|
|
624
|
+
" - Main thread 单帧耗时 ≤ 16ms",
|
|
625
|
+
" - 无长任务(Long Task > 50ms)",
|
|
626
|
+
"6. 在 `prefers-reduced-motion: reduce` 下验证降级表现",
|
|
627
|
+
"",
|
|
628
|
+
"**产出格式**:",
|
|
629
|
+
"```",
|
|
630
|
+
"performance_verification:",
|
|
631
|
+
" animations_tested: ['modal entrance', 'modal exit', 'button hover']",
|
|
632
|
+
" fps_results: [",
|
|
633
|
+
" { name: 'modal entrance', avg_fps: 60, status: 'pass' },",
|
|
634
|
+
" { name: 'modal exit', avg_fps: 59, status: 'pass' },",
|
|
635
|
+
" { name: 'button hover', avg_fps: 60, status: 'pass' }",
|
|
636
|
+
" ]",
|
|
637
|
+
" paint_area: 'element-only (no full-screen repaint)'",
|
|
638
|
+
" reduced_motion_verified: true",
|
|
639
|
+
" overall_status: 'pass'",
|
|
640
|
+
"```",
|
|
641
|
+
].join("\n"),
|
|
642
|
+
suggestedTools: ["Bash", "Read"],
|
|
643
|
+
output: "每个动画的 FPS 实测结果、Paint 区域、reduced-motion 验证",
|
|
644
|
+
depends: ["implement-animation"],
|
|
645
|
+
},
|
|
91
646
|
],
|
|
92
647
|
triggers: [{ type: "cli", command: "new:animation" }],
|
|
93
648
|
},
|
|
649
|
+
// ── GPU 迁移 ──
|
|
94
650
|
{
|
|
95
651
|
name: "migrate-to-gpu",
|
|
96
652
|
description: "动画 GPU 迁移:扫描 → 替换为 GPU 属性 → 验证",
|
|
97
|
-
version: "
|
|
653
|
+
version: "2.0.0",
|
|
98
654
|
steps: [
|
|
99
|
-
{
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
655
|
+
{
|
|
656
|
+
id: "find-cpu-animations",
|
|
657
|
+
title: "扫描使用 CPU 属性的动画",
|
|
658
|
+
instruction: [
|
|
659
|
+
"## 扫描使用 width/height/top/left 的 CPU 动画",
|
|
660
|
+
"",
|
|
661
|
+
"定位所有动画化了 layout 触发属性的代码。",
|
|
662
|
+
"",
|
|
663
|
+
"**执行动作**:",
|
|
664
|
+
"1. 扫描 CSS `@keyframes` 中的 layout 属性:",
|
|
665
|
+
" ```bash",
|
|
666
|
+
" awk '/@keyframes/{found=1} found{print FILENAME\":\"FNR\":\"$0; if(/^}/){found=0}}' src/**/*.css | grep -E 'width|height|top|left|right|bottom|margin|padding'",
|
|
667
|
+
" ```",
|
|
668
|
+
"2. 扫描 CSS `transition:` 中的 layout 属性:",
|
|
669
|
+
" ```bash",
|
|
670
|
+
" grep -rnE 'transition:.*(width|height|top|left|right|bottom|margin|padding)' src/ --include='*.css' --include='*.scss' --include='*.module.css'",
|
|
671
|
+
" ```",
|
|
672
|
+
"3. 扫描 Framer Motion 中动画化 layout 属性:",
|
|
673
|
+
" ```bash",
|
|
674
|
+
" grep -rnE 'animate=\\{\\{[^}]*(width|height|top|left|x|y)' src/ --include='*.tsx' --include='*.jsx'",
|
|
675
|
+
" # x/y 实际使用 transform: translate,是 GPU 加速的(✅)",
|
|
676
|
+
" # 但 width/height/top/left 在 framer 中仍触发 layout(❌)",
|
|
677
|
+
" grep -rnE 'animate=\\{\\{[^}]*(width|height|top|left)' src/ --include='*.tsx' --include='*.jsx'",
|
|
678
|
+
" ```",
|
|
679
|
+
"4. 扫描 JS 中直接改 style 的动画(`element.style.top = ...`):",
|
|
680
|
+
" ```bash",
|
|
681
|
+
" grep -rnE '\\.style\\.(width|height|top|left|margin|padding)\\s*=' src/ --include='*.ts' --include='*.tsx' --include='*.js'",
|
|
682
|
+
" ```",
|
|
683
|
+
"5. 扫描 GSAP 中动画化 layout 属性:",
|
|
684
|
+
" ```bash",
|
|
685
|
+
" grep -rnE 'gsap\\.(to|from|fromTo)\\([^)]*\\{[^}]*(width|height|top|left|x|y)' src/ --include='*.ts' --include='*.js'",
|
|
686
|
+
" ```",
|
|
687
|
+
"6. 为每个发现项记录文件、行号、属性、上下文",
|
|
688
|
+
"",
|
|
689
|
+
"**产出格式**:",
|
|
690
|
+
"```",
|
|
691
|
+
"cpu_animations_found:",
|
|
692
|
+
" css_keyframes: [{ file: 'card.css', line: 5, property: 'width', keyframe_name: 'expand' }]",
|
|
693
|
+
" css_transitions: [{ file: 'sidebar.css', line: 12, property: 'left' }]",
|
|
694
|
+
" framer_motion: [{ file: 'Modal.tsx', line: 8, property: 'height' }]",
|
|
695
|
+
" js_style: [{ file: 'drag.ts', line: 15, property: 'top' }]",
|
|
696
|
+
" gsap: []",
|
|
697
|
+
"total_cpu_animations: 4",
|
|
698
|
+
"```",
|
|
699
|
+
].join("\n"),
|
|
700
|
+
suggestedTools: ["Bash", "Read"],
|
|
701
|
+
output: "所有使用 CPU 属性(width/height/top/left)的动画清单",
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
id: "analyze-impact",
|
|
705
|
+
title: "分析 CPU 动画的性能影响",
|
|
706
|
+
instruction: [
|
|
707
|
+
"## 分析每处 CPU 动画的性能影响级别",
|
|
708
|
+
"",
|
|
709
|
+
"评估每个 CPU 动画触发 layout/paint 的严重度,决定迁移优先级。",
|
|
710
|
+
"",
|
|
711
|
+
"**影响级别判定**:",
|
|
712
|
+
"- **High**:动画触发 layout + 影响大范围元素(例如根容器 width、影响兄弟元素的 top/left)",
|
|
713
|
+
"- **Medium**:动画触发 layout 但影响范围局限(例如单卡片内部元素)",
|
|
714
|
+
"- **Low**:动画触发 paint 但不触发 layout(例如 background-position、color)",
|
|
715
|
+
"",
|
|
716
|
+
"**执行动作**:",
|
|
717
|
+
"1. 对 `find-cpu-animations` 每个结果,判定影响级别:",
|
|
718
|
+
" - 元素是否被多次复用(如列表项中的动画 vs 单个 hero)",
|
|
719
|
+
" - 元素层级深度(顶层容器 vs 叶子节点)",
|
|
720
|
+
" - 动画时长与频率(持续循环 > 一次性)",
|
|
721
|
+
"2. 检查是否存在多个 CPU 动画同时运行的情况:",
|
|
722
|
+
" ```bash",
|
|
723
|
+
" # 统计同一组件/页面的 CPU 动画数量",
|
|
724
|
+
" grep -rnE '(width|height|top|left)' src/ --include='*.css' | grep -E 'transition|animation' | awk -F: '{print $1}' | sort | uniq -c | sort -rn",
|
|
725
|
+
" ```",
|
|
726
|
+
"3. 评估迁移收益(FPS 提升预估):",
|
|
727
|
+
" - High:预估 FPS 提升 20-40",
|
|
728
|
+
" - Medium:预估 FPS 提升 10-20",
|
|
729
|
+
" - Low:预估 FPS 提升 < 10",
|
|
730
|
+
"4. 生成按优先级排序的迁移清单",
|
|
731
|
+
"",
|
|
732
|
+
"**产出格式**:",
|
|
733
|
+
"```",
|
|
734
|
+
"impact_analysis:",
|
|
735
|
+
" high_priority: [",
|
|
736
|
+
" { file: 'hero.css', line: 5, property: 'width', reason: 'root hero container animates during scroll', estimated_fps_gain: 30 }",
|
|
737
|
+
" ]",
|
|
738
|
+
" medium_priority: [",
|
|
739
|
+
" { file: 'card.css', line: 12, property: 'height', reason: 'reused 20x in list', estimated_fps_gain: 15 }",
|
|
740
|
+
" ]",
|
|
741
|
+
" low_priority: [",
|
|
742
|
+
" { file: 'button.css', line: 3, property: 'background-position', reason: 'paint only', estimated_fps_gain: 5 }",
|
|
743
|
+
" ]",
|
|
744
|
+
" total_estimated_fps_gain: 50",
|
|
745
|
+
"```",
|
|
746
|
+
].join("\n"),
|
|
747
|
+
suggestedTools: ["Bash", "Read"],
|
|
748
|
+
output: "每个 CPU 动画的影响级别、迁移优先级、预估 FPS 收益",
|
|
749
|
+
depends: ["find-cpu-animations"],
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
id: "replace-with-transform",
|
|
753
|
+
title: "替换 CPU 动画为 transform",
|
|
754
|
+
instruction: [
|
|
755
|
+
"## 替换 CPU 动画为 transform(translate 替代 top/left,scale 替代 width/height)",
|
|
756
|
+
"",
|
|
757
|
+
"根据 `analyze-impact` 的优先级,逐个替换。",
|
|
758
|
+
"",
|
|
759
|
+
"**执行动作**:",
|
|
760
|
+
"1. **top/left/right/bottom → transform: translate()**:",
|
|
761
|
+
" ```css",
|
|
762
|
+
" /* 修改前 */",
|
|
763
|
+
" .slide-in { transition: left 300ms; left: -100%; }",
|
|
764
|
+
" .slide-in.open { left: 0; }",
|
|
765
|
+
" /* 修改后 */",
|
|
766
|
+
" .slide-in { transform: translateX(-100%); transition: transform 300ms ease-out; }",
|
|
767
|
+
" .slide-in.open { transform: translateX(0); }",
|
|
768
|
+
" ```",
|
|
769
|
+
"",
|
|
770
|
+
"2. **width → transform: scaleX()**:",
|
|
771
|
+
" ```css",
|
|
772
|
+
" /* 修改前 */",
|
|
773
|
+
" .progress { transition: width 400ms; width: 0; }",
|
|
774
|
+
" .progress.done { width: 100%; }",
|
|
775
|
+
" /* 修改后 */",
|
|
776
|
+
" .progress { transform: scaleX(0); transform-origin: left; transition: transform 400ms ease-out; }",
|
|
777
|
+
" .progress.done { transform: scaleX(1); }",
|
|
778
|
+
" ```",
|
|
779
|
+
"",
|
|
780
|
+
"3. **height → transform: scaleY()**:",
|
|
781
|
+
" ```css",
|
|
782
|
+
" /* 修改前 */",
|
|
783
|
+
" .accordion-content { transition: height 300ms; height: 0; overflow: hidden; }",
|
|
784
|
+
" .accordion-content.open { height: auto; }",
|
|
785
|
+
" /* 修改后 */",
|
|
786
|
+
" .accordion-content {",
|
|
787
|
+
" transform: scaleY(0);",
|
|
788
|
+
" transform-origin: top;",
|
|
789
|
+
" transition: transform 300ms ease-out;",
|
|
790
|
+
" height: auto;",
|
|
791
|
+
" overflow: hidden;",
|
|
792
|
+
" }",
|
|
793
|
+
" .accordion-content.open { transform: scaleY(1); }",
|
|
794
|
+
" ```",
|
|
795
|
+
"",
|
|
796
|
+
"4. **margin/padding → transform: translate()**:",
|
|
797
|
+
" ```css",
|
|
798
|
+
" /* 修改前 */",
|
|
799
|
+
" .element { transition: margin-top 300ms; margin-top: 20px; }",
|
|
800
|
+
" /* 修改后 */",
|
|
801
|
+
" .element { transform: translateY(-20px); transition: transform 300ms ease-out; }",
|
|
802
|
+
" .element.open { transform: translateY(0); }",
|
|
803
|
+
" ```",
|
|
804
|
+
"",
|
|
805
|
+
"5. **Framer Motion 中的 layout 属性替换**:",
|
|
806
|
+
" ```tsx",
|
|
807
|
+
" // 修改前(触发 layout)",
|
|
808
|
+
" <motion.div animate={{ x: 100, height: 200 }} />",
|
|
809
|
+
" // 修改后(composite-only)",
|
|
810
|
+
" <motion.div animate={{ x: 100, scaleY: 1 }} style={{ scaleY: 0, transformOrigin: 'top' }} />",
|
|
811
|
+
" // 注意:x/y/z/rotate/scale 在 Framer 中已是 transform(✅),无需改",
|
|
812
|
+
" ```",
|
|
813
|
+
"",
|
|
814
|
+
"6. 替换完成后运行构建验证:",
|
|
815
|
+
" ```bash",
|
|
816
|
+
" npm run build",
|
|
817
|
+
" ```",
|
|
818
|
+
"",
|
|
819
|
+
"**产出格式**:",
|
|
820
|
+
"```",
|
|
821
|
+
"replacements: [",
|
|
822
|
+
" { file: 'slide.css', line: 5, before: 'left: -100% -> 0', after: 'translateX(-100%) -> translateX(0)' },",
|
|
823
|
+
" { file: 'progress.css', line: 8, before: 'width: 0 -> 100%', after: 'scaleX(0) -> scaleX(1)' },",
|
|
824
|
+
" { file: 'accordion.css', line: 3, before: 'height: 0 -> auto', after: 'scaleY(0) -> scaleY(1)' }",
|
|
825
|
+
"]",
|
|
826
|
+
"total_replaced: 3",
|
|
827
|
+
"files_modified: ['src/styles/slide.css', 'src/styles/progress.css', 'src/styles/accordion.css']",
|
|
828
|
+
"build_status: 'pass'",
|
|
829
|
+
"```",
|
|
830
|
+
].join("\n"),
|
|
831
|
+
suggestedTools: ["Read", "Bash", "Write"],
|
|
832
|
+
output: "CPU 属性 → transform 的替换清单、修改的文件、构建状态",
|
|
833
|
+
depends: ["analyze-impact"],
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
id: "add-will-change",
|
|
837
|
+
title: "添加 will-change 优化层创建时机",
|
|
838
|
+
instruction: [
|
|
839
|
+
"## 添加 will-change 提示浏览器提前创建 GPU 层",
|
|
840
|
+
"",
|
|
841
|
+
"对迁移后的动画元素合理使用 `will-change` 提升性能。",
|
|
842
|
+
"",
|
|
843
|
+
"**执行动作**:",
|
|
844
|
+
"1. **基础用法**(动画开始前添加,结束后移除):",
|
|
845
|
+
" ```css",
|
|
846
|
+
" /* 默认状态:不创建层 */",
|
|
847
|
+
" .animated { /* no will-change */ }",
|
|
848
|
+
" /* hover / 即将动画状态:创建层 */",
|
|
849
|
+
" .animated:hover,",
|
|
850
|
+
" .animated.will-animate {",
|
|
851
|
+
" will-change: transform, opacity;",
|
|
852
|
+
" }",
|
|
853
|
+
" ```",
|
|
854
|
+
"2. **JS 触发方式**(更精确控制):",
|
|
855
|
+
" ```ts",
|
|
856
|
+
" const el = document.querySelector('.animated');",
|
|
857
|
+
" el.addEventListener('mouseenter', () => {",
|
|
858
|
+
" el.style.willChange = 'transform, opacity';",
|
|
859
|
+
" });",
|
|
860
|
+
" el.addEventListener('transitionend', () => {",
|
|
861
|
+
" el.style.willChange = 'auto';",
|
|
862
|
+
" });",
|
|
863
|
+
" ```",
|
|
864
|
+
"3. **Framer Motion 自动处理**:Framer 会在 `animate` 时自动提升合成层,通常无需手动添加 `will-change`",
|
|
865
|
+
"4. **反模式**(避免):",
|
|
866
|
+
" - ❌ `will-change: auto` 常驻在大量元素上(过度提升会撑爆 GPU 内存)",
|
|
867
|
+
" - ❌ `will-change: all`(不具体,浏览器无法优化)",
|
|
868
|
+
" - ❌ 给每个列表项都加 `will-change`(应只在 hover/active 的单个元素上加)",
|
|
869
|
+
"5. 检查当前 `will-change` 使用情况:",
|
|
870
|
+
" ```bash",
|
|
871
|
+
" grep -rn 'will-change' src/ --include='*.css' --include='*.scss'",
|
|
872
|
+
" ```",
|
|
873
|
+
"6. 为 `replace-with-transform` 中每个替换项添加合适的 will-change:",
|
|
874
|
+
"",
|
|
875
|
+
"**产出格式**:",
|
|
876
|
+
"```",
|
|
877
|
+
"will_change_added: [",
|
|
878
|
+
" { file: 'slide.css', selector: '.slide-in:hover', value: 'transform' },",
|
|
879
|
+
" { file: 'progress.css', selector: '.progress.animating', value: 'transform' }",
|
|
880
|
+
"]",
|
|
881
|
+
"total_added: 2",
|
|
882
|
+
"overuse_warning: 'no excessive will-change detected'",
|
|
883
|
+
"```",
|
|
884
|
+
].join("\n"),
|
|
885
|
+
suggestedTools: ["Bash", "Read", "Write"],
|
|
886
|
+
output: "will-change 添加清单、避免的反模式、GPU 层数量预估",
|
|
887
|
+
depends: ["replace-with-transform"],
|
|
888
|
+
},
|
|
889
|
+
{
|
|
890
|
+
id: "benchmark",
|
|
891
|
+
title: "迁移前后 FPS 与 Paint 对比",
|
|
892
|
+
instruction: [
|
|
893
|
+
"## 迁移前后 FPS 与 Paint 次数对比",
|
|
894
|
+
"",
|
|
895
|
+
"用 DevTools 量化迁移带来的性能收益。",
|
|
896
|
+
"",
|
|
897
|
+
"**执行动作**:",
|
|
898
|
+
"1. **回滚到迁移前快照**(使用 git stash 临时还原):",
|
|
899
|
+
" ```bash",
|
|
900
|
+
" git stash push -m 'benchmark-before' -- src/",
|
|
901
|
+
" npm run dev -- --port 3000",
|
|
902
|
+
" ```",
|
|
903
|
+
"2. 在 DevTools → Performance 录制迁移前的动画表现(5-10 秒):",
|
|
904
|
+
" - 记录平均 FPS",
|
|
905
|
+
" - 记录 Paint 次数(Summary 中的 Green 区域)",
|
|
906
|
+
" - 记录 Main thread 单帧最大耗时",
|
|
907
|
+
"3. **恢复迁移后代码**:",
|
|
908
|
+
" ```bash",
|
|
909
|
+
" git stash pop",
|
|
910
|
+
" ```",
|
|
911
|
+
"4. 在同样条件下录制迁移后的 Performance:",
|
|
912
|
+
" - 同样触发相同的动画",
|
|
913
|
+
" - 同样时长(5-10 秒)",
|
|
914
|
+
"5. 对比数据:",
|
|
915
|
+
" | 指标 | 迁移前 | 迁移后 | 提升 |",
|
|
916
|
+
" |---|---|---|---|",
|
|
917
|
+
" | 平均 FPS | 42 | 60 | +43% |",
|
|
918
|
+
" | Paint 次数 | 120 | 8 | -93% |",
|
|
919
|
+
" | 单帧最大耗时 | 38ms | 12ms | -68% |",
|
|
920
|
+
"6. 验证功能未回归:",
|
|
921
|
+
" - 动画视觉效果与迁移前一致",
|
|
922
|
+
" - reduced-motion 仍然生效",
|
|
923
|
+
" - 所有交互(hover/click)正常",
|
|
924
|
+
"",
|
|
925
|
+
"**产出格式**:",
|
|
926
|
+
"```",
|
|
927
|
+
"benchmark_results:",
|
|
928
|
+
" before: { avg_fps: 42, paint_count: 120, max_frame_ms: 38 }",
|
|
929
|
+
" after: { avg_fps: 60, paint_count: 8, max_frame_ms: 12 }",
|
|
930
|
+
" improvements: { fps: '+43%', paint: '-93%', frame_time: '-68%' }",
|
|
931
|
+
" regression_check: 'no visual or functional regression'",
|
|
932
|
+
" conclusion: 'migration successful — all animations now composite-only'",
|
|
933
|
+
"```",
|
|
934
|
+
].join("\n"),
|
|
935
|
+
suggestedTools: ["Bash", "Read"],
|
|
936
|
+
output: "迁移前后 FPS/Paint/Frame time 对比、回归检查结果",
|
|
937
|
+
depends: ["add-will-change"],
|
|
938
|
+
},
|
|
104
939
|
],
|
|
105
940
|
triggers: [{ type: "cli", command: "migrate:gpu-animation" }],
|
|
106
941
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/plugin-animation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"clean": "rm -rf dist"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@devflow-tools/sdk": "^0.
|
|
20
|
+
"@devflow-tools/sdk": "^0.5.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"typescript": "^5.5.0",
|
|
@@ -26,5 +26,5 @@
|
|
|
26
26
|
"files": [
|
|
27
27
|
"dist"
|
|
28
28
|
],
|
|
29
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "431c0f26e14d476c08d543ef5cd65367413dbc98"
|
|
30
30
|
}
|