@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,139 @@
1
+ # `ListItemButton` — spec
2
+
3
+ > Synthesized from MUI `ListItemButton`. The clickable variant of `ListItem`. Use this whenever a list row should respond to clicks (settings, nav, picker). Without it, `ListItem` is just a structural container.
4
+
5
+ ## When to use
6
+
7
+ - Settings rows ("계정 정보", "알림 설정").
8
+ - Nav lists in drawers / sidebars.
9
+ - Picker / chooser rows where the row itself is the selection target.
10
+ - ANY list row with a primary click action.
11
+
12
+ ## Anatomy
13
+
14
+ ```
15
+ ┌──────────────────────────────────────────────────┐
16
+ │ [icon] Primary text [trailing icon] │
17
+ │ Secondary text │
18
+ └──────────────────────────────────────────────────┘
19
+ ─ entire row is the click target ─
20
+ ```
21
+
22
+ For rows with a *separate* trailing action (button), wrap `ListItemButton` inside `ListItem` and put the action in `secondaryAction` (which sits outside the button's hit area).
23
+
24
+ ## API
25
+
26
+ ```tsx
27
+ <List>
28
+ <ListItem disablePadding>
29
+ <ListItemButton selected={current === 'profile'} onClick={() => navigate('/profile')}>
30
+ <ListItemIcon><PersonIcon /></ListItemIcon>
31
+ <ListItemText primary="프로필" secondary="이름, 이메일, 사진" />
32
+ </ListItemButton>
33
+ </ListItem>
34
+ </List>
35
+ ```
36
+
37
+ | Prop | Type | Default | Description |
38
+ | --- | --- | --- | --- |
39
+ | `children` | `ReactNode` | — | Usually `ListItemIcon` + `ListItemText` + optional trailing icon |
40
+ | `selected` | `boolean` | `false` | Highlighted (current/active item in nav) |
41
+ | `disabled` | `boolean` | `false` | Non-interactive; greyed |
42
+ | `dense` | `boolean` | `false` | Reduce vertical padding |
43
+ | `divider` | `boolean` | `false` | Bottom divider line |
44
+ | `onClick` | `(e) => void` | — | Click handler |
45
+ | `href` | `string` | — | Renders as `<a>` (use for nav lists) |
46
+ | `component` | `ElementType` | `'div'` | Override element (e.g., `Link` from react-router) |
47
+ | `disableRipple` | `boolean` | `false` | Skip the click-ripple effect |
48
+
49
+ ## States
50
+
51
+ | State | Visual |
52
+ | --- | --- |
53
+ | Default | transparent bg, fg-default |
54
+ | Hover | bg-subtle |
55
+ | Focus-visible | bg-subtle + 2px focus ring inset |
56
+ | Active | bg-pressed |
57
+ | Selected | bg-selected (~ brand-50/dark mode brand-900-30%), fg-on-selected |
58
+ | Selected + hover | bg-selected-hover (slight shift) |
59
+ | Disabled | reduced opacity, no hover effect |
60
+
61
+ ## Tokens consumed
62
+
63
+ ```
64
+ --list-item-min-height-44 /* default touch target */
65
+ --list-item-min-height-36 /* dense */
66
+ --color-bg-default
67
+ --color-bg-subtle /* hover */
68
+ --color-bg-pressed /* active */
69
+ --color-bg-selected /* selected */
70
+ --color-fg-default
71
+ --color-fg-on-selected
72
+ --space-md /* horizontal padding */
73
+ --motion-duration-100 /* hover/active transition */
74
+ ```
75
+
76
+ ## Accessibility
77
+
78
+ - Default semantic: `<div role="button">` with `tabIndex=0`. With `href`: renders `<a>` (preferred for nav).
79
+ - `selected={true}` → `aria-selected="true"`. For nav lists also add `aria-current="page"` when the row matches the current route.
80
+ - Keyboard: Enter / Space activates. Disabled rows skipped in tab order.
81
+ - Touch target: ≥ 44pt mobile (default 48px). Don't use `dense` on mobile primary nav.
82
+ - Cite [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md).
83
+
84
+ ## Edge cases
85
+
86
+ - **Long primary text** — wraps to 2 lines, then ellipsis. For nav rows, prefer concise labels.
87
+ - **`href` + `onClick`** — `onClick` fires before navigation; useful for analytics.
88
+ - **Inside React Router** — pass `component={RouterLink}` + `to="/path"` for SPA-style nav (no full page reload).
89
+ - **Selected without persistence** — `selected` is for the *current* item. For multi-select (checkbox lists), use `Checkbox` inside the row instead of `selected`.
90
+ - **Korean labels** — slightly more vertical padding looks less cramped (Hangul reads taller). Default 48px row height works; resist `dense` for Korean nav.
91
+
92
+ ## Code example
93
+
94
+ ```tsx
95
+ function SettingsNav({ section }: { section: string }) {
96
+ const items = [
97
+ { id: 'profile', label: '프로필', icon: <PersonIcon /> },
98
+ { id: 'notifications', label: '알림 설정', icon: <BellIcon /> },
99
+ { id: 'privacy', label: '개인정보', icon: <LockIcon /> },
100
+ { id: 'billing', label: '결제 정보', icon: <CardIcon /> },
101
+ ];
102
+
103
+ return (
104
+ <List component="nav" aria-label="설정">
105
+ {items.map((it) => (
106
+ <ListItem key={it.id} disablePadding>
107
+ <ListItemButton
108
+ component={Link}
109
+ to={`/settings/${it.id}`}
110
+ selected={section === it.id}
111
+ >
112
+ <ListItemIcon>{it.icon}</ListItemIcon>
113
+ <ListItemText primary={it.label} />
114
+ </ListItemButton>
115
+ </ListItem>
116
+ ))}
117
+ </List>
118
+ );
119
+ }
120
+ ```
121
+
122
+ ## Don't
123
+
124
+ - Don't use `ListItemButton` outside a `ListItem` parent — semantics break.
125
+ - Don't make the entire `ListItem` clickable via `onClick` on `ListItem` — wrap the inner content in `ListItemButton` so secondary actions stay separately focusable.
126
+ - Don't combine `ListItemButton` with form controls (Checkbox, Switch) inside the same clickable area — a click on the form control conflicts with the row click.
127
+ - Don't override `selected` styling without keeping enough contrast (`color-bg-selected` should be ≥ 3:1 against `color-bg-default`).
128
+
129
+ ## References
130
+
131
+ - MUI: [`ListItemButton`](../refs/mui/packages/mui-material/src/ListItemButton/)
132
+
133
+ ## Cross-reference
134
+
135
+ - [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
136
+ - [`component-list-item.md`](component-list-item.md) — structural container
137
+ - [`component-list-item-text.md`](component-list-item-text.md)
138
+ - [`component-list-item-icon.md`](component-list-item-icon.md)
139
+ - [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md)
@@ -0,0 +1,82 @@
1
+ # `ListItemIcon` — spec
2
+
3
+ > Synthesized from MUI `ListItemIcon`. The leading-icon slot in a `ListItem` — handles consistent sizing, color, and spacing so icons align across rows.
4
+
5
+ ## When to use
6
+
7
+ - Leading icons in nav lists (settings, drawer menu).
8
+ - Status icons in compact lists (success / warning indicators).
9
+ - For trailing icons (chevrons, badges), use `secondaryAction` on `ListItem` instead.
10
+
11
+ ## API
12
+
13
+ ```tsx
14
+ <ListItem disablePadding>
15
+ <ListItemButton>
16
+ <ListItemIcon>
17
+ <PersonIcon />
18
+ </ListItemIcon>
19
+ <ListItemText primary="프로필" />
20
+ </ListItemButton>
21
+ </ListItem>
22
+ ```
23
+
24
+ | Prop | Type | Default | Description |
25
+ | --- | --- | --- | --- |
26
+ | `children` | `ReactNode` | — | The icon component |
27
+
28
+ The icon's color and size are controlled by the parent — don't apply explicit `sx={{ color, fontSize }}` unless intentionally diverging.
29
+
30
+ ## States
31
+
32
+ Inherits from parent button: hover, focus, selected, disabled all cascade. Selected rows get brand-colored icons.
33
+
34
+ ## Tokens consumed
35
+
36
+ ```
37
+ --icon-size-md /* 24px default */
38
+ --color-fg-muted /* default icon color */
39
+ --color-fg-on-selected /* selected state */
40
+ --list-icon-min-width /* 40-56px reserved column */
41
+ ```
42
+
43
+ ## Accessibility
44
+
45
+ - Decorative icons get `aria-hidden="true"` (default behavior of MUI icons).
46
+ - If the icon is the *only* indicator (no text label), wrap with `<span aria-label="..."/>`.
47
+ - Touch target lives on the parent `ListItemButton`, not the icon itself.
48
+
49
+ ## Edge cases
50
+
51
+ - **Mixed: some rows have icons, some don't** — use `inset={true}` on `ListItemText` for icon-less rows so text columns align.
52
+ - **Custom icon size** — overriding via `sx={{ minWidth: ... }}` lets compact lists fit more rows; don't go below 32px on touch.
53
+ - **Status icons + text** — pair with `<Stack direction="row" gap={1}>` inside `ListItemText.primary` if both need to be at the text level.
54
+
55
+ ## Code example
56
+
57
+ ```tsx
58
+ // Settings nav with status indicators
59
+ <List component="nav">
60
+ <ListItem disablePadding>
61
+ <ListItemButton>
62
+ <ListItemIcon><BellIcon color="primary" /></ListItemIcon>
63
+ <ListItemText primary="알림" secondary="3개 안 읽음" />
64
+ </ListItemButton>
65
+ </ListItem>
66
+ </List>
67
+ ```
68
+
69
+ ## Don't
70
+
71
+ - Don't put text inside `ListItemIcon` — it's sized for icons only.
72
+ - Don't skip `ListItemIcon` and put icons in `ListItemText.primary` for icon-led rows — alignment breaks.
73
+
74
+ ## References
75
+
76
+ - MUI: [`ListItemIcon`](../refs/mui/packages/mui-material/src/ListItemIcon/)
77
+
78
+ ## Cross-reference
79
+
80
+ - [`component-list-item.md`](component-list-item.md)
81
+ - [`component-list-item-text.md`](component-list-item-text.md)
82
+ - [`knowledge/icons/curated-sets.md`](../knowledge/icons/curated-sets.md)
@@ -0,0 +1,98 @@
1
+ # `ListItemText` — spec
2
+
3
+ > Synthesized from MUI `ListItemText`. The text block inside a `ListItem` — primary line plus optional secondary line. Handles typography, ellipsis, and screen-reader semantics so consumers don't reimplement.
4
+
5
+ ## When to use
6
+
7
+ - Inside every `ListItem` that has text content (almost all of them).
8
+ - For text-only rows (no icon, no secondary action), `ListItemText` is the entire body.
9
+
10
+ ## Anatomy
11
+
12
+ ```
13
+ [Primary text — 14px medium / fg-default]
14
+ [Secondary text — 12px regular / fg-muted]
15
+ ```
16
+
17
+ ## API
18
+
19
+ ```tsx
20
+ <ListItemText
21
+ primary="홍길동"
22
+ secondary="개발팀 · 2026-05-01 입사"
23
+ />
24
+ ```
25
+
26
+ | Prop | Type | Default | Description |
27
+ | --- | --- | --- | --- |
28
+ | `primary` | `ReactNode` | — | Primary line (label) |
29
+ | `secondary` | `ReactNode` | — | Secondary line (sub-label) |
30
+ | `inset` | `boolean` | `false` | Indent left to align with rows that have a leading icon |
31
+ | `disableTypography` | `boolean` | `false` | Skip wrapping in `<Typography>`; renders raw children |
32
+ | `primaryTypographyProps` | `TypographyProps` | — | Override primary line typography |
33
+ | `secondaryTypographyProps` | `TypographyProps` | — | Override secondary line typography |
34
+
35
+ ## States
36
+
37
+ `ListItemText` is structural — no interactive states. Inherits color from parent (`ListItemButton`'s selected/disabled states cascade).
38
+
39
+ ## Tokens consumed
40
+
41
+ ```
42
+ --font-size-body /* primary */
43
+ --font-size-caption /* secondary */
44
+ --font-weight-medium /* primary */
45
+ --font-weight-regular /* secondary */
46
+ --color-fg-default /* primary */
47
+ --color-fg-muted /* secondary */
48
+ --line-height-body /* KR-bumped 1.65 */
49
+ --space-xs /* gap between primary and secondary */
50
+ ```
51
+
52
+ ## Accessibility
53
+
54
+ - Semantic: primary renders as `<span>` (or override). Secondary renders as `<p>`.
55
+ - For screen readers, both lines are announced together as "primary, secondary".
56
+ - For LONG primary text that wraps, ensure `aria-label` provides a short summary if needed.
57
+ - `inset={true}` keeps text alignment consistent with sibling rows that have icons — don't drop it.
58
+
59
+ ## Edge cases
60
+
61
+ - **Long primary text** — wraps; if multi-line wrap is undesired, set `primaryTypographyProps={{ noWrap: true }}` for ellipsis.
62
+ - **Empty secondary** — omit the prop; don't pass empty string (creates extra spacing).
63
+ - **React node as primary** — primary can be a `<Stack>` for inline badges next to the label. `disableTypography` lets you control the wrapper.
64
+ - **Korean text density** — Hangul reads slightly taller; default line-height (1.65 KR-bumped) should not be reduced.
65
+
66
+ ## Code example
67
+
68
+ ```tsx
69
+ // Settings row with switch
70
+ <ListItem
71
+ secondaryAction={<Switch onChange={toggle} checked={pushEnabled} />}
72
+ >
73
+ <ListItemText
74
+ primary="푸시 알림"
75
+ secondary="새 메시지가 오면 알림을 받아요"
76
+ />
77
+ </ListItem>
78
+
79
+ // Inset variant — aligns with rows that have icons
80
+ <ListItemText inset primary="섹션 헤더 없음" secondary="아이콘 자리만큼 들여 써요" />
81
+ ```
82
+
83
+ ## Don't
84
+
85
+ - Don't pass JSX trees as `secondary` that reimplement Typography — use `secondaryTypographyProps` overrides.
86
+ - Don't omit `inset` selectively — once any sibling row uses `ListItemIcon`, all icon-less siblings should `inset` for visual rhythm.
87
+ - Don't rely on `secondary` for critical info screen reader users need quickly — they hear it as continuation of primary.
88
+
89
+ ## References
90
+
91
+ - MUI: [`ListItemText`](../refs/mui/packages/mui-material/src/ListItemText/)
92
+
93
+ ## Cross-reference
94
+
95
+ - [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
96
+ - [`component-list-item.md`](component-list-item.md)
97
+ - [`component-list-item-button.md`](component-list-item-button.md)
98
+ - [`knowledge/typography/type-scale-fundamentals.md`](../knowledge/typography/type-scale-fundamentals.md)
@@ -0,0 +1,116 @@
1
+ # `ListItem` — spec
2
+
3
+ > Synthesized from MUI `ListItem`. The single-row primitive used inside `List`. For interactive rows that respond to clicks, use [`component-list-item-button.md`](component-list-item-button.md) — `ListItem` itself is the structural container.
4
+
5
+ ## When to use
6
+
7
+ - One row inside a `<List>`.
8
+ - Pure-display rows (text + secondary action button on the right).
9
+ - For *clickable rows* (the common case in settings / nav lists), use `ListItemButton` as the child.
10
+
11
+ ## Anatomy
12
+
13
+ ```
14
+ ┌──────────────────────────────────────────────────┐
15
+ │ [icon/avatar] Primary text [secondary] │
16
+ │ Secondary text │
17
+ └──────────────────────────────────────────────────┘
18
+ ```
19
+
20
+ Slots: leading icon/avatar (optional), text block (`ListItemText`), trailing secondary action (`ListItemSecondaryAction`).
21
+
22
+ ## API
23
+
24
+ ```tsx
25
+ <List>
26
+ <ListItem secondaryAction={<IconButton><DeleteIcon /></IconButton>}>
27
+ <ListItemAvatar><Avatar /></ListItemAvatar>
28
+ <ListItemText primary="이름" secondary="설명" />
29
+ </ListItem>
30
+ </List>
31
+ ```
32
+
33
+ | Prop | Type | Default | Description |
34
+ | --- | --- | --- | --- |
35
+ | `children` | `ReactNode` | — | Primary content; usually `ListItemText` + optional avatar/icon |
36
+ | `disablePadding` | `boolean` | `false` | Remove default vertical padding (use when child is `ListItemButton`) |
37
+ | `secondaryAction` | `ReactNode` | — | Right-anchored action area; not part of the row's clickable surface |
38
+ | `disableGutters` | `boolean` | `false` | Remove horizontal padding |
39
+ | `dense` | `boolean` | `false` | Reduce vertical padding (settings / dense nav lists) |
40
+ | `divider` | `boolean` | `false` | Bottom divider line |
41
+
42
+ ## States
43
+
44
+ `ListItem` itself is non-interactive. Interactivity comes from a `ListItemButton` child:
45
+
46
+ | State (on inner button) | Visual |
47
+ | --- | --- |
48
+ | Default | transparent bg, fg-default |
49
+ | Hover | bg-subtle |
50
+ | Focus-visible | 2px focus ring inset; cite [keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md) |
51
+ | Active | bg-pressed |
52
+ | Selected | bg-selected, fg-on-selected |
53
+ | Disabled | reduced opacity |
54
+
55
+ ## Tokens consumed
56
+
57
+ ```
58
+ --color-bg-default
59
+ --color-fg-default
60
+ --space-sm /* dense */
61
+ --space-md /* default */
62
+ --list-row-min-height-44
63
+ --color-divider
64
+ ```
65
+
66
+ ## Accessibility
67
+
68
+ - Semantic element: `<li>` (default).
69
+ - For navigable list with selection, use `role="list"` on the parent and `aria-current="page"` on the selected item.
70
+ - `secondaryAction` must be a separately-focusable control with its own accessible name (otherwise it merges into the row's tab stop and is unreachable).
71
+ - Touch target: ≥ 44pt for mobile lists.
72
+
73
+ ## Edge cases
74
+
75
+ - **Long primary text** — wraps to 2 lines, then ellipsis.
76
+ - **`ListItemButton` child + `secondaryAction`** — the secondary action is OUTSIDE the button's hit area. Functionally critical for screen-reader nav.
77
+ - **Korean text density** — Hangul reads ~10% wider than Latin. Test with realistic Korean copy.
78
+
79
+ ## Code example
80
+
81
+ ```tsx
82
+ <List>
83
+ {users.map((u) => (
84
+ <ListItem
85
+ key={u.id}
86
+ secondaryAction={
87
+ <IconButton edge="end" aria-label={`${u.name} 삭제`}>
88
+ <DeleteIcon />
89
+ </IconButton>
90
+ }
91
+ disablePadding
92
+ >
93
+ <ListItemButton onClick={() => select(u.id)}>
94
+ <ListItemAvatar><Avatar src={u.avatarUrl} /></ListItemAvatar>
95
+ <ListItemText primary={u.name} secondary={u.role} />
96
+ </ListItemButton>
97
+ </ListItem>
98
+ ))}
99
+ </List>
100
+ ```
101
+
102
+ ## Don't
103
+
104
+ - Don't make the entire `ListItem` clickable via `onClick`; wrap inner content in `ListItemButton` so secondary action stays separately focusable.
105
+ - Don't put 3+ controls inside `secondaryAction` — overflow into a menu.
106
+
107
+ ## References
108
+
109
+ - MUI: [`ListItem.d.ts`](../refs/mui/packages/mui-material/src/ListItem/ListItem.d.ts)
110
+
111
+ ## Cross-reference
112
+
113
+ - [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
114
+ - [`component-list-item-button.md`](component-list-item-button.md)
115
+ - [`component-list-item-text.md`](component-list-item-text.md)
116
+ - [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md)
@@ -0,0 +1,70 @@
1
+ # `ListSubheader` — spec
2
+
3
+ > Synthesized from MUI `ListSubheader`. A section header inside a `List`. Use for grouping related rows under a label ("최근", "즐겨찾기", "전체").
4
+
5
+ ## When to use
6
+
7
+ - Grouped lists (categories of settings, sections of nav).
8
+ - Date-grouped feeds ("오늘", "어제", "이번 주").
9
+ - Avoid for short lists (<5 rows) — header overhead isn't worth it.
10
+
11
+ ## API
12
+
13
+ ```tsx
14
+ <List subheader={<ListSubheader>최근 검색</ListSubheader>}>
15
+ <ListItemButton>...</ListItemButton>
16
+ <ListItemButton>...</ListItemButton>
17
+ </List>
18
+ ```
19
+
20
+ | Prop | Type | Default | Description |
21
+ | --- | --- | --- | --- |
22
+ | `children` | `ReactNode` | — | Header text |
23
+ | `disableSticky` | `boolean` | `false` | Skip sticky-on-scroll behavior |
24
+ | `inset` | `boolean` | `false` | Indent to align with icon-led rows |
25
+ | `disableGutters` | `boolean` | `false` | Remove horizontal padding |
26
+
27
+ ## Tokens consumed
28
+
29
+ ```
30
+ --font-size-caption /* 12px */
31
+ --font-weight-semibold
32
+ --color-fg-muted /* default */
33
+ --space-md /* horizontal padding */
34
+ --list-subheader-height /* 32px */
35
+ ```
36
+
37
+ ## Accessibility
38
+
39
+ - Renders as `<li>` by default. For semantic headers, override `component="h3"` or wrap content with appropriate heading.
40
+ - Don't use as the *only* visual cue for grouping — pair with `Divider` or distinct background for low-vision users.
41
+
42
+ ## Edge cases
43
+
44
+ - **Sticky on scroll** — default behavior keeps the subheader visible while its rows scroll past. Disable for short lists.
45
+ - **Korean labels** — short and noun-form ("최근", "즐겨찾기"). Avoid sentence-form labels here.
46
+
47
+ ## Code example
48
+
49
+ ```tsx
50
+ <List>
51
+ <ListSubheader>최근</ListSubheader>
52
+ {recent.map((it) => <ListItemButton key={it.id}>{it.title}</ListItemButton>)}
53
+ <ListSubheader>즐겨찾기</ListSubheader>
54
+ {favs.map((it) => <ListItemButton key={it.id}>{it.title}</ListItemButton>)}
55
+ </List>
56
+ ```
57
+
58
+ ## Don't
59
+
60
+ - Don't nest subheaders.
61
+ - Don't use for sublabels under a single row — that's `ListItemText.secondary`.
62
+
63
+ ## References
64
+
65
+ - MUI: [`ListSubheader`](../refs/mui/packages/mui-material/src/ListSubheader/)
66
+
67
+ ## Cross-reference
68
+
69
+ - [`component-list-item.md`](component-list-item.md)
70
+ - [`component-list-item-button.md`](component-list-item-button.md)