@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,318 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: Error states
4
+ applies_to: [web, mobile, all-ui]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # Error states
11
+
12
+ Errors are the screens users see when something didn't go right. They're load-bearing: a good error keeps the user in the flow; a bad error makes them leave.
13
+
14
+ ## The seven kinds of error
15
+
16
+ Different causes need different UIs. Don't conflate them.
17
+
18
+ | Kind | Cause | UI tier | User can fix? |
19
+ | --- | --- | --- | --- |
20
+ | **Validation** | User input doesn't match rules | Inline (next to field) | Yes — fix input |
21
+ | **Network / connectivity** | No internet, request failed to leave | Full-page or inline banner | Sort of — wait for connection |
22
+ | **Server / 5xx** | Backend crashed, timeout | Full-page or banner | No — retry, escalate |
23
+ | **Permission / 403** | User lacks access | Full-page with explanation | Maybe — request access |
24
+ | **Not found / 404** | Resource doesn't exist | Full-page | No — navigate elsewhere |
25
+ | **Conflict / 409** | Stale data, concurrent edit | Inline modal or banner | Yes — refresh + reapply |
26
+ | **Quota / 429** | Rate limit, plan limit | Banner with upgrade or wait | Yes — wait or upgrade |
27
+
28
+ ## Anatomy
29
+
30
+ ```
31
+ ┌──────────────────────────────────────────────────┐
32
+ │ [error icon — soft] │
33
+ │ │
34
+ │ Title — what happened │
35
+ │ │
36
+ │ Description — what to do (1 sentence) │
37
+ │ │
38
+ │ [Primary action] [Secondary] │
39
+ │ │
40
+ │ (Optional: Error code · contact) │
41
+ └──────────────────────────────────────────────────┘
42
+ ```
43
+
44
+ | Slot | Required | Notes |
45
+ | --- | --- | --- |
46
+ | Icon | recommended | Matches kind. Soft, not aggressive. |
47
+ | Title | yes | Plain language: "저장할 수 없어요" not "Error 500" |
48
+ | Description | yes | What user can do. 1 sentence. |
49
+ | Primary action | yes | Most likely recovery — "다시 시도", "Refresh", "Sign in" |
50
+ | Secondary action | optional | Alternative path — "Contact support", "Go back" |
51
+ | Error code | dev-mode only | Hide in prod unless support asks |
52
+
53
+ ## Copy guidelines
54
+
55
+ ### Tone — apologetic but not abject
56
+
57
+ | Korean | English | Use |
58
+ | --- | --- | --- |
59
+ | "오류가 발생했어요. 다시 시도해 주세요." | "Something went wrong. Please try again." | Generic |
60
+ | "잠시 후 다시 시도해 주세요." | "Please try again in a moment." | Server / temporary |
61
+ | "네트워크 연결을 확인해 주세요." | "Check your network connection." | Connectivity |
62
+ | "권한이 없습니다. 관리자에게 문의해 주세요." | "You don't have access. Contact your admin." | Permission |
63
+ | "찾을 수 없는 페이지입니다." | "Page not found." | 404 |
64
+
65
+ Don't:
66
+ - "Oops!" — twee, content-free.
67
+ - "Error 500" — exposing tech detail. (Optionally show small "Error code: 500" at the bottom for support reference.)
68
+ - "Something terrible happened" — alarming.
69
+ - "User error" — blames the user.
70
+
71
+ ### Error message rules
72
+
73
+ 1. **Specific over generic**: "Email must include @" beats "Invalid email."
74
+ 2. **Actionable**: Tell the user what to do, not just what's wrong.
75
+ 3. **Don't blame the user**: "This file is too large" is fine. "You uploaded a file that's too large" is not.
76
+ 4. **Korean tone**: polite (존댓말), end errors with `~해 주세요` or `~합니다`.
77
+
78
+ ## By error kind
79
+
80
+ ### Validation (inline)
81
+
82
+ See [`patterns/form-design.md`](form-design.md) — handled at the field level, not as a separate screen.
83
+
84
+ ### Network / connectivity
85
+
86
+ ```
87
+ ┌─────────────────────────────────────────┐
88
+ │ ⚠ 인터넷 연결이 불안정합니다 │
89
+ │ 잠시 후 다시 시도해 주세요. │
90
+ │ │
91
+ │ [다시 시도] │
92
+ └─────────────────────────────────────────┘
93
+ ```
94
+
95
+ - Banner at top OR full-screen if it blocks all interaction.
96
+ - Auto-retry with backoff (1s, 2s, 4s, 8s, then stop).
97
+ - If user is offline (browser detects): show "오프라인 상태" banner that auto-clears when online.
98
+ - Don't aggressive-toast every failed background request — collapse to one persistent indicator.
99
+
100
+ ### Server / 5xx
101
+
102
+ ```
103
+ ┌─────────────────────────────────────────┐
104
+ │ ⚠ 일시적인 문제가 발생했어요 │
105
+ │ 잠시 후 다시 시도해 주세요. 문제가 계속되면 │
106
+ │ 고객센터로 문의해 주세요. │
107
+ │ │
108
+ │ [다시 시도] [고객센터] │
109
+ │ │
110
+ │ Error: 500 (req: a1b2c3d4) │ ← small, optional
111
+ └─────────────────────────────────────────┘
112
+ ```
113
+
114
+ - Include a request ID or error code (small text at bottom) so support can trace.
115
+ - Two actions: retry + contact support.
116
+ - For long-running operations (file upload, video processing): preserve user's work if possible. Don't blow away unsaved state on a 500.
117
+
118
+ ### Permission / 403
119
+
120
+ ```
121
+ ┌─────────────────────────────────────────┐
122
+ │ 🔒 접근 권한이 없습니다 │
123
+ │ 이 항목을 보려면 관리자 권한이 필요합니다.│
124
+ │ │
125
+ │ [관리자에게 권한 요청] [돌아가기] │
126
+ └─────────────────────────────────────────┘
127
+ ```
128
+
129
+ - Don't expose what the user **can't** see (security through obscurity).
130
+ - Provide the path to access (request flow, support contact).
131
+ - For SaaS multi-tenant: clarify which org/team they need access in.
132
+
133
+ ### Not found / 404
134
+
135
+ ```
136
+ ┌─────────────────────────────────────────┐
137
+ │ [illustration: 🗺 lost] │
138
+ │ │
139
+ │ 찾을 수 없는 페이지입니다 │
140
+ │ │
141
+ │ 주소를 확인하거나 홈으로 돌아가 주세요. │
142
+ │ │
143
+ │ [홈으로] [검색] │
144
+ └─────────────────────────────────────────┘
145
+ ```
146
+
147
+ - Branded 404 (use product personality for consumer apps).
148
+ - Always offer a path forward — home, search, recent activity.
149
+ - Don't show error code "404" prominently — describe in plain language.
150
+ - For deep linking gone bad: detect common patterns and route helpfully ("Did you mean /projects/123?").
151
+
152
+ ### Conflict / 409
153
+
154
+ ```
155
+ ┌─────────────────────────────────────────┐
156
+ │ ⓘ 다른 곳에서 이미 수정되었습니다 │
157
+ │ 최신 내용을 불러오고 다시 저장해 주세요. │
158
+ │ │
159
+ │ [최신 불러오기] [내 변경사항 보기] │
160
+ └─────────────────────────────────────────┘
161
+ ```
162
+
163
+ - Don't silently overwrite. The user must decide.
164
+ - For collaborative editing (Google Docs-style): merge automatically when possible; ask for choice when not.
165
+ - Show what's in conflict if possible (your version vs theirs).
166
+
167
+ ### Quota / 429
168
+
169
+ ```
170
+ ┌─────────────────────────────────────────┐
171
+ │ ⓘ 사용 한도에 도달했습니다 │
172
+ │ 1시간 후 다시 사용 가능합니다. │
173
+ │ 더 많이 사용하려면 플랜을 업그레이드하세요.│
174
+ │ │
175
+ │ [플랜 업그레이드] [대기] │
176
+ └─────────────────────────────────────────┘
177
+ ```
178
+
179
+ - Be specific about the limit (which? when reset?).
180
+ - Offer upgrade path if applicable.
181
+ - Don't block the entire UI — only the rate-limited action.
182
+
183
+ ## Layout
184
+
185
+ | Pattern | Use |
186
+ | --- | --- |
187
+ | **Inline** (next to field, in card) | Validation, conflict on a specific field |
188
+ | **Banner** (page-top strip) | Network, partial server failure, quota |
189
+ | **Full-page replace** | 404, 500 on critical path, permission |
190
+ | **Modal / overlay** | Conflict during save (must decide) |
191
+ | **Toast** | Background failures with auto-recovery (rare for errors — toast is for success/info) |
192
+
193
+ For mobile: prefer inline + banner over full-page modal. Full-page consumes valuable vertical space.
194
+
195
+ ## Recovery actions
196
+
197
+ Every error needs at least one user-actionable recovery. The order of preference:
198
+
199
+ 1. **Retry** — when the operation can be retried (network, server)
200
+ 2. **Refresh / Reload** — when the state is stale (conflict)
201
+ 3. **Navigate elsewhere** — when the resource isn't recoverable (404, permission)
202
+ 4. **Contact support** — last resort, with context preserved
203
+
204
+ Never just "OK" or "Dismiss" with no path forward.
205
+
206
+ ## Error code visibility
207
+
208
+ | Audience | Show error code? |
209
+ | --- | --- |
210
+ | End users | No — plain language |
211
+ | Internal users / admin | Yes, in dev mode |
212
+ | Support flow | Yes — copy-to-clipboard affordance |
213
+
214
+ For support handoff: render a small expandable "Technical details" section:
215
+ ```
216
+ > Technical details
217
+ > Code: 500
218
+ > Request ID: a1b2c3d4-e5f6-7890
219
+ > Timestamp: 2026-05-07 14:32:01 KST
220
+ > [Copy details]
221
+ ```
222
+
223
+ ## Logging vs displaying
224
+
225
+ The error message you SHOW to users is different from what you LOG to the server:
226
+
227
+ - **Log everything** (stack trace, request, user ID, browser).
228
+ - **Show only what helps the user** (cause + recovery).
229
+
230
+ Don't expose stack traces or technical jargon in user-facing errors.
231
+
232
+ ## Tokens consumed
233
+
234
+ ```
235
+ --color-error (icon, accent border)
236
+ --color-error-subtle-bg (banner bg)
237
+ --color-warning (for 429 / quota — not full error)
238
+ --color-text-primary (title)
239
+ --color-text-secondary (description)
240
+ --color-text-tertiary (technical details, error code)
241
+ --color-bg-default
242
+ --color-bg-elevated
243
+ --space-md, --space-base
244
+ --radius-md
245
+ ```
246
+
247
+ ## Accessibility
248
+
249
+ - Error containers: `role="alert"` (assertive) for blocking errors; `role="status"` (polite) for inline / banner.
250
+ - Title is a heading (`<h2>` or appropriate).
251
+ - Recovery action button: standard accessibility.
252
+ - Don't auto-focus the error icon — focus the recovery button.
253
+ - For form errors: announced via `aria-describedby` linking input to error text. See [`patterns/form-design.md`](form-design.md).
254
+
255
+ ## Korean considerations
256
+
257
+ Per [`knowledge/i18n/korean-product-conventions.md`](../i18n/korean-product-conventions.md):
258
+ - Polite (존댓말) tone — "~해 주세요" / "~합니다".
259
+ - "고객센터" (customer center) is the standard term for support.
260
+ - Customer service hours stated when contact is the recommended action.
261
+ - For payment errors: cite [`knowledge/i18n/korean-payments.md`](../i18n/korean-payments.md) — specific failure-mode messages.
262
+ - 1:1 inquiry is a standard expectation: provide that path, not just email.
263
+
264
+ ## Code example
265
+
266
+ ```tsx
267
+ function PageContent() {
268
+ const { data, error, retry } = useData();
269
+
270
+ if (error?.type === "404") {
271
+ return <NotFoundPage />;
272
+ }
273
+ if (error?.type === "permission") {
274
+ return <PermissionDeniedPage />;
275
+ }
276
+ if (error?.type === "network") {
277
+ return (
278
+ <Banner intent="warning">
279
+ <Banner.Title>인터넷 연결이 불안정합니다</Banner.Title>
280
+ <Banner.Description>잠시 후 다시 시도해 주세요.</Banner.Description>
281
+ <Banner.Action onClick={retry}>다시 시도</Banner.Action>
282
+ </Banner>
283
+ );
284
+ }
285
+ if (error) {
286
+ return (
287
+ <ErrorState
288
+ title="일시적인 문제가 발생했어요"
289
+ description="잠시 후 다시 시도해 주세요."
290
+ primaryAction={{ label: "다시 시도", onClick: retry }}
291
+ secondaryAction={{ label: "고객센터", href: "/support" }}
292
+ errorCode={error.code}
293
+ requestId={error.requestId}
294
+ />
295
+ );
296
+ }
297
+
298
+ return <Content data={data} />;
299
+ }
300
+ ```
301
+
302
+ ## Don't
303
+
304
+ - Don't show "Error 500" to end users.
305
+ - Don't conflate empty states with errors. They're different.
306
+ - Don't provide an "OK" button as the only action — what's "OK" about an error?
307
+ - Don't auto-retry indefinitely without a stop.
308
+ - Don't lose the user's work on a server error mid-action — preserve form state, draft, etc.
309
+ - Don't expose stack traces, internal IDs without copy affordance, or English error messages in Korean apps.
310
+ - Don't blame the user. Don't shout (no all-caps).
311
+ - Don't pop up a modal for every minor failure. Use inline / banner where the failure happens.
312
+
313
+ ## Cross-reference
314
+
315
+ - [`knowledge/patterns/empty-states.md`](empty-states.md) — when there's no data, but it's not an error
316
+ - [`knowledge/patterns/form-design.md`](form-design.md) — validation errors at the field level
317
+ - [`knowledge/i18n/korean-payments.md`](../i18n/korean-payments.md) — payment-specific error messages
318
+ - [`knowledge/i18n/korean-product-conventions.md`](../i18n/korean-product-conventions.md) — Korean tone
@@ -0,0 +1,237 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: Form design patterns
4
+ applies_to: [web, mobile, all-ui]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # Form design patterns
11
+
12
+ Forms are where users do real work. Bad forms cost real conversions and real frustration. This is the floor for any form longer than two fields.
13
+
14
+ ## Layout
15
+
16
+ ### Single column over multi-column
17
+
18
+ Single column is faster to fill, faster to scan, simpler on mobile. Use multi-column **only** for genuine pairs (first/last name — though for Korean, this is a single field; address line 1/2; city/state/zip).
19
+
20
+ ```
21
+ ✗ multi-column scattering related fields:
22
+ [Name ] [Email ]
23
+ [Phone ] [Birthday ]
24
+ [Address ] [Postal ]
25
+
26
+ ✓ single-column logical flow:
27
+ [Name ]
28
+ [Email ]
29
+ [Phone ]
30
+ [Birthday ]
31
+ [Address ]
32
+ [Postal ]
33
+ ```
34
+
35
+ ### Label position
36
+
37
+ | Position | Use |
38
+ | --- | --- |
39
+ | **Above the field** (default) | Always — fastest scan, accommodates long labels, RTL-safe, mobile-friendly |
40
+ | Inline left | Only for dense desktop forms with predictable short labels (admin tools, settings) |
41
+ | Floating label (Material) | Avoid — animation distracts, label disappears as users start typing, accessibility tooling struggles |
42
+ | Placeholder-as-label | **Never** — vanishes on input, fails contrast, fails screen readers |
43
+
44
+ For Korean labels (often longer than English), above-field is required.
45
+
46
+ ### Group with visual grouping, not boxes
47
+
48
+ Use whitespace + section headings to group related fields. Heavy borders or shaded card backgrounds for each section make the form feel like a tax document.
49
+
50
+ ## Field anatomy
51
+
52
+ ```
53
+ ┌──────────────────────────────────┐
54
+ │ Label │ ← always above
55
+ │ ┌──────────────────────────────┐ │
56
+ │ │ optional placeholder hint │ │ ← shows the format, NOT the label
57
+ │ └──────────────────────────────┘ │
58
+ │ Help text — explains what or why │ ← grey, below
59
+ │ ⚠ Error: be specific │ ← red, replaces help text on error
60
+ └──────────────────────────────────┘
61
+ ```
62
+
63
+ ### Required vs optional
64
+
65
+ Mark **optional** with `(optional)`, not required with `*`. Reasoning: most fields in a well-designed form are required; visually marking the few exceptions is less noisy than marking the majority.
66
+
67
+ ```
68
+ ✓ Email
69
+ ✓ Phone (optional)
70
+ ✓ Company
71
+
72
+ ✗ Email *
73
+ ✗ Phone
74
+ ✗ Company *
75
+ ```
76
+
77
+ For forms where most fields ARE optional (e.g., "complete your profile" type pages), reverse: mark required with `Required` text label, not `*`.
78
+
79
+ `*` alone fails accessibility — screen readers read it as "asterisk", not "required". Use `aria-required="true"` plus visible text.
80
+
81
+ ### Help text vs placeholder
82
+
83
+ | Type | Use | Example |
84
+ | --- | --- | --- |
85
+ | **Label** | What this field is | `Email address` |
86
+ | **Help text** (under field) | Why or how (constraints, format hints) | `We'll only use this for password recovery.` |
87
+ | **Placeholder** | Optional, format example only | `name@company.com` |
88
+ | **Error** (replaces help text on error) | What's wrong, how to fix | `Email must include @` |
89
+
90
+ Help text is the single most underused affordance. If you're tempted to add a tooltip — make it help text instead.
91
+
92
+ ## Validation
93
+
94
+ ### When to validate
95
+
96
+ | Trigger | Use |
97
+ | --- | --- |
98
+ | **On blur** (after user leaves the field) | Default for most fields. Don't yell while user is typing. |
99
+ | **On change** (every keystroke) | After the first error has shown — gives real-time feedback once user knows what's wrong. |
100
+ | **On submit** | Always — final pass. Catches anything missed. |
101
+ | **Async (server-side)** | Username availability, email taken, etc. Show a spinner/icon at the field, not a global loader. |
102
+
103
+ **Never** validate on focus (when user lands in field) — there's no input to validate.
104
+
105
+ ### Error message rules
106
+
107
+ 1. **Be specific**: `Password must be 8+ characters` not `Invalid password`.
108
+ 2. **Be actionable**: tell them what to do, not just what's wrong. `Use a different email — this one's already registered.` is better than `Email taken`.
109
+ 3. **Don't blame**: avoid "you failed to" or "you must". `This field is required` is fine.
110
+ 4. **Korean tone**: be polite/apologetic. `이메일 형식이 올바르지 않습니다` not `잘못된 이메일`.
111
+ 5. **Position next to the field**: never just at the top. Users miss top-level error summaries on mobile.
112
+ 6. **Plus a top summary on submit-fail** (with anchor links to each field) — for users with screen readers and for forms longer than ~5 fields.
113
+
114
+ ### Inline success affirmation
115
+
116
+ For fields with non-obvious correctness (strong password, valid coupon, available username), show a positive checkmark or message:
117
+
118
+ ```
119
+ ✓ Password is strong
120
+ ✓ "username123" is available
121
+ ✓ Coupon applied — 20% off
122
+ ```
123
+
124
+ Use sparingly — confirming every field reads as patronizing.
125
+
126
+ ## Specific field types
127
+
128
+ ### Email
129
+
130
+ - `<input type="email">` — gets correct mobile keyboard, native validation.
131
+ - `inputmode="email"` for older browsers.
132
+ - `autocomplete="email"` always — saves users typing it again.
133
+ - Validate format on blur with regex, but **don't be strict** — RFC-compliant emails are weirder than your regex thinks. Better to send a verification email than to reject `user+tag@subdomain.example.co.kr`.
134
+
135
+ ### Password
136
+
137
+ - `<input type="password">` with a **show/hide toggle** (eye icon).
138
+ - `autocomplete="new-password"` for sign-up, `autocomplete="current-password"` for sign-in. This determines whether the password manager prompts to save vs autofill.
139
+ - Strength meter: yes for sign-up, no for sign-in.
140
+ - Show requirements **before** the user types, not as red errors. `Use 8+ chars with a number` listed under the field.
141
+ - Don't mask password length. `••••••••` of fixed width regardless of actual length is harmful — users lose track.
142
+
143
+ ### Phone
144
+
145
+ - `<input type="tel">` for mobile keyboard.
146
+ - `inputmode="tel"`.
147
+ - `autocomplete="tel"`.
148
+ - Auto-format as user types: `010-1234-5678` (Korea), `(415) 555-1234` (US).
149
+ - For international, use a country-code dropdown + national number input. Don't ask users to type `+82` manually.
150
+
151
+ ### Date
152
+
153
+ - For dates the user knows (birthdate, expiry) — text input + format hint, OR three dropdowns. Calendar pickers are slow for known dates.
154
+ - For dates the user is choosing (appointment, travel) — calendar picker.
155
+ - Format: localize. Korean default `YYYY.MM.DD`, US `MM/DD/YYYY`, ISO `YYYY-MM-DD` for technical.
156
+
157
+ ### Address (Korea-specific)
158
+
159
+ - **Always use postcode lookup** (Daum Postcode API). Never free-form.
160
+ - Two-line address structure: 도로명/지번 (lookup) + 상세주소 (detail, free text).
161
+ - See [knowledge/i18n/korean-product-conventions.md](../i18n/korean-product-conventions.md).
162
+
163
+ ### Numbers / currency
164
+
165
+ - `<input type="number">` only when free integer input is fine.
166
+ - For currency: `<input type="text" inputmode="decimal">` + format on blur. (`type="number"` strips leading zeros and rejects formatting.)
167
+ - Show the unit (`₩`, `$`, `kg`) inside or beside the field — don't force the user to type it.
168
+ - For Korean currency: comma-separator on display, bare on submit.
169
+
170
+ ### File upload
171
+
172
+ - Drag-and-drop **plus** a button — both modalities. Drag-only excludes mobile.
173
+ - Show file name and size after select. Allow remove.
174
+ - State limits clearly **before** upload: `Max 10 MB. JPG, PNG, PDF.`
175
+ - For images, show preview after upload.
176
+
177
+ ## Multi-step forms
178
+
179
+ Use multi-step when:
180
+ - Form has > 8 logically separable fields.
181
+ - Steps have completion incentive (progressive disclosure).
182
+ - You can save progress between steps.
183
+
184
+ Don't use multi-step when:
185
+ - All fields could fit on one page comfortably.
186
+ - Steps are arbitrary chunks (no logical grouping).
187
+
188
+ Required affordances:
189
+ - **Progress indicator**: dots, numbered steps, or progress bar.
190
+ - **Back button** on every step except the first.
191
+ - **Save progress** if the form takes > 2 minutes.
192
+ - **Don't reset** on back navigation.
193
+ - **Allow non-linear navigation** if steps are independent.
194
+
195
+ ## Submit button
196
+
197
+ - Action-specific label: `Create account` not `Submit`. `Send password reset email` not `Send`.
198
+ - Always one primary submit per form. Multiple primary buttons confuse.
199
+ - Disable while submitting (loading state).
200
+ - After submit, show toast/banner with next-step guidance — don't just clear the form silently.
201
+ - For destructive submits (delete, remove): require confirmation, use red intent.
202
+
203
+ ## Mobile considerations
204
+
205
+ - All fields full-width on mobile — no left/right padding wasted.
206
+ - Field height ≥ 44 px for tap target.
207
+ - Spacing between fields ≥ 16 px (so the field above doesn't get accidentally tapped).
208
+ - Use the right `inputmode` for every field — gets users the right keyboard.
209
+ - Submit button at the bottom, sticky if form is long.
210
+ - Avoid datepickers that take over the screen — system native is better.
211
+
212
+ ## Accessibility
213
+
214
+ - Every field has a `<label for>` linking to its `id`. (Or `aria-labelledby` for non-label cases.)
215
+ - Required fields: `aria-required="true"` AND visible "required" indicator.
216
+ - Errors: `aria-invalid="true"` on the field + `aria-describedby` pointing to the error message.
217
+ - Error messages live in `role="alert"` or `aria-live="polite"` — announced by screen reader.
218
+ - Group related fields with `<fieldset>` and `<legend>`.
219
+ - For multi-step: announce step changes via live region.
220
+ - Cite [knowledge/a11y/keyboard-and-focus.md](../a11y/keyboard-and-focus.md) for keyboard handling.
221
+
222
+ ## Common form anti-patterns
223
+
224
+ - **Reset button**: nobody wants to reset by accident; remove it.
225
+ - **CAPTCHA at the end of a long form**: blocks valid users; use invisible reCAPTCHA or hCaptcha.
226
+ - **Confirm-email field**: just have one. Email validation + verification covers it.
227
+ - **Confirm-password field**: redundant if there's a show/hide toggle. Skip.
228
+ - **Fields that aren't actually used**: cut. Every field is friction.
229
+ - **Asking for info you can derive**: don't ask for "country" if you have IP. Don't ask for "age" if you have DOB.
230
+ - **Soft-disabled submit until "all valid"**: confusing — users can't tell why. Better: let them click, then surface specific errors.
231
+ - **Error summary on top of long form, no anchor links**: users have to scroll to find the field.
232
+
233
+ ## Cross-reference
234
+
235
+ - [knowledge/patterns/ux-guidelines.md](ux-guidelines.md) — broader UX rules
236
+ - [knowledge/i18n/korean-product-conventions.md](../i18n/korean-product-conventions.md) — Korean form expectations (phone, address, terms)
237
+ - [knowledge/a11y/keyboard-and-focus.md](../a11y/keyboard-and-focus.md) — keyboard navigation contract