@design-ai/cli 4.55.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 (529) hide show
  1. package/.claude-plugin/plugin.json +164 -0
  2. package/AGENTS.ko.md +126 -0
  3. package/AGENTS.md +182 -0
  4. package/CHANGELOG.md +6883 -0
  5. package/CLAUDE.md +39 -0
  6. package/LICENSE +21 -0
  7. package/README.ko.md +245 -0
  8. package/README.md +277 -0
  9. package/agents/README.md +14 -0
  10. package/agents/a11y-reviewer.md +121 -0
  11. package/agents/component-architect.md +57 -0
  12. package/agents/design-critic.md +46 -0
  13. package/agents/token-extractor.md +63 -0
  14. package/cli/bin/design-ai-mcp.mjs +6 -0
  15. package/cli/bin/design-ai.mjs +40 -0
  16. package/cli/commands/audit.mjs +111 -0
  17. package/cli/commands/check.mjs +226 -0
  18. package/cli/commands/doctor.mjs +141 -0
  19. package/cli/commands/examples.mjs +58 -0
  20. package/cli/commands/help.mjs +271 -0
  21. package/cli/commands/install.mjs +161 -0
  22. package/cli/commands/learn.mjs +1871 -0
  23. package/cli/commands/list.mjs +143 -0
  24. package/cli/commands/mcp.mjs +27 -0
  25. package/cli/commands/pack.mjs +211 -0
  26. package/cli/commands/prompt.mjs +199 -0
  27. package/cli/commands/route.mjs +247 -0
  28. package/cli/commands/search.mjs +60 -0
  29. package/cli/commands/show.mjs +52 -0
  30. package/cli/commands/site.mjs +558 -0
  31. package/cli/commands/status.mjs +161 -0
  32. package/cli/commands/uninstall.mjs +119 -0
  33. package/cli/commands/update.mjs +184 -0
  34. package/cli/commands/version.mjs +94 -0
  35. package/cli/commands/workspace.mjs +176 -0
  36. package/cli/lib/brief.mjs +52 -0
  37. package/cli/lib/check.mjs +642 -0
  38. package/cli/lib/dispatch.mjs +109 -0
  39. package/cli/lib/doctor.mjs +505 -0
  40. package/cli/lib/examples.mjs +258 -0
  41. package/cli/lib/exec.mjs +63 -0
  42. package/cli/lib/help-flags.mjs +5 -0
  43. package/cli/lib/learn.mjs +3694 -0
  44. package/cli/lib/log.mjs +47 -0
  45. package/cli/lib/mcp-server.mjs +426 -0
  46. package/cli/lib/output.mjs +101 -0
  47. package/cli/lib/pack.mjs +599 -0
  48. package/cli/lib/paths.mjs +63 -0
  49. package/cli/lib/prompt.mjs +603 -0
  50. package/cli/lib/route.mjs +740 -0
  51. package/cli/lib/search.mjs +158 -0
  52. package/cli/lib/show.mjs +161 -0
  53. package/cli/lib/signals.mjs +2337 -0
  54. package/cli/lib/site.mjs +6617 -0
  55. package/cli/lib/skill-proposals.mjs +2046 -0
  56. package/cli/lib/suggest.mjs +66 -0
  57. package/cli/lib/workspace.mjs +1056 -0
  58. package/commands/README.md +25 -0
  59. package/commands/component-spec.md +34 -0
  60. package/commands/conversational.md +44 -0
  61. package/commands/design-from-brief.md +141 -0
  62. package/commands/design-review.md +62 -0
  63. package/commands/document-from-brief.md +47 -0
  64. package/commands/extract-tokens.md +38 -0
  65. package/commands/game-ui.md +40 -0
  66. package/commands/illustration.md +37 -0
  67. package/commands/iterate.md +167 -0
  68. package/commands/motion-design.md +54 -0
  69. package/commands/palette-from-brand.md +50 -0
  70. package/commands/print.md +49 -0
  71. package/commands/slide-deck.md +46 -0
  72. package/commands/spatial.md +47 -0
  73. package/commands/stability-review.md +74 -0
  74. package/commands/video.md +42 -0
  75. package/commands/website-improvement.md +77 -0
  76. package/docs/AGENT-DEVELOPMENT.md +658 -0
  77. package/docs/AI-LEARNING.md +429 -0
  78. package/docs/AIDER-INTEGRATION.md +224 -0
  79. package/docs/ARCHITECTURE.ko.md +183 -0
  80. package/docs/ARCHITECTURE.md +105 -0
  81. package/docs/CODEX-INTEGRATION.md +311 -0
  82. package/docs/COMPANY-WEBSITE-DOGFOOD.ko.md +144 -0
  83. package/docs/COMPANY-WEBSITE-DOGFOOD.md +150 -0
  84. package/docs/COMPANY-WEBSITE-INTAKE-TEMPLATE.ko.md +153 -0
  85. package/docs/COMPANY-WEBSITE-INTAKE-TEMPLATE.md +154 -0
  86. package/docs/CONTRIBUTING.ko.md +203 -0
  87. package/docs/CONTRIBUTING.md +242 -0
  88. package/docs/CURSOR-INTEGRATION.md +220 -0
  89. package/docs/DISTRIBUTION.ko.md +248 -0
  90. package/docs/DISTRIBUTION.md +253 -0
  91. package/docs/DOGFOOD-FINDINGS.md +180 -0
  92. package/docs/DOGFOOD-V4-FINDINGS.md +139 -0
  93. package/docs/DOGFOOD-V4-MKDOCS-FINDINGS.md +233 -0
  94. package/docs/DOGFOOD-V4-NPM-FINDINGS.md +157 -0
  95. package/docs/DOGFOOD-V4-VSCODE-FINDINGS.md +135 -0
  96. package/docs/FIGMA-INTEGRATION.md +222 -0
  97. package/docs/MCP-INTEGRATION.md +243 -0
  98. package/docs/MIGRATION-v4.md +121 -0
  99. package/docs/PLUGIN-PACKAGING.md +240 -0
  100. package/docs/PRODUCT-READINESS.md +66 -0
  101. package/docs/QUICKSTART.ko.md +178 -0
  102. package/docs/QUICKSTART.md +179 -0
  103. package/docs/RELEASE-CHECKLIST.md +292 -0
  104. package/docs/ROADMAP.md +19495 -0
  105. package/docs/SESSION-LOG.md +940 -0
  106. package/docs/TOKEN-SYNC.md +237 -0
  107. package/docs/USING.ko.md +206 -0
  108. package/docs/USING.md +218 -0
  109. package/docs/WEBSITE-IMPROVEMENT.ko.md +75 -0
  110. package/docs/WEBSITE-IMPROVEMENT.md +89 -0
  111. package/docs/announcements/README.md +56 -0
  112. package/docs/announcements/dev-to-korea.md +206 -0
  113. package/docs/announcements/hashnode-post.ko.md +232 -0
  114. package/docs/announcements/okky-post.ko.md +158 -0
  115. package/docs/announcements/press-kit.md +101 -0
  116. package/docs/announcements/reddit-r-korea.md +196 -0
  117. package/docs/announcements/show-hn.md +114 -0
  118. package/docs/announcements/twitter-thread.md +255 -0
  119. package/docs/external-status.md +34 -0
  120. package/docs/integrations/aider-walkthrough.ko.md +275 -0
  121. package/docs/integrations/aider-walkthrough.md +274 -0
  122. package/docs/integrations/codex-walkthrough.ko.md +297 -0
  123. package/docs/integrations/codex-walkthrough.md +297 -0
  124. package/docs/integrations/cursor-walkthrough.ko.md +281 -0
  125. package/docs/integrations/cursor-walkthrough.md +284 -0
  126. package/docs/integrations/design-ai-mcp-server.md +169 -0
  127. package/docs/integrations/figma-mcp.md +149 -0
  128. package/docs/integrations/github-mcp.md +178 -0
  129. package/docs/integrations/linear-mcp.md +215 -0
  130. package/docs/integrations/notion-mcp.md +174 -0
  131. package/docs/integrations/sdk-walkthrough.ko.md +375 -0
  132. package/docs/integrations/sdk-walkthrough.md +375 -0
  133. package/docs/integrations/slack-mcp.md +208 -0
  134. package/docs/integrations/vscode-walkthrough.ko.md +202 -0
  135. package/docs/integrations/vscode-walkthrough.md +205 -0
  136. package/docs/requirements.txt +16 -0
  137. package/docs/site-overrides/extra.css +83 -0
  138. package/docs/site-overrides/favicon.svg +4 -0
  139. package/docs/site-overrides/logo.svg +10 -0
  140. package/docs/site-overrides/main.html +18 -0
  141. package/docs/website-console/app.js +2540 -0
  142. package/docs/website-console/index.html +24 -0
  143. package/docs/website-console/styles.css +975 -0
  144. package/examples/README.md +252 -0
  145. package/examples/cases/dogfood-v4-korean-hr-onboarding.md +356 -0
  146. package/examples/component-accordion-actions.md +153 -0
  147. package/examples/component-accordion-details.md +147 -0
  148. package/examples/component-accordion-summary.md +180 -0
  149. package/examples/component-accordion.md +229 -0
  150. package/examples/component-account-card.md +284 -0
  151. package/examples/component-address-input.md +260 -0
  152. package/examples/component-affix.md +190 -0
  153. package/examples/component-alert-dialog.md +210 -0
  154. package/examples/component-alert-title.md +77 -0
  155. package/examples/component-alert.md +192 -0
  156. package/examples/component-amount-input.md +278 -0
  157. package/examples/component-anchor.md +198 -0
  158. package/examples/component-app-bar.md +249 -0
  159. package/examples/component-aspect-ratio.md +156 -0
  160. package/examples/component-auto-complete.md +199 -0
  161. package/examples/component-avatar-group.md +170 -0
  162. package/examples/component-avatar.md +191 -0
  163. package/examples/component-back-top.md +123 -0
  164. package/examples/component-backdrop.md +148 -0
  165. package/examples/component-badge.md +181 -0
  166. package/examples/component-banner.md +237 -0
  167. package/examples/component-biometric-gate.md +281 -0
  168. package/examples/component-blockquote.md +153 -0
  169. package/examples/component-border-beam.md +207 -0
  170. package/examples/component-bottom-navigation.md +226 -0
  171. package/examples/component-box.md +112 -0
  172. package/examples/component-breadcrumb.md +222 -0
  173. package/examples/component-button-base.md +190 -0
  174. package/examples/component-button-group.md +117 -0
  175. package/examples/component-button.md +213 -0
  176. package/examples/component-calendar.md +280 -0
  177. package/examples/component-callout.md +131 -0
  178. package/examples/component-card-actions.md +101 -0
  179. package/examples/component-card-content.md +90 -0
  180. package/examples/component-card-header.md +122 -0
  181. package/examples/component-card-media.md +79 -0
  182. package/examples/component-card.md +233 -0
  183. package/examples/component-carousel.md +266 -0
  184. package/examples/component-cascader.md +135 -0
  185. package/examples/component-category-picker.md +271 -0
  186. package/examples/component-chart.md +237 -0
  187. package/examples/component-chat-interface.md +399 -0
  188. package/examples/component-checkbox.md +149 -0
  189. package/examples/component-click-away-listener.md +87 -0
  190. package/examples/component-code.md +213 -0
  191. package/examples/component-collapsible.md +219 -0
  192. package/examples/component-color-picker.md +110 -0
  193. package/examples/component-combobox.md +267 -0
  194. package/examples/component-command.md +299 -0
  195. package/examples/component-config-provider.md +190 -0
  196. package/examples/component-context-menu.md +179 -0
  197. package/examples/component-css-baseline.md +148 -0
  198. package/examples/component-date-picker.md +249 -0
  199. package/examples/component-descriptions.md +242 -0
  200. package/examples/component-dialog-actions.md +111 -0
  201. package/examples/component-dialog-content-text.md +76 -0
  202. package/examples/component-dialog-content.md +105 -0
  203. package/examples/component-dialog-title.md +104 -0
  204. package/examples/component-dialog.md +176 -0
  205. package/examples/component-divider.md +182 -0
  206. package/examples/component-doc-page.md +217 -0
  207. package/examples/component-drawer.md +257 -0
  208. package/examples/component-dropdown.md +220 -0
  209. package/examples/component-email-layout.md +253 -0
  210. package/examples/component-empty-state.md +269 -0
  211. package/examples/component-empty.md +172 -0
  212. package/examples/component-fade.md +87 -0
  213. package/examples/component-feature-grid.md +201 -0
  214. package/examples/component-field.md +266 -0
  215. package/examples/component-filled-input.md +114 -0
  216. package/examples/component-flex.md +117 -0
  217. package/examples/component-float-button.md +214 -0
  218. package/examples/component-form-control-label.md +134 -0
  219. package/examples/component-form-control.md +113 -0
  220. package/examples/component-form-controls.md +251 -0
  221. package/examples/component-form-group.md +86 -0
  222. package/examples/component-form-helper-text.md +95 -0
  223. package/examples/component-form-label.md +98 -0
  224. package/examples/component-form.md +291 -0
  225. package/examples/component-game-hud.md +362 -0
  226. package/examples/component-game-menu.md +327 -0
  227. package/examples/component-grid.md +140 -0
  228. package/examples/component-grow.md +79 -0
  229. package/examples/component-hero-block.md +252 -0
  230. package/examples/component-hover-card.md +211 -0
  231. package/examples/component-icon-button.md +142 -0
  232. package/examples/component-icon.md +102 -0
  233. package/examples/component-illustration.md +280 -0
  234. package/examples/component-image-list.md +107 -0
  235. package/examples/component-image.md +282 -0
  236. package/examples/component-input-adornment.md +101 -0
  237. package/examples/component-input-base.md +134 -0
  238. package/examples/component-input-number.md +141 -0
  239. package/examples/component-input-otp.md +271 -0
  240. package/examples/component-input.md +213 -0
  241. package/examples/component-item.md +243 -0
  242. package/examples/component-kbd.md +197 -0
  243. package/examples/component-krw-amount.md +219 -0
  244. package/examples/component-label.md +118 -0
  245. package/examples/component-layout.md +217 -0
  246. package/examples/component-link.md +223 -0
  247. package/examples/component-list-item-avatar.md +72 -0
  248. package/examples/component-list-item-button.md +139 -0
  249. package/examples/component-list-item-icon.md +82 -0
  250. package/examples/component-list-item-text.md +98 -0
  251. package/examples/component-list-item.md +116 -0
  252. package/examples/component-list-subheader.md +70 -0
  253. package/examples/component-list.md +198 -0
  254. package/examples/component-loading-button.md +125 -0
  255. package/examples/component-loading-sequence.md +254 -0
  256. package/examples/component-lottie-player.md +279 -0
  257. package/examples/component-masonry.md +191 -0
  258. package/examples/component-mentions.md +189 -0
  259. package/examples/component-menu-item.md +102 -0
  260. package/examples/component-menu-list.md +98 -0
  261. package/examples/component-menu.md +139 -0
  262. package/examples/component-menubar.md +259 -0
  263. package/examples/component-message.md +162 -0
  264. package/examples/component-mobile-stepper.md +155 -0
  265. package/examples/component-modal.md +220 -0
  266. package/examples/component-navigation-menu.md +295 -0
  267. package/examples/component-notification.md +166 -0
  268. package/examples/component-otp-countdown.md +245 -0
  269. package/examples/component-outlined-input.md +145 -0
  270. package/examples/component-page-transition.md +281 -0
  271. package/examples/component-pagination.md +226 -0
  272. package/examples/component-paper.md +199 -0
  273. package/examples/component-pass-auth.md +265 -0
  274. package/examples/component-payment-brand-button.md +253 -0
  275. package/examples/component-payment-method-selector.md +272 -0
  276. package/examples/component-payment-receipt.md +277 -0
  277. package/examples/component-popconfirm.md +144 -0
  278. package/examples/component-popover.md +239 -0
  279. package/examples/component-popper.md +129 -0
  280. package/examples/component-pricing-cards.md +247 -0
  281. package/examples/component-progress.md +195 -0
  282. package/examples/component-qr-code.md +201 -0
  283. package/examples/component-radio.md +167 -0
  284. package/examples/component-rate.md +202 -0
  285. package/examples/component-resizable.md +163 -0
  286. package/examples/component-result.md +270 -0
  287. package/examples/component-scroll-area.md +199 -0
  288. package/examples/component-scroll-reveal.md +320 -0
  289. package/examples/component-segmented.md +178 -0
  290. package/examples/component-select.md +258 -0
  291. package/examples/component-separator.md +177 -0
  292. package/examples/component-sheet.md +277 -0
  293. package/examples/component-sidebar.md +257 -0
  294. package/examples/component-skeleton.md +178 -0
  295. package/examples/component-slide.md +89 -0
  296. package/examples/component-slider.md +208 -0
  297. package/examples/component-snackbar-content.md +92 -0
  298. package/examples/component-snackbar.md +121 -0
  299. package/examples/component-sonner.md +165 -0
  300. package/examples/component-space.md +125 -0
  301. package/examples/component-spatial-locomotion.md +373 -0
  302. package/examples/component-spatial-panel.md +330 -0
  303. package/examples/component-speed-dial-action.md +78 -0
  304. package/examples/component-speed-dial.md +177 -0
  305. package/examples/component-spin.md +173 -0
  306. package/examples/component-spinner.md +204 -0
  307. package/examples/component-splitter.md +210 -0
  308. package/examples/component-stack.md +130 -0
  309. package/examples/component-statistic.md +282 -0
  310. package/examples/component-step-button.md +157 -0
  311. package/examples/component-step-connector.md +157 -0
  312. package/examples/component-step-content.md +121 -0
  313. package/examples/component-step-icon.md +115 -0
  314. package/examples/component-step-label.md +101 -0
  315. package/examples/component-step.md +84 -0
  316. package/examples/component-steps.md +264 -0
  317. package/examples/component-stock-chart.md +251 -0
  318. package/examples/component-swipeable-drawer.md +149 -0
  319. package/examples/component-switch.md +99 -0
  320. package/examples/component-tab-scroll-button.md +180 -0
  321. package/examples/component-tab.md +120 -0
  322. package/examples/component-table-body.md +82 -0
  323. package/examples/component-table-cell.md +118 -0
  324. package/examples/component-table-container.md +75 -0
  325. package/examples/component-table-footer.md +72 -0
  326. package/examples/component-table-head.md +78 -0
  327. package/examples/component-table-pagination.md +137 -0
  328. package/examples/component-table-row.md +113 -0
  329. package/examples/component-table-sort-label.md +109 -0
  330. package/examples/component-table.md +202 -0
  331. package/examples/component-tabs.md +184 -0
  332. package/examples/component-tag-badge.md +309 -0
  333. package/examples/component-tag.md +102 -0
  334. package/examples/component-testimonial-carousel.md +218 -0
  335. package/examples/component-textarea-autosize.md +114 -0
  336. package/examples/component-textarea.md +173 -0
  337. package/examples/component-time-picker.md +205 -0
  338. package/examples/component-timeline.md +170 -0
  339. package/examples/component-toast.md +224 -0
  340. package/examples/component-toggle-button.md +129 -0
  341. package/examples/component-toggle.md +220 -0
  342. package/examples/component-toolbar.md +104 -0
  343. package/examples/component-tooltip.md +178 -0
  344. package/examples/component-tour.md +176 -0
  345. package/examples/component-transaction-list-item.md +243 -0
  346. package/examples/component-transfer.md +156 -0
  347. package/examples/component-tree-select.md +202 -0
  348. package/examples/component-tree.md +297 -0
  349. package/examples/component-typography.md +215 -0
  350. package/examples/component-upload.md +295 -0
  351. package/examples/component-video-hero.md +409 -0
  352. package/examples/component-video-player.md +340 -0
  353. package/examples/component-voice-input.md +408 -0
  354. package/examples/component-watermark.md +217 -0
  355. package/examples/component-zoom.md +92 -0
  356. package/examples/doc-explanation-example.md +196 -0
  357. package/examples/doc-how-to-example.md +205 -0
  358. package/examples/doc-tutorial-example.md +162 -0
  359. package/examples/dogfood-korean-fintech-system.md +433 -0
  360. package/examples/email-transactional-example.md +259 -0
  361. package/examples/palette-saas-violet.md +235 -0
  362. package/examples/print-business-card-spec.md +205 -0
  363. package/examples/print-packaging-spec.md +285 -0
  364. package/examples/report-example.md +228 -0
  365. package/examples/slide-deck-example.md +237 -0
  366. package/examples/website-improvement-report.md +128 -0
  367. package/examples/website-improvement-workspace.json +126 -0
  368. package/install.sh +189 -0
  369. package/knowledge/COVERAGE.md +740 -0
  370. package/knowledge/PRINCIPLES.md +108 -0
  371. package/knowledge/a11y/contrast.md +70 -0
  372. package/knowledge/a11y/keyboard-and-focus.md +108 -0
  373. package/knowledge/colors/color-theory.md +90 -0
  374. package/knowledge/colors/mui-palette-structure.md +105 -0
  375. package/knowledge/colors/palettes-by-product-type.md +876 -0
  376. package/knowledge/components/INDEX.md +231 -0
  377. package/knowledge/components/index.json +1470 -0
  378. package/knowledge/components/shadcn-registry.md +159 -0
  379. package/knowledge/conversational/ai-chat-interfaces.md +323 -0
  380. package/knowledge/conversational/chatbot-design.md +312 -0
  381. package/knowledge/conversational/conversational-ui-fundamentals.md +299 -0
  382. package/knowledge/conversational/korean-voice-conventions.md +281 -0
  383. package/knowledge/conversational/voice-ui-patterns.md +297 -0
  384. package/knowledge/design-tokens/ant-design.md +124 -0
  385. package/knowledge/design-tokens/material-3.md +235 -0
  386. package/knowledge/design-tokens/polaris-and-carbon.md +231 -0
  387. package/knowledge/design-tokens/tailwind-v4.md +284 -0
  388. package/knowledge/game-ui/game-accessibility.md +317 -0
  389. package/knowledge/game-ui/game-ui-fundamentals.md +281 -0
  390. package/knowledge/game-ui/hud-design.md +324 -0
  391. package/knowledge/game-ui/korean-gaming-conventions.md +312 -0
  392. package/knowledge/game-ui/menu-systems.md +388 -0
  393. package/knowledge/i18n/korean-app-store-visual.md +223 -0
  394. package/knowledge/i18n/korean-document-style.md +301 -0
  395. package/knowledge/i18n/korean-payments.md +211 -0
  396. package/knowledge/i18n/korean-product-conventions.md +96 -0
  397. package/knowledge/i18n/korean-publishing.md +139 -0
  398. package/knowledge/i18n/korean-typography.md +123 -0
  399. package/knowledge/icons/curated-sets.md +225 -0
  400. package/knowledge/illustration/hero-illustrations.md +234 -0
  401. package/knowledge/illustration/illustration-systems.md +221 -0
  402. package/knowledge/illustration/mascot-design.md +208 -0
  403. package/knowledge/illustration/spot-illustrations.md +246 -0
  404. package/knowledge/illustration/svg-optimization.md +308 -0
  405. package/knowledge/layout/spacing-and-grid.md +119 -0
  406. package/knowledge/motion/app-loading-sequences.md +277 -0
  407. package/knowledge/motion/choreography-depth.md +297 -0
  408. package/knowledge/motion/marketing-motion.md +223 -0
  409. package/knowledge/motion/micro-interactions.md +266 -0
  410. package/knowledge/motion/motion-tools.md +281 -0
  411. package/knowledge/motion/principles.md +126 -0
  412. package/knowledge/patterns/auth-flow-design.md +316 -0
  413. package/knowledge/patterns/b2b-onboarding-flows.md +182 -0
  414. package/knowledge/patterns/brand-identity.md +238 -0
  415. package/knowledge/patterns/brand-references.md +97 -0
  416. package/knowledge/patterns/chart-color-encoding.md +269 -0
  417. package/knowledge/patterns/chart-types.md +344 -0
  418. package/knowledge/patterns/dashboard-composition.md +299 -0
  419. package/knowledge/patterns/design-system-qa.md +356 -0
  420. package/knowledge/patterns/document-typography.md +248 -0
  421. package/knowledge/patterns/email-design.md +338 -0
  422. package/knowledge/patterns/empty-states.md +263 -0
  423. package/knowledge/patterns/error-states.md +318 -0
  424. package/knowledge/patterns/form-design.md +237 -0
  425. package/knowledge/patterns/information-architecture.md +341 -0
  426. package/knowledge/patterns/landing-hero-design.md +283 -0
  427. package/knowledge/patterns/landing-page-patterns.md +681 -0
  428. package/knowledge/patterns/list-and-feed.md +371 -0
  429. package/knowledge/patterns/mobile-navigation.md +278 -0
  430. package/knowledge/patterns/money-and-amount.md +301 -0
  431. package/knowledge/patterns/onboarding.md +300 -0
  432. package/knowledge/patterns/pricing-page-design.md +261 -0
  433. package/knowledge/patterns/realtime-data.md +280 -0
  434. package/knowledge/patterns/report-design.md +330 -0
  435. package/knowledge/patterns/search-ux.md +373 -0
  436. package/knowledge/patterns/settings-page.md +325 -0
  437. package/knowledge/patterns/slide-deck-design.md +316 -0
  438. package/knowledge/patterns/styles-catalog.md +2599 -0
  439. package/knowledge/patterns/technical-writing.md +306 -0
  440. package/knowledge/patterns/ui-reasoning.md +1853 -0
  441. package/knowledge/patterns/ux-guidelines.md +1454 -0
  442. package/knowledge/platforms/react-native.md +395 -0
  443. package/knowledge/print/brochures-and-flyers.md +276 -0
  444. package/knowledge/print/korean-print-conventions.md +284 -0
  445. package/knowledge/print/packaging.md +321 -0
  446. package/knowledge/print/print-fundamentals.md +238 -0
  447. package/knowledge/print/signage-and-posters.md +235 -0
  448. package/knowledge/print/stationery.md +262 -0
  449. package/knowledge/spatial/ar-patterns.md +253 -0
  450. package/knowledge/spatial/comfort-and-accessibility.md +245 -0
  451. package/knowledge/spatial/spatial-design-fundamentals.md +346 -0
  452. package/knowledge/spatial/spatial-ui-elements.md +343 -0
  453. package/knowledge/spatial/vr-patterns.md +302 -0
  454. package/knowledge/typography/font-pairings.md +332 -0
  455. package/knowledge/typography/mui-type-scale.md +57 -0
  456. package/knowledge/typography/type-scale-fundamentals.md +105 -0
  457. package/knowledge/video/in-product-video.md +277 -0
  458. package/knowledge/video/korean-video-conventions.md +247 -0
  459. package/knowledge/video/marketing-video.md +258 -0
  460. package/knowledge/video/social-and-short-form.md +257 -0
  461. package/knowledge/video/video-fundamentals.md +296 -0
  462. package/package.json +106 -0
  463. package/skills/README.md +39 -0
  464. package/skills/color-palette/PLAYBOOK.md +175 -0
  465. package/skills/color-palette/SKILL.md +6 -0
  466. package/skills/color-palette/TEMPLATE.md +103 -0
  467. package/skills/component-spec-writer/PLAYBOOK.md +169 -0
  468. package/skills/component-spec-writer/SKILL.md +6 -0
  469. package/skills/component-spec-writer/TEMPLATE.md +115 -0
  470. package/skills/conversational-ui-designer/PLAYBOOK.md +231 -0
  471. package/skills/conversational-ui-designer/SKILL.md +6 -0
  472. package/skills/design-broadcast/PLAYBOOK.md +146 -0
  473. package/skills/design-broadcast/SKILL.md +6 -0
  474. package/skills/design-critique/PLAYBOOK.md +137 -0
  475. package/skills/design-critique/SKILL.md +6 -0
  476. package/skills/design-pr-review/PLAYBOOK.md +171 -0
  477. package/skills/design-pr-review/SKILL.md +6 -0
  478. package/skills/design-system-builder/PLAYBOOK.md +218 -0
  479. package/skills/design-system-builder/SKILL.md +6 -0
  480. package/skills/design-system-qa/PLAYBOOK.md +163 -0
  481. package/skills/design-system-qa/SKILL.md +6 -0
  482. package/skills/document-author/PLAYBOOK.md +167 -0
  483. package/skills/document-author/SKILL.md +6 -0
  484. package/skills/figma-token-sync/PLAYBOOK.md +149 -0
  485. package/skills/figma-token-sync/SKILL.md +6 -0
  486. package/skills/game-ui-designer/PLAYBOOK.md +209 -0
  487. package/skills/game-ui-designer/SKILL.md +6 -0
  488. package/skills/handoff-spec/PLAYBOOK.md +170 -0
  489. package/skills/handoff-spec/SKILL.md +6 -0
  490. package/skills/illustration-designer/PLAYBOOK.md +166 -0
  491. package/skills/illustration-designer/SKILL.md +6 -0
  492. package/skills/motion-designer/PLAYBOOK.md +223 -0
  493. package/skills/motion-designer/SKILL.md +6 -0
  494. package/skills/print-designer/PLAYBOOK.md +209 -0
  495. package/skills/print-designer/SKILL.md +6 -0
  496. package/skills/slide-deck-author/PLAYBOOK.md +198 -0
  497. package/skills/slide-deck-author/SKILL.md +6 -0
  498. package/skills/spatial-designer/PLAYBOOK.md +238 -0
  499. package/skills/spatial-designer/SKILL.md +6 -0
  500. package/skills/ux-audit/PLAYBOOK.md +142 -0
  501. package/skills/ux-audit/SKILL.md +6 -0
  502. package/skills/video-designer/PLAYBOOK.md +240 -0
  503. package/skills/video-designer/SKILL.md +6 -0
  504. package/skills/website-improvement/PLAYBOOK.md +118 -0
  505. package/skills/website-improvement/SKILL.md +6 -0
  506. package/skills/website-improvement/TEMPLATE.md +103 -0
  507. package/tools/audit/changelog-generate.py +176 -0
  508. package/tools/audit/check-coverage.py +483 -0
  509. package/tools/audit/doctor_assertions.py +256 -0
  510. package/tools/audit/example-qa.py +108 -0
  511. package/tools/audit/frontmatter-check.py +199 -0
  512. package/tools/audit/integration-check.py +95 -0
  513. package/tools/audit/korean-copy-check.py +161 -0
  514. package/tools/audit/link-check.py +146 -0
  515. package/tools/audit/local-ci.py +558 -0
  516. package/tools/audit/package-contents.py +723 -0
  517. package/tools/audit/package-smoke.py +22443 -0
  518. package/tools/audit/raw-hex-check.py +252 -0
  519. package/tools/audit/registry-smoke.py +8188 -0
  520. package/tools/audit/release-metadata.py +9832 -0
  521. package/tools/audit/run-all.py +351 -0
  522. package/tools/audit/smoke_assertions.py +12742 -0
  523. package/tools/audit/stability-review.py +332 -0
  524. package/tools/audit/stale-check.py +156 -0
  525. package/tools/migrations/add-version-frontmatter.py +132 -0
  526. package/tools/migrations/bump-last-updated.py +131 -0
  527. package/tools/migrations/promote-stability.py +172 -0
  528. package/tools/preview/README.md +58 -0
  529. package/tools/preview/render-tokens.py +454 -0
