@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,102 @@
1
+ # `Icon` — spec
2
+
3
+ > Synthesized from MUI `Icon`/`SvgIcon` and Ant Design `Icon`. The base primitive for rendering icons. Pairs with [`knowledge/icons/curated-sets.md`](../knowledge/icons/curated-sets.md) for icon-set selection.
4
+
5
+ ## When to use
6
+
7
+ - Inline icons in buttons, links, list items.
8
+ - Decorative or status indicators.
9
+ - As building blocks for `IconButton`, `Avatar`, `Toast`.
10
+
11
+ ## API
12
+
13
+ ```tsx
14
+ <Icon as={CheckIcon} />
15
+ <Icon size="md" color="brand" />
16
+ <Icon as={WarningIcon} aria-label="Warning" />
17
+ ```
18
+
19
+ | Prop | Type | Default | Description |
20
+ | --- | --- | --- | --- |
21
+ | `as` | `ComponentType` | required | The actual icon SVG component (Phosphor, Lucide, etc) |
22
+ | `size` | `"xs" \| "sm" \| "md" \| "lg" \| "xl" \| number` | `"md"` | Pixel size |
23
+ | `color` | `"current" \| "brand" \| "muted" \| "success" \| "warning" \| "error"` | `"current"` | Color via token |
24
+ | `weight` | `"thin" \| "light" \| "regular" \| "bold" \| "fill"` | `"regular"` | Phosphor-style weight (if icon set supports) |
25
+ | `aria-label` | `string` | — | Required for meaningful icons |
26
+ | `aria-hidden` | `boolean` | auto | True for decorative |
27
+
28
+ ## Sizes
29
+
30
+ | Size | px |
31
+ | --- | --- |
32
+ | `xs` | 12 |
33
+ | `sm` | 16 |
34
+ | `md` (default) | 20-24 |
35
+ | `lg` | 32 |
36
+ | `xl` | 48 |
37
+
38
+ ## Color via `currentColor`
39
+
40
+ ```svg
41
+ <svg viewBox="0 0 24 24" fill="currentColor">
42
+ <path d="..." />
43
+ </svg>
44
+ ```
45
+
46
+ The icon SVG should use `fill="currentColor"` (or `stroke="currentColor"` for stroke-style). Icon component sets the parent `color` token; SVG inherits.
47
+
48
+ ```css
49
+ .icon[data-color="brand"] { color: var(--color-brand-default); }
50
+ .icon[data-color="muted"] { color: var(--color-fg-muted); }
51
+ .icon[data-color="success"] { color: var(--color-success-default); }
52
+ .icon[data-color="warning"] { color: var(--color-warning-default); }
53
+ .icon[data-color="error"] { color: var(--color-error-default); }
54
+ ```
55
+
56
+ ## Accessibility
57
+
58
+ | Use | Pattern |
59
+ | --- | --- |
60
+ | Decorative (label-redundant) | `aria-hidden="true"` |
61
+ | Meaningful (no adjacent label) | `<span role="img" aria-label="...">` wrapper |
62
+ | Inside button text label | `aria-hidden="true"` (button label conveys meaning) |
63
+ | Inside icon-only button | label on the button, NOT the icon |
64
+
65
+ ```tsx
66
+ {/* Decorative inside text-labeled button */}
67
+ <button>
68
+ <Icon as={SaveIcon} aria-hidden /> 저장
69
+ </button>
70
+
71
+ {/* Meaningful icon-only button */}
72
+ <button aria-label="저장">
73
+ <Icon as={SaveIcon} aria-hidden />
74
+ </button>
75
+ ```
76
+
77
+ ## Icon-set conventions
78
+
79
+ - Pick **one set** per project (Phosphor, Lucide, Heroicons, Material Icons).
80
+ - Don't mix stroke and fill icon sets — visual inconsistency.
81
+ - For Phosphor: weights (thin / light / regular / bold / fill) accepted.
82
+ - For Lucide / Heroicons: stroke-only; uniform line weight.
83
+
84
+ See [`knowledge/icons/curated-sets.md`](../knowledge/icons/curated-sets.md).
85
+
86
+ ## Don't
87
+
88
+ - Don't use color alone to convey state. Pair with adjacent text or shape.
89
+ - Don't render icon SVG inline without `aria-hidden` if it's decorative.
90
+ - Don't use `<i className="icon-...">` icon-font pattern. Bad a11y, no theming.
91
+ - Don't render at non-multiple-of-2 sizes (15px). Stays sharp on retina at 16/20/24.
92
+
93
+ ## References
94
+
95
+ - MUI: [`SvgIcon`](../refs/mui/packages/mui-material/src/SvgIcon)
96
+ - Phosphor Icons: 1200+ icons, 5 weights
97
+ - Lucide: stroke-only minimalist set
98
+
99
+ ## Cross-reference
100
+
101
+ - [`examples/component-icon-button.md`](component-icon-button.md)
102
+ - [`knowledge/icons/curated-sets.md`](../knowledge/icons/curated-sets.md)
@@ -0,0 +1,280 @@
1
+ <!-- hand-written -->
2
+ # `Illustration` (custom — themeable SVG illustration display) — spec
3
+
4
+ > Generic wrapper for displaying a system illustration with theming, sizing, accessibility, and reduced-motion support. Used directly when `EmptyState` / `Result` / `OnboardingStep` aren't the right fit. Pairs with [`knowledge/illustration/svg-optimization.md`](../knowledge/illustration/svg-optimization.md).
5
+
6
+ ## Purpose
7
+
8
+ When you want to drop a system illustration into a screen — feature explainer, onboarding card, marketing surface — without the empty-state layout. `Illustration` provides:
9
+
10
+ 1. **Registry-backed name** — typesafe lookup from the system's illustration set.
11
+ 2. **Theming via `currentColor` + CSS variables**.
12
+ 3. **Responsive sizing** — width or height; the other auto-scales via aspect ratio.
13
+ 4. **Accessibility** — decorative by default; meaningful on opt-in.
14
+ 5. **Lottie escape hatch** — if the illustration is animated, delegate to `LottiePlayer`.
15
+
16
+ ## Anatomy
17
+
18
+ ```
19
+ ┌──────────────────┐
20
+ │ │
21
+ │ [SVG render] │ ← from registry
22
+ │ │
23
+ └──────────────────┘
24
+ OR
25
+ ┌──────────────────┐
26
+ │ │
27
+ │ [Lottie render] │ ← when name maps to a Lottie source
28
+ │ │
29
+ └──────────────────┘
30
+ ```
31
+
32
+ ## API
33
+
34
+ ```tsx
35
+ <Illustration name="onboarding-welcome" size="lg" />
36
+
37
+ <Illustration
38
+ name="payment-success"
39
+ size={200}
40
+ label="결제가 완료되었습니다" // makes meaningful (not decorative)
41
+ />
42
+
43
+ const heroMoneyFlowSize = { desktop: 480, mobile: 240 };
44
+ <Illustration name="hero-money-flow" size={heroMoneyFlowSize} />
45
+ ```
46
+
47
+ | Prop | Type | Default | Description |
48
+ | --- | --- | --- | --- |
49
+ | `name` | `IllustrationName` | — | Registry key. Required. Typesafe via TS union. |
50
+ | `size` | `"sm" \| "md" \| "lg" \| "xl" \| number \| { desktop: number; mobile: number }` | `"md"` | Display size in px. Object form for responsive. |
51
+ | `label` | `string` | `undefined` | If set, illustration is meaningful (`role="img"` + `aria-label`). Default: decorative (`aria-hidden`). |
52
+ | `tone` | `"brand" \| "neutral" \| "success" \| "warning" \| "danger"` | `"brand"` | Color theme via CSS variable cascade |
53
+ | `as` | `"div" \| "span" \| "figure"` | `"div"` | Wrapper element |
54
+ | `className` | `string` | — | Additional classes |
55
+
56
+ ## Sizes
57
+
58
+ | token | px |
59
+ | --- | --- |
60
+ | `sm` | 80 |
61
+ | `md` (default) | 120 |
62
+ | `lg` | 200 |
63
+ | `xl` | 320 |
64
+
65
+ For responsive: pass `{ desktop, mobile }` object. The component renders both via CSS `clamp()`:
66
+
67
+ ```css
68
+ .illustration[data-size-responsive] {
69
+ width: clamp(var(--mobile-size), 30vw, var(--desktop-size));
70
+ }
71
+ ```
72
+
73
+ ## Tones
74
+
75
+ `tone` maps to a CSS variable setting the illustration's `currentColor`:
76
+
77
+ ```css
78
+ .illustration[data-tone="brand"] { color: var(--color-brand-default); }
79
+ .illustration[data-tone="neutral"] { color: var(--color-fg-muted); }
80
+ .illustration[data-tone="success"] { color: var(--color-success-default); }
81
+ .illustration[data-tone="warning"] { color: var(--color-warning-default); }
82
+ .illustration[data-tone="danger"] { color: var(--color-error-default); }
83
+ ```
84
+
85
+ The illustration's SVG must use `currentColor` for the themable element. Multi-color illustrations also use CSS variables (`var(--color-bg-illo)`).
86
+
87
+ Contrast contract: each tone token must clear at least **3:1** against `--color-bg-default` for non-text graphic strokes/fills, and any nearby explanatory text must keep the normal **4.5:1** body-text contrast target from [`knowledge/a11y/contrast.md`](../knowledge/a11y/contrast.md).
88
+
89
+ ## Usage context
90
+
91
+ Use `Illustration` as a reusable visual-language primitive when the layout is owned by another surface: onboarding panels, fintech confirmation screens, feature explainers, or Korean payment-success moments where the surrounding copy already carries the meaning. Use `label` only when the image itself adds information not repeated in text; otherwise keep it decorative so screen-reader output stays concise.
92
+
93
+ ## Registry
94
+
95
+ ```ts
96
+ // illustrations/registry.ts
97
+ import { OnboardingWelcome } from "./svg/OnboardingWelcome";
98
+ import { PaymentSuccess } from "./svg/PaymentSuccess";
99
+ import { HeroMoneyFlow } from "./svg/HeroMoneyFlow";
100
+
101
+ export const illustrationRegistry = {
102
+ // Spot illustrations
103
+ "onboarding-welcome": { type: "svg", component: OnboardingWelcome },
104
+ "payment-success": { type: "svg", component: PaymentSuccess },
105
+ "filter-empty": { type: "svg", component: FilterEmpty },
106
+
107
+ // Hero illustrations
108
+ "hero-money-flow": { type: "svg", component: HeroMoneyFlow },
109
+ "hero-onboarding": { type: "svg", component: HeroOnboarding },
110
+
111
+ // Animated (Lottie)
112
+ "celebration": { type: "lottie", src: "/illustrations/celebration.json", poster: "/illustrations/celebration.png" },
113
+ } as const;
114
+
115
+ export type IllustrationName = keyof typeof illustrationRegistry;
116
+ ```
117
+
118
+ The registry is the **only** place new illustrations get added. Engineers can't ship an illustration not in the registry — enforces governance.
119
+
120
+ ## States
121
+
122
+ | State | Visual |
123
+ | --- | --- |
124
+ | Default (decorative) | Renders illustration with brand tone |
125
+ | Meaningful (label set) | Same render; adds `role="img"` and `aria-label` |
126
+ | Reduced motion + animated illustration | Static frame from poster |
127
+ | Loading (Lottie source) | Poster while JSON streams; cross-fade when ready |
128
+ | Error (illustration name not in registry) | Dev: throw. Prod: fallback to `generic` illustration. |
129
+
130
+ ## Tokens consumed
131
+
132
+ ```
133
+ --color-brand-default
134
+ --color-fg-muted
135
+ --color-success-default
136
+ --color-warning-default
137
+ --color-error-default
138
+ --color-bg-illo (multi-color illustrations)
139
+ --motion-fast (poster → animation cross-fade)
140
+ ```
141
+
142
+ ## Accessibility
143
+
144
+ ### Default — decorative
145
+
146
+ ```html
147
+ <div class="illustration" aria-hidden="true">
148
+ <svg ...>...</svg>
149
+ </div>
150
+ ```
151
+
152
+ Screen readers skip. Used when surrounding text already explains.
153
+
154
+ ### Meaningful — label set
155
+
156
+ ```html
157
+ <div class="illustration" role="img" aria-label="결제가 완료되었습니다">
158
+ <svg aria-hidden="true">...</svg>
159
+ </div>
160
+ ```
161
+
162
+ The wrapper carries the label. Inner SVG stays `aria-hidden` to avoid double-announcement.
163
+
164
+ ### Animated illustrations
165
+
166
+ If `name` maps to a Lottie source, delegates to `LottiePlayer` which handles `prefers-reduced-motion`. See [`examples/component-lottie-player.md`](component-lottie-player.md).
167
+
168
+ ## Implementation
169
+
170
+ ```tsx
171
+ import { illustrationRegistry, type IllustrationName } from "./registry";
172
+ import { LottiePlayer } from "./LottiePlayer";
173
+
174
+ interface Props {
175
+ name: IllustrationName;
176
+ size?: "sm" | "md" | "lg" | "xl" | number | { desktop: number; mobile: number };
177
+ label?: string;
178
+ tone?: "brand" | "neutral" | "success" | "warning" | "danger";
179
+ as?: "div" | "span" | "figure";
180
+ className?: string;
181
+ }
182
+
183
+ const SIZE_MAP = { sm: 80, md: 120, lg: 200, xl: 320 };
184
+
185
+ export function Illustration({
186
+ name,
187
+ size = "md",
188
+ label,
189
+ tone = "brand",
190
+ as: Tag = "div",
191
+ className,
192
+ }: Props) {
193
+ const entry = illustrationRegistry[name];
194
+
195
+ if (!entry) {
196
+ if (process.env.NODE_ENV !== "production") {
197
+ throw new Error(`Illustration "${name}" not in registry`);
198
+ }
199
+ return null; // or fallback
200
+ }
201
+
202
+ const dims = typeof size === "number"
203
+ ? { width: size, height: size }
204
+ : typeof size === "string"
205
+ ? { width: SIZE_MAP[size], height: SIZE_MAP[size] }
206
+ : { responsive: size };
207
+
208
+ const a11y = label
209
+ ? { role: "img", "aria-label": label }
210
+ : { "aria-hidden": "true" };
211
+
212
+ return (
213
+ <Tag
214
+ className={cn("illustration", className)}
215
+ data-tone={tone}
216
+ data-size-responsive={dims.responsive ? "" : undefined}
217
+ style={
218
+ dims.responsive
219
+ ? {
220
+ "--desktop-size": `${dims.responsive.desktop}px`,
221
+ "--mobile-size": `${dims.responsive.mobile}px`,
222
+ }
223
+ : { width: dims.width, height: dims.height }
224
+ }
225
+ {...a11y}
226
+ >
227
+ {entry.type === "svg" ? (
228
+ <entry.component aria-hidden="true" />
229
+ ) : (
230
+ <LottiePlayer src={entry.src} poster={entry.poster} ariaLabel={label ?? ""} />
231
+ )}
232
+ </Tag>
233
+ );
234
+ }
235
+ ```
236
+
237
+ ## Performance
238
+
239
+ - SVG illustrations: inlined as React components via SVGR / vite-plugin-svgr; treeshaken automatically.
240
+ - Lottie illustrations: lazy-loaded via `LottiePlayer`'s built-in lazy strategy.
241
+ - For 50+ illustrations in registry: import on-demand to avoid shipping all in main bundle:
242
+
243
+ ```ts
244
+ "hero-money-flow": {
245
+ type: "svg",
246
+ component: lazy(() => import("./svg/HeroMoneyFlow")),
247
+ },
248
+ ```
249
+
250
+ Wrap consumers in `<Suspense fallback={<IllustrationSkeleton width={width} height={height} />}>`.
251
+
252
+ ## Edge cases
253
+
254
+ - **Name not in registry (typo)**: TS catches at compile time. Runtime: throw in dev, fallback in prod.
255
+ - **Responsive size on SSR**: server renders both sizes; CSS `clamp()` resolves on client paint. No layout shift if dimensions are reserved.
256
+ - **Dark mode**: registry's SVGs use `currentColor` + CSS variables. Tone variable cascades through dark theme. No per-illustration dark variant needed if SVG is built right.
257
+ - **RTL languages**: most illustrations are visually symmetric; if not, mark in registry with `flippable: true` and apply `transform: scaleX(-1)` in RTL contexts.
258
+ - **Print**: illustrations using `currentColor` print in current text color. For colored print, use named colors in registry's CSS layer.
259
+
260
+ ## Don't
261
+
262
+ - Don't pass arbitrary SVG nodes — extend the registry.
263
+ - Don't bake tone color in the SVG file. Use `currentColor`.
264
+ - Don't size illustrations with raw px from the consumer's css. Use the `size` prop.
265
+ - Don't render an `<img src=".svg">` — that's the wrong escape. Use the registry; SVG is inlined for theming.
266
+ - Don't auto-loop animated illustrations on every screen. Battery + a11y.
267
+ - Don't omit `label` if the illustration carries the only meaning on the screen. Defaults are decorative.
268
+
269
+ ## References
270
+
271
+ No upstream component matches. Most libraries either ship icon systems (different concern) or expect raw `<img>` / `<svg>` for illustrations. This component formalizes the registry + theming pattern.
272
+
273
+ ## Cross-reference
274
+
275
+ - [`knowledge/illustration/illustration-systems.md`](../knowledge/illustration/illustration-systems.md) — system foundation
276
+ - [`knowledge/illustration/svg-optimization.md`](../knowledge/illustration/svg-optimization.md) — SVG production
277
+ - [`knowledge/illustration/spot-illustrations.md`](../knowledge/illustration/spot-illustrations.md) — illustration types
278
+ - [`examples/component-empty-state.md`](component-empty-state.md) — common consumer
279
+ - [`examples/component-lottie-player.md`](component-lottie-player.md) — animated branch
280
+ - [`examples/component-hero-block.md`](component-hero-block.md) — hero illustration consumer
@@ -0,0 +1,107 @@
1
+ # `ImageList` — spec
2
+
3
+ > Synthesized from MUI `ImageList`. Grid of images with consistent rules — distinct from `Masonry` (varied heights) and `Grid` (general).
4
+
5
+ ## When to use
6
+
7
+ - Photo galleries where uniform proportions OK.
8
+ - Product image grids.
9
+ - Avatars / icons in a grid.
10
+
11
+ When NOT to use:
12
+ - Pinterest-style varied heights → `Masonry`.
13
+ - Reading-order content → semantic `<ul>`/`<ol>`.
14
+
15
+ ## Anatomy
16
+
17
+ ```
18
+ ┌──┬──┬──┬──┐
19
+ │ │ │ │ │
20
+ ├──┼──┼──┼──┤
21
+ │ │ │ │ │
22
+ ├──┼──┼──┼──┤
23
+ │ │ │ │ │
24
+ └──┴──┴──┴──┘
25
+ uniform tiles
26
+ ```
27
+
28
+ ## API
29
+
30
+ ```tsx
31
+ <ImageList cols={4} gap={8}>
32
+ {photos.map(p => (
33
+ <ImageList.Item key={p.id}>
34
+ <img src={p.thumb} alt={p.alt} loading="lazy" />
35
+ <ImageList.ItemBar
36
+ title={p.title}
37
+ subtitle={p.author}
38
+ actionIcon={<IconButton><InfoIcon /></IconButton>}
39
+ />
40
+ </ImageList.Item>
41
+ ))}
42
+ </ImageList>
43
+ ```
44
+
45
+ | Prop | Type | Default | Description |
46
+ | --- | --- | --- | --- |
47
+ | `cols` | `number` | `2` | Column count |
48
+ | `gap` | `number` | `4` | Gap between tiles (px) |
49
+ | `rowHeight` | `number \| "auto"` | `"auto"` | Fixed row height; "auto" sizes by content |
50
+ | `variant` | `"standard" \| "quilted" \| "masonry" \| "woven"` | `"standard"` | Layout style |
51
+
52
+ ## Variants
53
+
54
+ - **standard**: uniform grid.
55
+ - **quilted**: different tile sizes (some span 2 cols/rows) for visual rhythm.
56
+ - **masonry**: varying heights (use `Masonry` instead — clearer name).
57
+ - **woven**: alternating row heights.
58
+
59
+ ## States
60
+
61
+ Stateless. Tiles can be interactive (click → open / navigate); each tile follows Item semantics.
62
+
63
+ ## Tokens consumed
64
+
65
+ ```
66
+ --image-list-gap
67
+ --image-list-bar-bg (caption bar bg)
68
+ --image-list-bar-fg
69
+ --radius-sm (tile rounding)
70
+ ```
71
+
72
+ ## Accessibility
73
+
74
+ - Each `<img alt="...">` required.
75
+ - For interactive grids: wrap each Item in `<a>` or `<button>`.
76
+ - Keyboard: Tab through items; arrow keys can navigate (configurable).
77
+
78
+ ## Code example
79
+
80
+ ```tsx
81
+ <ImageList cols={3} gap={12} rowHeight={200}>
82
+ {products.map(p => (
83
+ <ImageList.Item key={p.id}>
84
+ <a href={`/products/${p.id}`}>
85
+ <img src={p.image} alt={p.name} loading="lazy" />
86
+ </a>
87
+ <ImageList.ItemBar title={p.name} subtitle={`₩${p.price.toLocaleString()}`} />
88
+ </ImageList.Item>
89
+ ))}
90
+ </ImageList>
91
+ ```
92
+
93
+ ## Don't
94
+
95
+ - Don't omit `alt` on images.
96
+ - Don't use ImageList for non-image grids — use Grid.
97
+ - Don't lazy-load above-the-fold — they should appear immediately.
98
+
99
+ ## References
100
+
101
+ - MUI: [`ImageList`](../refs/mui/packages/mui-material/src/ImageList)
102
+
103
+ ## Cross-reference
104
+
105
+ - [`examples/component-masonry.md`](component-masonry.md) — varied heights
106
+ - [`examples/component-grid.md`](component-grid.md) — generic 2D
107
+ - [`examples/component-aspect-ratio.md`](component-aspect-ratio.md) — single tile