@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,130 @@
1
+ # `Stack` — spec
2
+
3
+ > Synthesized from MUI `Stack`. The flexbox-based linear layout primitive — children laid out in a row or column with consistent spacing. Most-used layout container after `Box`. The shadcn equivalent uses Tailwind utilities directly (`flex flex-col gap-4`) — Stack abstracts that for design-system enforcement.
4
+
5
+ ## When to use
6
+
7
+ - Any group of elements that need consistent spacing (button rows, form rows, card stacks).
8
+ - Replacing `<div style={{ display: 'flex', gap: 16 }}>` boilerplate.
9
+ - For grid-style 2D layouts, use `Grid` instead.
10
+
11
+ ## Anatomy
12
+
13
+ ```
14
+ Direction = "row":
15
+ ┌──────┬──[gap]──┬──────┬──[gap]──┬──────┐
16
+ │ <1/> │ │ <2/> │ │ <3/> │
17
+ └──────┴─────────┴──────┴─────────┴──────┘
18
+
19
+ Direction = "column":
20
+ ┌──────┐
21
+ │ <1/> │
22
+ ├─[gap]┤
23
+ │ <2/> │
24
+ ├─[gap]┤
25
+ │ <3/> │
26
+ └──────┘
27
+ ```
28
+
29
+ ## API
30
+
31
+ ```tsx
32
+ <Stack direction="row" gap={2} alignItems="center" justifyContent="flex-end">
33
+ <Button onClick={onCancel}>취소</Button>
34
+ <Button onClick={onSave} variant="contained">저장</Button>
35
+ </Stack>
36
+ ```
37
+
38
+ | Prop | Type | Default | Description |
39
+ | --- | --- | --- | --- |
40
+ | `direction` | `'row' \| 'column' \| 'row-reverse' \| 'column-reverse'` | `'column'` | Flex axis |
41
+ | `spacing` / `gap` | `number \| string` | `0` | Gap between children (theme spacing units; `gap={2}` = 16px on 8-base) |
42
+ | `alignItems` | `'flex-start' \| 'center' \| 'flex-end' \| 'stretch' \| 'baseline'` | — | Cross-axis alignment |
43
+ | `justifyContent` | `'flex-start' \| 'center' \| 'flex-end' \| 'space-between' \| 'space-around'` | — | Main-axis alignment |
44
+ | `divider` | `ReactNode` | — | Element rendered between children (e.g., `<Divider />`) |
45
+ | `useFlexGap` | `boolean` | `true` (MUI v6+) | Use CSS `gap` instead of margins; safer with `divider` |
46
+ | `flexWrap` | `'nowrap' \| 'wrap'` | `'nowrap'` | Wrap children to next line |
47
+ | `sx` | `SxProps` | — | Style override (responsive values, custom CSS) |
48
+
49
+ ### Responsive
50
+
51
+ ```tsx
52
+ <Stack
53
+ direction={{ xs: 'column', md: 'row' }}
54
+ gap={{ xs: 1, md: 2 }}
55
+ >
56
+ ...
57
+ </Stack>
58
+ ```
59
+
60
+ ## States
61
+
62
+ Layout primitive — no interactive states.
63
+
64
+ ## Tokens consumed
65
+
66
+ ```
67
+ --space-xs /* gap={0.5} */
68
+ --space-sm /* gap={1} */
69
+ --space-md /* gap={2} */
70
+ --space-lg /* gap={3} */
71
+ --space-xl /* gap={4} */
72
+ ```
73
+
74
+ ## Accessibility
75
+
76
+ - `Stack` is a `<div>` (default). For semantic groupings, override via `component`:
77
+ - List of nav items: `component="nav"` + ARIA label.
78
+ - Toolbar: `component="div" role="toolbar"`.
79
+ - For RTL languages, `direction="row"` automatically reverses if the document is `dir="rtl"`. For Korean (LTR), no special handling needed.
80
+
81
+ ## Edge cases
82
+
83
+ - **Mixed-width children with `space-between`** — Stack distributes remaining space; long children may shrink. Use `flex={1}` on the spreading child if needed.
84
+ - **Korean text in row direction** — Korean labels run wider than Latin equivalents; test row layouts at 320px viewport. Switch to `direction={{ xs: 'column', md: 'row' }}` if cramped.
85
+ - **Nested Stacks** — common and fine. `Stack` doesn't add semantic meaning, just layout.
86
+ - **`divider` with `useFlexGap=false`** — older MUI versions used margin-based spacing which collides with dividers. Set `useFlexGap` explicitly.
87
+
88
+ ## Code example
89
+
90
+ ```tsx
91
+ // Card footer with cancel + primary
92
+ <Card>
93
+ <CardContent>...</CardContent>
94
+ <Stack direction="row" gap={1} justifyContent="flex-end" sx={{ p: 2 }}>
95
+ <Button onClick={onCancel}>취소</Button>
96
+ <Button onClick={onSave} variant="contained">저장</Button>
97
+ </Stack>
98
+ </Card>
99
+
100
+ // Form row that stacks on mobile
101
+ <Stack direction={{ xs: 'column', sm: 'row' }} gap={2}>
102
+ <TextField label="이름" />
103
+ <TextField label="사번" />
104
+ <TextField label="부서" />
105
+ </Stack>
106
+
107
+ // Vertical list of cards with dividers
108
+ <Stack gap={2} divider={<Divider flexItem />}>
109
+ {items.map((it) => <Card key={it.id}>{it.title}</Card>)}
110
+ </Stack>
111
+ ```
112
+
113
+ ## Don't
114
+
115
+ - Don't reach for `Stack` for 2D grids — use `Grid`.
116
+ - Don't nest 4+ Stacks deep — extract to a custom layout component.
117
+ - Don't use `Stack direction="row"` for content that should wrap to multiple lines without explicit `flexWrap`.
118
+ - Don't apply `Stack` to a single child — pure overhead.
119
+
120
+ ## References
121
+
122
+ - MUI: [`Stack`](../refs/mui/packages/mui-material/src/Stack/)
123
+
124
+ ## Cross-reference
125
+
126
+ - [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
127
+ - [`component-box.md`](component-box.md)
128
+ - [`component-grid.md`](component-grid.md)
129
+ - [`component-flex.md`](component-flex.md) — alternate flex primitive
130
+ - [`knowledge/layout/spacing-and-grid.md`](../knowledge/layout/spacing-and-grid.md)
@@ -0,0 +1,282 @@
1
+ # `Statistic` — spec
2
+
3
+ > Citing Ant Design `Statistic`, MUI (no direct equivalent — composition), shadcn-ui (composition)
4
+
5
+ ## Purpose
6
+
7
+ Displays a single number prominently — a KPI, count, balance, or metric. The "hero number" of a card or dashboard tile.
8
+
9
+ ## When Statistic vs alternatives
10
+
11
+ | Pattern | Use |
12
+ | --- | --- |
13
+ | **Statistic** | Single value with label + optional delta/trend |
14
+ | **AmountInput display** (read-only) | Editable monetary value |
15
+ | **Progress** | Completion % with bar/ring |
16
+ | **Chart** | Time-series or comparison data |
17
+ | **Card with body text** | Number is part of a paragraph |
18
+
19
+ Use Statistic when the number is the message. The label, delta, and unit are supporting cast.
20
+
21
+ ## Anatomy
22
+
23
+ ```
24
+ ┌──────────────────────────────┐
25
+ │ 이번 달 매출 │ ← label
26
+ │ │
27
+ │ ₩2,847,500 │ ← value (display tier, tabular numerals)
28
+ │ │
29
+ │ ↑ 12% vs 지난 달 │ ← delta (optional, color-coded)
30
+ └──────────────────────────────┘
31
+ ```
32
+
33
+ | Slot | Required | Notes |
34
+ | --- | --- | --- |
35
+ | Label / title | yes | What this number is |
36
+ | Value | yes | The number itself, formatted |
37
+ | Prefix / suffix | optional | Currency symbol, unit |
38
+ | Delta indicator | optional | Trend arrow + comparison ("↑ 12%") |
39
+ | Tooltip / icon | optional | "i" icon for definition |
40
+ | Trend chart (sparkline) | optional | Tiny line chart inline |
41
+
42
+ ## API
43
+
44
+ ```tsx
45
+ <Statistic
46
+ label="이번 달 매출"
47
+ value={2847500}
48
+ prefix="₩"
49
+ precision={0}
50
+ delta={{ value: 0.12, period: "지난 달 대비" }}
51
+ />
52
+
53
+ <Statistic
54
+ label="활성 사용자"
55
+ value={1247}
56
+ delta={{ value: -0.03, period: "지난 주" }}
57
+ variant="compact"
58
+ />
59
+
60
+ <Statistic
61
+ label="응답 시간"
62
+ value={328}
63
+ suffix="ms"
64
+ delta={{ value: -0.15, period: "지난 시간", goalDirection: "down" }}
65
+ />
66
+ ```
67
+
68
+ | Prop | Type | Default | Description |
69
+ | --- | --- | --- | --- |
70
+ | `label` | `string \| ReactNode` | — | Required. What the number is. |
71
+ | `value` | `number \| string` | — | Required. The number (or pre-formatted string). |
72
+ | `prefix` | `string \| ReactNode` | — | E.g., `₩`, `$`, icon |
73
+ | `suffix` | `string \| ReactNode` | — | E.g., `원`, `%`, `ms` |
74
+ | `precision` | `number` | `0` (KRW) / `2` (USD/EUR) | Decimal places |
75
+ | `groupSeparator` | `string` | `,` | Thousands separator |
76
+ | `decimalSeparator` | `string` | `.` | |
77
+ | `delta` | `Delta` | — | Comparison indicator |
78
+ | `variant` | `"default" \| "compact"` | `"default"` | |
79
+ | `size` | `"sm" \| "md" \| "lg" \| "xl"` | `"lg"` | Value font size |
80
+ | `loading` | `boolean` | `false` | Skeleton |
81
+ | `tooltip` | `string` | — | Hover definition (small `i` icon next to label) |
82
+ | `sparkline` | `number[]` | — | Optional inline mini chart |
83
+
84
+ ```ts
85
+ type Delta = {
86
+ value: number; // 0.12 means +12%; -0.03 means -3%
87
+ period: string; // "지난 달 대비" / "vs last month"
88
+ goalDirection?: "up" | "down" | "neutral"; // up=positive trend
89
+ };
90
+ ```
91
+
92
+ ## Sizes
93
+
94
+ | Size | Value font | Label | Use |
95
+ | --- | --- | --- | --- |
96
+ | `sm` | 18px | 12px | Sidebar, dashboard tile inside a card |
97
+ | `md` | 24px | 13px | Standard KPI card |
98
+ | `lg` (default) | 32px | 14px | Hero KPI in a dashboard |
99
+ | `xl` | 48px | 16px | Single hero stat (account balance display) |
100
+
101
+ For account balance / hero amounts: `xl` with `tnum` font feature for tabular numerals.
102
+
103
+ ## Delta — color and direction semantics
104
+
105
+ The delta value's color depends on whether the trend is "good":
106
+
107
+ ```ts
108
+ const goodTrend = delta.goalDirection === "up" ? delta.value > 0 : delta.value < 0;
109
+ const color = goodTrend ? "money-positive" : "money-negative";
110
+ ```
111
+
112
+ | Stat | `goalDirection` | Positive delta = | Color |
113
+ | --- | --- | --- | --- |
114
+ | Revenue | `up` | Good | `money-positive` (green or red KR-stocks) |
115
+ | Errors / latency | `down` | Bad | `money-negative` |
116
+ | Conversion rate | `up` | Good | `money-positive` |
117
+ | Bounce rate | `down` | Bad | `money-negative` |
118
+ | Active users | `up` | Good | `money-positive` |
119
+
120
+ Default: `up`. Most metrics are "more is better".
121
+
122
+ For Korean stock UIs: see [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — color convention is inverted (red=up).
123
+
124
+ ### Delta visual
125
+
126
+ ```
127
+ ↑ 12% vs 지난 달 ← positive trend, good direction (green/red)
128
+ ↓ 3% vs 지난 주 ← negative trend, color depends on goalDirection
129
+ ─ vs 지난 달 ← no change (gray)
130
+ ```
131
+
132
+ Delta arrows: `↑` `↓` are most common. Some apps use `▲` `▼` for stocks.
133
+
134
+ ## Variants
135
+
136
+ ### Default
137
+
138
+ Vertical stack: label top, value middle, delta bottom.
139
+
140
+ ### Compact
141
+
142
+ Single line: `Label Value ±Delta`.
143
+
144
+ ```
145
+ 이번 달 매출 ₩2,847,500 ↑ 12%
146
+ ```
147
+
148
+ Use in dense table cells, sidebar lists.
149
+
150
+ ### Hero
151
+
152
+ `xl` size, often with sparkline inline:
153
+
154
+ ```
155
+ Account balance
156
+ ₩2,847,500 ▁▂▃▅▆▇ ← sparkline
157
+ ↑ 12% 이번 달
158
+ ```
159
+
160
+ ## Tokens consumed
161
+
162
+ ```
163
+ --color-text-primary
164
+ --color-text-secondary (label)
165
+ --color-text-tertiary
166
+ --color-money-positive (good delta)
167
+ --color-money-negative (bad delta)
168
+ --color-money-neutral (no change)
169
+ --space-xs, --space-sm
170
+ --font-size-base, --font-size-xl, --font-size-2xl
171
+ --font-feature-amount: 'tnum' 1 (tabular numerals)
172
+ --font-weight-semibold (value)
173
+ --font-weight-regular (label)
174
+ ```
175
+
176
+ ## Sparkline (inline mini chart)
177
+
178
+ When passed `sparkline`:
179
+ - Renders a small line chart inside the Statistic body.
180
+ - Width: ~60–80px, height: 16–24px.
181
+ - Single line, no axes, no labels — just shape.
182
+ - Color matches the delta direction (or stays neutral).
183
+
184
+ For libraries: `react-sparklines`, `recharts` mini variant, or hand-roll an SVG.
185
+
186
+ ## States
187
+
188
+ | State | Visual |
189
+ | --- | --- |
190
+ | Default | Resting |
191
+ | Loading | Skeleton placeholders for label + value |
192
+ | No data / undefined | Show `—` or "—" instead of "0" — clarifies vs zero |
193
+ | Error | "—" + tooltip explaining failure |
194
+
195
+ ## Accessibility
196
+
197
+ - Label is associated with value via DOM proximity (no special wiring needed for static stats).
198
+ - Numeric value: `aria-label="이번 달 매출 ₩2,847,500"` if the visual format is hard for screen readers.
199
+ - Delta: also include in aria-label — "12% increase vs last month".
200
+ - Don't rely on color alone for delta direction — the arrow does the work.
201
+
202
+ ```html
203
+ <div class="statistic">
204
+ <div class="label">이번 달 매출</div>
205
+ <div class="value" aria-label="이번 달 매출 290만 원, 지난 달 대비 12% 증가">
206
+ ₩2,847,500
207
+ </div>
208
+ <div class="delta delta--positive" aria-hidden="true">↑ 12%</div>
209
+ </div>
210
+ ```
211
+
212
+ ## Code example
213
+
214
+ ```tsx
215
+ // Hero balance
216
+ <Statistic
217
+ label="사용 가능 금액"
218
+ value={user.balance}
219
+ prefix="₩"
220
+ size="xl"
221
+ delta={{ value: 0.04, period: "이번 달", goalDirection: "up" }}
222
+ />
223
+
224
+ // KPI grid
225
+ <div className="grid grid-cols-1 md:grid-cols-4 gap-4">
226
+ <Card><Statistic label="신규 가입" value={47} delta={{ value: 0.18, period: "지난 주" }} /></Card>
227
+ <Card><Statistic label="활성 사용자" value={1247} delta={{ value: -0.03, period: "지난 주" }} /></Card>
228
+ <Card><Statistic label="평균 응답 시간" value={328} suffix="ms" delta={{ value: -0.15, period: "지난 시간", goalDirection: "down" }} /></Card>
229
+ <Card><Statistic label="에러율" value={0.012} suffix="%" delta={{ value: 0.005, period: "지난 시간", goalDirection: "down" }} precision={3} /></Card>
230
+ </div>
231
+
232
+ // Compact in a sidebar
233
+ <aside>
234
+ <Statistic variant="compact" label="잔액" value={user.balance} prefix="₩" />
235
+ <Statistic variant="compact" label="활동 수" value={user.activityCount} />
236
+ </aside>
237
+
238
+ // Loading state
239
+ <Statistic loading label="이번 달 매출" />
240
+
241
+ // No data
242
+ <Statistic label="평균 응답 시간" value="—" />
243
+ ```
244
+
245
+ ## Edge cases
246
+
247
+ - **Zero value with no delta**: render as `0` with no trend indicator.
248
+ - **Negative value** (loss, debt): use `--color-money-negative` for the value, optionally show `−` prefix.
249
+ - **Very large numbers** (1조+): display normally with separators; for hero contexts, consider Korean compact form ("1.2조원" instead of "1,200,000,000,000원").
250
+ - **Currency symbol with locale**: `₩` for KRW, `$` for USD; respect the user's locale preference.
251
+ - **Sparkline with insufficient data** (< 2 points): hide sparkline.
252
+ - **Delta of exactly 0**: render `─ vs 지난 달` (no arrow).
253
+ - **Time-period without comparison data**: omit delta entirely.
254
+ - **Stat that's a fraction** ("12 of 50"): render as compound — `<Statistic value="12 / 50" />` rather than just 12.
255
+
256
+ ## Don't
257
+
258
+ - Don't put 10+ Statistics in one row. 4–6 max for a KPI grid.
259
+ - Don't use Statistic for non-numeric "stats" like "Most popular: Coffee" — that's a Card with body text.
260
+ - Don't auto-update Statistic without a visual cue. Number-tick animations are OK; flashes are not.
261
+ - Don't use `--color-error` for negative-trend values. Use `--color-money-negative`.
262
+ - Don't show delta for static values that don't change (e.g., "Member since 2024-01-15").
263
+ - Don't omit the label. "₩2,847,500" alone is unintelligible.
264
+ - Don't use proportional numerals — use tabular for column alignment.
265
+
266
+ ## References
267
+
268
+ - Ant Design: [`refs/ant-design/components/statistic/`](../refs/ant-design/components/statistic/) — `Statistic` + `Statistic.Countdown` (auto-counting). Solid baseline.
269
+ - MUI: no dedicated component — compose `<Card><CardContent><Typography variant="overline">label</Typography>...`.
270
+ - shadcn-ui: no built-in. Compose from `Card` + Tailwind.
271
+
272
+ API choices made:
273
+ - **`delta` as a structured prop** rather than rendered string: enables consistent color/arrow logic.
274
+ - **`goalDirection` opt-in**: most metrics are "up = good"; let consumer flip when needed.
275
+ - **Tabular numerals enforced** via `font-feature-settings`: KPI grids align cleanly.
276
+
277
+ ## Cross-reference
278
+
279
+ - [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — money color semantics + tabular numerals
280
+ - [`knowledge/patterns/dashboard-composition.md`](../knowledge/patterns/dashboard-composition.md) — placing Statistics in a dashboard
281
+ - [`examples/component-card.md`](component-card.md) — wrapping Statistic in a Card
282
+ - [`examples/component-progress.md`](component-progress.md) — alternative for completion-style metrics
@@ -0,0 +1,157 @@
1
+ # `StepButton` - spec
2
+
3
+ > Direct upstream component: MUI `StepButton`. Parent pattern references: Ant Design `Steps`, MUI `Stepper`, and composed shadcn-style primitives.
4
+
5
+ ## Purpose
6
+
7
+ `StepButton` makes a step indicator clickable in non-linear steppers. Use it when users may revisit completed steps, fix validation errors, or jump between sections in a wizard.
8
+
9
+ Do not use it when the flow must be strictly linear. Future steps should remain unavailable until prerequisites are satisfied.
10
+
11
+ ## Anatomy
12
+
13
+ ```
14
+ StepButton
15
+ ├── Root button
16
+ │ ├── StepIcon optional override
17
+ │ ├── StepLabel text/content
18
+ │ └── Optional text optional helper, e.g. "선택"
19
+ ```
20
+
21
+ | Part | Required | Purpose |
22
+ | --- | --- | --- |
23
+ | Root button | yes | Receives focus and activates navigation to the step. |
24
+ | Icon | optional | Overrides the default number/check/error icon. |
25
+ | Label | yes | Names the step. |
26
+ | Optional node | optional | Marks optional/skipped status. |
27
+
28
+ ## API
29
+
30
+ ```tsx
31
+ <Step completed={isCompleted}>
32
+ <StepButton onClick={() => goToStep(index)} optional={<Text size="sm">선택</Text>}>
33
+ 결제 수단
34
+ </StepButton>
35
+ </Step>
36
+ ```
37
+
38
+ | Prop | Type | Default | Description |
39
+ | --- | --- | --- | --- |
40
+ | `children` | `ReactNode` | - | Usually `StepLabel` or label content passed into `StepLabel`. |
41
+ | `classes` | `Partial<StepButtonClasses>` | - | Style override hooks for MUI-style implementations. |
42
+ | `component` | `React.ElementType` | MUI `ButtonBase` default | Root override. Must preserve button semantics. |
43
+ | `icon` | `ReactNode` | Step index from parent | Icon displayed by the step label. |
44
+ | `optional` | `ReactNode` | - | Secondary optional/skipped content below or beside label. |
45
+ | `sx` | `SxProps<Theme>` | - | MUI system override. Prefer tokens for shared design-system code. |
46
+
47
+ Inherits button-like props from MUI `ButtonBase`. In MUI, `disabled` is controlled by step context rather than the `StepButton` prop surface.
48
+
49
+ ## API choices made
50
+
51
+ - Keep `StepButton` as a child of `Step`. Status and disabled logic should come from the parent stepper.
52
+ - Expose `optional` because multi-step forms often need visible "선택" or "건너뜀" context.
53
+ - Do not add `status` here. Status belongs to `Step`, `StepLabel`, or the parent `Steps` model.
54
+ - Do not use anchors for wizard navigation unless the route actually changes.
55
+
56
+ ## States
57
+
58
+ | State | Trigger | Visual rule |
59
+ | --- | --- | --- |
60
+ | Wait | Future or incomplete step | Muted label and neutral icon. |
61
+ | Process | Current active step | Primary icon/label; set current-step semantics. |
62
+ | Finish | Completed step | Check icon or completed marker; remains clickable if revisiting is allowed. |
63
+ | Error | Step has validation error | Error icon and text label; do not rely on color alone. |
64
+ | Hover | Pointer over enabled step | Subtle background or label emphasis. |
65
+ | Focus-visible | Keyboard focus | 2px focus ring around the whole button, not only the icon. |
66
+ | Active | Press | Pressed background; no layout shift. |
67
+ | Disabled | Future locked step | Muted, non-clickable, `aria-disabled` if not native disabled. |
68
+ | Loading | Step validation pending | Small spinner near label/icon; suppress repeated activation. |
69
+
70
+ ## Tokens consumed
71
+
72
+ ```
73
+ --color-primary-default
74
+ --color-error
75
+ --color-text-primary
76
+ --color-text-secondary
77
+ --color-text-disabled
78
+ --color-bg-subtle
79
+ --color-border-default
80
+ --color-focus-ring
81
+ --space-xs
82
+ --space-sm
83
+ --space-md
84
+ --radius-md
85
+ --motion-fast
86
+ ```
87
+
88
+ ## Accessibility
89
+
90
+ - Render a native `<button type="button">` when the step does not navigate to a new route.
91
+ - The active step must be announced as current. Use `aria-current="step"` on the current step item or button, consistently with the parent `Steps` implementation.
92
+ - Disabled future steps use native `disabled` where possible; custom roots need `aria-disabled="true"` and no activation.
93
+ - Error steps need text in the accessible name, such as "오류: 결제 수단".
94
+ - Touch target must be at least 44x44 on mobile.
95
+ - The connector line remains `aria-hidden`; the button owns only the step label/icon.
96
+
97
+ ### Keyboard
98
+
99
+ | Key | Behavior |
100
+ | --- | --- |
101
+ | `Tab` | Moves through enabled clickable steps in order. |
102
+ | `Enter` / `Space` | Activates the focused step. |
103
+ | Arrow keys | Optional parent-level roving behavior when the stepper is implemented as a tablist. |
104
+
105
+ ## Code example
106
+
107
+ ```tsx
108
+ <Steps current={currentStep} clickable onChange={setCurrentStep}>
109
+ {steps.map((step, index) => (
110
+ <Step
111
+ key={step.id}
112
+ completed={index < currentStep && !step.hasError}
113
+ disabled={index > highestReachableStep}
114
+ status={step.hasError ? "error" : undefined}
115
+ >
116
+ <StepButton
117
+ aria-current={index === currentStep ? "step" : undefined}
118
+ onClick={() => setCurrentStep(index)}
119
+ optional={step.optional ? <Text size="sm">선택</Text> : undefined}
120
+ >
121
+ {step.label}
122
+ </StepButton>
123
+ </Step>
124
+ ))}
125
+ </Steps>
126
+ ```
127
+
128
+ ## Edge cases
129
+
130
+ - **User jumps back and edits**: mark later dependent steps as needing review if their data becomes stale.
131
+ - **Future step disabled**: keep it visible so progress is understandable, but suppress focus/activation.
132
+ - **Validation error in completed step**: keep the step clickable and expose error text in the label.
133
+ - **Vertical stepper**: root button can fill width for easier scanning and larger touch target.
134
+ - **Custom component root**: must forward refs, keyboard events, disabled state, and focus-visible styles.
135
+ - **Long Korean labels**: allow two-line labels in vertical mode; truncate in compact horizontal mode with tooltip only if necessary.
136
+ - **Reduced motion**: remove animated icon transitions; state changes still occur.
137
+
138
+ ## Don't
139
+
140
+ - Don't make future locked steps clickable.
141
+ - Don't use `StepButton` for a decorative progress indicator.
142
+ - Don't put form fields inside the button.
143
+ - Don't encode error/completed state only with icon color.
144
+
145
+ ## References
146
+
147
+ - MUI direct source: [`refs/mui/packages/mui-material/src/StepButton/StepButton.d.ts`](../refs/mui/packages/mui-material/src/StepButton/StepButton.d.ts)
148
+ - MUI implementation: [`refs/mui/packages/mui-material/src/StepButton/StepButton.js`](../refs/mui/packages/mui-material/src/StepButton/StepButton.js)
149
+ - MUI stepper docs/examples: [`refs/mui/docs/data/material/components/steppers/`](../refs/mui/docs/data/material/components/steppers/)
150
+ - Ant Design parent pattern: [`refs/ant-design/components/steps/`](../refs/ant-design/components/steps/)
151
+ - Accessibility baseline: [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md)
152
+
153
+ ## Cross-reference
154
+
155
+ - [examples/component-steps.md](component-steps.md)
156
+ - [examples/component-step-label.md](component-step-label.md)
157
+ - [examples/component-step-icon.md](component-step-icon.md)