@@ -0,0 +1,266 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: Micro-interactions (the small motions that make UI feel alive)
4
+ applies_to: [ui, motion, interactive-elements]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # Micro-interactions
11
+
12
+ The < 200ms motions that respond to user input — button press, switch toggle, focus ring, hover. They're invisible when right; janky when wrong. This is the floor.
13
+
14
+ ## What is a micro-interaction
15
+
16
+ A motion that:
17
+ - Lasts < 200ms
18
+ - Responds directly to user action
19
+ - Confirms an event happened
20
+ - Doesn't navigate or change state at the system level
21
+
22
+ Examples: button scale-down on press, switch toggle, checkbox checkmark draw-in, hover glow, focus ring expand, tooltip fade-in, ripple, chip dismiss.
23
+
24
+ ## Five categories
25
+
26
+ ### 1. Press feedback
27
+
28
+ User taps / clicks. The element confirms with a brief visual reaction.
29
+
30
+ | Pattern | Use |
31
+ | --- | --- |
32
+ | **Scale 0.97** + opacity 0.85 | iOS-feeling, default for buttons |
33
+ | **Ripple** (Material) | Material-aligned products |
34
+ | **Subtle bg shift** (10% darker) | Calm, business-feeling |
35
+ | **Border emphasis** | Buttons with no fill |
36
+ | **Shadow lift** then settle | Card-like elements |
37
+
38
+ Duration: 100–150ms. `ease-out` going down, `ease-out` returning.
39
+
40
+ ```css
41
+ .button {
42
+ transition: transform 100ms ease-out, opacity 100ms ease-out;
43
+ }
44
+ .button:active {
45
+ transform: scale(0.97);
46
+ opacity: 0.85;
47
+ }
48
+ ```
49
+
50
+ ### 2. State change confirmation
51
+
52
+ A binary state changes (toggle, checkbox, radio). Show the change physically.
53
+
54
+ ```
55
+ Switch: 200ms ease-out track color + thumb translateX
56
+ Checkbox: 100ms checkmark draw-in (SVG path with stroke-dashoffset)
57
+ Radio: 100ms scale 0 → 1 of inner dot
58
+ Star rating: 150ms scale 0.8 → 1.1 → 1 (slight overshoot for satisfaction)
59
+ ```
60
+
61
+ The "physical satisfaction" of the toggle matters. Don't strip the motion.
62
+
63
+ ### 3. Hover (desktop only)
64
+
65
+ | Element | Hover motion |
66
+ | --- | --- |
67
+ | Button | bg darken 5–8%, no scale |
68
+ | Card (interactive) | shadow deepen, optional 1–2px translateY -1 |
69
+ | Link | underline appears |
70
+ | Icon button | bg circle appears (40px round) |
71
+ | Checkbox | border color emphasis |
72
+
73
+ Duration: 100–150ms. Apply `@media (hover: hover)` so touch devices skip.
74
+
75
+ ### 4. Focus ring
76
+
77
+ When element receives keyboard focus.
78
+
79
+ ```css
80
+ .button:focus-visible {
81
+ outline: 2px solid var(--color-focus-ring);
82
+ outline-offset: 2px;
83
+ transition: outline-offset 100ms ease-out;
84
+ }
85
+ ```
86
+
87
+ Optional: animate ring scale on appearance. But mostly: just appear instantly.
88
+
89
+ `:focus-visible` (modern browsers) keeps focus rings on keyboard nav, hides on mouse click. Keyboard users get them; mouse users don't.
90
+
91
+ ### 5. Loading / progress micro-states
92
+
93
+ Inside a button or input, motion reflects async work:
94
+
95
+ | Pattern | Use |
96
+ | --- | --- |
97
+ | Spinner inside button | Loading after click |
98
+ | Progress bar inline | File upload row |
99
+ | Pulse on indicator | "live" / refreshing |
100
+ | Shimmer | Skeleton loading |
101
+
102
+ Duration: continuous loop until done. Spinner: 1000ms linear rotate. Shimmer: 1500ms linear sweep.
103
+
104
+ ## The four laws of micro-interactions
105
+
106
+ ### Law 1: Be fast
107
+
108
+ < 200ms feels instant. > 300ms feels sluggish. > 500ms is broken.
109
+
110
+ ### Law 2: Be functional
111
+
112
+ Every micro-interaction confirms something:
113
+ - Button press → "I registered your tap"
114
+ - Switch → "I changed the state"
115
+ - Focus ring → "You're here now"
116
+
117
+ If a motion communicates nothing, cut it.
118
+
119
+ ### Law 3: Match the input
120
+
121
+ | Input source | Motion type |
122
+ | --- | --- |
123
+ | Mouse click | Subtle (mouse is precise) |
124
+ | Touch | Pronounced (finger needs feedback) |
125
+ | Keyboard | Focus ring (visual only) |
126
+ | Voice | Visual + audio (TBD pattern) |
127
+
128
+ Touch needs more motion than mouse — fingers cover the button on tap. The press feedback is the only confirmation.
129
+
130
+ ### Law 4: Stagger redundancy
131
+
132
+ If a button changes 3 things on click (color, scale, shadow), don't fire all at exactly 0ms. Stagger by 30–50ms for a more natural sequence.
133
+
134
+ ```
135
+ Press:
136
+ 0ms — scale 1 → 0.97
137
+ 20ms — opacity 1 → 0.85
138
+ 40ms — shadow drops
139
+ ```
140
+
141
+ Tiny stagger; enough that the eye reads "physical."
142
+
143
+ ## Reduced motion
144
+
145
+ For micro-interactions:
146
+
147
+ | Pattern | Reduced-motion alternative |
148
+ | --- | --- |
149
+ | Press scale | Instant bg color shift |
150
+ | Switch toggle | Instant state change |
151
+ | Checkbox draw | Instant checkmark |
152
+ | Hover lift | No motion; rely on color + cursor |
153
+ | Spinner | Static "loading" text |
154
+ | Shimmer | Static skeleton, no animation |
155
+
156
+ Skip motion, keep meaning.
157
+
158
+ ## The animation timing function — fine-tuning
159
+
160
+ Most micro-interactions use `ease-out` (decelerate to rest). For finer control:
161
+
162
+ | Curve | Feel | Use |
163
+ | --- | --- | --- |
164
+ | `cubic-bezier(0, 0, 0.2, 1)` | Standard ease-out | Default |
165
+ | `cubic-bezier(0.4, 0, 0.2, 1)` | Material standard | Material-aligned products |
166
+ | `cubic-bezier(0.34, 1.56, 0.64, 1)` | Slight overshoot (back-out) | Toggle satisfaction, checkmark |
167
+ | `cubic-bezier(0.68, -0.55, 0.27, 1.55)` | Big bounce | Avoid for UI; OK for celebration |
168
+ | `linear` | Constant | Spinners, progress bars |
169
+
170
+ For micro-interactions: stick with the first three. Bouncier curves feel toy-like in serious products.
171
+
172
+ ## Sound and haptic
173
+
174
+ Mobile micro-interactions can pair with haptic:
175
+ - iOS: `UIImpactFeedbackGenerator` (light, medium, heavy)
176
+ - Android: `Vibrator.vibrate(pattern)`
177
+ - React Native: `Haptics.impactAsync()`
178
+
179
+ When to add haptic:
180
+ - Long-press confirmation (helps users know they pressed long enough)
181
+ - Switch / toggle (physical satisfaction)
182
+ - Pull-to-refresh activation
183
+ - Drag-and-drop pickup
184
+
185
+ When to skip:
186
+ - Every button press (excessive)
187
+ - Settings or read-only screens (annoying)
188
+
189
+ Sound: rarely appropriate in product UI. Reserve for games, accessibility cues, video calls.
190
+
191
+ ## Korean fintech micro-interactions
192
+
193
+ Toss-style: smooth, calm, money-friendly.
194
+ - Press: 0.97 scale + 0.85 opacity (gentle).
195
+ - Toggle: 250ms (slightly slower than typical, "deliberate").
196
+ - Number ticker for amounts: 300ms count-up.
197
+ - Sub-200ms haptic for transfer confirmation.
198
+
199
+ KakaoBank-style: warmer, slightly more pronounced.
200
+ - Press: 0.95 scale (more visible).
201
+ - Checkmark: with slight bounce.
202
+ - Coin / money icons may rotate playfully in success states.
203
+
204
+ For Korean banking specifically: don't over-do motion. Users associate restraint with trustworthiness.
205
+
206
+ ## Button micro-interaction spec (canonical)
207
+
208
+ ```css
209
+ .button {
210
+ background: var(--color-primary-default);
211
+ transition:
212
+ background-color 150ms ease-out,
213
+ transform 100ms ease-out,
214
+ opacity 100ms ease-out,
215
+ box-shadow 150ms ease-out;
216
+ }
217
+
218
+ @media (hover: hover) {
219
+ .button:hover {
220
+ background: var(--color-primary-hover);
221
+ box-shadow: var(--shadow-card);
222
+ }
223
+ }
224
+
225
+ .button:active {
226
+ background: var(--color-primary-active);
227
+ transform: scale(0.97);
228
+ opacity: 0.85;
229
+ }
230
+
231
+ .button:focus-visible {
232
+ outline: 2px solid var(--color-focus-ring);
233
+ outline-offset: 2px;
234
+ }
235
+
236
+ @media (prefers-reduced-motion: reduce) {
237
+ .button {
238
+ transition: background-color 0ms;
239
+ transform: none;
240
+ }
241
+ .button:active {
242
+ transform: none;
243
+ }
244
+ }
245
+ ```
246
+
247
+ ## Common micro-interaction mistakes
248
+
249
+ - **Over 200ms** — too slow.
250
+ - **No press feedback** — touch users wonder if tap registered.
251
+ - **Hover-only feedback** — fails for touch.
252
+ - **All elements animating equally** — no hierarchy.
253
+ - **Bounce/spring on serious surfaces** (banking, government) — toy-like.
254
+ - **Same motion for press and hover** — should differ.
255
+ - **Animation interferes with rapid tapping** — rapid taps shouldn't queue up animations.
256
+ - **Spinner inside disabled button** — looks broken.
257
+ - **No reduced-motion fallback**.
258
+
259
+ ## Cross-reference
260
+
261
+ - [`knowledge/motion/principles.md`](principles.md) — duration tiers, easings
262
+ - [`knowledge/motion/choreography-depth.md`](choreography-depth.md) — coordinating multiple micro-interactions
263
+ - [`knowledge/motion/motion-tools.md`](motion-tools.md) — when CSS vs Framer Motion
264
+ - [`knowledge/a11y/keyboard-and-focus.md`](../a11y/keyboard-and-focus.md) — focus indicator rules
265
+ - [`examples/component-button.md`](../../examples/component-button.md) — Button spec with full state machine
266
+ - [`examples/component-form-controls.md`](../../examples/component-form-controls.md) — Switch/Checkbox/Radio motions
@@ -0,0 +1,281 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: Motion tools comparison
4
+ applies_to: [motion, animation, tools]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # Motion tools comparison
11
+
12
+ Designers and developers split the work of motion. The tool depends on who creates and how complex.
13
+
14
+ ## Decision tree
15
+
16
+ ```
17
+ Is the motion < 200ms and triggered by user input?
18
+ ├── Yes → CSS transition / animation
19
+ └── No
20
+ ├── Designer-led, complex sequence?
21
+ │ ├── Yes, interactive → Rive
22
+ │ └── Yes, non-interactive → Lottie
23
+ └── Engineer-led, in React?
24
+ ├── Simple → Framer Motion
25
+ ├── Timeline-based, complex → GSAP
26
+ └── Physics / springs → react-spring
27
+ ```
28
+
29
+ ## Six tools, when to use each
30
+
31
+ ### 1. CSS animations / transitions
32
+
33
+ **Use for**: hover, press feedback, state changes, simple entrances.
34
+
35
+ Built into the browser. No bundle cost. Universally supported.
36
+
37
+ ```css
38
+ .button {
39
+ transition: transform 100ms ease-out, opacity 100ms ease-out;
40
+ }
41
+ .button:active {
42
+ transform: scale(0.97);
43
+ opacity: 0.85;
44
+ }
45
+
46
+ @keyframes shimmer {
47
+ 0% { background-position: -200% 0; }
48
+ 100% { background-position: 200% 0; }
49
+ }
50
+ ```
51
+
52
+ Limitations:
53
+ - No JS-driven control (can't pause / scrub / sequence imperatively).
54
+ - Limited to single elements (no choreographing many).
55
+ - No state-machine animations.
56
+
57
+ For 80% of micro-interactions: CSS is the right answer.
58
+
59
+ ### 2. Framer Motion (React)
60
+
61
+ **Use for**: React apps. Component entrances, page transitions, shared elements (`layoutId`), choreographed sequences.
62
+
63
+ ```tsx
64
+ import { motion, AnimatePresence } from "framer-motion";
65
+
66
+ <motion.div
67
+ initial={{ opacity: 0, y: 8 }}
68
+ animate={{ opacity: 1, y: 0 }}
69
+ exit={{ opacity: 0 }}
70
+ transition={{ duration: 0.2, ease: "easeOut" }}
71
+ >
72
+ Content
73
+ </motion.div>
74
+ ```
75
+
76
+ Strengths:
77
+ - React-native API (declarative).
78
+ - Layout animations (`layout` prop, FLIP technique built-in).
79
+ - Shared element transitions (`layoutId`).
80
+ - Drag, gesture support.
81
+ - Variants (orchestrate parent → children).
82
+ - AnimatePresence for exits.
83
+
84
+ Bundle cost: ~30 kB gz. Use `LazyMotion` + `domAnimation` to slim to ~7 kB for simple needs.
85
+
86
+ When NOT to use:
87
+ - Non-React apps.
88
+ - Simple CSS hovers (overkill).
89
+ - Timeline-heavy sequences (GSAP is better).
90
+
91
+ ### 3. GSAP (GreenSock)
92
+
93
+ **Use for**: complex marketing sequences, scroll-triggered animations, timeline-based choreography. Framework-agnostic.
94
+
95
+ ```js
96
+ gsap.timeline()
97
+ .from(".hero-headline", { y: 40, opacity: 0, duration: 0.6 })
98
+ .from(".hero-sub", { y: 20, opacity: 0, duration: 0.5 }, "-=0.4")
99
+ .from(".hero-cta", { scale: 0.9, opacity: 0, duration: 0.4 }, "-=0.3")
100
+ .from(".hero-visual", { x: 80, opacity: 0, duration: 0.7 }, "-=0.5");
101
+ ```
102
+
103
+ Strengths:
104
+ - **ScrollTrigger** plugin — best-in-class for scroll-driven motion.
105
+ - **Timeline** — precise control over sequence timing.
106
+ - **Performance** — heavily optimized, 60fps on complex scenes.
107
+ - Framework-agnostic (works in React, Vue, vanilla, etc.).
108
+
109
+ License: MIT for non-business use; **paid for commercial use** of certain plugins (ScrollTrigger, MorphSVG, etc.). Check current pricing.
110
+
111
+ Bundle: 30–60 kB depending on plugins.
112
+
113
+ When NOT to use:
114
+ - Simple CSS fades (overkill).
115
+ - Pure micro-interactions (CSS is faster).
116
+
117
+ ### 4. Lottie
118
+
119
+ **Use for**: designer-created animations exported from After Effects, used as JSON.
120
+
121
+ ```tsx
122
+ import Lottie from "lottie-react";
123
+ import animationData from "./checkmark-success.json";
124
+
125
+ <Lottie animationData={animationData} loop={false} />
126
+ ```
127
+
128
+ Workflow:
129
+ 1. Designer animates in After Effects.
130
+ 2. Export with [Bodymovin plugin](https://aescripts.com/bodymovin/) → JSON.
131
+ 3. Engineer drops JSON into runtime (React, RN, iOS, Android, web).
132
+
133
+ Strengths:
134
+ - **Designer-led** — designers create motion in their familiar tool.
135
+ - **Cross-platform** — same JSON runs on web, iOS, Android, RN.
136
+ - **Vector-based** — scales to any size cleanly.
137
+ - Best for: brand logos animated, success / error states with motion, hero illustrations.
138
+
139
+ When NOT to use:
140
+ - Interactive animations (Lottie can play / pause / scrub but not state-machine — use Rive instead).
141
+ - Animations that should respond to user input (use Rive).
142
+ - Tiny micro-interactions (overkill; CSS faster).
143
+
144
+ Bundle: lottie-web is ~150 kB. Use `lottie-react-light` (~50 kB) if you don't need all features.
145
+
146
+ ### 5. Rive
147
+
148
+ **Use for**: interactive animations with state machines. Designer + engineer collaborate.
149
+
150
+ ```tsx
151
+ import { useRive } from "@rive-app/react-canvas";
152
+
153
+ function HeartButton() {
154
+ const { rive, RiveComponent } = useRive({
155
+ src: "/animations/heart.riv",
156
+ stateMachines: "Like Button",
157
+ autoplay: true,
158
+ });
159
+
160
+ return (
161
+ <button onClick={() => rive?.fireState("Like Button", "Click")}>
162
+ <RiveComponent />
163
+ </button>
164
+ );
165
+ }
166
+ ```
167
+
168
+ Strengths:
169
+ - **State machines** — animations respond to events / inputs.
170
+ - **Smaller files** than Lottie (binary format).
171
+ - **Designer-friendly** tool (rive.app).
172
+ - **Cross-platform**: web, iOS, Android, RN, Flutter, Unity, Unreal.
173
+
174
+ Best for:
175
+ - Interactive characters (mascots that react).
176
+ - Button states (idle → hover → press → success).
177
+ - Onboarding flow visuals.
178
+ - Game UI (character emotes, etc.).
179
+
180
+ When NOT to use:
181
+ - Static animation clips (Lottie is fine).
182
+ - Design-system-internal motion (CSS / Framer Motion fits closer to code).
183
+
184
+ Bundle: ~150 kB runtime.
185
+
186
+ ### 6. react-spring (React)
187
+
188
+ **Use for**: physics-based motion that responds to user input naturally.
189
+
190
+ ```tsx
191
+ import { useSpring, animated } from "@react-spring/web";
192
+
193
+ function Card() {
194
+ const styles = useSpring({
195
+ from: { scale: 0.9, opacity: 0 },
196
+ to: { scale: 1, opacity: 1 },
197
+ config: { tension: 280, friction: 60 },
198
+ });
199
+
200
+ return <animated.div style={styles}>...</animated.div>;
201
+ }
202
+ ```
203
+
204
+ Strengths:
205
+ - **Spring physics** — natural feeling motion (no fixed durations).
206
+ - **Imperative + declarative APIs**.
207
+ - **Smaller** than Framer Motion (~17 kB).
208
+
209
+ When NOT to use:
210
+ - You don't need spring physics — Framer Motion is more featureful.
211
+ - You're outside React.
212
+
213
+ Bundle: ~17 kB.
214
+
215
+ ## When to pick which (decision matrix)
216
+
217
+ | Need | Tool |
218
+ | --- | --- |
219
+ | Hover, press, focus rings | CSS |
220
+ | Loading shimmers | CSS |
221
+ | Page transitions in React | Framer Motion |
222
+ | Modal entrances in React | Framer Motion |
223
+ | List re-orders (FLIP) | Framer Motion `layout` prop |
224
+ | Hero / shared-element morph | Framer Motion `layoutId` OR View Transitions API |
225
+ | Scroll-driven parallax | GSAP ScrollTrigger |
226
+ | Marketing storyboard (3+ second sequence) | GSAP timeline OR Lottie |
227
+ | Brand-led illustrated success state | Lottie |
228
+ | Interactive mascot / character | Rive |
229
+ | Onboarding visuals that react | Rive |
230
+ | Drag-and-drop with physics | react-spring or Framer Motion |
231
+ | Cross-platform (web + iOS + Android) | Lottie or Rive |
232
+
233
+ ## Performance comparison
234
+
235
+ | Tool | First load | Per-animation cost |
236
+ | --- | --- | --- |
237
+ | CSS | 0 kB | Minimal (GPU-composited) |
238
+ | Framer Motion | 7–30 kB gz | Low (DOM + transforms) |
239
+ | GSAP | 30–60 kB gz | Low (highly optimized) |
240
+ | Lottie | 50–150 kB | Medium (canvas / SVG rendering) |
241
+ | Rive | ~150 kB | Low (canvas, optimized) |
242
+ | react-spring | 17 kB | Low |
243
+
244
+ For most apps: CSS + Framer Motion ≈ 20-40 kB total motion budget. Don't add Lottie / Rive unless designer-created animation justifies it.
245
+
246
+ ## Korean / Toss-style preference
247
+
248
+ Toss / KakaoBank-style apps often use:
249
+ - CSS for micro-interactions
250
+ - Framer Motion for app transitions
251
+ - Lottie for brand moments (success animations, money-flow demos)
252
+ - Rarely GSAP (less common in Korean tech stacks)
253
+
254
+ ## Reduced motion handling
255
+
256
+ | Tool | Reduced-motion support |
257
+ | --- | --- |
258
+ | CSS | Native via `@media (prefers-reduced-motion: reduce)` |
259
+ | Framer Motion | `useReducedMotion()` hook |
260
+ | GSAP | Manual: check `matchMedia("(prefers-reduced-motion)")` and disable timelines |
261
+ | Lottie | Pause / show single frame |
262
+ | Rive | Pause state machine; show "rest" state |
263
+
264
+ Implement always. Don't ship without it.
265
+
266
+ ## Don't
267
+
268
+ - Don't load Lottie just to do a fade-in.
269
+ - Don't import Framer Motion for one CSS-doable hover.
270
+ - Don't ship 4 different motion libraries in one app.
271
+ - Don't auto-play Lottie / Rive for purely decorative effect (battery drain).
272
+ - Don't use library-specific easings without exposing them as tokens.
273
+
274
+ ## Cross-reference
275
+
276
+ - [`knowledge/motion/principles.md`](principles.md) — fundamentals
277
+ - [`knowledge/motion/micro-interactions.md`](micro-interactions.md) — when CSS is enough
278
+ - [`knowledge/motion/marketing-motion.md`](marketing-motion.md) — when GSAP is right
279
+ - [`knowledge/motion/app-loading-sequences.md`](app-loading-sequences.md) — Framer Motion patterns
280
+ - [`knowledge/motion/choreography-depth.md`](choreography-depth.md) — multi-element coordination
281
+ - [`examples/component-lottie-player.md`](../../examples/component-lottie-player.md) — Lottie integration spec
@@ -0,0 +1,126 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: Motion principles for product UI
4
+ applies_to: [web, mobile, all-ui]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # Motion principles for product UI
11
+
12
+ Motion in product UI is functional, not decorative. Every animation should answer one of: *Where did this come from? Where is it going? What just happened? What can I do now?*
13
+
14
+ If an animation answers none of those, cut it.
15
+
16
+ ## The three duration tiers
17
+
18
+ | Tier | Duration | Use |
19
+ | --- | --- | --- |
20
+ | **Fast** | 100–150 ms | Micro-interactions: hover, focus ring, button press, ripple, switch toggle, checkbox, simple state changes within a component. |
21
+ | **Default** | 200–300 ms | Component-level transitions: drawer slide, modal fade-in, tooltip, dropdown, accordion expand, page transition (within an SPA). |
22
+ | **Slow** | 400–600 ms | Hero/storytelling moments only: celebrating a completed action, full-screen welcome, large card flip in onboarding. |
23
+
24
+ > Above 600 ms, users perceive the system as slow. Reserve for genuinely emotional moments or intentional delays.
25
+
26
+ ## Easing curves
27
+
28
+ Pick a small set of named curves. Don't author one-off `cubic-bezier()` per animation.
29
+
30
+ | Token | cubic-bezier | Feel | Use |
31
+ | --- | --- | --- | --- |
32
+ | `ease-out` | `cubic-bezier(0, 0, 0.2, 1)` | starts fast, decelerates | **Default for entrances** — element settles into place |
33
+ | `ease-in` | `cubic-bezier(0.4, 0, 1, 1)` | accelerates, snaps off | **Default for exits** — element accelerates away |
34
+ | `ease-in-out` | `cubic-bezier(0.4, 0, 0.2, 1)` | symmetric | Position changes within view (e.g., reorder, accordion height) |
35
+ | `emphasized` | `cubic-bezier(0.2, 0, 0, 1)` | Material 3 style — strong start, slow end | Hero entrances, primary CTA reveal |
36
+ | `bounce` | `cubic-bezier(0.34, 1.56, 0.64, 1)` | overshoot | **Use rarely** — celebratory micro-moments only |
37
+ | `linear` | `linear` | constant | progress bars, spinners, anything that should not "feel" elastic |
38
+
39
+ **Do not** ship custom-named curves like `wobble`, `whoosh`, `pop` unless you have a brand-driven motion language and a designer who maintains it.
40
+
41
+ Source for emphasized curves: Material 3 motion (https://m3.material.io/styles/motion/easing-and-duration). Ant Design uses `cubic-bezier(0.215, 0.61, 0.355, 1)` for `motionEaseOut` — also good.
42
+
43
+ ## Choreography (multi-element transitions)
44
+
45
+ When several elements animate together:
46
+
47
+ 1. **Sequence, don't overlap chaos**. A list reveal: first item starts at 0 ms, each subsequent at +30 ms (stagger). Total duration ≤ 400 ms even with 10 items.
48
+ 2. **Stack hierarchy**. The most important element animates first (or last — for emphasis). Don't animate everything in unison; one anchor point + supporting elements.
49
+ 3. **Match-move on transitions**. Element A turns into element B (e.g., FAB expands into modal). Use FLIP technique or shared element transitions (CSS View Transitions API in 2024+).
50
+
51
+ ## Reduced motion
52
+
53
+ WCAG 2.3.3 (AAA) and platform conventions:
54
+
55
+ ```css
56
+ @media (prefers-reduced-motion: reduce) {
57
+ *, *::before, *::after {
58
+ animation-duration: 0.01ms !important;
59
+ animation-iteration-count: 1 !important;
60
+ transition-duration: 0.01ms !important;
61
+ scroll-behavior: auto !important;
62
+ }
63
+ }
64
+ ```
65
+
66
+ But blanket-killing all motion is too aggressive. Better:
67
+
68
+ - **Keep**: state changes (color shift, opacity 0→1) without movement.
69
+ - **Drop**: spring/bounce, parallax, hero auto-play, scroll-jacking, anything that translates >20px.
70
+ - **Replace**: heavy transitions with instant state changes.
71
+
72
+ Audit every animation for reduced-motion behavior. The system either respects user preference or it fails AA.
73
+
74
+ ## Performance budget
75
+
76
+ | Animated property | Cost | Use when |
77
+ | --- | --- | --- |
78
+ | `transform` (translate, scale, rotate) | **cheap** — GPU-composited | first choice, almost always |
79
+ | `opacity` | cheap | first choice |
80
+ | `filter` (blur, brightness) | medium | sparingly, not on large surfaces |
81
+ | `width` / `height` | **expensive** — triggers layout | avoid; use `transform: scale` |
82
+ | `top` / `left` | **expensive** — triggers layout | avoid; use `transform: translate` |
83
+ | `box-shadow` | medium-expensive | OK for hover, avoid for keyframe loops |
84
+ | `background-color` | cheap | yes |
85
+
86
+ Aim for **60fps**. If a transition stutters on a mid-range Android device, simplify it.
87
+
88
+ ## Common animations and their specs
89
+
90
+ | Pattern | Duration | Easing | Property |
91
+ | --- | --- | --- | --- |
92
+ | Button hover | 150 ms | `ease-out` | `background-color` |
93
+ | Button press | 100 ms | `ease-out` | `transform: scale(0.97)` |
94
+ | Focus ring | 0 ms (instant) | — | — |
95
+ | Modal fade-in | 200 ms | `ease-out` | `opacity 0→1`, `transform: translateY(8px)→0` |
96
+ | Drawer slide-in | 300 ms | `ease-out` | `transform: translateX(±100%)→0` |
97
+ | Drawer slide-out | 250 ms | `ease-in` | reverse |
98
+ | Tooltip appear | 100 ms (300 ms delay) | `ease-out` | `opacity`, slight `scale 0.95→1` |
99
+ | Toast enter | 250 ms | `ease-out` | `transform: translateY(100%)→0`, opacity |
100
+ | Toast auto-dismiss | 200 ms (after 4–5s linger) | `ease-in` | reverse |
101
+ | Accordion expand | 250 ms | `ease-in-out` | `height: 0→auto` (actually animate `grid-template-rows` 0fr→1fr or use FLIP) |
102
+ | Tab indicator slide | 200 ms | `ease-out` | `transform: translateX` |
103
+ | Page transition (SPA) | 200–300 ms | `ease-out` | `opacity` only — avoid horizontal slide |
104
+ | List item enter | 200 ms (30 ms stagger) | `ease-out` | `opacity 0→1`, `translateY(8px)→0` |
105
+ | Skeleton shimmer | 1500 ms loop | `linear` | `background-position` |
106
+ | Spinner rotation | 1000 ms loop | `linear` | `transform: rotate` |
107
+ | Form error shake | 400 ms | `ease-in-out` | `transform: translateX` (4 cycles) — **rarely; use color/border instead** |
108
+
109
+ ## Anti-patterns
110
+
111
+ - **Auto-playing hero video without pause control**: WCAG fail. Always provide pause and respect reduced-motion.
112
+ - **Long entrance animations on every page load**: 400+ ms transitions every navigation feel sluggish. Reserve for first-load or rare transitions.
113
+ - **Bouncy / springy on serious surfaces**: a banking app with bouncy delete confirmations reads as toy-like.
114
+ - **Decorative motion on focused work surfaces**: the data table doesn't need fade-ins on every cell.
115
+ - **Motion as the only feedback**: a button that wiggles to indicate error but doesn't change color fails for users with reduced motion. Color, copy, and motion together.
116
+
117
+ ## Reference values from upstream systems
118
+
119
+ - **Material 3**: short1 50ms, short2 100ms, short3 150ms, short4 200ms, medium1 250ms, medium2 300ms, medium3 350ms, medium4 400ms, long1 450ms, long2 500ms, long3 550ms, long4 600ms.
120
+ - **Ant Design**: `motionUnit 0.1` (100ms base), most transitions `0.2–0.3s`. Easings in [knowledge/design-tokens/ant-design.md](../design-tokens/ant-design.md).
121
+ - **iOS HIG**: 0.35s default for most transitions, 0.5s for cross-fade.
122
+
123
+ ## Cross-reference
124
+
125
+ - [knowledge/design-tokens/ant-design.md](../design-tokens/ant-design.md) — Ant's motion easings as concrete cubic-bezier values
126
+ - [knowledge/a11y/keyboard-and-focus.md](../a11y/keyboard-and-focus.md) — focus must not depend on motion