@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,122 @@
1
+ # `CardHeader` — spec
2
+
3
+ > Synthesized from MUI `CardHeader`. The structured header region of a `Card` — avatar/icon + title + subheader + optional trailing action. Distinct from a plain `<Typography variant="h6">` inside `CardContent` because it handles the avatar/action layout.
4
+
5
+ ## When to use
6
+
7
+ - Cards representing a person/entity (post by user, project by team).
8
+ - Cards with a top-level action (more menu, dismiss button).
9
+ - For text-only cards, use `<Typography>` inside `CardContent` instead.
10
+
11
+ ## Anatomy
12
+
13
+ ```
14
+ ┌─────────────────────────────────────────┐
15
+ │ [avatar] Title [⋮] │
16
+ │ Subheader │
17
+ └─────────────────────────────────────────┘
18
+ ```
19
+
20
+ ## API
21
+
22
+ ```tsx
23
+ <Card>
24
+ <CardHeader
25
+ avatar={<Avatar src={user.avatarUrl} />}
26
+ title={user.name}
27
+ subheader="2시간 전 게시"
28
+ action={
29
+ <IconButton aria-label="더보기">
30
+ <MoreVertIcon />
31
+ </IconButton>
32
+ }
33
+ />
34
+ <CardMedia component="img" image={post.image} />
35
+ <CardContent>...</CardContent>
36
+ </Card>
37
+ ```
38
+
39
+ | Prop | Type | Default | Description |
40
+ | --- | --- | --- | --- |
41
+ | `avatar` | `ReactNode` | — | Leading element (Avatar / Icon) |
42
+ | `title` | `ReactNode` | — | Primary title (string or component) |
43
+ | `subheader` | `ReactNode` | — | Sub-title (smaller, muted) |
44
+ | `action` | `ReactNode` | — | Trailing right-aligned action (button/menu) |
45
+ | `disableTypography` | `boolean` | `false` | Skip default Typography wrapping |
46
+ | `titleTypographyProps` | `TypographyProps` | — | Override title typography |
47
+ | `subheaderTypographyProps` | `TypographyProps` | — | Override subheader typography |
48
+
49
+ ## States
50
+
51
+ Header itself is non-interactive. The `action` slot owns its states.
52
+
53
+ ## Tokens consumed
54
+
55
+ ```
56
+ --font-size-heading-sm /* title — 16px */
57
+ --font-size-caption /* subheader — 12px */
58
+ --font-weight-semibold /* title */
59
+ --space-md /* horizontal padding */
60
+ --space-md-y /* vertical padding */
61
+ --color-fg-default
62
+ --color-fg-muted /* subheader */
63
+ ```
64
+
65
+ ## Accessibility
66
+
67
+ - Title renders as `<span>` by default — for semantic page hierarchy, use `<Typography component="h2" variant="h6">` as title prop instead of bare string.
68
+ - `action` button needs an accessible name (`aria-label="더보기"`).
69
+ - Avatar `alt` should be the person's name, not "avatar" or "user image".
70
+
71
+ ## Edge cases
72
+
73
+ - **Long title** — wraps; if you need ellipsis, set `titleTypographyProps={{ noWrap: true }}` and ensure container width is bounded.
74
+ - **No avatar** — `action` still right-aligns; title/subheader fill the avatar's gap. Layout works fine.
75
+ - **Korean datetime in subheader** — relative format "2시간 전" rather than absolute "2026-05-09 14:23". Cite [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md).
76
+
77
+ ## Code example
78
+
79
+ ```tsx
80
+ function PostCard({ post, onMore, onLike }) {
81
+ return (
82
+ <Card>
83
+ <CardHeader
84
+ avatar={<Avatar src={post.author.avatarUrl}>{post.author.name[0]}</Avatar>}
85
+ title={post.author.name}
86
+ subheader={formatRelative(post.createdAt)} // "2시간 전"
87
+ action={
88
+ <IconButton aria-label={`${post.author.name}의 게시물 더보기`} onClick={onMore}>
89
+ <MoreVertIcon />
90
+ </IconButton>
91
+ }
92
+ />
93
+ <CardMedia component="img" image={post.imageUrl} alt="" />
94
+ <CardContent>
95
+ <Typography variant="body2">{post.body}</Typography>
96
+ </CardContent>
97
+ <CardActions>
98
+ <IconButton aria-label="좋아요" onClick={onLike}>
99
+ <FavoriteIcon />
100
+ </IconButton>
101
+ </CardActions>
102
+ </Card>
103
+ );
104
+ }
105
+ ```
106
+
107
+ ## Don't
108
+
109
+ - Don't put the entire card click handler on `CardHeader` — split into specific actions.
110
+ - Don't omit `aria-label` on the `action` IconButton.
111
+ - Don't use `CardHeader` for a card without avatar/action — `<Typography variant="h6">` inside `CardContent` is lighter.
112
+
113
+ ## References
114
+
115
+ - MUI: [`CardHeader`](../refs/mui/packages/mui-material/src/CardHeader/)
116
+
117
+ ## Cross-reference
118
+
119
+ - [`component-card.md`](component-card.md)
120
+ - [`component-card-content.md`](component-card-content.md)
121
+ - [`component-card-actions.md`](component-card-actions.md)
122
+ - [`component-card-media.md`](component-card-media.md)
@@ -0,0 +1,79 @@
1
+ # `CardMedia` — spec
2
+
3
+ > Synthesized from MUI `CardMedia`. The image/video region of a `Card`. Handles aspect ratio + responsive sizing + lazy loading defaults.
4
+
5
+ ## When to use
6
+
7
+ - Top hero image of a Card.
8
+ - Inline video/audio inside a Card.
9
+ - For decorative background, prefer `Box` + `sx={{ backgroundImage }}`.
10
+
11
+ ## API
12
+
13
+ ```tsx
14
+ <Card>
15
+ <CardMedia
16
+ component="img"
17
+ image={post.imageUrl}
18
+ alt={post.imageAlt ?? ''}
19
+ height={200}
20
+ />
21
+ <CardContent>...</CardContent>
22
+ </Card>
23
+ ```
24
+
25
+ | Prop | Type | Default | Description |
26
+ | --- | --- | --- | --- |
27
+ | `component` | `'img' \| 'video' \| 'audio' \| 'div'` | `'div'` | Underlying element |
28
+ | `image` | `string` | — | Image URL (required for `div`/`img`) |
29
+ | `src` | `string` | — | Source URL (for `video` / `audio` — `image` prop is also accepted) |
30
+ | `alt` | `string` | — | Alt text (`img` only) |
31
+ | `height` | `number \| string` | — | Fixed height (image will object-fit cover) |
32
+
33
+ ## Accessibility
34
+
35
+ - For decorative images: `alt=""` (not omitted).
36
+ - For meaningful images: descriptive `alt`. Don't repeat the title.
37
+ - Korean alt: avoid "이미지" — that's redundant; describe the content ("팀 회식 사진" not "이미지").
38
+ - For video: provide captions track or transcript. Cite [`knowledge/video/in-product-video.md`](../knowledge/video/in-product-video.md).
39
+
40
+ ## Edge cases
41
+
42
+ - **Image fails to load** — show fallback. CardMedia doesn't have built-in fallback; wrap with custom error handling if critical.
43
+ - **Aspect ratio control** — `height` is fixed; for ratio-based, use `sx={{ aspectRatio: '16 / 9' }}`.
44
+ - **Lazy loading** — set `loading="lazy"` via `<CardMedia component="img" loading="lazy" />`.
45
+ - **Korean image content** — avoid text in images (untranslatable, accessibility issues). Render text via HTML overlay instead.
46
+
47
+ ## Code example
48
+
49
+ ```tsx
50
+ <Card>
51
+ <CardMedia
52
+ component="img"
53
+ image={recipe.imageUrl}
54
+ alt={`${recipe.title} 완성 사진`}
55
+ sx={{ aspectRatio: '4 / 3', objectFit: 'cover' }}
56
+ loading="lazy"
57
+ />
58
+ <CardContent>
59
+ <Typography variant="h6">{recipe.title}</Typography>
60
+ </CardContent>
61
+ </Card>
62
+ ```
63
+
64
+ ## Don't
65
+
66
+ - Don't omit `alt` for `img` — even decorative needs `alt=""` explicitly.
67
+ - Don't use `CardMedia` for icons — wrong sizing model.
68
+ - Don't apply `objectFit: 'contain'` for hero images — they leave letterbox bars; use `cover`.
69
+
70
+ ## References
71
+
72
+ - MUI: [`CardMedia`](../refs/mui/packages/mui-material/src/CardMedia/)
73
+
74
+ ## Cross-reference
75
+
76
+ - [`component-card.md`](component-card.md)
77
+ - [`component-card-header.md`](component-card-header.md)
78
+ - [`component-card-content.md`](component-card-content.md)
79
+ - [`knowledge/a11y/contrast.md`](../knowledge/a11y/contrast.md) — for any text-overlay
@@ -0,0 +1,233 @@
1
+ # `Card` — spec
2
+
3
+ > Status: example artifact for `component-spec-writer` skill
4
+ > Generated by: `skills/component-spec-writer`, citing Ant Design `Card`, MUI `Card`, shadcn-ui `card`
5
+
6
+ ## Purpose
7
+
8
+ A card groups related content into a single contained surface. Cards are the workhorse of dashboards, lists, settings, and landing pages. Easy to over-use — every group does NOT need to be a card.
9
+
10
+ ## When to use a card vs alternatives
11
+
12
+ | Pattern | Use |
13
+ | --- | --- |
14
+ | **Card** (with border or background) | Group is genuinely a unit of content the user might select, navigate to, or compare. |
15
+ | **Section** (no border, just heading + whitespace) | Logical grouping where boundary doesn't matter. **Default for forms.** |
16
+ | **List item** | Many comparable items in a feed. Cards in a vertical list = visual noise. |
17
+ | **Tile** (square, image-led) | Grid of equal items where image dominates. |
18
+
19
+ Rule of thumb: if you remove the card border and the grouping is still clear from spacing + typography, **don't use a card**.
20
+
21
+ ## Anatomy
22
+
23
+ ```
24
+ Card (root surface)
25
+ ├── [Card.Cover]? full-bleed image/media at top
26
+ ├── Card.Header
27
+ │ ├── [Card.HeaderActions]? (top-right slot — menu, close)
28
+ │ ├── Card.Title
29
+ │ └── [Card.Description]?
30
+ ├── Card.Body (main content)
31
+ └── [Card.Footer]? (actions, metadata)
32
+ ```
33
+
34
+ | Part | Required | Notes |
35
+ | --- | --- | --- |
36
+ | Card | yes | the container |
37
+ | Cover | optional | full-bleed image; sits above header |
38
+ | Header | typically | unless body is self-titling (e.g., a metric card with the metric as the only content) |
39
+ | Title | yes if Header present | semantic `<h3>` or `<h4>` based on page hierarchy |
40
+ | Description | optional | secondary line under title |
41
+ | HeaderActions | optional | top-right; menu button, close, status badge |
42
+ | Body | yes | primary content |
43
+ | Footer | optional | actions, timestamps, metadata |
44
+
45
+ ## API (composition-style)
46
+
47
+ ```tsx
48
+ <Card>
49
+ <Card.Cover src="..." alt="..." />
50
+ <Card.Header>
51
+ <Card.Title>Project Aurora</Card.Title>
52
+ <Card.Description>Design system for the new dashboard</Card.Description>
53
+ <Card.HeaderActions>
54
+ <IconButton aria-label="More options" />
55
+ </Card.HeaderActions>
56
+ </Card.Header>
57
+ <Card.Body>
58
+ Body content...
59
+ </Card.Body>
60
+ <Card.Footer>
61
+ <Button variant="outline">View</Button>
62
+ </Card.Footer>
63
+ </Card>
64
+ ```
65
+
66
+ | Prop (root) | Type | Default | Description |
67
+ | --- | --- | --- | --- |
68
+ | `variant` | `"outline" \| "filled" \| "elevated"` | `"outline"` | Visual treatment. |
69
+ | `interactive` | `boolean` | `false` | Hover/focus states; entire card clickable. |
70
+ | `as` | `ElementType` | `"div"` | Render-as. Use `"a"` or `"button"` when interactive. |
71
+ | `href` | `string` | — | If set, root renders as `<a>` for navigation. |
72
+ | `onClick` | `(e: MouseEvent) => void` | — | Sets interactive=true. |
73
+ | `padding` | `"none" \| "sm" \| "md" \| "lg"` | `"md"` | Internal padding. `none` for image-led cards. |
74
+
75
+ ## Variants
76
+
77
+ ### `variant`
78
+
79
+ | Value | Background | Border | Shadow | Use |
80
+ | --- | --- | --- | --- | --- |
81
+ | `outline` (default) | `--color-bg-default` | `1px --color-border-default` | none | Default — clean, neutral. Most cards. |
82
+ | `filled` | `--color-bg-elevated` | none | none | Subtle backdrop without a border line. |
83
+ | `elevated` | `--color-bg-default` | none | `--shadow-2` | Lifted feel — landing pages, marketing. **Avoid in dense UIs.** |
84
+
85
+ Choose **one** variant per surface and stick to it. Mixing `outline` and `elevated` cards on the same page reads as inconsistent.
86
+
87
+ ### Interactive cards
88
+
89
+ `interactive={true}` (or providing `onClick`/`href`) adds:
90
+ - Cursor pointer
91
+ - Hover: bg shift to `--color-bg-subtle` (outline/filled) or shadow strengthens (elevated)
92
+ - Focus-visible: 2px ring (same as Button)
93
+ - The full card is clickable, not just the title.
94
+
95
+ Required: render as `<a>` (with `href`) or `<button>` — not `<div onClick>`. Cite [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md).
96
+
97
+ If the card has both a primary navigation AND inner buttons (e.g., card click navigates, footer has "Edit" and "Delete"), use the **["block link" pattern](https://inclusive-components.design/cards/)**:
98
+ - The whole card is wrapped in `<a>`.
99
+ - Inner buttons stop propagation and have higher z-index.
100
+ - The card title's text is the inner `<a>` for screen reader, with the rest visually clickable via `::before` pseudo.
101
+
102
+ ## Padding rules
103
+
104
+ | `padding` | Header | Body | Footer | Use |
105
+ | --- | --- | --- | --- | --- |
106
+ | `sm` | 12px | 12px | 12px | Dense lists, list-as-cards |
107
+ | `md` (default) | 16px | 16px | 16px | Standard product cards |
108
+ | `lg` | 24px | 24px | 24px | Marketing, hero cards |
109
+ | `none` | 0 | 0 | 0 | Image-led cards where Cover takes full width |
110
+
111
+ For image-led cards: `padding="none"`, manually pad the text sections. The cover should bleed to the card's border-radius edge.
112
+
113
+ ## Tokens consumed
114
+
115
+ ```
116
+ --color-bg-default
117
+ --color-bg-elevated
118
+ --color-bg-subtle (interactive hover)
119
+ --color-border-default
120
+ --color-text-primary
121
+ --color-text-secondary
122
+ --space-md
123
+ --space-lg
124
+ --radius-lg (cards usually larger than buttons)
125
+ --shadow-2 (elevated variant)
126
+ --transition-fast (interactive hover)
127
+ ```
128
+
129
+ ## Accessibility
130
+
131
+ - **Default**: `<div>` is fine for non-interactive cards. Title inside should be a heading (`<h3>` typically).
132
+ - **Interactive**: render as `<a>` (navigation) or `<button>` (action). Keyboard reachable via Tab. Activates with Enter (always) and Space (button only).
133
+ - **Block link pattern** when card has primary nav + inner controls: only one focus stop for the card's primary purpose; inner buttons get their own focus stops. Don't nest interactive elements.
134
+ - **Heading hierarchy**: card titles should not all be `<h2>`. Match the page's hierarchy. A card on a `<h1>` page might use `<h3>` for its title — never skip a level.
135
+ - **Image alt text**: `Cover` image needs `alt` describing meaning, not "card image". If decorative, `alt=""`.
136
+ - **Empty state**: a card with no content should not render an empty box. Render a placeholder with a clear CTA, or omit the card entirely.
137
+ - **Focus indicator**: 2px ring on the card (interactive only), 2px offset from border. Same `--color-focus-ring` as Button.
138
+
139
+ ## Code examples
140
+
141
+ ```tsx
142
+ // Static info card — content card
143
+ <Card>
144
+ <Card.Header>
145
+ <Card.Title>Total revenue</Card.Title>
146
+ <Card.Description>Last 30 days</Card.Description>
147
+ </Card.Header>
148
+ <Card.Body>
149
+ <p className="text-3xl font-semibold">₩12,847,500</p>
150
+ <p className="text-sm text-text-secondary">+12% vs prior period</p>
151
+ </Card.Body>
152
+ </Card>
153
+
154
+ // Interactive card — navigates on click
155
+ <Card interactive href="/projects/aurora">
156
+ <Card.Cover src="/aurora-thumb.jpg" alt="Aurora project preview" />
157
+ <Card.Header>
158
+ <Card.Title>Project Aurora</Card.Title>
159
+ <Card.Description>Design system rebuild</Card.Description>
160
+ </Card.Header>
161
+ <Card.Body>
162
+ <p>12 components shipped this week.</p>
163
+ </Card.Body>
164
+ </Card>
165
+
166
+ // Card with menu + actions
167
+ <Card>
168
+ <Card.Header>
169
+ <Card.Title>Notifications</Card.Title>
170
+ <Card.HeaderActions>
171
+ <IconButton aria-label="Settings"><SettingsIcon /></IconButton>
172
+ </Card.HeaderActions>
173
+ </Card.Header>
174
+ <Card.Body>
175
+ <NotificationList items={notifs} />
176
+ </Card.Body>
177
+ <Card.Footer>
178
+ <Button variant="link">See all</Button>
179
+ </Card.Footer>
180
+ </Card>
181
+
182
+ // Block-link pattern
183
+ <Card interactive className="relative">
184
+ <Card.Header>
185
+ <Card.Title>
186
+ <a href="/post/123" className="absolute inset-0 z-0" aria-label="Read post: How we shipped Aurora" />
187
+ How we shipped Aurora
188
+ </Card.Title>
189
+ </Card.Header>
190
+ <Card.Body>
191
+ <p>Last week we wrapped a 3-month effort to...</p>
192
+ </Card.Body>
193
+ <Card.Footer className="relative z-10">
194
+ <Button onClick={(e) => { e.stopPropagation(); like(); }}>Like</Button>
195
+ <Button onClick={(e) => { e.stopPropagation(); share(); }}>Share</Button>
196
+ </Card.Footer>
197
+ </Card>
198
+ ```
199
+
200
+ ## Edge cases
201
+
202
+ - **Card grid that wraps awkwardly** at certain widths: use `repeat(auto-fit, minmax(280px, 1fr))` to set a sensible min before wrapping.
203
+ - **Card with image of unknown aspect ratio**: use `aspect-ratio` CSS to enforce a ratio for the cover; lazy-load with `loading="lazy"`.
204
+ - **Cards in dark mode look flat**: `outline` variant works as-is. `elevated` shadow becomes ineffective on dark bg — increase shadow opacity OR switch to a +2% lighter background instead of shadow.
205
+ - **Long text in card body**: don't truncate by default. Truncate only in space-constrained layouts (compact list cards) and provide a "see more" path.
206
+ - **Long titles**: wrap to 2 lines, then truncate with `…`. Provide `title` attribute with full text.
207
+ - **Skeleton loading**: render the same shape (header + body + footer) with skeleton placeholders rather than a generic block. Cite [knowledge/patterns/ux-guidelines.md](../knowledge/patterns/ux-guidelines.md).
208
+
209
+ ## Don't
210
+
211
+ - Don't put cards inside cards. The visual nesting reads chaotic. Use sections within a card instead.
212
+ - Don't make every grouping a card. Use whitespace + headings — they're free.
213
+ - Don't mix card variants on the same page (e.g., some `elevated`, some `outline`).
214
+ - Don't put a primary CTA in a card without context — a card is a container, not a top-level surface.
215
+ - Don't make a card interactive AND put another interactive surface inside without using the block-link pattern. Nested clickable is broken.
216
+
217
+ ## References
218
+
219
+ - Ant Design: [`refs/ant-design/components/card/`](../refs/ant-design/components/card/) — `Card`, `Card.Meta`, `Card.Grid`. Strong support for tabbed cards (`tabList` prop) and grid cards. Most exhaustive.
220
+ - MUI: [`refs/mui/packages/mui-material/src/Card/`](../refs/mui/packages/mui-material/src/Card/) — composition: `Card`, `CardHeader`, `CardMedia`, `CardContent`, `CardActions`, `CardActionArea` (the wrapper that makes a card clickable). MUI's `CardActionArea` is the clearest implementation of the interactive-card pattern.
221
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/card.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/card.tsx) — composition with `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardContent`, `CardFooter`, `CardAction`. Cleanest minimal version.
222
+
223
+ API choices made:
224
+ - **Composition over prop overload**: matches all three references' direction. Single `<Card title=... description=... actions=...>` API was rejected — slot-based scales.
225
+ - **`Card.HeaderActions` as a slot inside `Card.Header`** rather than a separate top-level child: keeps the action's positional semantics tied to the header, making CSS simpler.
226
+ - **`variant` over MUI's `elevation` number**: 3 named variants are easier to choose than 24 shadow elevation steps. (MUI's `elevation={1..24}` is over-flexible.)
227
+ - **`interactive` prop OR `onClick`/`href` infers it**: ergonomic — common case requires no extra prop, advanced case (interactive without click handler — rare) is still expressible.
228
+
229
+ ## Cross-reference
230
+
231
+ - [knowledge/components/INDEX.md](../knowledge/components/INDEX.md)
232
+ - [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md) — block-link pattern
233
+ - [knowledge/layout/spacing-and-grid.md](../knowledge/layout/spacing-and-grid.md) — card-grid sizing