@rotifer/playground 0.5.0-alpha.2 → 0.7.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.
Files changed (316) hide show
  1. package/CHANGELOG.md +159 -15
  2. package/LICENSE +1 -1
  3. package/README.md +51 -23
  4. package/README.zh.md +54 -25
  5. package/dist/cloud/auth.d.ts +7 -1
  6. package/dist/cloud/auth.d.ts.map +1 -1
  7. package/dist/cloud/auth.js +65 -1
  8. package/dist/cloud/auth.js.map +1 -1
  9. package/dist/cloud/client.d.ts +4 -1
  10. package/dist/cloud/client.d.ts.map +1 -1
  11. package/dist/cloud/client.js +9 -2
  12. package/dist/cloud/client.js.map +1 -1
  13. package/dist/cloud/types.d.ts +3 -1
  14. package/dist/cloud/types.d.ts.map +1 -1
  15. package/dist/cloud/types.js.map +1 -1
  16. package/dist/commands/agent-create.d.ts.map +1 -1
  17. package/dist/commands/agent-create.js +66 -3
  18. package/dist/commands/agent-create.js.map +1 -1
  19. package/dist/commands/agent-run.d.ts.map +1 -1
  20. package/dist/commands/agent-run.js +296 -32
  21. package/dist/commands/agent-run.js.map +1 -1
  22. package/dist/commands/arena-submit.d.ts.map +1 -1
  23. package/dist/commands/arena-submit.js +45 -17
  24. package/dist/commands/arena-submit.js.map +1 -1
  25. package/dist/commands/compile.d.ts.map +1 -1
  26. package/dist/commands/compile.js +9 -3
  27. package/dist/commands/compile.js.map +1 -1
  28. package/dist/commands/init.d.ts.map +1 -1
  29. package/dist/commands/init.js +13 -3
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/login.d.ts.map +1 -1
  32. package/dist/commands/login.js +23 -16
  33. package/dist/commands/login.js.map +1 -1
  34. package/dist/commands/network.js +4 -4
  35. package/dist/commands/network.js.map +1 -1
  36. package/dist/commands/publish.d.ts.map +1 -1
  37. package/dist/commands/publish.js +162 -44
  38. package/dist/commands/publish.js.map +1 -1
  39. package/dist/commands/test.d.ts.map +1 -1
  40. package/dist/commands/test.js +209 -23
  41. package/dist/commands/test.js.map +1 -1
  42. package/dist/commands/wrap.d.ts.map +1 -1
  43. package/dist/commands/wrap.js +17 -1
  44. package/dist/commands/wrap.js.map +1 -1
  45. package/dist/index.js +0 -0
  46. package/dist/runtime/network-gateway.d.ts +53 -0
  47. package/dist/runtime/network-gateway.d.ts.map +1 -0
  48. package/dist/runtime/network-gateway.js +147 -0
  49. package/dist/runtime/network-gateway.js.map +1 -0
  50. package/dist/utils/binding.d.ts +25 -0
  51. package/dist/utils/binding.d.ts.map +1 -1
  52. package/dist/utils/binding.js.map +1 -1
  53. package/dist/utils/open-browser.d.ts +10 -0
  54. package/dist/utils/open-browser.d.ts.map +1 -0
  55. package/dist/utils/open-browser.js +23 -0
  56. package/dist/utils/open-browser.js.map +1 -0
  57. package/genes/academic-writer/.cloud-manifest.json +6 -0
  58. package/genes/academic-writer/.gene-manifest.json +8 -0
  59. package/genes/academic-writer/SKILL.md +274 -0
  60. package/genes/academic-writer/phenotype.json +28 -0
  61. package/genes/ai-components/.cloud-manifest.json +6 -0
  62. package/genes/ai-components/.gene-manifest.json +8 -0
  63. package/genes/ai-components/SKILL.md +381 -0
  64. package/genes/ai-components/phenotype.json +28 -0
  65. package/genes/algorithmic-art/.cloud-manifest.json +6 -0
  66. package/genes/algorithmic-art/.gene-manifest.json +8 -0
  67. package/genes/algorithmic-art/SKILL.md +405 -0
  68. package/genes/algorithmic-art/phenotype.json +28 -0
  69. package/genes/answer-synthesizer/.cloud-manifest.json +6 -0
  70. package/genes/answer-synthesizer/index.ts +194 -0
  71. package/genes/answer-synthesizer/phenotype.json +61 -0
  72. package/genes/api-designer/.cloud-manifest.json +6 -0
  73. package/genes/api-designer/.gene-manifest.json +8 -0
  74. package/genes/api-designer/SKILL.md +456 -0
  75. package/genes/api-designer/phenotype.json +28 -0
  76. package/genes/auto-coder/.cloud-manifest.json +6 -0
  77. package/genes/auto-coder/.gene-manifest.json +8 -0
  78. package/genes/auto-coder/SKILL.md +400 -0
  79. package/genes/auto-coder/phenotype.json +28 -0
  80. package/genes/auto-writer/.cloud-manifest.json +6 -0
  81. package/genes/auto-writer/.gene-manifest.json +8 -0
  82. package/genes/auto-writer/SKILL.md +361 -0
  83. package/genes/auto-writer/phenotype.json +28 -0
  84. package/genes/brand-personality/.cloud-manifest.json +6 -0
  85. package/genes/brand-personality/.gene-manifest.json +8 -0
  86. package/genes/brand-personality/SKILL.md +549 -0
  87. package/genes/brand-personality/phenotype.json +28 -0
  88. package/genes/business-writer/.cloud-manifest.json +6 -0
  89. package/genes/business-writer/.gene-manifest.json +8 -0
  90. package/genes/business-writer/SKILL.md +448 -0
  91. package/genes/business-writer/phenotype.json +28 -0
  92. package/genes/citation-manager/.cloud-manifest.json +6 -0
  93. package/genes/citation-manager/.gene-manifest.json +8 -0
  94. package/genes/citation-manager/SKILL.md +279 -0
  95. package/genes/citation-manager/index.ts +162 -0
  96. package/genes/citation-manager/package.json +1 -0
  97. package/genes/citation-manager/phenotype.json +50 -0
  98. package/genes/code-complexity/.cloud-manifest.json +6 -0
  99. package/genes/code-complexity/README.md +35 -0
  100. package/genes/code-complexity/index.ts +101 -0
  101. package/genes/code-complexity/phenotype.json +34 -0
  102. package/genes/copywriter/.cloud-manifest.json +6 -0
  103. package/genes/copywriter/.gene-manifest.json +8 -0
  104. package/genes/copywriter/SKILL.md +329 -0
  105. package/genes/copywriter/phenotype.json +28 -0
  106. package/genes/creative-writer/.cloud-manifest.json +6 -0
  107. package/genes/creative-writer/.gene-manifest.json +8 -0
  108. package/genes/creative-writer/SKILL.md +356 -0
  109. package/genes/creative-writer/phenotype.json +28 -0
  110. package/genes/data-modeler/.cloud-manifest.json +6 -0
  111. package/genes/data-modeler/.gene-manifest.json +8 -0
  112. package/genes/data-modeler/SKILL.md +486 -0
  113. package/genes/data-modeler/phenotype.json +28 -0
  114. package/genes/debugger/.cloud-manifest.json +6 -0
  115. package/genes/debugger/.gene-manifest.json +8 -0
  116. package/genes/debugger/SKILL.md +416 -0
  117. package/genes/debugger/phenotype.json +28 -0
  118. package/genes/design-tokens/.cloud-manifest.json +6 -0
  119. package/genes/design-tokens/.gene-manifest.json +8 -0
  120. package/genes/design-tokens/SKILL.md +222 -0
  121. package/genes/design-tokens/index.ts +128 -0
  122. package/genes/design-tokens/package.json +1 -0
  123. package/genes/design-tokens/phenotype.json +1 -0
  124. package/genes/devops-automator/.cloud-manifest.json +6 -0
  125. package/genes/devops-automator/.gene-manifest.json +8 -0
  126. package/genes/devops-automator/SKILL.md +490 -0
  127. package/genes/devops-automator/phenotype.json +28 -0
  128. package/genes/doc-coauthoring/.cloud-manifest.json +6 -0
  129. package/genes/doc-coauthoring/.gene-manifest.json +8 -0
  130. package/genes/doc-coauthoring/SKILL.md +375 -0
  131. package/genes/doc-coauthoring/phenotype.json +28 -0
  132. package/genes/doc-retrieval/.cloud-manifest.json +6 -0
  133. package/genes/doc-retrieval/index.ts +134 -0
  134. package/genes/doc-retrieval/phenotype.json +54 -0
  135. package/genes/docs-writer/.cloud-manifest.json +6 -0
  136. package/genes/docs-writer/.gene-manifest.json +8 -0
  137. package/genes/docs-writer/SKILL.md +492 -0
  138. package/genes/docs-writer/phenotype.json +28 -0
  139. package/genes/evolve-life/.cloud-manifest.json +6 -0
  140. package/genes/evolve-life/.compile-result.json +12 -0
  141. package/genes/evolve-life/README.md +52 -0
  142. package/genes/evolve-life/gene.ir.wasm +0 -0
  143. package/genes/evolve-life/gene.wasm +0 -0
  144. package/genes/evolve-life/index.ts +255 -0
  145. package/genes/evolve-life/phenotype.json +129 -0
  146. package/genes/evolve-life-bitwise/.cloud-manifest.json +6 -0
  147. package/genes/evolve-life-bitwise/.compile-result.json +12 -0
  148. package/genes/evolve-life-bitwise/gene.ir.wasm +0 -0
  149. package/genes/evolve-life-bitwise/gene.wasm +0 -0
  150. package/genes/evolve-life-bitwise/index.ts +273 -0
  151. package/genes/evolve-life-bitwise/phenotype.json +129 -0
  152. package/genes/evolve-life-sparse/.cloud-manifest.json +6 -0
  153. package/genes/evolve-life-sparse/.compile-result.json +12 -0
  154. package/genes/evolve-life-sparse/gene.ir.wasm +0 -0
  155. package/genes/evolve-life-sparse/gene.wasm +0 -0
  156. package/genes/evolve-life-sparse/index.ts +236 -0
  157. package/genes/evolve-life-sparse/phenotype.json +129 -0
  158. package/genes/fact-checker/.cloud-manifest.json +6 -0
  159. package/genes/fact-checker/.gene-manifest.json +8 -0
  160. package/genes/fact-checker/SKILL.md +373 -0
  161. package/genes/fact-checker/phenotype.json +28 -0
  162. package/genes/genesis-code-format/.cloud-manifest.json +6 -0
  163. package/genes/genesis-code-format/package.json +1 -0
  164. package/genes/genesis-code-format/phenotype.json +1 -0
  165. package/genes/genesis-file-read/.cloud-manifest.json +6 -0
  166. package/genes/genesis-file-read/index.ts +11 -1
  167. package/genes/genesis-file-read/package.json +1 -0
  168. package/genes/genesis-file-read/phenotype.json +1 -0
  169. package/genes/genesis-l0-constraint/.cloud-manifest.json +6 -0
  170. package/genes/genesis-l0-constraint/package.json +1 -0
  171. package/genes/genesis-l0-constraint/phenotype.json +1 -0
  172. package/genes/genesis-web-search/.cloud-manifest.json +2 -2
  173. package/genes/genesis-web-search/package.json +1 -0
  174. package/genes/genesis-web-search/phenotype.json +1 -0
  175. package/genes/genesis-web-search-lite/.cloud-manifest.json +6 -0
  176. package/genes/genesis-web-search-lite/package.json +1 -0
  177. package/genes/genesis-web-search-lite/phenotype.json +1 -0
  178. package/genes/git-workflow/.cloud-manifest.json +6 -0
  179. package/genes/git-workflow/.gene-manifest.json +8 -0
  180. package/genes/git-workflow/SKILL.md +407 -0
  181. package/genes/git-workflow/phenotype.json +28 -0
  182. package/genes/grammar-checker/.cloud-manifest.json +6 -0
  183. package/genes/grammar-checker/.gene-manifest.json +8 -0
  184. package/genes/grammar-checker/SKILL.md +194 -0
  185. package/genes/grammar-checker/index.ts +168 -0
  186. package/genes/grammar-checker/package.json +1 -0
  187. package/genes/grammar-checker/phenotype.json +52 -0
  188. package/genes/json-validator/.cloud-manifest.json +6 -0
  189. package/genes/json-validator/README.md +42 -0
  190. package/genes/json-validator/index.ts +112 -0
  191. package/genes/json-validator/phenotype.json +42 -0
  192. package/genes/license-advisor/.cloud-manifest.json +6 -0
  193. package/genes/license-advisor/.gene-manifest.json +8 -0
  194. package/genes/license-advisor/SKILL.md +117 -0
  195. package/genes/license-advisor/phenotype.json +28 -0
  196. package/genes/logic-architect/.cloud-manifest.json +6 -0
  197. package/genes/logic-architect/.gene-manifest.json +8 -0
  198. package/genes/logic-architect/SKILL.md +451 -0
  199. package/genes/logic-architect/phenotype.json +28 -0
  200. package/genes/markdown-formatter/.cloud-manifest.json +6 -0
  201. package/genes/markdown-formatter/README.md +34 -0
  202. package/genes/markdown-formatter/index.ts +86 -0
  203. package/genes/markdown-formatter/phenotype.json +32 -0
  204. package/genes/orch/.cloud-manifest.json +6 -0
  205. package/genes/orch/.gene-manifest.json +8 -0
  206. package/genes/orch/SKILL.md +504 -0
  207. package/genes/orch/phenotype.json +28 -0
  208. package/genes/particle-barneshut/.cloud-manifest.json +6 -0
  209. package/genes/particle-barneshut/.compile-result.json +12 -0
  210. package/genes/particle-barneshut/README.md +55 -0
  211. package/genes/particle-barneshut/gene.ir.wasm +0 -0
  212. package/genes/particle-barneshut/gene.wasm +0 -0
  213. package/genes/particle-barneshut/index.ts +486 -0
  214. package/genes/particle-barneshut/phenotype.json +137 -0
  215. package/genes/particle-brute/.cloud-manifest.json +6 -0
  216. package/genes/particle-brute/.compile-result.json +12 -0
  217. package/genes/particle-brute/README.md +55 -0
  218. package/genes/particle-brute/gene.ir.wasm +0 -0
  219. package/genes/particle-brute/gene.wasm +0 -0
  220. package/genes/particle-brute/index.ts +277 -0
  221. package/genes/particle-brute/phenotype.json +137 -0
  222. package/genes/particle-spatial/.cloud-manifest.json +6 -0
  223. package/genes/particle-spatial/.compile-result.json +12 -0
  224. package/genes/particle-spatial/README.md +53 -0
  225. package/genes/particle-spatial/gene.ir.wasm +0 -0
  226. package/genes/particle-spatial/gene.wasm +0 -0
  227. package/genes/particle-spatial/index.ts +352 -0
  228. package/genes/particle-spatial/phenotype.json +137 -0
  229. package/genes/performance-optimizer/.cloud-manifest.json +6 -0
  230. package/genes/performance-optimizer/.gene-manifest.json +8 -0
  231. package/genes/performance-optimizer/SKILL.md +480 -0
  232. package/genes/performance-optimizer/phenotype.json +28 -0
  233. package/genes/plagiarism-checker/.cloud-manifest.json +6 -0
  234. package/genes/plagiarism-checker/.gene-manifest.json +8 -0
  235. package/genes/plagiarism-checker/SKILL.md +342 -0
  236. package/genes/plagiarism-checker/phenotype.json +28 -0
  237. package/genes/product-manager/.cloud-manifest.json +6 -0
  238. package/genes/product-manager/.gene-manifest.json +8 -0
  239. package/genes/product-manager/SKILL.md +249 -0
  240. package/genes/product-manager/phenotype.json +28 -0
  241. package/genes/project-reviewer/.cloud-manifest.json +6 -0
  242. package/genes/project-reviewer/.gene-manifest.json +8 -0
  243. package/genes/project-reviewer/SKILL.md +312 -0
  244. package/genes/project-reviewer/phenotype.json +28 -0
  245. package/genes/prompt-engineer/.cloud-manifest.json +6 -0
  246. package/genes/prompt-engineer/.gene-manifest.json +8 -0
  247. package/genes/prompt-engineer/SKILL.md +411 -0
  248. package/genes/prompt-engineer/phenotype.json +28 -0
  249. package/genes/readability-analyzer/.cloud-manifest.json +6 -0
  250. package/genes/readability-analyzer/.gene-manifest.json +8 -0
  251. package/genes/readability-analyzer/SKILL.md +357 -0
  252. package/genes/readability-analyzer/index.ts +123 -0
  253. package/genes/readability-analyzer/package.json +1 -0
  254. package/genes/readability-analyzer/phenotype.json +35 -0
  255. package/genes/rotifer-protocol/SKILL.md +121 -0
  256. package/genes/security-auditor/.cloud-manifest.json +6 -0
  257. package/genes/security-auditor/.gene-manifest.json +8 -0
  258. package/genes/security-auditor/SKILL.md +494 -0
  259. package/genes/security-auditor/phenotype.json +28 -0
  260. package/genes/seo-optimizer/.cloud-manifest.json +6 -0
  261. package/genes/seo-optimizer/.gene-manifest.json +8 -0
  262. package/genes/seo-optimizer/SKILL.md +327 -0
  263. package/genes/seo-optimizer/index.ts +206 -0
  264. package/genes/seo-optimizer/package.json +1 -0
  265. package/genes/seo-optimizer/phenotype.json +1 -0
  266. package/genes/source-linker/.cloud-manifest.json +6 -0
  267. package/genes/source-linker/index.ts +88 -0
  268. package/genes/source-linker/phenotype.json +45 -0
  269. package/genes/style-optimizer/.cloud-manifest.json +6 -0
  270. package/genes/style-optimizer/.gene-manifest.json +8 -0
  271. package/genes/style-optimizer/SKILL.md +285 -0
  272. package/genes/style-optimizer/phenotype.json +28 -0
  273. package/genes/tech-lead/.cloud-manifest.json +6 -0
  274. package/genes/tech-lead/.gene-manifest.json +8 -0
  275. package/genes/tech-lead/SKILL.md +451 -0
  276. package/genes/tech-lead/phenotype.json +28 -0
  277. package/genes/test-wrap/.cloud-manifest.json +6 -0
  278. package/genes/test-wrap/.gene-manifest.json +8 -0
  279. package/genes/test-wrap/phenotype.json +28 -0
  280. package/genes/testing-strategist/.cloud-manifest.json +6 -0
  281. package/genes/testing-strategist/.gene-manifest.json +8 -0
  282. package/genes/testing-strategist/SKILL.md +500 -0
  283. package/genes/testing-strategist/phenotype.json +28 -0
  284. package/genes/text-summarizer/.cloud-manifest.json +6 -0
  285. package/genes/text-summarizer/README.md +34 -0
  286. package/genes/text-summarizer/index.ts +122 -0
  287. package/genes/text-summarizer/phenotype.json +32 -0
  288. package/genes/tone-analyzer/.cloud-manifest.json +6 -0
  289. package/genes/tone-analyzer/.gene-manifest.json +8 -0
  290. package/genes/tone-analyzer/SKILL.md +410 -0
  291. package/genes/tone-analyzer/phenotype.json +28 -0
  292. package/genes/translator/.cloud-manifest.json +6 -0
  293. package/genes/translator/.gene-manifest.json +8 -0
  294. package/genes/translator/SKILL.md +355 -0
  295. package/genes/translator/phenotype.json +28 -0
  296. package/genes/ui-components/.cloud-manifest.json +6 -0
  297. package/genes/ui-components/.gene-manifest.json +8 -0
  298. package/genes/ui-components/SKILL.md +467 -0
  299. package/genes/ui-components/phenotype.json +28 -0
  300. package/genes/uiux-designer/.cloud-manifest.json +6 -0
  301. package/genes/uiux-designer/.gene-manifest.json +8 -0
  302. package/genes/uiux-designer/SKILL.md +353 -0
  303. package/genes/uiux-designer/phenotype.json +28 -0
  304. package/genes/url-extractor/.cloud-manifest.json +6 -0
  305. package/genes/url-extractor/README.md +37 -0
  306. package/genes/url-extractor/index.ts +86 -0
  307. package/genes/url-extractor/phenotype.json +48 -0
  308. package/genes/ux-patterns/.cloud-manifest.json +6 -0
  309. package/genes/ux-patterns/.gene-manifest.json +8 -0
  310. package/genes/ux-patterns/SKILL.md +872 -0
  311. package/genes/ux-patterns/phenotype.json +28 -0
  312. package/genes/web3-components/.cloud-manifest.json +6 -0
  313. package/genes/web3-components/.gene-manifest.json +8 -0
  314. package/genes/web3-components/SKILL.md +390 -0
  315. package/genes/web3-components/phenotype.json +28 -0
  316. package/package.json +6 -5
