@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,271 @@
1
+ # `InputOTP` (one-time password input) — spec
2
+
3
+ > Citing Ant Design `Input.OTP`, MUI (no built-in), shadcn-ui `input-otp`
4
+
5
+ ## Purpose
6
+
7
+ A multi-cell input for one-time passwords / verification codes. Each digit lives in its own visual cell. Used for: SMS verification, 2FA codes, app verification (KakaoTalk login auth).
8
+
9
+ In Korean fintech: **mandatory** for SMS-based 본인인증 verification flows.
10
+
11
+ ## Anatomy
12
+
13
+ ```
14
+ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐
15
+ │ 1│ │ 2│ │ 3│ │ 4│ │ 5│ │ 6│ ← 6-digit code (Korean SMS standard)
16
+ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘
17
+ [Resend] in 30s
18
+ ```
19
+
20
+ | Slot | Required | Notes |
21
+ | --- | --- | --- |
22
+ | Cells | yes | One per digit, square boxes |
23
+ | Active cell indicator | yes | Cursor / border emphasis on current input |
24
+ | Resend button | optional | Below the input — re-request the code |
25
+
26
+ ## API
27
+
28
+ ```tsx
29
+ <InputOTP
30
+ length={6}
31
+ value={code}
32
+ onValueChange={setCode}
33
+ onComplete={(code) => verify(code)}
34
+ autoFocus
35
+ />
36
+ ```
37
+
38
+ | Prop | Type | Default | Description |
39
+ | --- | --- | --- | --- |
40
+ | `length` | `number` | `6` | Number of cells |
41
+ | `value` | `string` | — | Current value |
42
+ | `onValueChange` | `(value: string) => void` | — | Fires on each cell change |
43
+ | `onComplete` | `(value: string) => void` | — | Fires when all cells filled |
44
+ | `autoFocus` | `boolean` | `false` | Focus first cell on mount |
45
+ | `disabled` | `boolean` | `false` | |
46
+ | `error` / `errorText` | — | — | |
47
+ | `pattern` | `"numeric" \| "alphanumeric"` | `"numeric"` | Allowed chars per cell |
48
+ | `mask` | `boolean` | `false` | Mask digits as ` • ` (security; rare for SMS codes) |
49
+ | `separator` | `ReactNode` | — | Visual separator after N cells (e.g., `-` after 3) |
50
+
51
+ ## Behavior
52
+
53
+ ### Per-cell typing
54
+
55
+ - User types in cell 1: digit appears, focus auto-advances to cell 2.
56
+ - Continues until all cells filled.
57
+ - On complete: `onComplete` fires.
58
+
59
+ ### Backspace
60
+
61
+ - Backspace in an empty cell: focus moves back, deletes previous cell's digit.
62
+ - Backspace in a filled cell: deletes that digit, focus stays.
63
+
64
+ ### Paste
65
+
66
+ User pastes a 6-digit code (e.g., from SMS). Distribute across cells:
67
+ - "123456" → cells become 1, 2, 3, 4, 5, 6.
68
+ - "12 34 56" → strip spaces, distribute.
69
+ - "123-456" → strip non-digits, distribute.
70
+ - Mid-paste: cursor lands on the last filled cell or after.
71
+
72
+ This is the most-tested path — get it right.
73
+
74
+ ### Auto-fill (mobile)
75
+
76
+ iOS / Android can auto-fill SMS codes from the most recent text message. Set `autoComplete="one-time-code"` on the input:
77
+
78
+ ```tsx
79
+ <input
80
+ type="text"
81
+ inputMode="numeric"
82
+ autoComplete="one-time-code"
83
+ pattern="[0-9]*"
84
+ maxLength={1}
85
+ />
86
+ ```
87
+
88
+ iOS reads the SMS notification, extracts the code, and offers to autofill.
89
+
90
+ ## States
91
+
92
+ | State | Visual |
93
+ | --- | --- |
94
+ | Empty | Cells empty, first cell focus ring |
95
+ | Active cell | Border highlighted (primary), cursor visible |
96
+ | Filled cell | Digit visible, border default |
97
+ | Complete | All filled; `onComplete` fired |
98
+ | Error | All cells red border |
99
+ | Disabled | Muted, no events |
100
+ | Loading (verifying) | Cells dimmed, spinner overlay |
101
+
102
+ ## Sizes
103
+
104
+ | Size | Cell | Font | Gap |
105
+ | --- | --- | --- | --- |
106
+ | `sm` | 32×40 | 16px | 4px |
107
+ | `md` (default) | 40×48 | 20px | 8px |
108
+ | `lg` | 48×56 | 24px | 12px |
109
+
110
+ For mobile primary auth: `lg` is right (large touch targets, clear digits).
111
+
112
+ ## Tokens consumed
113
+
114
+ ```
115
+ --color-bg-default
116
+ --color-border-default (cell border)
117
+ --color-border-strong (hover)
118
+ --color-primary-default (active cell, complete state)
119
+ --color-text-primary
120
+ --color-error (error state)
121
+ --color-focus-ring
122
+ --space-xs, --space-sm
123
+ --radius-md
124
+ --font-size-xl (digit display)
125
+ --font-feature-amount: 'tnum' 1 (tabular numerals — digits align)
126
+ ```
127
+
128
+ ## Accessibility
129
+
130
+ - Container: `<fieldset>` with `<legend>` ("인증번호 입력").
131
+ - Each cell: `<input type="text" inputMode="numeric" maxLength={1}>` with `aria-label="N번째 자리"`.
132
+ - Group: `role="group"` for screen reader awareness.
133
+ - Error: `role="alert"` on errorText.
134
+
135
+ ```html
136
+ <fieldset>
137
+ <legend class="sr-only">인증번호 입력</legend>
138
+ <div role="group">
139
+ <input aria-label="1번째 자리" maxlength="1" inputmode="numeric" autocomplete="one-time-code" />
140
+ <input aria-label="2번째 자리" maxlength="1" inputmode="numeric" />
141
+ ...
142
+ </div>
143
+ </fieldset>
144
+ ```
145
+
146
+ ### Keyboard
147
+
148
+ | Key | Behavior |
149
+ | --- | --- |
150
+ | `Tab` | Reach first cell |
151
+ | Type digit | Auto-advance to next |
152
+ | `Backspace` | Delete + go back |
153
+ | `←` / `→` | Move between cells |
154
+ | `Home` / `End` | First / last cell |
155
+ | `Cmd+V` / `Ctrl+V` | Paste full code |
156
+
157
+ ## Korean SMS verification flow
158
+
159
+ Standard pattern in Korean fintech / banking:
160
+
161
+ 1. User enters phone number.
162
+ 2. App sends SMS via vendor (NICE, KCB, Toss).
163
+ 3. SMS arrives: `[XXX 인증번호] 123456 입력해주세요.`
164
+ 4. User enters code in InputOTP.
165
+ 5. App verifies via vendor API.
166
+ 6. Either: success → proceed; OR: 3+ failures → reset.
167
+
168
+ ### Resend timer
169
+
170
+ Always include a "재전송" (resend) button with a 30–60s cooldown:
171
+
172
+ ```tsx
173
+ <div>
174
+ <InputOTP length={6} onComplete={verify} />
175
+ <ResendButton cooldown={30} onResend={requestNewCode} />
176
+ {/* Shows: "30초 후 재전송" → "재전송하기" after countdown */}
177
+ </div>
178
+ ```
179
+
180
+ Rate-limit re-sends server-side (max 5/hour typical).
181
+
182
+ ## Error states
183
+
184
+ | Cause | Message |
185
+ | --- | --- |
186
+ | Wrong code | "인증번호가 올바르지 않습니다." |
187
+ | Expired code | "인증번호가 만료되었습니다. 다시 발급해 주세요." |
188
+ | Too many attempts | "인증 시도 횟수를 초과했습니다. 잠시 후 다시 시도해 주세요." |
189
+ | Network | "네트워크 연결을 확인해 주세요." |
190
+
191
+ Clear the input on error so user can re-type.
192
+
193
+ ## Code example
194
+
195
+ ```tsx
196
+ function VerifyPhoneScreen({ phone }: Props) {
197
+ const [code, setCode] = useState("");
198
+ const [error, setError] = useState<string>();
199
+ const [verifying, setVerifying] = useState(false);
200
+ const [cooldown, setCooldown] = useCountdown(30);
201
+
202
+ const handleVerify = async (otpCode: string) => {
203
+ setVerifying(true);
204
+ try {
205
+ await api.verifyCode({ phone, code: otpCode });
206
+ navigation.navigate("Success");
207
+ } catch (err) {
208
+ setError(err.message);
209
+ setCode("");
210
+ } finally {
211
+ setVerifying(false);
212
+ }
213
+ };
214
+
215
+ return (
216
+ <Page>
217
+ <h1>인증번호 입력</h1>
218
+ <p>{phone}로 보낸 6자리 인증번호를 입력해 주세요.</p>
219
+
220
+ <InputOTP
221
+ length={6}
222
+ value={code}
223
+ onValueChange={setCode}
224
+ onComplete={handleVerify}
225
+ autoFocus
226
+ disabled={verifying}
227
+ errorText={error}
228
+ />
229
+
230
+ <Button
231
+ variant="link"
232
+ onClick={() => { resendCode(); setCooldown(30); }}
233
+ disabled={cooldown > 0}
234
+ >
235
+ {cooldown > 0 ? `${cooldown}초 후 재전송` : "재전송하기"}
236
+ </Button>
237
+ </Page>
238
+ );
239
+ }
240
+ ```
241
+
242
+ ## Edge cases
243
+
244
+ - **Paste includes non-digits**: filter to digits only, distribute remaining across cells.
245
+ - **Paste shorter than length**: fill from start, leave rest empty.
246
+ - **Paste longer than length**: take first N digits.
247
+ - **User types fast**: each cell may flicker — make sure auto-advance doesn't skip.
248
+ - **Auto-fill replaces manual entry**: respect user's intent — auto-fill once if user hasn't typed yet; don't override mid-typing.
249
+ - **Lost focus**: when user dismisses keyboard then returns, focus the next empty cell.
250
+
251
+ ## Don't
252
+
253
+ - Don't omit `autoComplete="one-time-code"` — auto-fill is a major UX win.
254
+ - Don't allow non-digit input (unless `pattern="alphanumeric"` for special cases).
255
+ - Don't reset entire input on error — let user just fix the wrong cells.
256
+ - Don't skip the resend cooldown — user-initiated DoS risk.
257
+ - Don't show the digits as plaintext in screen readers if `mask=true` was requested.
258
+ - Don't make cells too small to tap reliably (≥ 40px on mobile).
259
+
260
+ ## References
261
+
262
+ - Ant Design: [`refs/ant-design/components/input/`](../refs/ant-design/components/input/) — `Input.OTP`. Length, formatting, paste handling.
263
+ - MUI: no built-in. Compose individual `<TextField>` cells.
264
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/input-otp.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/input-otp.tsx) — wraps `input-otp` library. **Default for new projects.**
265
+
266
+ ## Cross-reference
267
+
268
+ - [`examples/component-input.md`](component-input.md) — base Input
269
+ - [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md) — phone-first auth + 본인인증
270
+ - [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — payment-related verification
271
+ - [`examples/component-biometric-gate.md`](component-biometric-gate.md) — biometric fallback path
@@ -0,0 +1,213 @@
1
+ # `Input` — spec
2
+
3
+ > Status: example artifact for `component-spec-writer` skill
4
+ > Generated by: `skills/component-spec-writer`, citing Ant Design `Input`, MUI `TextField`, shadcn-ui `input` + `label`
5
+
6
+ ## Purpose
7
+
8
+ A single-line text input. The most-used form control. Must compose with labels, help text, and errors; must accept controlled and uncontrolled values; must clear WCAG AA in every state.
9
+
10
+ ## Anatomy
11
+
12
+ ```
13
+ Field (the row)
14
+ ├── Label (above input)
15
+ ├── Input
16
+ │ ├── [iconStart]? prefix slot
17
+ │ ├── input element
18
+ │ ├── [iconEnd]? suffix slot (status icon, clear button, password toggle, etc.)
19
+ │ └── [addonStart/End]? text/button addon (e.g., `https://`, `/page`)
20
+ ├── HelpText (below — neutral hint)
21
+ └── ErrorText (below — replaces HelpText in error state)
22
+ ```
23
+
24
+ | Part | Purpose | Required |
25
+ | --- | --- | --- |
26
+ | Label | What this field is | yes (visible OR `aria-label`) |
27
+ | Input | The control | yes |
28
+ | HelpText | Why or how (constraints, format) | optional |
29
+ | ErrorText | What's wrong, how to fix | required when `error` |
30
+ | iconStart/End | Icon affordance inside the field | optional |
31
+ | addonStart/End | Text or control attached to the side | optional |
32
+
33
+ ## API
34
+
35
+ | Prop | Type | Default | Description |
36
+ | --- | --- | --- | --- |
37
+ | `value` | `string` | — | Controlled value. |
38
+ | `defaultValue` | `string` | — | Uncontrolled initial value. |
39
+ | `onChange` | `(value: string, e: ChangeEvent) => void` | — | Fires per keystroke. First arg is value (most-used), event second. |
40
+ | `onBlur` | `(e: FocusEvent) => void` | — | Fires when input loses focus. Use to trigger validation. |
41
+ | `label` | `string \| ReactNode` | — | Visible label. If omitted, **`aria-label` is required**. |
42
+ | `placeholder` | `string` | — | Format hint. Never the label. Disappears on input. |
43
+ | `helpText` | `string \| ReactNode` | — | Below-field hint. Always visible until error replaces it. |
44
+ | `errorText` | `string` | — | Below-field error. Setting non-empty implies `error={true}`. |
45
+ | `error` | `boolean` | inferred from `errorText` | Force error styling without text. |
46
+ | `required` | `boolean` | `false` | Marks visually + sets `aria-required`. Visible label gets `(optional)` on others. |
47
+ | `disabled` | `boolean` | `false` | Removes interactivity. |
48
+ | `readOnly` | `boolean` | `false` | Value visible but not editable. Different from disabled — focus/copy still work. |
49
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
50
+ | `type` | `"text" \| "email" \| "password" \| "tel" \| "url" \| "search"` | `"text"` | Drives mobile keyboard via native attr. |
51
+ | `inputMode` | `HTMLAttributes['inputMode']` | derived from `type` | Override mobile keyboard. |
52
+ | `autoComplete` | `string` | — | `"email"`, `"new-password"`, `"current-password"`, `"tel"`, etc. **Always set** for known semantic fields. |
53
+ | `iconStart` | `ReactNode` | — | Icon inside left side of input. |
54
+ | `iconEnd` | `ReactNode` | — | Icon inside right side. Auto-rendered for password toggle, clear button, status. |
55
+ | `addonStart` | `ReactNode` | — | Attached element outside the input on the left (e.g., `https://`). |
56
+ | `addonEnd` | `ReactNode` | — | Attached element outside the input on the right. |
57
+ | `clearable` | `boolean` | `false` | Renders an `×` clear button when value is non-empty. |
58
+ | `showPasswordToggle` | `boolean` | `true` for `type="password"` | Eye icon to show/hide. |
59
+ | `maxLength` | `number` | — | Hard limit. If set, render counter `0/100`. |
60
+ | `name` | `string` | — | Form name. Required for native form submission. |
61
+ | `id` | `string` | auto-generated | Used by `<label htmlFor>`. |
62
+ | `fullWidth` | `boolean` | `true` | Inputs default full-width within their parent. |
63
+
64
+ ## States
65
+
66
+ | State | Trigger | Visual |
67
+ | --- | --- | --- |
68
+ | Default | resting | 1px border `--color-border-default`, bg `--color-bg-default` |
69
+ | Hover | mouse-over | border `--color-border-strong` |
70
+ | Focus-visible | keyboard tab | 2px ring `--color-focus-ring`, 2px offset; border `--color-primary-default` |
71
+ | Filled | `value` non-empty | unchanged (don't darken) |
72
+ | Error | `error` | border `--color-error`, focus ring `--color-error/40`, errorText shown |
73
+ | Disabled | `disabled` | bg `--color-bg-subtle`, text `--color-text-disabled`, no border emphasis |
74
+ | Read-only | `readOnly` | bg `--color-bg-subtle`, no border emphasis, cursor `text` |
75
+ | Loading (async validation) | `loading` (custom prop) | spinner in iconEnd slot |
76
+
77
+ ## Sizes
78
+
79
+ | Size | Height | Font | Padding-x | Icon size | Use |
80
+ | --- | --- | --- | --- | --- | --- |
81
+ | `sm` | 32px | 13px | 8px | 14px | dense forms, compact UIs |
82
+ | `md` | 40px | 14px | 12px | 16px | default |
83
+ | `lg` | 48px | 16px | 16px | 20px | mobile-priority forms |
84
+
85
+ ## Tokens consumed
86
+
87
+ ```
88
+ --color-border-default
89
+ --color-border-strong
90
+ --color-bg-default
91
+ --color-bg-subtle
92
+ --color-text-primary
93
+ --color-text-secondary
94
+ --color-text-tertiary
95
+ --color-text-disabled
96
+ --color-primary-default
97
+ --color-error
98
+ --color-focus-ring
99
+ --space-sm
100
+ --space-md
101
+ --radius-md
102
+ --font-size-sm
103
+ --font-size-base
104
+ --font-size-lg
105
+ --transition-fast
106
+ ```
107
+
108
+ ## Accessibility
109
+
110
+ - **Semantic**: native `<input>`. Always paired with `<label>` (visible) or `aria-label`.
111
+ - `<label htmlFor={id}>` is the strongest pattern — clicking the label focuses the input.
112
+ - **Required**:
113
+ - `required` attribute (HTML).
114
+ - `aria-required="true"` (explicit for AT).
115
+ - Visible "Required" indicator (or `(optional)` on optionals — see [knowledge/patterns/form-design.md](../knowledge/patterns/form-design.md)).
116
+ - **Error**:
117
+ - `aria-invalid="true"` when `error`.
118
+ - `aria-describedby` pointing to the error text element's id.
119
+ - Error text in `role="alert"` for assertive announcement, or `aria-live="polite"` for non-blocking.
120
+ - **Help text**: `aria-describedby` pointing to the help element (in addition to error when present, both ids).
121
+ - **Password show/hide**: the toggle button needs its own `aria-label="Show password"` / `"Hide password"`.
122
+ - **Clear button**: `aria-label="Clear"`.
123
+ - **Touch target**: input height ≥ 40px for mobile. `sm` (32px) is too small for touch primary forms.
124
+ - **Keyboard**:
125
+ - `Tab` reaches.
126
+ - `Esc` clears search-type inputs (convention, not native).
127
+ - For comboboxes built on top of input, follow [WAI-ARIA APG combobox pattern](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/).
128
+ - **Autofill**: `autoComplete` attribute is required for password manager and browser autofill. Skipping it is a real friction cost.
129
+
130
+ ## Code example
131
+
132
+ ```tsx
133
+ // Default — labeled, with help text
134
+ <Input
135
+ label="Email"
136
+ type="email"
137
+ placeholder="name@company.com"
138
+ helpText="We'll only use this for password recovery."
139
+ autoComplete="email"
140
+ value={email}
141
+ onChange={setEmail}
142
+ required
143
+ />
144
+
145
+ // Error state
146
+ <Input
147
+ label="Password"
148
+ type="password"
149
+ value={password}
150
+ onChange={setPassword}
151
+ errorText="Password must include a number."
152
+ autoComplete="new-password"
153
+ required
154
+ />
155
+
156
+ // With icon and clearable
157
+ <Input
158
+ label="Search"
159
+ type="search"
160
+ iconStart={<SearchIcon />}
161
+ clearable
162
+ value={query}
163
+ onChange={setQuery}
164
+ />
165
+
166
+ // With addon (URL prefix)
167
+ <Input
168
+ label="Site URL"
169
+ addonStart="https://"
170
+ placeholder="example.com"
171
+ value={url}
172
+ onChange={setUrl}
173
+ />
174
+
175
+ // Read-only display
176
+ <Input label="Account ID" value="acc_8f2k...3jq" readOnly />
177
+ ```
178
+
179
+ ## Edge cases
180
+
181
+ - **Pasting overflows `maxLength`**: native truncates. Surface the behavior with the counter going red and a help-text update.
182
+ - **`type="number"` quirks**: avoid for currency/decimals — strips leading zeros, rejects formatting, scrolls on accidental wheel. Use `type="text" inputMode="decimal"` and parse on blur.
183
+ - **Password manager covering iconEnd**: 1Password and similar overlay over the right side of password fields. Don't put critical UI there for `type="password"`.
184
+ - **iOS auto-zoom on font-size < 16px**: focusing an input with smaller font triggers Safari zoom. Either set `font-size: 16px` or add `<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">` (the latter is debated for a11y).
185
+ - **RTL**: `iconStart` mirrors right, `iconEnd` mirrors left, padding swaps. Use logical CSS properties.
186
+ - **Korean input**: IME (input method editor) generates intermediate states (조합 중). Don't validate per-keystroke during composition. Listen to `compositionstart`/`compositionend` and skip validation between them.
187
+
188
+ ## Don't
189
+
190
+ - Don't use `placeholder` as the only label.
191
+ - Don't make `label` the only error indicator (color alone fails contrast for color-blind users — always have `errorText`).
192
+ - Don't disable submit until "valid" without showing why each field is invalid.
193
+ - Don't validate on every keystroke before user has had a chance to finish typing — validate on blur for the first error, then on change after.
194
+ - Don't mask password length with fixed-width dots — show actual length in the bullet count.
195
+ - Don't put `iconStart` and `addonStart` together — pick one to indicate the leading affordance.
196
+
197
+ ## References
198
+
199
+ - Ant Design: [`refs/ant-design/components/input/`](../refs/ant-design/components/input/) — `Input`, `Input.Search`, `Input.Password`, `Input.TextArea`, `Input.Group`, `Input.OTP`. Most exhaustive split-by-purpose API.
200
+ - MUI: [`refs/mui/packages/mui-material/src/Input/Input.tsx`](../refs/mui/packages/mui-material/src/Input/) and [`TextField/TextField.tsx`](../refs/mui/packages/mui-material/src/TextField/) — separates `Input` (raw) from `TextField` (Input + label + helper). MUI's split is cleaner conceptually.
201
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/input.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/input.tsx) — minimal styling layer over native `<input>`. Pairs with separate `label.tsx`. Composition over configuration.
202
+
203
+ API choices made:
204
+ - **`label`/`helpText`/`errorText` as props** rather than separate components: 80% of inputs need all three; props keep usage compact. Composition (`<Field><Label/>...`) for the 20% that need finer control.
205
+ - **`onChange(value, e)` ordering**: value-first since that's what 95% of consumers want. Event is escape hatch.
206
+ - **`autoComplete` is documented as critical**: ant-design and shadcn don't emphasize it; skipping is a real loss for forms.
207
+ - **`clearable` and `showPasswordToggle` as props**: ant-design has them, MUI doesn't. They're worth the surface area — every product UI re-implements them otherwise.
208
+
209
+ ## Cross-reference
210
+
211
+ - [knowledge/patterns/form-design.md](../knowledge/patterns/form-design.md)
212
+ - [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md)
213
+ - [knowledge/a11y/contrast.md](../knowledge/a11y/contrast.md)