@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,251 @@
1
+ # `Switch` / `Checkbox` / `Radio` — combined spec
2
+
3
+ > Three sibling controls. They share patterns (binary/boolean inputs with a label) but differ in semantics. Speccing together avoids duplication.
4
+ >
5
+ > Citing Ant Design `Switch`/`Checkbox`/`Radio`, MUI `Switch`/`Checkbox`/`Radio`, shadcn-ui `switch`/`checkbox`/`radio-group`
6
+
7
+ ## Semantic difference
8
+
9
+ | Control | Semantic | Use |
10
+ | --- | --- | --- |
11
+ | **Switch** | Apply immediately, on/off | Settings (notifications, dark mode) — change takes effect at toggle. |
12
+ | **Checkbox** | Multi-select, deferred | Form fields, tasks, multi-select lists — user toggles, then submits. |
13
+ | **Radio** | Single-select from a group, deferred | Pick one from N — payment method, plan tier. |
14
+
15
+ **Picking the wrong one is the most common mistake.** A "subscribe to newsletter" checkbox isn't a Switch — its effect is deferred to form submit.
16
+
17
+ ## Anatomy — Switch
18
+
19
+ ```
20
+ Off: On:
21
+ ┌─────────────┐ ┌─────────────┐
22
+ │ ⚪ │ │ ⚪ │
23
+ └─────────────┘ └─────────────┘
24
+ gray bg primary bg
25
+ ```
26
+
27
+ ## Anatomy — Checkbox
28
+
29
+ ```
30
+ Unchecked: Checked: Indeterminate:
31
+ ┌────┐ ┌────┐ ┌────┐
32
+ │ │ │ ✓ │ │ ─ │
33
+ └────┘ └────┘ └────┘
34
+ ```
35
+
36
+ ## Anatomy — Radio
37
+
38
+ ```
39
+ Unselected: Selected:
40
+ ○ ●
41
+ ```
42
+
43
+ ## API
44
+
45
+ ### Switch
46
+
47
+ ```tsx
48
+ <Switch
49
+ checked={enabled}
50
+ onCheckedChange={setEnabled}
51
+ label="알림 받기"
52
+ description="새 메시지가 오면 푸시 알림을 보냅니다."
53
+ size="md"
54
+ />
55
+ ```
56
+
57
+ | Prop | Type | Default | Description |
58
+ | --- | --- | --- | --- |
59
+ | `checked` / `defaultChecked` | `boolean` | — | Controlled / uncontrolled |
60
+ | `onCheckedChange` | `(checked: boolean) => void` | — | Fires on toggle |
61
+ | `label` | `string \| ReactNode` | — | Visible label (right side). Required for accessible name. |
62
+ | `description` | `string \| ReactNode` | — | Help text below label |
63
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
64
+ | `disabled` | `boolean` | `false` | |
65
+ | `name` / `value` | — | — | For native form submission |
66
+
67
+ ### Checkbox
68
+
69
+ ```tsx
70
+ <Checkbox
71
+ checked={agreed}
72
+ onCheckedChange={setAgreed}
73
+ label="이용약관에 동의합니다"
74
+ required
75
+ />
76
+ ```
77
+
78
+ Same props as Switch, plus:
79
+
80
+ | Prop | Type | Default | Description |
81
+ | --- | --- | --- | --- |
82
+ | `indeterminate` | `boolean` | `false` | Mixed state (some children selected) |
83
+ | `required` | `boolean` | `false` | Required for form |
84
+ | `error` / `errorText` | — | — | Validation state |
85
+
86
+ ### RadioGroup + Radio
87
+
88
+ Radios always live in a `RadioGroup`:
89
+
90
+ ```tsx
91
+ <RadioGroup
92
+ value={method}
93
+ onValueChange={setMethod}
94
+ label="결제 수단"
95
+ >
96
+ <Radio value="card" label="신용/체크카드" description="국내 모든 카드 사용 가능" />
97
+ <Radio value="kakao" label="KakaoPay" description="간편결제" />
98
+ <Radio value="naver" label="NaverPay" description="간편결제" />
99
+ </RadioGroup>
100
+ ```
101
+
102
+ | Prop (group) | Type | Default | Description |
103
+ | --- | --- | --- | --- |
104
+ | `value` / `defaultValue` | `string` | — | Currently selected value |
105
+ | `onValueChange` | `(value: string) => void` | — | |
106
+ | `label` | `string` | — | Group label (`<legend>`) |
107
+ | `description` | `string` | — | |
108
+ | `orientation` | `"vertical" \| "horizontal"` | `"vertical"` | |
109
+ | `disabled` | `boolean` | `false` | Disables all radios |
110
+ | `required` | `boolean` | `false` | |
111
+ | `error` / `errorText` | — | — | |
112
+
113
+ | Prop (radio) | Type | Description |
114
+ | --- | --- | --- |
115
+ | `value` | `string` | Required. Matches `RadioGroup.value`. |
116
+ | `label` | `string \| ReactNode` | Required for accessible name. |
117
+ | `description` | `string \| ReactNode` | |
118
+ | `disabled` | `boolean` | |
119
+
120
+ ## Sizes
121
+
122
+ | Size | Switch (W×H) | Checkbox / Radio | Label font |
123
+ | --- | --- | --- | --- |
124
+ | `sm` | 28 × 16 | 14 | 13px |
125
+ | `md` (default) | 36 × 20 | 16 | 14px |
126
+ | `lg` | 44 × 24 | 20 | 16px |
127
+
128
+ For mobile primary forms: `md` minimum. The control is small but the **whole row** (control + label) should be the tap target — minimum row height 44px.
129
+
130
+ ## States
131
+
132
+ | State | Switch | Checkbox / Radio |
133
+ | --- | --- | --- |
134
+ | Default | Gray track | Gray border |
135
+ | Hover | Track darkens | Border darkens |
136
+ | Focus-visible | 2px ring around control | 2px ring |
137
+ | Active (toggled on) | Primary bg | Primary fill + checkmark/dot |
138
+ | Disabled | 50% opacity, no events | 50% opacity, no events |
139
+ | Error | Red border | Red border |
140
+ | Indeterminate (Checkbox only) | N/A | Filled with horizontal bar |
141
+
142
+ ## Tokens consumed
143
+
144
+ ```
145
+ --color-bg-default (track off, checkbox bg unchecked)
146
+ --color-border-default (border)
147
+ --color-border-strong (hover border)
148
+ --color-primary-default (track on, fill, dot)
149
+ --color-on-primary (checkmark)
150
+ --color-text-primary (label)
151
+ --color-text-secondary (description)
152
+ --color-error (error border)
153
+ --color-focus-ring
154
+ --space-sm, --space-md
155
+ --radius-sm (checkbox)
156
+ --radius-full (switch track, radio)
157
+ --motion-fast, --easing-out (toggle animation)
158
+ ```
159
+
160
+ ## Layout
161
+
162
+ ```
163
+ ┌─────────────────────────────────────────────────┐
164
+ │ [control] Label (clickable to toggle) │
165
+ │ Description (optional) │
166
+ └─────────────────────────────────────────────────┘
167
+
168
+ 12px gap between control and label
169
+
170
+ vs.
171
+
172
+ ┌─────────────────────────────────────────────────┐
173
+ │ Label [control] │ ← settings list pattern
174
+ │ Description │
175
+ └─────────────────────────────────────────────────┘
176
+ ```
177
+
178
+ - **Form field pattern**: control on left, label on right. Default for forms.
179
+ - **Settings row pattern**: label on left, control (Switch) on right. Default for `Settings` pages.
180
+
181
+ ## Accessibility
182
+
183
+ ### Native HTML preferred
184
+
185
+ - Switch: `<input type="checkbox" role="switch">` (or `<button role="switch" aria-checked>` for custom). Prefer the input.
186
+ - Checkbox: `<input type="checkbox">`.
187
+ - Radio: `<input type="radio" name="...">` (group via `name`).
188
+
189
+ Custom-styled controls hide the input visually but keep it in the DOM for native form submission + a11y.
190
+
191
+ ### ARIA
192
+
193
+ - `<label htmlFor={id}>` wraps or is paired with the input (clicking label toggles).
194
+ - `aria-describedby` points to the description's id.
195
+ - `aria-required="true"` when `required`.
196
+ - `aria-invalid="true"` on error.
197
+ - Switch: native `type="checkbox"` + `role="switch"` is the AAA pattern.
198
+ - Indeterminate (Checkbox only): set via JavaScript — `el.indeterminate = true`. There's no HTML attribute.
199
+ - RadioGroup: wrap radios in `<fieldset>` + `<legend>`. Or `role="radiogroup"` + `aria-labelledby`.
200
+
201
+ ### Keyboard
202
+
203
+ | Key | Switch | Checkbox | Radio |
204
+ | --- | --- | --- | --- |
205
+ | `Tab` | Reach | Reach | Reach the **selected** radio (first if none selected) |
206
+ | `Space` | Toggle | Toggle | (selects current radio) |
207
+ | `Enter` | Toggle (custom only) | (forms submit if inside form) | (forms submit) |
208
+ | `↑` `↓` | — | — | Move + select within group (radio behavior) |
209
+ | `←` `→` | — | — | Same as ↑ ↓ (when horizontal) |
210
+
211
+ ### Touch target
212
+
213
+ The visible control is small (16–24px). The **clickable area** must be ≥ 44×44 — extend via the label/row. The whole `[control + label]` row is the click target.
214
+
215
+ ## Edge cases
216
+
217
+ - **"Save changes" pattern with Switches**: anti-pattern. Switches mean immediate effect. If you have a Save button, use Checkboxes.
218
+ - **Required Checkbox (e.g., terms-and-conditions)**: must show validation error if unchecked at submit. `aria-invalid` + visible error text.
219
+ - **Multiple Checkboxes acting as a group**: that's fine, but if exactly-one must be picked, use a RadioGroup.
220
+ - **2 options where Radio would work**: usually a Switch reads cleaner if it's binary. "Light/Dark" → Switch (or 3-radio if "System" is also an option). "Yes/No" → Radio if part of a form, Switch if immediate.
221
+ - **Pre-selected radio**: avoid. Let users actively choose. (Exception: settings forms where defaults are explicit.)
222
+ - **Many radios (10+)**: use a Select. Radio groups become unwieldy.
223
+ - **Korean labels**: typically more verbose ("이용약관에 동의합니다" vs "I agree"). Plan label width.
224
+
225
+ ## Don't
226
+
227
+ - Don't use Checkbox for "this takes effect immediately" — that's a Switch.
228
+ - Don't use Switch for "submit later" — that's a Checkbox.
229
+ - Don't use Radio for binary on/off. Use Switch (immediate) or Checkbox (form).
230
+ - Don't pre-check marketing-consent checkboxes. **Illegal in Korea** (e-commerce law) and bad practice everywhere.
231
+ - Don't use Switch as a destructive confirmation ("Delete account: [Switch]"). Confirmation needs explicit action with a button + modal.
232
+ - Don't make the control's hit area smaller than the label's. Make the entire row clickable.
233
+ - Don't combine indeterminate with disabled — visually confusing.
234
+
235
+ ## References
236
+
237
+ - Ant Design: `Switch`, `Checkbox`, `Checkbox.Group`, `Radio`, `Radio.Group`, `Radio.Button`. Has `Radio.Button` for segmented-control-style radios.
238
+ - MUI: `Switch`, `Checkbox`, `Radio` + `RadioGroup` + `FormControl` for the wrapper. `FormControlLabel` for label-with-control.
239
+ - shadcn-ui: [`switch.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/switch.tsx), [`checkbox.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/checkbox.tsx), [`radio-group.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/radio-group.tsx). Radix primitives. **Default for new projects.**
240
+
241
+ API choices made:
242
+ - **`onCheckedChange(checked)` for Switch + Checkbox**, **`onValueChange(value)` for RadioGroup**: matches the actual user intent — Switch/Checkbox is "what's the boolean?", RadioGroup is "what's the value?".
243
+ - **`label` and `description` as props**: 90% of forms use both; props are faster than composition. Composition (`<Switch.Label>`) is the escape hatch.
244
+ - **Three components in one spec**: shared a11y rules and visual language; treating them separately would force triplicate maintenance.
245
+
246
+ ## Cross-reference
247
+
248
+ - [examples/component-input.md](component-input.md) — also a form input, but text-typed
249
+ - [examples/component-form.md](component-form.md) — orchestration of multiple form controls
250
+ - [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md) — keyboard contracts
251
+ - [knowledge/i18n/korean-product-conventions.md](../knowledge/i18n/korean-product-conventions.md) — required marketing-consent split
@@ -0,0 +1,86 @@
1
+ # `FormGroup` — spec
2
+
3
+ > Synthesized from MUI `FormGroup`. A wrapper for grouping multiple `FormControlLabel`-wrapped checkboxes. Provides spacing + optional row layout. Doesn't enforce mutual exclusivity (use `RadioGroup` for that).
4
+
5
+ ## When to use
6
+
7
+ - Multi-select checkbox groups (filter options, consent checkboxes, multi-day picker).
8
+ - Inside `FormControl` to group related toggles under one label.
9
+
10
+ ## API
11
+
12
+ ```tsx
13
+ <FormControl>
14
+ <FormLabel>관심 도메인 (복수 선택)</FormLabel>
15
+ <FormGroup>
16
+ <FormControlLabel control={<Checkbox />} label="UI/UX" />
17
+ <FormControlLabel control={<Checkbox />} label="브랜드" />
18
+ <FormControlLabel control={<Checkbox />} label="모션" />
19
+ </FormGroup>
20
+ </FormControl>
21
+ ```
22
+
23
+ | Prop | Type | Default | Description |
24
+ | --- | --- | --- | --- |
25
+ | `children` | `ReactNode` | — | `FormControlLabel` children |
26
+ | `row` | `boolean` | `false` | Layout horizontally (default vertical) |
27
+
28
+ ## States
29
+
30
+ Layout primitive — no interactive state of its own.
31
+
32
+ ## Tokens consumed
33
+
34
+ ```
35
+ --space-xs /* gap between rows */
36
+ --space-md /* gap between columns when row */
37
+ ```
38
+
39
+ ## Accessibility
40
+
41
+ - Wrap inside `FormControl` with `FormLabel` to give the group an accessible name.
42
+ - For required groups: `FormControl required` propagates to the FormLabel asterisk.
43
+ - Don't rely on FormGroup alone for labeling — screen readers won't announce the group purpose without a parent label.
44
+
45
+ ## Edge cases
46
+
47
+ - **Many options (10+)** — switch to a multi-select Autocomplete or a search-filtered list.
48
+ - **`row` with long labels** — wraps to next line; check at narrow viewports (320px).
49
+ - **Mixing checkboxes + switches** — possible but visually inconsistent; prefer one control type per group.
50
+
51
+ ## Code example
52
+
53
+ ```tsx
54
+ <FormControl required component="fieldset">
55
+ <FormLabel component="legend">법적 동의 사항</FormLabel>
56
+ <FormGroup>
57
+ <FormControlLabel
58
+ control={<Checkbox required name="terms" />}
59
+ label="이용약관에 동의해요"
60
+ />
61
+ <FormControlLabel
62
+ control={<Checkbox required name="privacy" />}
63
+ label="개인정보 수집·이용에 동의해요"
64
+ />
65
+ <FormControlLabel
66
+ control={<Checkbox name="marketing" />}
67
+ label="마케팅 수신에 동의해요 (선택)"
68
+ />
69
+ </FormGroup>
70
+ </FormControl>
71
+ ```
72
+
73
+ ## Don't
74
+
75
+ - Don't use for radio groups — use `RadioGroup` (handles `name` + mutual exclusivity).
76
+ - Don't omit the parent label — the group needs an accessible name.
77
+
78
+ ## References
79
+
80
+ - MUI: [`FormGroup`](../refs/mui/packages/mui-material/src/FormGroup/)
81
+
82
+ ## Cross-reference
83
+
84
+ - [`component-form-control.md`](component-form-control.md)
85
+ - [`component-form-control-label.md`](component-form-control-label.md)
86
+ - [`component-checkbox.md`](component-checkbox.md)
@@ -0,0 +1,95 @@
1
+ # `FormHelperText` — spec
2
+
3
+ > Synthesized from MUI `FormHelperText`. The helper / error text below an input. Inherits `error` and `disabled` state from the parent `FormControl` so consumers don't conditionally style.
4
+
5
+ ## When to use
6
+
7
+ - Below every input that needs guidance ("회사 이메일을 입력해 주세요").
8
+ - Below every input that can show validation errors.
9
+ - Skip when an input is fully self-explanatory (rare for a sound design).
10
+
11
+ ## API
12
+
13
+ ```tsx
14
+ <FormControl error={!!emailError} required>
15
+ <FormLabel htmlFor="email">이메일</FormLabel>
16
+ <OutlinedInput id="email" />
17
+ <FormHelperText id="email-help">
18
+ {emailError ?? "회사 도메인 이메일을 입력해 주세요"}
19
+ </FormHelperText>
20
+ </FormControl>
21
+ ```
22
+
23
+ | Prop | Type | Default | Description |
24
+ | --- | --- | --- | --- |
25
+ | `children` | `ReactNode` | — | The helper / error text |
26
+ | `disabled` | `boolean` | inherited | Mute when disabled |
27
+ | `error` | `boolean` | inherited | Color as error |
28
+ | `filled` | `boolean` | inherited | Match Filled variant spacing |
29
+ | `focused` | `boolean` | inherited | Color when input focused |
30
+ | `margin` | `'dense' \| 'normal' \| 'none'` | `'normal'` | Top spacing |
31
+ | `required` | `boolean` | inherited | (Not visualized; from FormControl) |
32
+
33
+ ## States
34
+
35
+ | State | Color |
36
+ | --- | --- |
37
+ | Default | `fg-muted` |
38
+ | Focused | `fg-primary` |
39
+ | Error | `fg-error` |
40
+ | Disabled | reduced opacity |
41
+
42
+ ## Tokens consumed
43
+
44
+ ```
45
+ --font-size-caption /* 12px */
46
+ --color-fg-muted
47
+ --color-fg-primary
48
+ --color-fg-error
49
+ --space-xs /* margin-top */
50
+ ```
51
+
52
+ ## Accessibility
53
+
54
+ - Pair with input via `aria-describedby` matching this element's `id`.
55
+ - For error states, also set `aria-invalid="true"` on the input.
56
+ - Avoid putting links inside helper text — they're hard to spot at this size and easy to miss.
57
+
58
+ ## Edge cases
59
+
60
+ - **Switching between helper and error** — keep the same `id`; switch text content. Don't unmount/remount (the screen reader association breaks).
61
+ - **Multi-line helper** — wraps; for long text, consider moving to a Tooltip or below-block info instead.
62
+ - **Korean honorific** — match the form's overall register. Onboarding: 해요체 ("입력해 주세요"). Legal/contracts: 합쇼체 ("입력하시기 바랍니다").
63
+
64
+ ## Code example
65
+
66
+ ```tsx
67
+ <FormControl error={!!errors.email} fullWidth>
68
+ <FormLabel htmlFor="email">이메일</FormLabel>
69
+ <OutlinedInput
70
+ id="email"
71
+ type="email"
72
+ aria-invalid={!!errors.email}
73
+ aria-describedby="email-help"
74
+ />
75
+ <FormHelperText id="email-help">
76
+ {errors.email ?? "회사 도메인 이메일을 입력해 주세요"}
77
+ </FormHelperText>
78
+ </FormControl>
79
+ ```
80
+
81
+ ## Don't
82
+
83
+ - Don't use raw `<p>` for helper text — `error` state won't auto-propagate.
84
+ - Don't conditionally hide the helper element when there's no error and there used to be — the layout shifts and screen readers lose the association.
85
+ - Don't pile multiple FormHelperText siblings — combine into one node.
86
+
87
+ ## References
88
+
89
+ - MUI: [`FormHelperText`](../refs/mui/packages/mui-material/src/FormHelperText/)
90
+
91
+ ## Cross-reference
92
+
93
+ - [`component-form-control.md`](component-form-control.md)
94
+ - [`component-form-label.md`](component-form-label.md)
95
+ - [`knowledge/patterns/form-design.md`](../knowledge/patterns/form-design.md)
@@ -0,0 +1,98 @@
1
+ # `FormLabel` — spec
2
+
3
+ > Synthesized from MUI `FormLabel`. The label of a form input — handles required-asterisk, focused color, error color via parent `FormControl`. Use this OR `<label htmlFor>` directly; FormLabel adds the design-system styling.
4
+
5
+ ## When to use
6
+
7
+ - Label for any `OutlinedInput` / `Select` / custom input inside `FormControl`.
8
+ - For `Checkbox` / `Radio` / `Switch`, prefer `FormControlLabel` (label-wraps-control pattern).
9
+
10
+ ## API
11
+
12
+ ```tsx
13
+ <FormControl required error={!!emailError}>
14
+ <FormLabel htmlFor="email">이메일</FormLabel>
15
+ <OutlinedInput id="email" />
16
+ <FormHelperText>...</FormHelperText>
17
+ </FormControl>
18
+ ```
19
+
20
+ | Prop | Type | Default | Description |
21
+ | --- | --- | --- | --- |
22
+ | `htmlFor` | `string` | — | Match the input's `id` (REQUIRED for click-to-focus + screen-reader association) |
23
+ | `children` | `ReactNode` | — | Label text |
24
+ | `required` | `boolean` | inherited | Visual asterisk |
25
+ | `error` | `boolean` | inherited | Color as error |
26
+ | `focused` | `boolean` | inherited | Color when input focused |
27
+ | `disabled` | `boolean` | inherited | Mute when disabled |
28
+ | `component` | `ElementType` | `'label'` | Override (use `'legend'` inside `<fieldset>`) |
29
+ | `filled` | `boolean` | inherited | Match Filled variant spacing |
30
+
31
+ ## States
32
+
33
+ | State | Color |
34
+ | --- | --- |
35
+ | Default | `fg-default` |
36
+ | Focused | `fg-primary` |
37
+ | Error | `fg-error` |
38
+ | Disabled | `fg-muted` |
39
+ | Required | Same color + `*` suffix |
40
+
41
+ ## Tokens consumed
42
+
43
+ ```
44
+ --font-size-body
45
+ --font-weight-medium
46
+ --color-fg-default
47
+ --color-fg-primary /* focused */
48
+ --color-fg-error
49
+ --color-fg-muted /* disabled */
50
+ --space-xs /* margin-bottom to input */
51
+ ```
52
+
53
+ ## Accessibility
54
+
55
+ - `htmlFor` MUST match the input's `id`. Without it, click-on-label-focuses-input doesn't work AND screen readers don't announce the label.
56
+ - For groups (RadioGroup, FormGroup), use `component="legend"` inside a `<fieldset>` (FormControl handles fieldset for you when you set `component="fieldset"`).
57
+ - Required asterisk: visual decoration; pair with `aria-required="true"` on the input for screen readers.
58
+ - Korean labels: keep short (1-3 words). Avoid "을/를" particles in label form ("이메일" not "이메일을").
59
+
60
+ ## Edge cases
61
+
62
+ - **Optional indicator** — for forms where most fields are optional, label *required* fields visually rather than the inverse. Per [`knowledge/patterns/form-design.md`](../knowledge/patterns/form-design.md).
63
+ - **Long label** — wraps; check at narrow viewports.
64
+ - **Tooltip on label** — wrap label content in a Tooltip for hint-on-hover; ensure focus-visible on label still triggers the tooltip.
65
+
66
+ ## Code example
67
+
68
+ ```tsx
69
+ <FormControl required error={!!errors.password} fullWidth>
70
+ <FormLabel htmlFor="password">비밀번호</FormLabel>
71
+ <OutlinedInput
72
+ id="password"
73
+ type="password"
74
+ aria-required="true"
75
+ aria-invalid={!!errors.password}
76
+ aria-describedby="password-help"
77
+ />
78
+ <FormHelperText id="password-help">
79
+ {errors.password ?? "8자 이상, 영문 + 숫자 + 특수문자"}
80
+ </FormHelperText>
81
+ </FormControl>
82
+ ```
83
+
84
+ ## Don't
85
+
86
+ - Don't omit `htmlFor` — biggest a11y miss in real codebases.
87
+ - Don't put placeholder text instead of a label — placeholders disappear on focus.
88
+ - Don't use multiple `FormLabel` per input.
89
+
90
+ ## References
91
+
92
+ - MUI: [`FormLabel`](../refs/mui/packages/mui-material/src/FormLabel/)
93
+
94
+ ## Cross-reference
95
+
96
+ - [`component-form-control.md`](component-form-control.md)
97
+ - [`component-form-helper-text.md`](component-form-helper-text.md)
98
+ - [`knowledge/patterns/form-design.md`](../knowledge/patterns/form-design.md)