@@ -0,0 +1,872 @@
1
+ ---
2
+ name: ux-patterns
3
+ description: 参数化UX交互模式库,根据emotionalTone和motionIntensity参数动态生成文案和动效。当用户提到"动效""状态反馈""文案""交互""微交互""用户体验"时使用。
4
+ ---
5
+
6
+ # UX Patterns (参数化交互模式库)
7
+
8
+ **定位**: 确保交互体验有温度、有个性。
9
+
10
+ **核心目标**: 根据风格参数生成匹配的文案和动效,而非从预设中选择。
11
+
12
+ **依赖**: 接收 [brand-personality](../brand-personality/SKILL.md) 输出的 `emotionalTone` 和 `motionIntensity` 参数。
13
+
14
+ ---
15
+
16
+ ## Pre-Polish Checklist
17
+
18
+ 应用 UX 模式前,逐项检查:
19
+
20
+ ```
21
+ 功能完整性:
22
+ - [ ] Loading: 有 Spinner/Skeleton/趣味加载?
23
+ - [ ] Success: 有 Toast/确认/庆祝动效?
24
+ - [ ] Error: 有温暖的错误提示?
25
+ - [ ] Empty: 有有趣的空状态?
26
+ - [ ] Animations: 状态切换有过渡?
27
+ - [ ] Hover: 可交互元素有悬停状态?
28
+ - [ ] Focus: 焦点状态清晰可见?
29
+
30
+ 情感化检查(消除AI味):
31
+ - [ ] 文案是否像真人说的话?
32
+ - [ ] 有没有至少一个惊喜时刻?
33
+ - [ ] 动效是否有个性(不只是 ease-out)?
34
+ - [ ] 空状态/错误状态是否让人感到被关心?
35
+ ```
36
+
37
+ ---
38
+
39
+ ## 状态反馈模式
40
+
41
+ ### 加载状态
42
+
43
+ | 场景 | 反馈方式 | 示例 |
44
+ |------|----------|------|
45
+ | 按钮提交 | 按钮内 Spinner + 文字 | "保存中..." |
46
+ | 页面加载 | 骨架屏 (Skeleton) | 灰色占位块 |
47
+ | 数据刷新 | 顶部进度条 / Spinner | NProgress 风格 |
48
+ | 后台操作 | Toast 提示 | "正在处理..." |
49
+
50
+ ### 成功状态
51
+
52
+ | 场景 | 反馈方式 | 持续时间 |
53
+ |------|----------|---------|
54
+ | 表单提交 | Toast 成功提示 | 3秒自动消失 |
55
+ | 重要操作 | 弹窗确认 + 对勾动画 | 用户点击关闭 |
56
+ | 保存操作 | 轻量提示(顶部闪现) | 2秒自动消失 |
57
+
58
+ ### 错误状态
59
+
60
+ | 场景 | 反馈方式 | 要求 |
61
+ |------|----------|------|
62
+ | 表单验证 | 输入框下方红色提示 | 即时反馈 |
63
+ | 网络错误 | Toast 错误提示 + 重试按钮 | 可操作 |
64
+ | 权限错误 | 弹窗说明 + 引导操作 | 说人话 |
65
+ | 严重错误 | 全屏错误页 + 联系方式 | 提供解决路径 |
66
+
67
+ ### 空状态
68
+
69
+ | 场景 | 内容要素 |
70
+ |------|----------|
71
+ | 无数据 | 图标 + 说明文字 + 操作按钮 |
72
+ | 无搜索结果 | 提示词 + 搜索建议 |
73
+ | 无权限 | 说明 + 申请入口 |
74
+
75
+ ---
76
+
77
+ ## 参数化惊喜动效 (Delight Moments)
78
+
79
+ ### 惊喜强度与参数关系
80
+
81
+ > 根据 `emotionalTone` 参数决定惊喜动效的强度
82
+
83
+ ```typescript
84
+ type DelightLevel = 'none' | 'subtle' | 'moderate' | 'expressive';
85
+
86
+ function getDelightLevel(emotionalTone: number): DelightLevel {
87
+ if (emotionalTone < 30) return 'none'; // 极简风格不使用惊喜动效
88
+ if (emotionalTone < 55) return 'subtle'; // 轻微:对勾动画
89
+ if (emotionalTone < 80) return 'moderate'; // 中等:弹性 + 高亮
90
+ return 'expressive'; // 强烈:撒花/emoji/庆祝
91
+ }
92
+ ```
93
+
94
+ ### 惊喜动效对照表
95
+
96
+ | emotionalTone | 级别 | 成功反馈 | 里程碑 | 首次完成 |
97
+ |---------------|------|----------|--------|----------|
98
+ | 0-29 | none | 无动效 | 无 | 无 |
99
+ | 30-54 | subtle | 对勾淡入 | 微弹高亮 | 轻微光效 |
100
+ | 55-79 | moderate | 对勾 + 弹性 | 徽章动画 | 光效 + 震动 |
101
+ | 80-100 | expressive | 撒花 + 对勾 | 烟花 + 徽章 | 全屏庆祝 |
102
+
103
+ ### Delight 触发时机
104
+
105
+ | 时机 | subtle | moderate | expressive |
106
+ |------|--------|----------|------------|
107
+ | 首次完成任务 | 轻微高亮 | 光效动画 | 撒花/烟花 |
108
+ | 达成里程碑 | 微弹提示 | 徽章动画 | 徽章 + 震动 + emoji |
109
+ | 重要操作成功 | 对勾淡入 | 弹性对勾 | 对勾 + 撒花 |
110
+ | 解锁成就 | 轻微脉冲 | 星星效果 | 全屏光效 |
111
+
112
+ ### Delight 动效代码
113
+
114
+ ```tsx
115
+ // 撒花庆祝
116
+ function Confetti({ trigger }: { trigger: boolean }) {
117
+ if (!trigger) return null
118
+ return (
119
+ <div className="fixed inset-0 pointer-events-none z-50 overflow-hidden">
120
+ {[...Array(50)].map((_, i) => (
121
+ <span
122
+ key={i}
123
+ className="absolute w-3 h-3 animate-confetti"
124
+ style={{
125
+ left: `${Math.random() * 100}%`,
126
+ top: '-20px',
127
+ backgroundColor: ['#FF6B6B', '#4ECDC4', '#FFE66D', '#A855F7', '#FF00FF'][i % 5],
128
+ animationDelay: `${Math.random() * 0.5}s`,
129
+ animationDuration: `${1.5 + Math.random()}s`,
130
+ }}
131
+ />
132
+ ))}
133
+ </div>
134
+ )
135
+ }
136
+
137
+ // 成功对勾(带弹性)
138
+ function SuccessCheck() {
139
+ return (
140
+ <div className="w-16 h-16 rounded-full bg-green-100 flex items-center justify-center animate-success-pop">
141
+ <svg className="w-8 h-8 text-green-500" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3">
142
+ <path className="animate-check-draw" d="M5 13l4 4L19 7" strokeLinecap="round" strokeLinejoin="round" />
143
+ </svg>
144
+ </div>
145
+ )
146
+ }
147
+
148
+ // 趣味加载(不同风格)
149
+ function FunLoader({ style = 'warm' }: { style: 'minimal' | 'warm' | 'playful' }) {
150
+ const loaders = {
151
+ minimal: <div className="w-4 h-4 border-2 border-black border-t-transparent rounded-full animate-spin" />,
152
+ warm: (
153
+ <div className="flex flex-col items-center gap-3">
154
+ <div className="text-3xl animate-bounce">☕</div>
155
+ <p className="text-sm text-gray-500">马上就好...</p>
156
+ </div>
157
+ ),
158
+ playful: (
159
+ <div className="flex gap-1">
160
+ {[0, 1, 2].map(i => (
161
+ <div
162
+ key={i}
163
+ className="w-3 h-3 bg-gradient-to-r from-pink-500 to-cyan-500 rounded-full animate-bounce"
164
+ style={{ animationDelay: `${i * 0.15}s` }}
165
+ />
166
+ ))}
167
+ </div>
168
+ ),
169
+ }
170
+ return loaders[style]
171
+ }
172
+ ```
173
+
174
+ ### Delight 动画 CSS
175
+
176
+ ```css
177
+ /* 撒花下落 */
178
+ @keyframes confetti {
179
+ 0% { transform: translateY(0) rotate(0deg); opacity: 1; }
180
+ 100% { transform: translateY(100vh) rotate(720deg); opacity: 0; }
181
+ }
182
+ .animate-confetti { animation: confetti 2s ease-out forwards; }
183
+
184
+ /* 成功弹出 */
185
+ @keyframes success-pop {
186
+ 0% { transform: scale(0); opacity: 0; }
187
+ 50% { transform: scale(1.2); }
188
+ 100% { transform: scale(1); opacity: 1; }
189
+ }
190
+ .animate-success-pop { animation: success-pop 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); }
191
+
192
+ /* 对勾绘制 */
193
+ @keyframes check-draw {
194
+ 0% { stroke-dashoffset: 24; }
195
+ 100% { stroke-dashoffset: 0; }
196
+ }
197
+ .animate-check-draw {
198
+ stroke-dasharray: 24;
199
+ stroke-dashoffset: 24;
200
+ animation: check-draw 0.4s ease-out 0.2s forwards;
201
+ }
202
+
203
+ /* 星星闪烁 */
204
+ @keyframes twinkle {
205
+ 0%, 100% { opacity: 1; transform: scale(1); }
206
+ 50% { opacity: 0.5; transform: scale(0.8); }
207
+ }
208
+ .animate-twinkle { animation: twinkle 1s ease-in-out infinite; }
209
+
210
+ /* 脉冲光环 */
211
+ @keyframes pulse-ring {
212
+ 0% { transform: scale(1); opacity: 0.8; }
213
+ 100% { transform: scale(1.5); opacity: 0; }
214
+ }
215
+ .animate-pulse-ring { animation: pulse-ring 1s ease-out infinite; }
216
+ ```
217
+
218
+ ---
219
+
220
+ ## 参数化动效系统
221
+
222
+ > 根据 `motionIntensity` 参数(0-100)生成匹配的动效参数
223
+
224
+ ### 动效生成函数
225
+
226
+ ```typescript
227
+ interface MotionParams {
228
+ duration: number; // 毫秒
229
+ easing: string; // CSS缓动函数
230
+ staggerDelay: number; // 错开延迟(毫秒)
231
+ hoverScale: number; // 悬停缩放比例
232
+ clickScale: number; // 点击缩放比例
233
+ }
234
+
235
+ function getMotionParams(motionIntensity: number): MotionParams {
236
+ // 时长:80ms (克制) → 500ms (夸张)
237
+ const duration = 80 + motionIntensity * 4.2;
238
+
239
+ // 缓动函数随强度变化
240
+ let easing: string;
241
+ if (motionIntensity < 25) {
242
+ easing = 'cubic-bezier(0.2, 0, 0, 1)'; // 快速线性
243
+ } else if (motionIntensity < 50) {
244
+ easing = 'cubic-bezier(0.16, 1, 0.3, 1)'; // 标准ease-out
245
+ } else if (motionIntensity < 75) {
246
+ easing = 'cubic-bezier(0.34, 1.56, 0.64, 1)'; // 轻微弹性
247
+ } else {
248
+ easing = 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'; // 明显弹性
249
+ }
250
+
251
+ // 错开延迟:30ms (克制) → 80ms (夸张)
252
+ const staggerDelay = 30 + motionIntensity * 0.5;
253
+
254
+ // 悬停缩放:1.0 (无) → 1.05 (明显)
255
+ const hoverScale = 1 + (motionIntensity > 40 ? motionIntensity * 0.0005 : 0);
256
+
257
+ // 点击缩放:0.98 (轻微) → 0.92 (明显)
258
+ const clickScale = 0.98 - (motionIntensity * 0.0006);
259
+
260
+ return { duration, easing, staggerDelay, hoverScale, clickScale };
261
+ }
262
+ ```
263
+
264
+ ### 动效参数对照表
265
+
266
+ | motionIntensity | 时长 | 缓动类型 | 特点 |
267
+ |-----------------|------|----------|------|
268
+ | 0-24 | 80-180ms | linear/snap | 瞬间响应,无多余 |
269
+ | 25-49 | 185-285ms | ease-out | 稳定,可预测 |
270
+ | 50-74 | 290-395ms | spring轻弹 | 柔和,让人放松 |
271
+ | 75-100 | 395-500ms | spring强弹 | 弹跳,有活力 |
272
+
273
+ ### 缓动函数库
274
+
275
+ ```css
276
+ :root {
277
+ /* 根据 motionIntensity 选择 */
278
+
279
+ /* 0-24: 快速响应 */
280
+ --easing-snap: cubic-bezier(0.2, 0, 0, 1);
281
+
282
+ /* 25-49: 标准流畅 */
283
+ --easing-smooth: cubic-bezier(0.16, 1, 0.3, 1);
284
+
285
+ /* 50-74: 轻微弹性 */
286
+ --easing-spring-soft: cubic-bezier(0.34, 1.56, 0.64, 1);
287
+
288
+ /* 75-100: 明显弹性 */
289
+ --easing-spring-hard: cubic-bezier(0.175, 0.885, 0.32, 1.275);
290
+ }
291
+ ```
292
+
293
+ ### 动效应用示例
294
+
295
+ ```tsx
296
+ // 根据参数生成组件样式
297
+ function AnimatedButton({ motionIntensity }: { motionIntensity: number }) {
298
+ const params = getMotionParams(motionIntensity);
299
+
300
+ return (
301
+ <button
302
+ style={{
303
+ transition: `all ${params.duration}ms ${params.easing}`,
304
+ }}
305
+ className={`
306
+ hover:scale-[${params.hoverScale}]
307
+ active:scale-[${params.clickScale}]
308
+ `}
309
+ >
310
+ Click me
311
+ </button>
312
+ );
313
+ }
314
+
315
+ // 列表错开动画
316
+ function StaggerList({ items, motionIntensity }: Props) {
317
+ const params = getMotionParams(motionIntensity);
318
+
319
+ return (
320
+ <ul>
321
+ {items.map((item, i) => (
322
+ <li
323
+ key={item.id}
324
+ style={{
325
+ animation: `slide-up ${params.duration}ms ${params.easing}`,
326
+ animationDelay: `${i * params.staggerDelay}ms`,
327
+ }}
328
+ >
329
+ {item.content}
330
+ </li>
331
+ ))}
332
+ </ul>
333
+ );
334
+ }
335
+ ```
336
+
337
+ ### 动效场景适配
338
+
339
+ | 场景 | 低参数 (0-40) | 高参数 (60-100) |
340
+ |------|---------------|-----------------|
341
+ | 元素出现 | 快速淡入 | 淡入 + 弹性上移 |
342
+ | 弹窗出现 | 快速缩放 | 弹性缩放 + overshoot |
343
+ | 悬停 | 仅背景色变化 | 背景色 + 上浮 + 阴影 |
344
+ | 点击 | 轻微缩小(0.98) | 明显缩小(0.92) + 回弹 |
345
+ | 列表加载 | 快速全部出现 | 错开出现(stagger) |
346
+
347
+ ### 错开延迟 (Stagger)
348
+
349
+ ```tsx
350
+ // 列表项依次出现
351
+ function StaggerList({ items }: { items: any[] }) {
352
+ return (
353
+ <ul>
354
+ {items.map((item, i) => (
355
+ <li
356
+ key={item.id}
357
+ className="animate-slide-up"
358
+ style={{ animationDelay: `${i * 50}ms` }}
359
+ >
360
+ {item.content}
361
+ </li>
362
+ ))}
363
+ </ul>
364
+ )
365
+ }
366
+ ```
367
+
368
+ ### 基础动画代码
369
+
370
+ ```css
371
+ @keyframes slide-up {
372
+ from { opacity: 0; transform: translateY(10px); }
373
+ to { opacity: 1; transform: translateY(0); }
374
+ }
375
+
376
+ @keyframes fade-in {
377
+ from { opacity: 0; }
378
+ to { opacity: 1; }
379
+ }
380
+
381
+ @keyframes scale-in {
382
+ from { opacity: 0; transform: scale(0.95); }
383
+ to { opacity: 1; transform: scale(1); }
384
+ }
385
+
386
+ /* 弹性缩放(温暖/活泼风格) */
387
+ @keyframes pop-in {
388
+ 0% { opacity: 0; transform: scale(0.8); }
389
+ 70% { transform: scale(1.05); }
390
+ 100% { opacity: 1; transform: scale(1); }
391
+ }
392
+
393
+ /* 抖动(错误反馈) */
394
+ @keyframes shake {
395
+ 0%, 100% { transform: translateX(0); }
396
+ 25% { transform: translateX(-5px); }
397
+ 75% { transform: translateX(5px); }
398
+ }
399
+
400
+ .animate-slide-up { animation: slide-up 0.3s var(--ease-out); }
401
+ .animate-fade-in { animation: fade-in 0.2s var(--ease-out); }
402
+ .animate-scale-in { animation: scale-in 0.2s var(--ease-out); }
403
+ .animate-pop-in { animation: pop-in 0.4s var(--spring-soft); }
404
+ .animate-shake { animation: shake 0.3s ease-in-out; }
405
+ ```
406
+
407
+ ---
408
+
409
+ ## 微交互设计
410
+
411
+ ### 按钮交互
412
+
413
+ ```html
414
+ <!-- 完整交互状态 -->
415
+ <button class="px-4 py-2.5 bg-primary-500 text-white rounded-xl
416
+ hover:bg-primary-600
417
+ active:bg-primary-700 active:scale-[0.98]
418
+ focus:outline-none focus:ring-2 focus:ring-primary-500/20
419
+ disabled:opacity-50 disabled:cursor-not-allowed
420
+ transition-all duration-200">
421
+ 按钮
422
+ </button>
423
+ ```
424
+
425
+ ### 输入框交互
426
+
427
+ ```html
428
+ <!-- 完整输入框状态 -->
429
+ <input class="w-full px-4 py-2.5 bg-gray-50 border border-gray-200 rounded-xl
430
+ text-gray-900 text-sm placeholder-gray-400
431
+ hover:border-gray-300
432
+ focus:outline-none focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500
433
+ disabled:bg-gray-100 disabled:cursor-not-allowed
434
+ transition-all duration-200"
435
+ placeholder="请输入...">
436
+ ```
437
+
438
+ ### 卡片交互
439
+
440
+ ```html
441
+ <!-- 可点击卡片 -->
442
+ <div class="bg-white rounded-2xl border border-gray-100 p-6
443
+ cursor-pointer
444
+ hover:border-gray-200 hover:shadow-md
445
+ active:scale-[0.99]
446
+ transition-all duration-200">
447
+ 卡片内容
448
+ </div>
449
+ ```
450
+
451
+ ### 列表项交互
452
+
453
+ ```html
454
+ <!-- 列表项悬停 -->
455
+ <div class="px-4 py-3 rounded-xl
456
+ hover:bg-gray-50
457
+ active:bg-gray-100
458
+ transition-colors duration-150 cursor-pointer">
459
+ 列表项
460
+ </div>
461
+ ```
462
+
463
+ ---
464
+
465
+ ## 参数化文案系统
466
+
467
+ > 根据 `emotionalTone` 参数(0-100)生成匹配的文案风格
468
+
469
+ ### 文案生成函数
470
+
471
+ ```typescript
472
+ type CopyStyle = 'minimal' | 'neutral' | 'friendly' | 'enthusiastic';
473
+
474
+ function getCopyStyle(emotionalTone: number): CopyStyle {
475
+ if (emotionalTone < 25) return 'minimal'; // 0-24: 极简
476
+ if (emotionalTone < 50) return 'neutral'; // 25-49: 中性
477
+ if (emotionalTone < 75) return 'friendly'; // 50-74: 友好
478
+ return 'enthusiastic'; // 75-100: 热情
479
+ }
480
+
481
+ // 文案库:每个场景4个级别
482
+ const COPY_LIBRARY = {
483
+ loading: {
484
+ minimal: 'Loading',
485
+ neutral: '加载中...',
486
+ friendly: '马上就好...',
487
+ enthusiastic: '稍等一下下~ ✨'
488
+ },
489
+ saveSuccess: {
490
+ minimal: 'Saved',
491
+ neutral: '已保存',
492
+ friendly: '保存成功!',
493
+ enthusiastic: '太棒了,搞定!🎉'
494
+ },
495
+ error: {
496
+ minimal: 'Failed',
497
+ neutral: '操作失败',
498
+ friendly: '哎呀,出了点问题',
499
+ enthusiastic: 'Oops!再试试?😅'
500
+ },
501
+ empty: {
502
+ minimal: 'No items',
503
+ neutral: '暂无数据',
504
+ friendly: '这里空空如也,创建第一个吧',
505
+ enthusiastic: '还没有内容呢,要不创建一个?✨'
506
+ }
507
+ };
508
+
509
+ // 使用
510
+ function getCopy(scene: string, emotionalTone: number): string {
511
+ const style = getCopyStyle(emotionalTone);
512
+ return COPY_LIBRARY[scene][style];
513
+ }
514
+
515
+ // 示例:
516
+ // emotionalTone: 30 → getCopy('loading', 30) → "加载中..."
517
+ // emotionalTone: 70 → getCopy('loading', 70) → "马上就好..."
518
+ // emotionalTone: 90 → getCopy('loading', 90) → "稍等一下下~ ✨"
519
+ ```
520
+
521
+ ### 文案参数对照表
522
+
523
+ | emotionalTone | 风格 | 特点 | 示例(保存成功) |
524
+ |---------------|------|------|---------------|
525
+ | 0-24 | minimal | 极简、直接、无情绪 | "Saved" |
526
+ | 25-49 | neutral | 清晰、友好、不过分 | "已保存" |
527
+ | 50-74 | friendly | 亲切、鼓励、语气词 | "保存成功!" |
528
+ | 75-100 | enthusiastic | 热情、emoji、感叹 | "太棒了,搞定!🎉" |
529
+
530
+ ### 完整文案库
531
+
532
+ #### 状态文案
533
+
534
+ | 场景 | minimal (0-24) | neutral (25-49) | friendly (50-74) | enthusiastic (75-100) |
535
+ |------|----------------|-----------------|------------------|----------------------|
536
+ | 加载中 | Loading | 加载中... | 马上就好... | 稍等一下下~ ✨ |
537
+ | 保存成功 | Saved | 已保存 | 保存成功! | 太棒了,搞定!🎉 |
538
+ | 操作失败 | Failed | 操作失败 | 哎呀,出了点问题 | Oops!再试试?😅 |
539
+ | 空状态 | No items | 暂无数据 | 这里空空如也 | 还没有内容呢~ ✨ |
540
+ | 网络错误 | Offline | 网络连接失败 | 网络不太稳定 | 网络开小差了~ 🌐 |
541
+
542
+ #### 确认弹窗文案
543
+
544
+ | 场景 | minimal | neutral | friendly | enthusiastic |
545
+ |------|---------|---------|----------|--------------|
546
+ | 删除标题 | Delete? | 确认删除 | 确定要删除吗? | 真的要删掉吗?🤔 |
547
+ | 删除描述 | Cannot undo | 此操作不可撤销 | 删除后无法恢复哦 | 删掉就找不回来啦! |
548
+ | 确认按钮 | Delete | 确认删除 | 确定删除 | 删掉它! |
549
+ | 取消按钮 | Cancel | 取消 | 再想想 | 我再想想 |
550
+
551
+ #### 欢迎/问候
552
+
553
+ | 场景 | minimal | neutral | friendly | enthusiastic |
554
+ |------|---------|---------|----------|--------------|
555
+ | 首次欢迎 | Welcome | 欢迎使用 | 欢迎来到这里! | Hey!欢迎加入!🎊 |
556
+ | 回访问候 | — | 您好 | 欢迎回来! | 好久不见!👋 |
557
+ | 完成引导 | Done | 设置完成 | 准备就绪! | 搞定!准备起飞!🚀 |
558
+
559
+ ### 文案通用原则
560
+
561
+ | 原则 | 说明 | 好例子 | 坏例子 |
562
+ |------|------|--------|--------|
563
+ | 像人说话 | 避免机器腔 | "哎呀,出了点问题" | "Error: Operation failed" |
564
+ | 避免责怪 | 不让用户感到愚蠢 | "请输入邮箱地址" | "邮箱格式错误!" |
565
+ | 提供出路 | 告诉用户怎么办 | "网络不稳定,点击重试" | "网络错误" |
566
+ | 适度幽默 | 根据参数调整程度 | emotionalTone > 70 时可用 | 低参数时避免 |
567
+
568
+ ### Emoji 使用规则
569
+
570
+ ```typescript
571
+ function shouldUseEmoji(emotionalTone: number): boolean {
572
+ return emotionalTone >= 60; // 60以上才使用emoji
573
+ }
574
+
575
+ function getEmojiIntensity(emotionalTone: number): 'none' | 'sparse' | 'frequent' {
576
+ if (emotionalTone < 60) return 'none';
577
+ if (emotionalTone < 80) return 'sparse'; // 偶尔使用
578
+ return 'frequent'; // 大方使用
579
+ }
580
+ ```
581
+
582
+ ---
583
+
584
+ ## 响应式交互
585
+
586
+ ### 触摸优化
587
+
588
+ ```css
589
+ /* 触摸设备优化 */
590
+ @media (hover: none) {
591
+ /* 移除 hover 效果,避免粘滞 */
592
+ .button:hover {
593
+ background-color: initial;
594
+ }
595
+
596
+ /* 增大点击区域 */
597
+ .touch-target {
598
+ min-height: 44px;
599
+ min-width: 44px;
600
+ }
601
+ }
602
+ ```
603
+
604
+ ### 手势支持
605
+
606
+ | 手势 | 操作 |
607
+ |------|------|
608
+ | 点击 | 主要交互 |
609
+ | 长按 | 显示上下文菜单 |
610
+ | 左滑 | 删除/归档(列表项) |
611
+ | 下拉 | 刷新 |
612
+
613
+ ---
614
+
615
+ ## 可访问性
616
+
617
+ ### 键盘导航
618
+
619
+ ```html
620
+ <!-- 确保可聚焦 -->
621
+ <button tabindex="0">可聚焦按钮</button>
622
+
623
+ <!-- 跳过链接 -->
624
+ <a href="#main" class="sr-only focus:not-sr-only">跳到主内容</a>
625
+ ```
626
+
627
+ ### 焦点样式
628
+
629
+ ```css
630
+ /* 清晰的焦点指示 */
631
+ :focus-visible {
632
+ outline: 2px solid var(--primary-500);
633
+ outline-offset: 2px;
634
+ }
635
+
636
+ /* 移除默认 outline,使用自定义样式 */
637
+ :focus {
638
+ outline: none;
639
+ }
640
+ ```
641
+
642
+ ### 屏幕阅读器
643
+
644
+ ```html
645
+ <!-- 仅屏幕阅读器可见 -->
646
+ <span class="sr-only">关闭弹窗</span>
647
+
648
+ <!-- 实时区域 -->
649
+ <div aria-live="polite" aria-atomic="true">
650
+ <!-- 动态内容会被朗读 -->
651
+ </div>
652
+ ```
653
+
654
+ ---
655
+
656
+ ## 必加 Classes
657
+
658
+ ```tsx
659
+ "transition-all duration-200" // 所有交互元素
660
+ "tabular-nums" // 数字对齐
661
+ "font-mono" // 地址/哈希/代码
662
+ "truncate" // 文本截断
663
+ "select-none" // 禁止选中(按钮等)
664
+ "cursor-pointer" // 可点击元素
665
+ ```
666
+
667
+ ---
668
+
669
+ ## 设计检查清单
670
+
671
+ 应用 UX 模式后,最终检查:
672
+
673
+ ```
674
+ 视觉一致性:
675
+ - [ ] 圆角统一 (卡片 2xl,按钮 xl,输入框 xl)
676
+ - [ ] 间距遵循 8px 基准系统
677
+ - [ ] 字号阶梯清晰 (最多 3-4 种)
678
+ - [ ] 颜色使用克制 (主色 + 灰度)
679
+
680
+ 交互体验:
681
+ - [ ] 所有可交互元素有 hover 状态
682
+ - [ ] 过渡动画平滑 (150-300ms)
683
+ - [ ] 焦点状态清晰可见
684
+ - [ ] 加载状态有反馈
685
+
686
+ 留白与层次:
687
+ - [ ] 组件间有足够呼吸感
688
+ - [ ] 视觉层次不超过 3 级
689
+ - [ ] 使用边框代替重阴影
690
+ - [ ] 背景色使用浅灰而非纯白
691
+
692
+ 文案:
693
+ - [ ] 文案简洁明了
694
+ - [ ] 错误提示说人话
695
+ - [ ] 空状态有引导
696
+ ```
697
+
698
+ ---
699
+
700
+ ## 人性化反馈设计
701
+
702
+ ### 超越"成功/失败"
703
+
704
+ 传统反馈只告诉用户结果,人性化反馈关心用户的感受:
705
+
706
+ | 场景 | 传统反馈 | 人性化反馈 |
707
+ |------|---------|-----------|
708
+ | 保存成功 | "保存成功" | "已保存。你今天效率真高!" |
709
+ | 删除成功 | "删除成功" | "已删除。需要的话可以在回收站找回" |
710
+ | 上传完成 | "上传完成" | "上传完成!文件看起来不错 📄" |
711
+ | 首次操作 | "操作成功" | "太棒了,这是你的第一个项目!🎉" |
712
+ | 连续操作 | "保存成功" | "又搞定一个!保持这个节奏 💪" |
713
+
714
+ ### 错误反馈的温度
715
+
716
+ ```
717
+ 冷冰冰(❌ 避免):
718
+ - "Error 500: Internal Server Error"
719
+ - "操作失败"
720
+ - "请求超时"
721
+
722
+ 有温度(✅ 推荐):
723
+ - "服务器开了个小差,我们正在修复,请稍后再试"
724
+ - "哎呀,这个操作没成功,再试一次?"
725
+ - "网络有点慢,要不换个信号好的地方?"
726
+ ```
727
+
728
+ ### 空状态的温暖
729
+
730
+ ```html
731
+ <!-- 冷冰冰 ❌ -->
732
+ <div class="text-center text-gray-500">
733
+ 暂无数据
734
+ </div>
735
+
736
+ <!-- 有温度 ✅ -->
737
+ <div class="text-center py-12">
738
+ <div class="text-6xl mb-4">📝</div>
739
+ <h3 class="text-lg font-medium text-gray-900 mb-2">还没有任何笔记</h3>
740
+ <p class="text-sm text-gray-500 mb-6">
741
+ 写下你的第一个想法吧,好记性不如烂笔头
742
+ </p>
743
+ <button class="px-4 py-2 bg-primary text-white rounded-xl">
744
+ 创建笔记
745
+ </button>
746
+ </div>
747
+ ```
748
+
749
+ ### 加载状态的趣味
750
+
751
+ ```html
752
+ <!-- 无聊 ❌ -->
753
+ <div class="animate-spin w-8 h-8 border-2 border-gray-300 border-t-primary rounded-full"></div>
754
+
755
+ <!-- 有趣 ✅ -->
756
+ <div class="flex flex-col items-center gap-3">
757
+ <div class="text-4xl animate-bounce">🚀</div>
758
+ <p class="text-sm text-gray-500">正在准备精彩内容...</p>
759
+ </div>
760
+
761
+ <!-- 或者:进度文案变化 -->
762
+ <div class="text-center">
763
+ <div class="animate-pulse text-sm text-gray-500">
764
+ <!-- 随时间变化的文案 -->
765
+ <!-- 0-2s: "加载中..." -->
766
+ <!-- 2-5s: "快好了..." -->
767
+ <!-- 5s+: "稍微有点慢,再等等..." -->
768
+ </div>
769
+ </div>
770
+ ```
771
+
772
+ ### 进度反馈的鼓励
773
+
774
+ ```tsx
775
+ function ProgressFeedback({ progress }: { progress: number }) {
776
+ const getMessage = () => {
777
+ if (progress < 25) return "开始了!继续加油 💪"
778
+ if (progress < 50) return "进展不错!"
779
+ if (progress < 75) return "已经过半了!"
780
+ if (progress < 100) return "马上就完成了!"
781
+ return "太棒了,完成了!🎉"
782
+ }
783
+
784
+ return (
785
+ <div>
786
+ <div className="flex justify-between text-sm mb-2">
787
+ <span>{getMessage()}</span>
788
+ <span className="font-medium">{progress}%</span>
789
+ </div>
790
+ <div className="h-2 bg-gray-100 rounded-full overflow-hidden">
791
+ <div
792
+ className="h-full bg-primary rounded-full transition-all duration-500"
793
+ style={{ width: `${progress}%` }}
794
+ />
795
+ </div>
796
+ </div>
797
+ )
798
+ }
799
+ ```
800
+
801
+ ---
802
+
803
+ ## 设计检查清单(消除AI味)
804
+
805
+ 最终检查,确保设计有灵魂:
806
+
807
+ ```
808
+ 文案检查:
809
+ - [ ] 文案像真人说的话吗?
810
+ - [ ] 错误提示是否让人感到被关心而非被责怪?
811
+ - [ ] 空状态是否温暖/有趣?
812
+ - [ ] 有没有在适当的地方使用 emoji?
813
+
814
+ 动效检查:
815
+ - [ ] 动效是否有个性(不只是 ease-out 200ms)?
816
+ - [ ] 重要操作是否有惊喜反馈?
817
+ - [ ] 列表是否有错开加载效果?
818
+ - [ ] 成功状态是否有庆祝感?
819
+
820
+ 情感检查:
821
+ - [ ] 首次用户有没有特别的欢迎?
822
+ - [ ] 里程碑时刻有没有庆祝?
823
+ - [ ] 等待时是否不无聊?
824
+ - [ ] 用户离开时有没有温暖的告别?
825
+ ```
826
+
827
+ ---
828
+
829
+ ## 参数使用示例
830
+
831
+ ### 完整工作流
832
+
833
+ ```typescript
834
+ // 1. 从 brand-personality 获取参数
835
+ const styleParams = {
836
+ emotionalTone: 65,
837
+ motionIntensity: 55
838
+ };
839
+
840
+ // 2. 生成文案
841
+ const loadingCopy = getCopy('loading', styleParams.emotionalTone);
842
+ // → "马上就好..."
843
+
844
+ // 3. 生成动效参数
845
+ const motion = getMotionParams(styleParams.motionIntensity);
846
+ // → { duration: 311, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)', ... }
847
+
848
+ // 4. 确定惊喜级别
849
+ const delightLevel = getDelightLevel(styleParams.emotionalTone);
850
+ // → 'moderate'
851
+
852
+ // 5. 应用到组件
853
+ <Button
854
+ style={{ transition: `all ${motion.duration}ms ${motion.easing}` }}
855
+ onClick={() => {
856
+ // 操作成功后
857
+ showToast(getCopy('saveSuccess', styleParams.emotionalTone));
858
+ if (delightLevel !== 'none') showSuccessAnimation(delightLevel);
859
+ }}
860
+ >
861
+ {getCopy('save', styleParams.emotionalTone)}
862
+ </Button>
863
+ ```
864
+
865
+ ---
866
+
867
+ ## 相关技能
868
+
869
+ - **brand-personality**: 提供 emotionalTone 和 motionIntensity 参数
870
+ - **design-tokens**: 提供圆角、颜色等视觉令牌
871
+ - **ui-components**: 使用本技能的文案和动效参数
872
+ - **uiux-designer**: 统一调度入口