@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,215 @@
1
+ # `Typography` (text primitive) — spec
2
+
3
+ > Citing Ant Design `Typography`, MUI `Typography`, shadcn-ui (composition with utility classes)
4
+
5
+ ## Purpose
6
+
7
+ A semantic + style primitive for text. Wraps `<h1>`–`<h6>`, `<p>`, `<span>` with consistent variant-driven styling per the design system's type scale.
8
+
9
+ For most teams: **don't use a Typography component**. Apply utility classes (`text-xl font-semibold`) or use semantic HTML directly. Only reach for Typography when:
10
+ - You're consuming a design system that ships one (Ant, MUI).
11
+ - You need centralized type-variant changes propagating across the app.
12
+
13
+ ## Anatomy
14
+
15
+ A Typography element is a single text node with:
16
+ - HTML semantic (h1, h2, p, span)
17
+ - Type scale variant (display, heading-lg, body, caption)
18
+ - Optional color, weight, alignment overrides
19
+ - Optional truncation, ellipsis, copyable
20
+
21
+ ## API
22
+
23
+ ```tsx
24
+ <Typography variant="display">우리 가계부</Typography>
25
+ <Typography variant="heading-md">최근 거래</Typography>
26
+ <Typography variant="body">설명 텍스트입니다.</Typography>
27
+ <Typography variant="body-sm" color="secondary">부가 정보</Typography>
28
+ <Typography variant="caption">2026.05.07</Typography>
29
+
30
+ // As different element
31
+ <Typography variant="heading-lg" as="h2">섹션 제목</Typography>
32
+
33
+ // Truncation
34
+ <Typography variant="body" truncate maxLines={2}>
35
+ 매우 긴 텍스트가 두 줄로 잘립니다 매우 긴 텍스트가 두 줄로 잘립니다 ...
36
+ </Typography>
37
+
38
+ // Copy
39
+ <Typography variant="body" copyable>
40
+ abc123-def456
41
+ </Typography>
42
+ ```
43
+
44
+ | Prop | Type | Default | Description |
45
+ | --- | --- | --- | --- |
46
+ | `variant` | `"display" \| "heading-lg" \| "heading-md" \| "heading-sm" \| "body-lg" \| "body" \| "body-sm" \| "caption" \| "amount"` | `"body"` | Type scale variant |
47
+ | `as` | `"h1" \| ... \| "p" \| "span" \| "div"` | inferred from variant | Override HTML element |
48
+ | `color` | `"primary" \| "secondary" \| "tertiary" \| "disabled" \| "success" \| "warning" \| "error"` | `"primary"` | Semantic color |
49
+ | `weight` | `400 \| 500 \| 600 \| 700` | from variant | Override weight |
50
+ | `align` | `"left" \| "center" \| "right"` | `"left"` | |
51
+ | `truncate` | `boolean` | `false` | Single-line ellipsis |
52
+ | `maxLines` | `number` | — | Multi-line clamp |
53
+ | `copyable` | `boolean` | `false` | Render copy button next to text |
54
+
55
+ ## Variants → defaults
56
+
57
+ Per [`knowledge/typography/type-scale-fundamentals.md`](../knowledge/typography/type-scale-fundamentals.md), with Korean +10% line-height adjustment:
58
+
59
+ | Variant | Tag | Size | Weight | Line-height |
60
+ | --- | --- | --- | --- | --- |
61
+ | `display` | h1 | 38px | 700 | 1.2 |
62
+ | `heading-lg` | h2 | 24px | 700 | 1.4 |
63
+ | `heading-md` | h3 | 20px | 600 | 1.4 |
64
+ | `heading-sm` | h4 | 17px | 600 | 1.4 |
65
+ | `body-lg` | p | 17px | 400 | 1.6 |
66
+ | `body` (default) | p | 15px | 400 | 1.6 |
67
+ | `body-sm` | p | 13px | 400 | 1.6 |
68
+ | `caption` | span | 12px | 400 | 1.5 |
69
+ | `amount` | span | varies | 600 | 1.2, tabular numerals |
70
+
71
+ ## Color
72
+
73
+ | Color | Use |
74
+ | --- | --- |
75
+ | `primary` (default) | Body text, headings |
76
+ | `secondary` | Help text, captions |
77
+ | `tertiary` | Less-emphasized labels |
78
+ | `disabled` | Disabled state text |
79
+ | `success` / `warning` / `error` | Status text |
80
+
81
+ For **money colors** (`money-positive` / `money-negative`): use `<Amount>` component or specific class. Don't blur into Typography's color axis.
82
+
83
+ ## Why semantic mapping by variant
84
+
85
+ `heading-lg` defaults to `<h2>`, not `<h1>` — most apps have one `<h1>` per page (page title). `heading-lg` is used for sub-section headings.
86
+
87
+ If you need different semantic: override with `as`. The visual stays consistent; the tag changes.
88
+
89
+ ```tsx
90
+ {/* Page hero — h1 */}
91
+ <Typography variant="display" as="h1">대시보드</Typography>
92
+
93
+ {/* Section header inside page — h2 */}
94
+ <Typography variant="heading-lg">최근 거래</Typography>
95
+
96
+ {/* Card title inside section — h3 */}
97
+ <Typography variant="heading-md">5월 7일 (목)</Typography>
98
+ ```
99
+
100
+ ## Truncation
101
+
102
+ Single-line truncation is straightforward:
103
+
104
+ ```css
105
+ .truncate {
106
+ overflow: hidden;
107
+ text-overflow: ellipsis;
108
+ white-space: nowrap;
109
+ }
110
+ ```
111
+
112
+ Multi-line (clamp):
113
+
114
+ ```css
115
+ .line-clamp-2 {
116
+ display: -webkit-box;
117
+ -webkit-line-clamp: 2;
118
+ -webkit-box-orient: vertical;
119
+ overflow: hidden;
120
+ }
121
+ ```
122
+
123
+ For Korean: line-clamp works cleanly with Hangul. `word-break: keep-all` ensures syllables don't break mid-word.
124
+
125
+ ## Copyable
126
+
127
+ Adds a small copy icon next to the text. Useful for IDs, codes, addresses:
128
+
129
+ ```tsx
130
+ <Typography variant="body" copyable>
131
+ 주문번호: ORD-2026-001234
132
+ </Typography>
133
+ ```
134
+
135
+ Click → copies to clipboard, shows brief "복사됨!" toast.
136
+
137
+ ## Accessibility
138
+
139
+ - HTML semantic preserved (h1, h2, p) — assistive tech navigates by heading hierarchy.
140
+ - Color is supplementary; don't encode meaning by color alone.
141
+ - Truncated text: `title` attribute provides full text on hover (and screen readers).
142
+
143
+ ```html
144
+ <p title="Full long text...">Full long text that gets truncated...</p>
145
+ ```
146
+
147
+ For copyable: the copy button has `aria-label="복사"`.
148
+
149
+ ## Korean considerations
150
+
151
+ - Apply `word-break: keep-all` to body text — prevents Hangul mid-syllable breaks.
152
+ - Apply `font-feature-settings: 'tnum' 1` to amount variant.
153
+ - See [`knowledge/i18n/korean-typography.md`](../knowledge/i18n/korean-typography.md) for full Korean adjustments.
154
+
155
+ ## Code example
156
+
157
+ ```tsx
158
+ function TransactionDetail({ tx }: Props) {
159
+ return (
160
+ <article>
161
+ <Typography variant="display" as="h1">
162
+ ₩{formatKRW(tx.amount)}
163
+ </Typography>
164
+ <Typography variant="caption" color="secondary">
165
+ {formatDate(tx.date)}
166
+ </Typography>
167
+
168
+ <Typography variant="heading-md" className="mt-6">
169
+ 상세
170
+ </Typography>
171
+
172
+ <dl className="mt-4">
173
+ <dt><Typography variant="body-sm" color="secondary">상점</Typography></dt>
174
+ <dd><Typography variant="body">{tx.merchant}</Typography></dd>
175
+
176
+ <dt><Typography variant="body-sm" color="secondary">주문번호</Typography></dt>
177
+ <dd>
178
+ <Typography variant="body" copyable>
179
+ {tx.orderId}
180
+ </Typography>
181
+ </dd>
182
+ </dl>
183
+ </article>
184
+ );
185
+ }
186
+ ```
187
+
188
+ ## When NOT to use Typography component
189
+
190
+ For projects using **Tailwind**: utility classes (`text-xl font-semibold leading-relaxed`) are usually clearer than `<Typography variant="heading-md">`. The Typography component is a convention from CSS-in-JS / styled-components systems.
191
+
192
+ For **shadcn-ui projects**: skip Typography. Define type-scale classes in your global CSS / Tailwind config and use semantic HTML directly.
193
+
194
+ For **Ant Design / MUI projects**: Typography is canonical; use it.
195
+
196
+ ## Don't
197
+
198
+ - Don't use Typography for layout (margin, padding). It's a text primitive.
199
+ - Don't override the default semantic (`as`) without reason — h1 is meaningful.
200
+ - Don't apply different variants to the same logical text role across the app — that's drift.
201
+ - Don't omit `aria-label` on copyable copy buttons.
202
+
203
+ ## References
204
+
205
+ - Ant Design: [`refs/ant-design/components/typography/`](../refs/ant-design/components/typography/) — `Typography`, `Typography.Title`, `Typography.Text`, `Typography.Paragraph`. Most exhaustive: copyable, ellipsis with tooltip, editable.
206
+ - MUI: [`refs/mui/packages/mui-material/src/Typography/`](../refs/mui/packages/mui-material/src/Typography/) — `Typography` with variants matching Material 3 (display, headline, title, body, label).
207
+ - shadcn-ui: no Typography component. Apply utility classes directly.
208
+
209
+ ## Cross-reference
210
+
211
+ - [`knowledge/typography/type-scale-fundamentals.md`](../knowledge/typography/type-scale-fundamentals.md) — type scale rules
212
+ - [`knowledge/typography/mui-type-scale.md`](../knowledge/typography/mui-type-scale.md) — MUI variants
213
+ - [`knowledge/i18n/korean-typography.md`](../knowledge/i18n/korean-typography.md) — Korean adjustments
214
+ - [`examples/component-amount-input.md`](component-amount-input.md) — amount-specific text variant
215
+ - [`examples/component-code.md`](component-code.md) — code-specific text
@@ -0,0 +1,295 @@
1
+ # `Upload` — spec
2
+
3
+ > Citing Ant Design `Upload`, MUI (composition with file input), shadcn-ui (composition)
4
+
5
+ ## Purpose
6
+
7
+ Lets users select files from disk to upload (or stage for upload) — profile photo, attachments, document import.
8
+
9
+ ## Three patterns
10
+
11
+ | Pattern | Use |
12
+ | --- | --- |
13
+ | **Drop zone** (large dashed area) | File-centric uploads — bulk import, document upload |
14
+ | **Button trigger** (small button + native picker) | Single-file uploads — profile photo, attach |
15
+ | **Inline avatar** (click photo to replace) | Profile photo, contained image |
16
+
17
+ Most products need 1–2 of these. Drop zone is most flexible.
18
+
19
+ ## Anatomy — drop zone
20
+
21
+ ```
22
+ ┌──────────────────────────────────────────────────┐
23
+ │ │
24
+ │ 📤 │
25
+ │ │
26
+ │ 파일을 드래그하거나 클릭하여 선택 │
27
+ │ JPG, PNG, PDF · 최대 10 MB │
28
+ │ │
29
+ └──────────────────────────────────────────────────┘
30
+ (after select)
31
+ ┌──────────────────────────────────────────────────┐
32
+ │ 📄 design-spec.pdf ━━━━━━━━━━ 85% ✕ │
33
+ │ 🖼 hero-image.jpg ━━━━━━━━━━ 100% │
34
+ └──────────────────────────────────────────────────┘
35
+ ```
36
+
37
+ | Slot | Required | Notes |
38
+ | --- | --- | --- |
39
+ | Drop zone | yes | Large dashed area with icon + helper text |
40
+ | File list | yes (after select) | Each file with progress bar and remove |
41
+ | Helper text | yes | Allowed types, max size |
42
+ | Upload progress | yes (during upload) | Per-file bar + total |
43
+ | Error state | when applicable | Per-file or top-level error |
44
+
45
+ ## API
46
+
47
+ ```tsx
48
+ <Upload
49
+ accept={["image/jpeg", "image/png", "application/pdf"]}
50
+ multiple
51
+ maxFiles={5}
52
+ maxSize={10 * 1024 * 1024} // 10 MB
53
+ onFilesChange={setFiles}
54
+ onUpload={uploadHandler}
55
+ uploadOnSelect={true}
56
+ pattern="drop-zone"
57
+ />
58
+ ```
59
+
60
+ | Prop | Type | Default | Description |
61
+ | --- | --- | --- | --- |
62
+ | `accept` | `string[]` | — | MIME types or extensions (`["image/*", ".pdf"]`) |
63
+ | `multiple` | `boolean` | `false` | Allow multiple files |
64
+ | `maxFiles` | `number` | — | Cap on count |
65
+ | `maxSize` | `number` | — | Bytes per file |
66
+ | `value` | `UploadedFile[]` | — | Controlled list |
67
+ | `onFilesChange` | `(files) => void` | — | Fires when list changes |
68
+ | `onUpload` | `(file) => Promise<UploadResult>` | — | Per-file upload handler. Returns when upload completes. |
69
+ | `uploadOnSelect` | `boolean` | `true` | Auto-upload on select; false = stage and upload separately |
70
+ | `pattern` | `"drop-zone" \| "button" \| "avatar"` | `"drop-zone"` | UI pattern |
71
+ | `disabled` | `boolean` | `false` | |
72
+ | `directory` | `boolean` | `false` | Allow folder selection (browser support varies) |
73
+ | `paste` | `boolean` | `true` | Allow paste-to-upload (Cmd+V on focused zone) |
74
+ | `errorText` | `string` | — | Top-level error |
75
+ | `helpText` | `string` | derived from accept + maxSize | E.g., "JPG, PNG · max 10MB" |
76
+
77
+ ```ts
78
+ type UploadedFile = {
79
+ id: string;
80
+ file: File; // browser File object
81
+ status: "pending" | "uploading" | "success" | "error";
82
+ progress: number; // 0–100
83
+ url?: string; // server-returned after success
84
+ error?: string;
85
+ };
86
+ ```
87
+
88
+ ## Behavior
89
+
90
+ ### Selection paths
91
+
92
+ 1. **Click drop zone**: opens native file picker.
93
+ 2. **Drag-and-drop**: drop file onto the zone.
94
+ 3. **Paste** (when `paste: true` and zone focused): Cmd+V pastes a copied image.
95
+
96
+ ### Upload flow
97
+
98
+ ```
99
+ [file selected] → validate (size, type) → if pass: add to list, status="pending"
100
+ → if uploadOnSelect: status="uploading", call onUpload, track progress
101
+ → on success: status="success", store url
102
+ → on error: status="error", show retry
103
+ ```
104
+
105
+ ### Validation
106
+
107
+ Per file:
108
+ - Type matches `accept`. If not, reject with "지원하지 않는 형식입니다."
109
+ - Size <= `maxSize`. If not, reject with "파일이 너무 큽니다."
110
+
111
+ Per batch:
112
+ - Total count <= `maxFiles`. If exceeds, reject the excess.
113
+
114
+ Show validation errors inline (per-file) or as a top banner if multiple files share the same issue.
115
+
116
+ ### Progress tracking
117
+
118
+ Per file: 0–100% bar. The `onUpload` handler should report progress:
119
+
120
+ ```ts
121
+ const upload = async (file) => {
122
+ const xhr = new XMLHttpRequest();
123
+ xhr.upload.onprogress = (e) => {
124
+ setProgress(file.id, (e.loaded / e.total) * 100);
125
+ };
126
+ xhr.open("POST", "/api/upload");
127
+ xhr.send(file);
128
+ };
129
+ ```
130
+
131
+ Or use `fetch` with a `ReadableStream` for progress (modern, more complex).
132
+
133
+ ### Cancel mid-upload
134
+
135
+ Provide a ✕ on each uploading file. Aborts the request:
136
+
137
+ ```ts
138
+ const controller = new AbortController();
139
+ fetch("/api/upload", { body: file, signal: controller.signal });
140
+ // On cancel:
141
+ controller.abort();
142
+ ```
143
+
144
+ ### Retry on error
145
+
146
+ Show "다시 시도" button next to errored files.
147
+
148
+ ## Patterns
149
+
150
+ ### Drop zone
151
+
152
+ Default pattern. Clicking opens picker; dragging files works.
153
+
154
+ ```
155
+ ┌──────────────────────────────────────────────────┐
156
+ │ 📤 파일을 드래그하거나 클릭하여 선택 │
157
+ │ JPG, PNG, PDF · 최대 10 MB │
158
+ └──────────────────────────────────────────────────┘
159
+ ```
160
+
161
+ ### Button
162
+
163
+ Small button that triggers native picker. Renders selected files inline below or as tags.
164
+
165
+ ```tsx
166
+ <Upload pattern="button" multiple>
167
+ <Button variant="outline" iconStart={<UploadIcon />}>
168
+ 파일 선택
169
+ </Button>
170
+ </Upload>
171
+ ```
172
+
173
+ ### Avatar (single image)
174
+
175
+ Profile photo replacement. Click opens picker; uploaded file replaces avatar.
176
+
177
+ ```tsx
178
+ <Upload pattern="avatar" accept="image/*" maxSize={5 * 1024 * 1024}>
179
+ <Avatar src={user.photoUrl} alt={user.name} size="xl" />
180
+ <span className="overlay">변경</span>
181
+ </Upload>
182
+ ```
183
+
184
+ ## States
185
+
186
+ | State | Visual |
187
+ | --- | --- |
188
+ | Default | Resting drop zone or button |
189
+ | Drag-over | Border emphasizes (`--color-primary-default` border, `--color-primary-subtle-bg` bg) |
190
+ | Disabled | Muted, no events |
191
+ | Has files | File list rendered below (or replaces zone) |
192
+ | Uploading | Progress bars on each file; spinner on zone if uploading more |
193
+ | Error (per-file) | Red border on file row + retry button |
194
+ | Error (top-level) | Banner above zone with message |
195
+
196
+ ## Tokens consumed
197
+
198
+ ```
199
+ --color-bg-default
200
+ --color-bg-subtle
201
+ --color-primary-default (drag-over border, progress bar)
202
+ --color-primary-subtle-bg (drag-over bg)
203
+ --color-text-primary
204
+ --color-text-secondary (helper text)
205
+ --color-text-tertiary (file metadata)
206
+ --color-error (validation errors)
207
+ --color-success (upload success)
208
+ --color-border-default
209
+ --color-border-default-dashed (drop zone border style)
210
+ --color-focus-ring
211
+ --space-md, --space-base, --space-lg
212
+ --radius-md
213
+ --font-size-sm, --font-size-base
214
+ --motion-fast
215
+ ```
216
+
217
+ ## Sizes
218
+
219
+ | Size | Drop zone height | Padding |
220
+ | --- | --- | --- |
221
+ | `sm` | 80px | 16px |
222
+ | `md` (default) | 120px | 24px |
223
+ | `lg` | 200px | 32px |
224
+
225
+ ## Accessibility
226
+
227
+ - The drop zone is a `<button>` (or has `role="button"`) that opens the file picker.
228
+ - `<input type="file">` is hidden but real — keyboard activates it.
229
+ - File list: `<ul>` with each file as `<li>` containing description + status announcements.
230
+ - Progress: `aria-valuenow` on the per-file progress bar.
231
+ - Errors: `role="alert"` on per-file error.
232
+ - Drag-and-drop is supplementary — keyboard users go through the file picker.
233
+ - For drag enter/leave: announce via `aria-live="polite"` ("Drop file to upload" appears).
234
+
235
+ ### Keyboard
236
+
237
+ | Key | Behavior |
238
+ | --- | --- |
239
+ | `Tab` | Reach drop zone |
240
+ | `Enter` / `Space` | Open file picker |
241
+ | `Tab` (inside file list) | Move to retry / remove buttons |
242
+
243
+ ## Korean considerations
244
+
245
+ | English | Korean |
246
+ | --- | --- |
247
+ | Drop file or click | 파일을 드래그하거나 클릭 |
248
+ | Click to upload | 클릭하여 업로드 |
249
+ | File too large | 파일이 너무 큽니다 |
250
+ | Unsupported format | 지원하지 않는 형식입니다 |
251
+ | Uploading | 업로드 중 |
252
+ | Failed | 실패 |
253
+ | Try again | 다시 시도 |
254
+ | Remove | 제거 |
255
+ | Max N files | 최대 N개 |
256
+
257
+ ## Edge cases
258
+
259
+ - **User selects huge file (>maxSize)**: reject before starting upload. Don't begin upload of a 1GB file just to cancel at 99%.
260
+ - **User selects 50 files when max is 5**: accept first 5; reject the rest with a banner.
261
+ - **Network drops mid-upload**: file row goes to error state with retry button.
262
+ - **Same file uploaded twice**: detect by name + size (not 100% reliable). Optional warning, not block.
263
+ - **Drag from another browser tab**: works; the dragged item is a URL/text. Some browsers fire `dataTransfer.files` differently.
264
+ - **Mobile**: native picker handles camera/gallery selection. Drag-and-drop not applicable. Use button pattern.
265
+ - **Folder upload**: browser support is limited (`webkitdirectory`). Document the constraint.
266
+ - **Paste image**: most browsers support pasting an image (e.g., screenshot). If `paste: true`, focus zone first.
267
+
268
+ ## Don't
269
+
270
+ - Don't upload silently in the background without progress — user has no feedback.
271
+ - Don't accept all file types unless truly meant. Restrict via `accept`.
272
+ - Don't fail silently on unsupported types. Show why.
273
+ - Don't lose files in a list when one fails. Failed files stay until removed.
274
+ - Don't render a 1MB file's progress bar but skip it for a 10KB file. Consistency.
275
+ - Don't make the drop zone a click target without keyboard alternative.
276
+ - Don't accept user uploads to your server without server-side validation. Client validation is UX only.
277
+ - Don't show "Uploaded successfully" toast for every successful file. Use the inline checkmark.
278
+
279
+ ## References
280
+
281
+ - Ant Design: [`refs/ant-design/components/upload/`](../refs/ant-design/components/upload/) — `Upload` with `Upload.Dragger` (drop zone), file list, multiple modes. Most exhaustive.
282
+ - MUI: no dedicated component. Compose `<input type="file">` with custom button.
283
+ - shadcn-ui: no built-in. Compose with file input + drop-zone library (e.g., `react-dropzone`).
284
+
285
+ API choices made:
286
+ - **`pattern` prop** (drop-zone / button / avatar) collapses three sibling components into one with mode.
287
+ - **`uploadOnSelect` opt-in vs explicit upload**: matches the two real-world flows (auto-upload vs review-then-upload).
288
+ - **`onUpload` returns Promise**: enables progress tracking + retry uniformly.
289
+
290
+ ## Cross-reference
291
+
292
+ - [`knowledge/patterns/form-design.md`](../knowledge/patterns/form-design.md) — file inputs in forms
293
+ - [`examples/component-progress.md`](component-progress.md) — per-file upload progress
294
+ - [`examples/component-avatar.md`](component-avatar.md) — avatar pattern for image uploads
295
+ - [`knowledge/i18n/korean-publishing.md`](../knowledge/i18n/korean-publishing.md) — image upload size constraints for app store