@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,77 @@
1
+ # `AlertTitle` — spec
2
+
3
+ > Synthesized from MUI `AlertTitle`. The header line inside an `Alert`. Use for alerts with both a short title and a longer body — without it, the alert just shows a one-line message.
4
+
5
+ ## When to use
6
+
7
+ - Multi-line alerts where the first line is a summary and the rest is detail.
8
+ - Alerts that need a strong visual hierarchy ("Something went wrong" + paragraph of detail).
9
+
10
+ ## When NOT to use
11
+
12
+ - One-line alerts → just use `<Alert>` with text content.
13
+
14
+ ## API
15
+
16
+ ```tsx
17
+ <Alert severity="error">
18
+ <AlertTitle>저장에 실패했어요</AlertTitle>
19
+ 네트워크 연결을 확인하고 다시 시도해 주세요. 문제가 계속되면{' '}
20
+ <Link href="/help">도움말</Link>을 참고하세요.
21
+ </Alert>
22
+ ```
23
+
24
+ | Prop | Type | Default | Description |
25
+ | --- | --- | --- | --- |
26
+ | `children` | `ReactNode` | — | Title text |
27
+
28
+ Extends `Typography` — typography props work.
29
+
30
+ ## Tokens consumed
31
+
32
+ ```
33
+ --font-size-heading-sm /* 16px */
34
+ --font-weight-semibold
35
+ --space-xs /* margin-bottom to body */
36
+ ```
37
+
38
+ ## Accessibility
39
+
40
+ - Renders inside the Alert's accessible region.
41
+ - For severity changes, the title color follows (error red, warning amber, etc.).
42
+ - Don't omit the title for severity-error multi-paragraph alerts — title gives quick scan.
43
+
44
+ ## Edge cases
45
+
46
+ - **Korean honorific** — match the alert severity. Error: 합쇼체 ("저장에 실패하셨습니다"). Info: 해요체 ("저장됐어요").
47
+ - **Long titles** — wrap; for ellipsis, use `noWrap` on Typography.
48
+
49
+ ## Code example
50
+
51
+ ```tsx
52
+ <Alert
53
+ severity="warning"
54
+ action={
55
+ <Button color="inherit" size="small" onClick={handleDismiss}>
56
+ 닫기
57
+ </Button>
58
+ }
59
+ >
60
+ <AlertTitle>저장하지 않은 변경사항이 있어요</AlertTitle>
61
+ 페이지를 떠나면 변경사항이 사라져요. 저장하시겠어요?
62
+ </Alert>
63
+ ```
64
+
65
+ ## Don't
66
+
67
+ - Don't use for one-liner alerts.
68
+ - Don't put interactive elements inside the title — they belong in `action`.
69
+
70
+ ## References
71
+
72
+ - MUI: [`AlertTitle`](../refs/mui/packages/mui-material/src/AlertTitle/)
73
+
74
+ ## Cross-reference
75
+
76
+ - [`component-alert.md`](component-alert.md)
77
+ - [`component-snackbar.md`](component-snackbar.md)
@@ -0,0 +1,192 @@
1
+ # `Alert` (Banner) — spec
2
+
3
+ > Citing Ant Design `Alert`, MUI `Alert`, shadcn-ui `alert`. Different from Toast — Alert is **persistent and inline**, Toast is **transient and floating**.
4
+
5
+ ## Purpose
6
+
7
+ A persistent in-page message: status info, warnings, errors that the user must see and may need to act on. Sticks until dismissed or until the underlying state changes.
8
+
9
+ ## When Alert vs Toast vs Modal
10
+
11
+ | Use | Why |
12
+ | --- | --- |
13
+ | **Alert** | The state persists. The user sees it on every render. Inline in the page. |
14
+ | **Toast** | The state is momentary. Auto-dismisses. Floating. |
15
+ | **Modal** | The user must respond before continuing. Blocks interaction. |
16
+ | **InlineError** (form-level) | Single field validation — use form's ErrorText, not Alert. |
17
+
18
+ ## Anatomy
19
+
20
+ ```
21
+ ┌──────────────────────────────────────────────────────────────┐
22
+ │ [icon] Title [✕] │
23
+ │ Description (optional) │
24
+ │ │
25
+ │ [primary action] [secondary] │ ← actions row (optional)
26
+ └──────────────────────────────────────────────────────────────┘
27
+ ```
28
+
29
+ | Slot | Required | Notes |
30
+ | --- | --- | --- |
31
+ | Intent icon | usually | Matches intent: ℹ ✓ ⚠ ✕ — provides redundant cue beyond color |
32
+ | Title | yes | The message; ≤ 80 chars |
33
+ | Description | optional | Detail or remediation hint |
34
+ | Actions | optional | 1–2 buttons (e.g., "Retry", "Learn more") |
35
+ | Close button | optional (always for `error`) | ✕ in top-right |
36
+
37
+ ## API
38
+
39
+ ```tsx
40
+ <Alert
41
+ intent="warning"
42
+ title="구독 만료가 임박했습니다"
43
+ description="2026년 6월 1일까지 결제 정보를 업데이트해 주세요."
44
+ actions={[
45
+ { label: "결제 정보 업데이트", onClick: handleUpdate, intent: "primary" },
46
+ { label: "나중에", onClick: dismiss, variant: "ghost" },
47
+ ]}
48
+ dismissible
49
+ onDismiss={handleDismiss}
50
+ />
51
+ ```
52
+
53
+ | Prop | Type | Default | Description |
54
+ | --- | --- | --- | --- |
55
+ | `intent` | `"info" \| "success" \| "warning" \| "error"` | `"info"` | Sets icon + color + ARIA role |
56
+ | `title` | `string \| ReactNode` | — | Required. The message. |
57
+ | `description` | `string \| ReactNode` | — | Detail line(s). |
58
+ | `actions` | `Action[]` | — | Up to 2 buttons. |
59
+ | `dismissible` | `boolean` | `false` | Show ✕ |
60
+ | `onDismiss` | `() => void` | — | Called on dismiss |
61
+ | `iconStart` | `ReactNode` | derived from intent | Override the intent icon |
62
+ | `variant` | `"subtle" \| "outlined" \| "solid"` | `"subtle"` | Visual emphasis |
63
+
64
+ ## Variants — `variant`
65
+
66
+ | Variant | Background | Border | Use |
67
+ | --- | --- | --- | --- |
68
+ | `subtle` (default) | `--color-<intent>-subtle-bg` | none | In-page, low-emphasis |
69
+ | `outlined` | `--color-bg-default` | `1px --color-<intent>` | Light pages, when subtle bg blends |
70
+ | `solid` | `--color-<intent>` | none | High-emphasis, full-bleed banners |
71
+
72
+ `subtle` is the right default for 90% of cases. `solid` is for marketing announcements (top-of-page promo banner).
73
+
74
+ ## Intent → token mapping
75
+
76
+ | Intent | Icon | Subtle bg | Border / solid bg | Title color (subtle) |
77
+ | --- | --- | --- | --- | --- |
78
+ | `info` | ℹ | `--color-info-subtle-bg` | `--color-info` | `--color-text-primary` |
79
+ | `success` | ✓ | `--color-success-subtle-bg` | `--color-success` | `--color-text-primary` |
80
+ | `warning` | ⚠ | `--color-warning-subtle-bg` | `--color-warning` | `--color-text-primary` |
81
+ | `error` | ✕ | `--color-error-subtle-bg` | `--color-error` | `--color-text-primary` |
82
+
83
+ For `solid` variant: title and body text become white (or near-black for warning's amber, where contrast inverts).
84
+
85
+ ## States
86
+
87
+ | State | Visual |
88
+ | --- | --- |
89
+ | Default | resting |
90
+ | Action hovered | nested Button states |
91
+ | Dismissed | unmount with 150ms fade-out |
92
+
93
+ Alerts don't have hover/active themselves — only their nested actions do.
94
+
95
+ ## Tokens consumed
96
+
97
+ ```
98
+ --color-info, --color-info-subtle-bg
99
+ --color-success, --color-success-subtle-bg
100
+ --color-warning, --color-warning-subtle-bg
101
+ --color-error, --color-error-subtle-bg
102
+ --color-text-primary
103
+ --color-text-secondary
104
+ --color-bg-default
105
+ --space-md, --space-base
106
+ --radius-md
107
+ --font-size-sm, --font-size-base
108
+ --font-weight-medium
109
+ ```
110
+
111
+ ## Accessibility
112
+
113
+ - **Role**:
114
+ - `role="alert"` for `error` intent — assertive, interrupts screen reader.
115
+ - `role="status"` for `info` / `success` / `warning` — polite.
116
+ - **`aria-live`** matches role implicitly; explicit on the container is fine.
117
+ - **Live region timing**: if the alert is mounted on page load (not in response to action), wrap in a `<div aria-live="off">` initially, then update to live after first paint — otherwise screen readers announce immediately on mount which is jarring.
118
+ - **Dismiss button**: `aria-label="Dismiss alert"`. Focus returns to a logical neighbor (or the next focusable element after the alert) on dismiss.
119
+ - **Color is not the only signal**: every alert has the intent icon — color-blind users see the icon.
120
+ - **For interactive alerts** (with action buttons): they are NOT modals — page content remains tab-reachable around them.
121
+
122
+ ## Code example
123
+
124
+ ```tsx
125
+ // Simple info banner at top of page
126
+ <Alert intent="info" title="새 기능이 추가되었습니다" description="대시보드에서 새 차트를 확인하세요." dismissible />
127
+
128
+ // Error with retry
129
+ <Alert
130
+ intent="error"
131
+ title="저장에 실패했습니다"
132
+ description="네트워크 연결을 확인하고 다시 시도해 주세요."
133
+ actions={[
134
+ { label: "다시 시도", onClick: retry, intent: "primary" },
135
+ ]}
136
+ />
137
+
138
+ // Warning with dismiss
139
+ <Alert
140
+ intent="warning"
141
+ title="계정 보안 경고"
142
+ description="새로운 기기에서 로그인이 감지되었습니다."
143
+ actions={[
144
+ { label: "확인하기", onClick: review },
145
+ ]}
146
+ dismissible
147
+ />
148
+
149
+ // Solid promotional banner (top of page, full-width)
150
+ <Alert
151
+ intent="info"
152
+ variant="solid"
153
+ title="🎉 신규 가입 시 50% 할인"
154
+ description="6월 30일까지 한정"
155
+ actions={[{ label: "자세히 보기", onClick: nav }]}
156
+ />
157
+ ```
158
+
159
+ ## Edge cases
160
+
161
+ - **Multiple alerts stacked**: order by severity (error → warning → info → success). Don't show 5+ alerts simultaneously — collapse to a summary.
162
+ - **Alert with no dismiss + no actions**: legitimate but rare. Make sure the underlying state changes will eventually remove the alert.
163
+ - **Alert that's also a link**: avoid making the entire alert clickable. If it has navigation, use an explicit action button.
164
+ - **Long description that wraps**: title-then-description layout still works; align icon + dismiss to the top, not center.
165
+ - **Inside a modal**: the modal already has assertive-context; Alert inside should use `role="status"` (not `alert`) to avoid double-announcing.
166
+ - **RTL**: dismiss flips to left, actions flow RTL, padding swaps via logical CSS.
167
+
168
+ ## Don't
169
+
170
+ - Don't use Alert for transient feedback ("Saved!"). Use a Toast — Alert sticks around until dismissed.
171
+ - Don't use Alert for form-field errors. Forms have their own ErrorText.
172
+ - Don't auto-dismiss errors after a timeout. They're persistent on purpose.
173
+ - Don't put more than 2 actions in an Alert. If there are 3+ paths, the choice is a Modal.
174
+ - Don't use solid variant inside a card or section — too punchy. Reserve solid for full-bleed banners.
175
+ - Don't ship Alert with no icon AND color-only intent — fails for color-blind users. Always include the icon.
176
+
177
+ ## References
178
+
179
+ - Ant Design: [`refs/ant-design/components/alert/`](../refs/ant-design/components/alert/) — `Alert`, `Alert.ErrorBoundary`. Supports `closable`, `banner` variant, `showIcon`, `action`. Has a "banner" mode for full-width top banners.
180
+ - MUI: [`refs/mui/packages/mui-material/src/Alert/`](../refs/mui/packages/mui-material/src/Alert/) — `Alert` + `AlertTitle`. Variants: `standard` (subtle), `filled` (solid), `outlined`. Closest to this spec.
181
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/alert.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/alert.tsx) — primitive (`Alert`, `AlertTitle`, `AlertDescription`). Composition; intent via className variant.
182
+
183
+ API choices made:
184
+ - **`actions` array prop** rather than children-only: 80% of alerts with actions need exactly 1–2 buttons; the prop is faster than composing.
185
+ - **`variant` (subtle / outlined / solid)** matches MUI's three-tier model. Most universal.
186
+ - **`role` derived from `intent`**: explicit only when overriding (rare).
187
+
188
+ ## Cross-reference
189
+
190
+ - [examples/component-toast.md](component-toast.md) — transient version
191
+ - [examples/component-modal.md](component-modal.md) — blocking version
192
+ - [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md) — focus management on dismiss
@@ -0,0 +1,278 @@
1
+ # `AmountInput` (custom) — spec
2
+
3
+ > Status: example artifact for **custom components** — not derived from Ant/MUI/shadcn. This is the kind of spec the system produces for product-specific components that don't exist upstream.
4
+ >
5
+ > Cited knowledge: [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md), [`knowledge/i18n/korean-typography.md`](../knowledge/i18n/korean-typography.md), [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md)
6
+
7
+ ## Purpose
8
+
9
+ A specialized text input for entering currency amounts — the most-used input in any fintech / 가계부 / e-commerce product. Critical to get right because:
10
+
11
+ - Auto-formatting must not break caret position.
12
+ - Pasting and IME composition must work cleanly.
13
+ - Korean conventions differ from Latin (no decimals for KRW, suffix `원` vs prefix `₩`, comma separator).
14
+ - Validation (positive only, balance ceiling, max amount) is per-context.
15
+
16
+ This is **not a Slider, not a stepper** — it's a text input optimized for amounts.
17
+
18
+ ## Anatomy
19
+
20
+ ```
21
+ ┌─────────────────────────────────────────┐
22
+ │ 1,234,567 원 │ ← suffix style (consumer)
23
+ └─────────────────────────────────────────┘
24
+
25
+ ┌─────────────────────────────────────────┐
26
+ │ ₩ 1,234,567 │ ← prefix style (fintech)
27
+ └─────────────────────────────────────────┘
28
+
29
+ [+1만] [+5만] [+10만] [+100만] ← optional quick chips
30
+ ┌─────────────────────────────────────────┐
31
+ │ 0 원 ✕ │
32
+ └─────────────────────────────────────────┘
33
+ 잔액 ₩2,500,000 [전액 사용] ← optional balance + max button
34
+ ```
35
+
36
+ | Slot | Required | Notes |
37
+ | --- | --- | --- |
38
+ | Input field | yes | Numeric-only via `inputmode="numeric"` |
39
+ | Affix (₩ prefix or 원 suffix) | yes | Decorative — visually inside the input but not editable |
40
+ | Clear button | optional | ✕ when value > 0 |
41
+ | Quick chips | optional | Pre-fill amounts (`+1만`, `+5만`, `+10만`, `+100만`) |
42
+ | Max affordance | optional | "전액" / "전액 사용" — populates with full balance |
43
+ | Balance display | optional | "잔액 ₩X" beside or below |
44
+ | Help / error text | optional | Standard Input pattern |
45
+
46
+ ## API
47
+
48
+ ```tsx
49
+ <AmountInput
50
+ value={amount}
51
+ onValueChange={setAmount}
52
+ currency="KRW"
53
+ affixStyle="suffix"
54
+ max={balance}
55
+ showBalance
56
+ balance={balance}
57
+ showQuickChips
58
+ quickChipAmounts={[10000, 50000, 100000, 1000000]}
59
+ showMaxButton
60
+ errorText={amount > balance ? "잔액이 부족합니다" : undefined}
61
+ />
62
+ ```
63
+
64
+ | Prop | Type | Default | Description |
65
+ | --- | --- | --- | --- |
66
+ | `value` | `number \| null` | — | Numeric value (in smallest unit — won for KRW). |
67
+ | `onValueChange` | `(value: number \| null) => void` | — | Numeric, not formatted string |
68
+ | `currency` | `"KRW" \| "USD" \| "JPY" \| "EUR" \| "CNY"` | `"KRW"` | Drives format + decimal precision |
69
+ | `affixStyle` | `"prefix" \| "suffix"` | `"suffix"` (KRW consumer) / `"prefix"` (other) | |
70
+ | `min` | `number` | `0` | Smallest allowed |
71
+ | `max` | `number` | — | Largest (e.g., balance) |
72
+ | `step` | `number` | `1` (KRW) / `0.01` (USD) | Smallest increment |
73
+ | `placeholder` | `string` | `"0"` | |
74
+ | `showBalance` | `boolean` | `false` | Render balance below |
75
+ | `balance` | `number` | — | The user's balance (for display + validation) |
76
+ | `showQuickChips` | `boolean` | `false` | Render add-amount chips above |
77
+ | `quickChipAmounts` | `number[]` | `[10000, 50000, 100000, 1000000]` (KRW) | Chip amounts (added to current value) |
78
+ | `showMaxButton` | `boolean` | `false` | "전액 사용" affordance |
79
+ | `disabled` / `readOnly` | `boolean` | `false` | |
80
+ | `error` / `errorText` | — | — | Validation state |
81
+ | `label` / `helpText` | — | — | Inherited from Input |
82
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
83
+ | `autoFocus` | `boolean` | `false` | |
84
+
85
+ ## Currency-driven format
86
+
87
+ | Currency | Decimal | Separator | Default affix | Example |
88
+ | --- | --- | --- | --- | --- |
89
+ | KRW (₩) | 0 | `,` | `원` suffix (consumer) / `₩` prefix (fintech) | `1,234,567원` / `₩1,234,567` |
90
+ | USD ($) | 2 | `,` decimal `.` | `$` prefix | `$1,234.56` |
91
+ | JPY (¥) | 0 | `,` | `¥` prefix | `¥1,234` |
92
+ | EUR (€) | 2 | `.` decimal `,` | `€` suffix or prefix (locale-dependent) | `1.234,56 €` |
93
+ | CNY (¥) | 2 | `,` decimal `.` | `¥` prefix | `¥1,234.56` |
94
+
95
+ Per [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md).
96
+
97
+ ## Behavior
98
+
99
+ ### Auto-format
100
+
101
+ - User types `1234567` → field shows `1,234,567`. Caret position must not jump.
102
+ - Implementation: format-on-input, with caret restored to the equivalent visual position.
103
+ - Use `react-number-format` or similar; don't roll from scratch (caret bugs).
104
+
105
+ ### Pasting
106
+
107
+ User pastes `12,500.00` (or `₩12,500`, or `$12.50`). The input must:
108
+
109
+ 1. Strip all non-digits except decimal separator.
110
+ 2. For KRW (no decimals): strip everything after the decimal too.
111
+ 3. Re-format with thousands separators.
112
+ 4. Land on `12,500`.
113
+
114
+ For input mode in Korean apps, paste handling is the most common bug area — test with locale-formatted clipboard content.
115
+
116
+ ### Quick chips
117
+
118
+ Tapping `+5만` adds 50,000 to the current value. Adds, doesn't replace:
119
+
120
+ ```
121
+ Current: 12,000
122
+ After tap on [+5만]: 62,000
123
+ ```
124
+
125
+ This is canonical in Korean transfer / 송금 apps.
126
+
127
+ ### Max affordance
128
+
129
+ For "send all balance":
130
+ - "전액" or "전액 사용" button populates the field with the full balance.
131
+ - Useful in transfer flows.
132
+ - Validate that balance is fresh — don't overflow.
133
+
134
+ ### IME composition
135
+
136
+ For Korean apps where Hangul keyboard is default:
137
+ - Hangul keys produce non-numeric input that should be filtered.
138
+ - Don't crash on weird character; just ignore non-digit keystrokes.
139
+ - `inputmode="numeric"` on mobile triggers numeric keypad — bypassing Hangul entry.
140
+
141
+ ### Validation timing
142
+
143
+ | Trigger | What |
144
+ | --- | --- |
145
+ | Typing | Format only. No errors yet. |
146
+ | Blur | Validate (>= min, <= max). Show error. |
147
+ | Quick chip | Re-validate immediately. If exceeds max, cap or show error. |
148
+
149
+ For "send transfer" flows: server-side validation also runs at submit (balance might have changed).
150
+
151
+ ## States
152
+
153
+ | State | Visual |
154
+ | --- | --- |
155
+ | Empty | Placeholder (`0`), affix in muted color |
156
+ | Typing | Live formatting with caret preserved |
157
+ | Filled | Value formatted, affix prominent |
158
+ | Focus-visible | 2px ring (matches Input spec) |
159
+ | Error | Border red, `errorText` shown |
160
+ | Disabled | Muted, no events |
161
+ | Over balance | Amber border + warning text "잔액이 부족합니다" |
162
+
163
+ ## Sizes
164
+
165
+ Inherited from Input. `lg` is most common for primary amount inputs (transfer screens, payment) — large touch target + readable digits.
166
+
167
+ | Size | Height | Font | Suggested affix size |
168
+ | --- | --- | --- | --- |
169
+ | `sm` | 32px | 14px | 13px |
170
+ | `md` (default) | 40px | 16px | 15px |
171
+ | `lg` | 56px | 24px (numerals) | 18px |
172
+
173
+ For amounts in primary CTAs: bump font to `display` size — 28–32px tabular numerals.
174
+
175
+ ## Tokens consumed
176
+
177
+ ```
178
+ --color-bg-default
179
+ --color-border-default
180
+ --color-border-strong
181
+ --color-text-primary
182
+ --color-text-secondary (affix when not focused)
183
+ --color-text-tertiary
184
+ --color-error
185
+ --color-warning (over-balance state)
186
+ --color-focus-ring
187
+ --color-primary-default (chip active state)
188
+ --color-primary-subtle-bg (chip bg)
189
+ --space-md, --space-base
190
+ --radius-md
191
+ --font-feature-amount: 'tnum' 1 (tabular numerals — critical)
192
+ --font-size-base, --font-size-xl, --font-size-2xl
193
+ --motion-fast
194
+ ```
195
+
196
+ ## Accessibility
197
+
198
+ - Input role: standard `<input type="text" inputmode="numeric">` (not `type="number"` — see [`patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md)).
199
+ - `aria-label` if no visible label. For a transfer screen, "Amount to send".
200
+ - `aria-describedby` linking to balance / error / help text.
201
+ - `aria-invalid="true"` on error.
202
+ - For `step` semantics: not strictly needed (text input), but `aria-valuemin` / `aria-valuemax` can be added for assistive tech.
203
+ - Quick chips and max button: standard `<button>` with `aria-label` describing what they do.
204
+
205
+ ## Code example
206
+
207
+ ```tsx
208
+ function TransferScreen() {
209
+ const [amount, setAmount] = useState<number | null>(null);
210
+ const balance = useBalance();
211
+ const isOverBalance = amount && amount > balance;
212
+
213
+ return (
214
+ <div>
215
+ <AmountInput
216
+ label="보낼 금액"
217
+ value={amount}
218
+ onValueChange={setAmount}
219
+ currency="KRW"
220
+ affixStyle="suffix"
221
+ max={balance}
222
+ size="lg"
223
+ showQuickChips
224
+ showMaxButton
225
+ showBalance
226
+ balance={balance}
227
+ errorText={isOverBalance ? "잔액이 부족합니다" : undefined}
228
+ autoFocus
229
+ />
230
+
231
+ <Button
232
+ size="lg"
233
+ disabled={!amount || isOverBalance}
234
+ loading={isTransferring}
235
+ onClick={() => transfer(amount)}
236
+ >
237
+ {amount ? `${formatKRW(amount)}원 보내기` : "금액을 입력하세요"}
238
+ </Button>
239
+ </div>
240
+ );
241
+ }
242
+ ```
243
+
244
+ ## Edge cases
245
+
246
+ - **Pasted negative**: strip the `-`. Use `min` validation, don't allow negative entry.
247
+ - **Decimal in KRW**: strip. KRW is integer.
248
+ - **Very large numbers** (≥ 100조 / 100 trillion): allowed but may not format prettily (Korean number names break down). Display as comma-separated digits.
249
+ - **Amount equal to balance** (sending all): allow if `max=balance`; balance becomes 0 after.
250
+ - **Balance changes mid-edit** (background sync updates): re-validate on next blur. Don't reset typed amount.
251
+ - **Multi-currency conversion display**: outside this component's scope. Pair with a separate display.
252
+ - **Max button when balance not loaded**: disable until balance arrives.
253
+ - **Auto-fill leaves bad format**: most browsers don't autofill amount inputs. If they do, re-format on detection.
254
+ - **0 as a valid value**: usually invalid for transfers (can't send 0). For 가계부, 0 might be valid (record a free meal). Pass `min={0}` as appropriate.
255
+
256
+ ## Don't
257
+
258
+ - Don't use `type="number"` — strips formatting, scrolls on wheel, rejects commas.
259
+ - Don't render the affix as an editable character.
260
+ - Don't auto-submit on Enter without confirmation modal for transfer-type actions.
261
+ - Don't show currency conversion approximation without "약" annotation.
262
+ - Don't display the value formatted in a way the user didn't type (e.g., user types `100`, you display `100원`, then on blur convert to `1만`). Stay literal.
263
+ - Don't allow negative amounts via input.
264
+ - Don't fire validation on every keystroke. Wait for blur.
265
+
266
+ ## API rationale
267
+
268
+ - **`value: number` (not formatted string)**: the source of truth is the integer. Formatting is presentation. Always pass numbers between AmountInput and the rest of the app.
269
+ - **`currency` prop drives format**: avoids passing 5 separate format props (decimals, separator, affix). One declarative prop.
270
+ - **Quick chips + max button as opt-in**: not all amount inputs need them. Form-field amount in a 가계부 receipt doesn't need quick chips.
271
+
272
+ ## Cross-reference
273
+
274
+ - [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — comprehensive money-display rules
275
+ - [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — payment UX context
276
+ - [`knowledge/i18n/korean-typography.md`](../knowledge/i18n/korean-typography.md) — IME composition handling
277
+ - [`examples/component-input.md`](component-input.md) — base Input spec this extends
278
+ - [`examples/component-form.md`](component-form.md) — form orchestration