@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,72 @@
1
+ # `TableFooter` — spec
2
+
3
+ > Synthesized from MUI `TableFooter`. The container for footer rows in a `Table` — totals, summaries, or pagination. Renders `<tfoot>`.
4
+
5
+ ## When to use
6
+
7
+ - Tables with totals/subtotals row (sum of an amount column).
8
+ - Tables with `TablePagination` rendered inside the table (rather than below).
9
+
10
+ ## API
11
+
12
+ ```tsx
13
+ <Table>
14
+ <TableHead>...</TableHead>
15
+ <TableBody>...</TableBody>
16
+ <TableFooter>
17
+ <TableRow>
18
+ <TableCell colSpan={2}>합계</TableCell>
19
+ <TableCell align="right">{total.toLocaleString('ko-KR')}원</TableCell>
20
+ </TableRow>
21
+ </TableFooter>
22
+ </Table>
23
+ ```
24
+
25
+ | Prop | Type | Default | Description |
26
+ | --- | --- | --- | --- |
27
+ | `children` | `ReactNode` | — | `TableRow` (typically one) |
28
+ | `component` | `ElementType` | `'tfoot'` | Override |
29
+
30
+ ## Accessibility
31
+
32
+ - `<tfoot>` semantics communicate "summary row" to screen readers.
33
+ - For totals: the row label cell uses `scope="row"` so the total cell is properly associated.
34
+
35
+ ## Edge cases
36
+
37
+ - **Multiple footer rows** — fine; common for layered summaries (subtotal, tax, total).
38
+ - **Korean total labels** — "합계", "총액", "소계 / 부가세 / 합계" — keep in 합쇼체 or noun-form.
39
+
40
+ ## Code example
41
+
42
+ ```tsx
43
+ <TableFooter>
44
+ <TableRow>
45
+ <TableCell colSpan={2} scope="row">소계</TableCell>
46
+ <TableCell align="right" sx={{ fontVariantNumeric: 'tabular-nums' }}>
47
+ {subtotal.toLocaleString('ko-KR')}원
48
+ </TableCell>
49
+ </TableRow>
50
+ <TableRow>
51
+ <TableCell colSpan={2} scope="row">부가세 (10%)</TableCell>
52
+ <TableCell align="right">{tax.toLocaleString('ko-KR')}원</TableCell>
53
+ </TableRow>
54
+ <TableRow sx={{ '& td': { fontWeight: 600 } }}>
55
+ <TableCell colSpan={2} scope="row">합계</TableCell>
56
+ <TableCell align="right">{total.toLocaleString('ko-KR')}원</TableCell>
57
+ </TableRow>
58
+ </TableFooter>
59
+ ```
60
+
61
+ ## Don't
62
+
63
+ - Don't use as a wrapper for non-summary rows (filters, etc.) — that's a sibling component, not the footer.
64
+
65
+ ## References
66
+
67
+ - MUI: [`TableFooter`](../refs/mui/packages/mui-material/src/TableFooter/)
68
+
69
+ ## Cross-reference
70
+
71
+ - [`component-table.md`](component-table.md)
72
+ - [`component-table-row.md`](component-table-row.md)
@@ -0,0 +1,78 @@
1
+ # `TableHead` — spec
2
+
3
+ > Synthesized from MUI `TableHead`. The container for header rows in a `Table`. Renders `<thead>` with semibold cell text and `<th>` semantics on inner `TableCell`s.
4
+
5
+ ## When to use
6
+
7
+ - Every `Table` with column labels (almost all of them).
8
+ - For tables with sortable columns, header cells contain `TableSortLabel`.
9
+
10
+ ## API
11
+
12
+ ```tsx
13
+ <Table>
14
+ <TableHead>
15
+ <TableRow>
16
+ <TableCell scope="col">이름</TableCell>
17
+ <TableCell scope="col" align="right">금액</TableCell>
18
+ </TableRow>
19
+ </TableHead>
20
+ <TableBody>...</TableBody>
21
+ </Table>
22
+ ```
23
+
24
+ | Prop | Type | Default | Description |
25
+ | --- | --- | --- | --- |
26
+ | `children` | `ReactNode` | — | `TableRow` (typically one) |
27
+ | `component` | `ElementType` | `'thead'` | Override |
28
+
29
+ ## Accessibility
30
+
31
+ - `TableCell` children inside `TableHead` automatically render as `<th>`.
32
+ - Add `scope="col"` to each header cell — required for screen readers to associate columns with body cells.
33
+ - For multi-row headers, use `<TableRow>` siblings inside `TableHead` and `colspan` / `rowspan` on cells.
34
+
35
+ ## Edge cases
36
+
37
+ - **Sticky header** — set `<TableContainer sx={{ maxHeight: 400 }}>` + `<Table stickyHeader>` to keep headers visible during scroll.
38
+ - **Mobile narrow viewport** — Tables don't scale well; switch to card-list layout. Cite [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md).
39
+ - **Korean column labels** — keep short (1-3 words). Long labels wrap or truncate; truncated headers are confusing.
40
+
41
+ ## Code example
42
+
43
+ ```tsx
44
+ <TableContainer component={Paper} sx={{ maxHeight: 480 }}>
45
+ <Table stickyHeader>
46
+ <TableHead>
47
+ <TableRow>
48
+ <TableCell scope="col">이름</TableCell>
49
+ <TableCell scope="col">부서</TableCell>
50
+ <TableCell scope="col" align="right">
51
+ <TableSortLabel active direction="asc" onClick={onSort}>
52
+ 입사일
53
+ </TableSortLabel>
54
+ </TableCell>
55
+ </TableRow>
56
+ </TableHead>
57
+ <TableBody>
58
+ {employees.map((emp) => <EmployeeRow key={emp.id} {...emp} />)}
59
+ </TableBody>
60
+ </Table>
61
+ </TableContainer>
62
+ ```
63
+
64
+ ## Don't
65
+
66
+ - Don't omit `scope="col"` — accessibility miss.
67
+ - Don't put body rows inside `TableHead`.
68
+ - Don't style header cells with body-cell typography — keep semibold semantic distinction.
69
+
70
+ ## References
71
+
72
+ - MUI: [`TableHead`](../refs/mui/packages/mui-material/src/TableHead/)
73
+
74
+ ## Cross-reference
75
+
76
+ - [`component-table.md`](component-table.md)
77
+ - [`component-table-cell.md`](component-table-cell.md)
78
+ - [`component-table-sort-label.md`](component-table-sort-label.md)
@@ -0,0 +1,137 @@
1
+ # `TablePagination` — spec
2
+
3
+ > Synthesized from MUI `TablePagination`. The pagination controls for a `Table` — page size selector + page navigation + total count display. Sits in `TableFooter` or below the table container.
4
+
5
+ ## When to use
6
+
7
+ - Tables with > 25 rows where users need to navigate pages.
8
+ - For client-side pagination of small datasets, prefer `Pagination` component (decoupled from Table).
9
+
10
+ ## When NOT to use
11
+
12
+ - Infinite-scroll feeds → use `Load More` button or auto-load on scroll. Cite [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md).
13
+ - Single-page tables → no pagination control.
14
+
15
+ ## Anatomy
16
+
17
+ ```
18
+ ┌────────────────────────────────────────────────────────┐
19
+ │ Rows per page: [10 ▼] 1-10 of 234 [<] [>] [>>] │
20
+ └────────────────────────────────────────────────────────┘
21
+ ```
22
+
23
+ ## API
24
+
25
+ ```tsx
26
+ <TablePagination
27
+ component="div"
28
+ count={total}
29
+ page={page}
30
+ onPageChange={(_, newPage) => setPage(newPage)}
31
+ rowsPerPage={pageSize}
32
+ onRowsPerPageChange={(e) => {
33
+ setPageSize(parseInt(e.target.value, 10));
34
+ setPage(0);
35
+ }}
36
+ rowsPerPageOptions={[10, 25, 50, 100]}
37
+ labelRowsPerPage="페이지당 행"
38
+ labelDisplayedRows={({ from, to, count }) => `${from}-${to} / 전체 ${count}`}
39
+ />
40
+ ```
41
+
42
+ | Prop | Type | Default | Description |
43
+ | --- | --- | --- | --- |
44
+ | `count` | `number` | required | Total row count |
45
+ | `page` | `number` | required | Current page (0-indexed) |
46
+ | `onPageChange` | `(e, page) => void` | required | Page change handler |
47
+ | `rowsPerPage` | `number` | required | Current page size |
48
+ | `onRowsPerPageChange` | `(e) => void` | — | Page-size change handler |
49
+ | `rowsPerPageOptions` | `number[]` | `[10, 25, 50, 100]` | Page-size options (or `[]` to hide selector) |
50
+ | `labelRowsPerPage` | `ReactNode` | `'Rows per page:'` | Selector label |
51
+ | `labelDisplayedRows` | `({ from, to, count }) => ReactNode` | — | Range label formatter |
52
+ | `showFirstButton` / `showLastButton` | `boolean` | `false` | Show first/last page jumps |
53
+ | `component` | `ElementType` | `'td'` | Override (use `'div'` outside Table footer) |
54
+ | `SelectProps` | `SelectProps` | — | Customize the page-size Select |
55
+ | `getItemAriaLabel` | `(type) => string` | — | Customize button aria-labels |
56
+
57
+ ## States
58
+
59
+ | State | Visual |
60
+ | --- | --- |
61
+ | First page | Previous button disabled |
62
+ | Last page | Next button disabled |
63
+ | All pages fit on one | Pagination collapses; only count shows |
64
+
65
+ ## Tokens consumed
66
+
67
+ ```
68
+ --table-pagination-min-height-52
69
+ --font-size-body
70
+ --space-md
71
+ ```
72
+
73
+ ## Accessibility
74
+
75
+ - Buttons have `aria-label` (Previous/Next/First/Last). Localize via `getItemAriaLabel`.
76
+ - The page-size Select needs an associated label — `labelRowsPerPage` provides it.
77
+ - Korean: provide `labelDisplayedRows` formatter that uses Korean range syntax: `1-10 / 전체 234`.
78
+ - Announce page changes via `aria-live="polite"` if context requires (e.g., screen reader users navigating large tables).
79
+
80
+ ## Edge cases
81
+
82
+ - **`count={-1}` (unknown total)** — pagination shows "1-10 of more than 10" (with `labelDisplayedRows` returning that string). Useful for cursor-based APIs.
83
+ - **Korean pluralization** — there's none in Korean; "1 결과" and "234 결과" both fine. Don't try to pluralize.
84
+ - **Mobile narrow** — buttons + Select can wrap awkwardly. Consider hiding `rowsPerPageOptions` on mobile (`rowsPerPageOptions={[]}`).
85
+
86
+ ## Code example
87
+
88
+ ```tsx
89
+ function EmployeesTable() {
90
+ const [page, setPage] = useState(0);
91
+ const [pageSize, setPageSize] = useState(25);
92
+ const { data, total } = useEmployees({ page, pageSize });
93
+
94
+ return (
95
+ <Paper>
96
+ <TableContainer>
97
+ <Table>
98
+ <TableHead>...</TableHead>
99
+ <TableBody>
100
+ {data.map((emp) => <EmployeeRow key={emp.id} {...emp} />)}
101
+ </TableBody>
102
+ </Table>
103
+ </TableContainer>
104
+ <TablePagination
105
+ component="div"
106
+ count={total}
107
+ page={page}
108
+ onPageChange={(_, p) => setPage(p)}
109
+ rowsPerPage={pageSize}
110
+ onRowsPerPageChange={(e) => {
111
+ setPageSize(parseInt(e.target.value, 10));
112
+ setPage(0);
113
+ }}
114
+ rowsPerPageOptions={[10, 25, 50, 100]}
115
+ labelRowsPerPage="페이지당 행"
116
+ labelDisplayedRows={({ from, to, count }) => `${from}-${to} / 전체 ${count}`}
117
+ />
118
+ </Paper>
119
+ );
120
+ }
121
+ ```
122
+
123
+ ## Don't
124
+
125
+ - Don't reset `page` to 0 implicitly when filters change without surfacing the reset to the user (sudden page jumps confuse).
126
+ - Don't put 1000+ rows on one page — slow render + bad UX.
127
+ - Don't use English labels in a Korean UI.
128
+
129
+ ## References
130
+
131
+ - MUI: [`TablePagination`](../refs/mui/packages/mui-material/src/TablePagination/)
132
+
133
+ ## Cross-reference
134
+
135
+ - [`component-table.md`](component-table.md)
136
+ - [`component-pagination.md`](component-pagination.md)
137
+ - [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md)
@@ -0,0 +1,113 @@
1
+ # `TableRow` — spec
2
+
3
+ > Synthesized from MUI `TableRow`. A row inside a `Table`. Handles selection state, hover styling, zebra striping. Used for both `<tbody>` rows and `<thead>` header rows.
4
+
5
+ ## When to use
6
+
7
+ - Inside any `Table` body or head.
8
+ - For non-tabular data (cards, lists), don't use TableRow.
9
+
10
+ ## API
11
+
12
+ ```tsx
13
+ <TableRow hover selected={isSelected} onClick={() => onSelect(row.id)}>
14
+ <TableCell padding="checkbox">
15
+ <Checkbox checked={isSelected} />
16
+ </TableCell>
17
+ <TableCell>{row.name}</TableCell>
18
+ <TableCell align="right">{row.amount.toLocaleString('ko-KR')}원</TableCell>
19
+ </TableRow>
20
+ ```
21
+
22
+ | Prop | Type | Default | Description |
23
+ | --- | --- | --- | --- |
24
+ | `children` | `ReactNode` | — | TableCell children |
25
+ | `hover` | `boolean` | `false` | Enable hover bg |
26
+ | `selected` | `boolean` | `false` | Selected styling (bg-selected) |
27
+ | `onClick` | `(e) => void` | — | Row click handler |
28
+
29
+ ## States
30
+
31
+ | State | Visual |
32
+ | --- | --- |
33
+ | Default | transparent / zebra |
34
+ | Hover (with `hover`) | bg-subtle |
35
+ | Selected | bg-selected (brand-tinted) |
36
+ | Focus-visible | 2px ring inset |
37
+
38
+ ## Tokens consumed
39
+
40
+ ```
41
+ --table-row-bg
42
+ --table-row-bg-zebra
43
+ --table-row-bg-hover
44
+ --table-row-bg-selected
45
+ --table-row-min-height-48
46
+ --color-divider
47
+ ```
48
+
49
+ ## Accessibility
50
+
51
+ - Renders as `<tr>`. Native semantics handle row/column relationships.
52
+ - For selectable rows with `onClick`, also support keyboard (Enter/Space). MUI doesn't add this automatically — wrap in `tabIndex={0}` + onKeyDown handler.
53
+ - For selected rows, screen readers announce based on the inner Checkbox state, not `selected` prop.
54
+ - Cite [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md).
55
+
56
+ ## Edge cases
57
+
58
+ - **Whole-row click** — convenient but can conflict with cell-level clicks (link inside, button). Use `e.stopPropagation()` on inner interactives.
59
+ - **Korean amount alignment** — `align="right"` on numeric cells; use `font-variant-numeric: tabular-nums` for clean column alignment.
60
+ - **Long cell content** — wraps by default; use `noWrap` on Typography or `overflow: hidden` for ellipsis.
61
+
62
+ ## Code example
63
+
64
+ ```tsx
65
+ <TableContainer>
66
+ <Table>
67
+ <TableHead>
68
+ <TableRow>
69
+ <TableCell padding="checkbox">
70
+ <Checkbox checked={allSelected} onChange={toggleAll} />
71
+ </TableCell>
72
+ <TableCell>이름</TableCell>
73
+ <TableCell>부서</TableCell>
74
+ <TableCell align="right">입사일</TableCell>
75
+ </TableRow>
76
+ </TableHead>
77
+ <TableBody>
78
+ {employees.map((emp) => (
79
+ <TableRow
80
+ key={emp.id}
81
+ hover
82
+ selected={selected.has(emp.id)}
83
+ onClick={() => toggleSelect(emp.id)}
84
+ >
85
+ <TableCell padding="checkbox">
86
+ <Checkbox checked={selected.has(emp.id)} />
87
+ </TableCell>
88
+ <TableCell>{emp.name}</TableCell>
89
+ <TableCell>{emp.department}</TableCell>
90
+ <TableCell align="right">{formatDate(emp.hireDate)}</TableCell>
91
+ </TableRow>
92
+ ))}
93
+ </TableBody>
94
+ </Table>
95
+ </TableContainer>
96
+ ```
97
+
98
+ ## Don't
99
+
100
+ - Don't put TableRow outside a Table — semantics break.
101
+ - Don't use TableRow for card layouts — use Stack / Grid.
102
+ - Don't omit a key when mapping.
103
+
104
+ ## References
105
+
106
+ - MUI: [`TableRow`](../refs/mui/packages/mui-material/src/TableRow/)
107
+
108
+ ## Cross-reference
109
+
110
+ - [`component-table.md`](component-table.md)
111
+ - [`component-table-cell.md`](component-table-cell.md)
112
+ - [`component-table-body.md`](component-table-body.md)
113
+ - [`component-table-head.md`](component-table-head.md)
@@ -0,0 +1,109 @@
1
+ # `TableSortLabel` — spec
2
+
3
+ > Synthesized from MUI `TableSortLabel`. The clickable sort indicator inside a header `TableCell`. Shows the current sort direction (ascending / descending) + click handler to toggle.
4
+
5
+ ## When to use
6
+
7
+ - Inside header `TableCell`s of sortable columns.
8
+ - For non-sortable columns, render plain text in the TableCell.
9
+
10
+ ## API
11
+
12
+ ```tsx
13
+ <TableCell sortDirection={orderBy === 'name' ? order : false}>
14
+ <TableSortLabel
15
+ active={orderBy === 'name'}
16
+ direction={orderBy === 'name' ? order : 'asc'}
17
+ onClick={() => handleSort('name')}
18
+ >
19
+ 이름
20
+ </TableSortLabel>
21
+ </TableCell>
22
+ ```
23
+
24
+ | Prop | Type | Default | Description |
25
+ | --- | --- | --- | --- |
26
+ | `active` | `boolean` | `false` | This column is currently sorted |
27
+ | `direction` | `'asc' \| 'desc'` | `'asc'` | Sort direction (ignored when not active) |
28
+ | `hideSortIcon` | `boolean` | `false` | Hide arrow when not active (cleaner default; arrow appears on hover) |
29
+ | `IconComponent` | `ElementType` | `ArrowDownwardIcon` | Custom sort icon |
30
+ | `onClick` | `(e) => void` | — | Toggle handler |
31
+
32
+ ## States
33
+
34
+ | State | Visual |
35
+ | --- | --- |
36
+ | Default (not active) | Label only; no arrow (or arrow on hover if `hideSortIcon=false`) |
37
+ | Active asc | Label + up arrow |
38
+ | Active desc | Label + down arrow |
39
+ | Hover (any) | Subtle bg + arrow visible |
40
+ | Focus-visible | 2px focus ring |
41
+
42
+ ## Tokens consumed
43
+
44
+ ```
45
+ --icon-size-sm /* sort arrow */
46
+ --color-fg-default
47
+ --color-fg-muted /* inactive arrow */
48
+ --motion-duration-100 /* arrow rotation */
49
+ ```
50
+
51
+ ## Accessibility
52
+
53
+ - Renders as `<button>` — keyboard activates with Enter/Space.
54
+ - Pair with `TableCell sortDirection={...}` to set `aria-sort` correctly. MUI handles the cell side automatically.
55
+ - Korean: arrow direction is universal; the label localizes naturally.
56
+
57
+ ## Edge cases
58
+
59
+ - **Tri-state sort** (asc → desc → unsorted → asc...) — implement in your `onClick`. MUI doesn't enforce tri-state by default; common is asc ↔ desc.
60
+ - **Multi-column sort** — possible but UX-confusing for most adopters. Stick to single-column unless data work warrants it.
61
+ - **Default sort** — set initial `orderBy` + `order` state on mount; first render shows the active arrow.
62
+
63
+ ## Code example
64
+
65
+ ```tsx
66
+ function SortableHeader({ orderBy, order, onSort }) {
67
+ const cell = (key, label, align = 'left') => (
68
+ <TableCell
69
+ align={align}
70
+ sortDirection={orderBy === key ? order : false}
71
+ scope="col"
72
+ >
73
+ <TableSortLabel
74
+ active={orderBy === key}
75
+ direction={orderBy === key ? order : 'asc'}
76
+ onClick={() => onSort(key)}
77
+ >
78
+ {label}
79
+ </TableSortLabel>
80
+ </TableCell>
81
+ );
82
+
83
+ return (
84
+ <TableHead>
85
+ <TableRow>
86
+ {cell('name', '이름')}
87
+ {cell('department', '부서')}
88
+ {cell('hireDate', '입사일', 'right')}
89
+ {cell('salary', '급여', 'right')}
90
+ </TableRow>
91
+ </TableHead>
92
+ );
93
+ }
94
+ ```
95
+
96
+ ## Don't
97
+
98
+ - Don't put `TableSortLabel` outside a `TableCell` — `aria-sort` won't propagate.
99
+ - Don't use for non-sortable columns — confuses users when clicking does nothing.
100
+ - Don't omit `aria-label` if the column header is icon-only (pair with `aria-label="정렬: 이름"` or similar).
101
+
102
+ ## References
103
+
104
+ - MUI: [`TableSortLabel`](../refs/mui/packages/mui-material/src/TableSortLabel/)
105
+
106
+ ## Cross-reference
107
+
108
+ - [`component-table-cell.md`](component-table-cell.md)
109
+ - [`component-table-head.md`](component-table-head.md)