@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,201 @@
1
+ # `QRCode` — spec
2
+
3
+ > Citing Ant Design `QRCode`, MUI (no built-in), shadcn-ui (no built-in)
4
+
5
+ ## Purpose
6
+
7
+ Renders a QR code from a string (URL, payment ID, contact info). Used in Korean fintech (계좌이체 QR, KakaoPay QR), authentication flows, content sharing.
8
+
9
+ ## Anatomy
10
+
11
+ ```
12
+ ┌─────────────────────┐
13
+ │ ▣ ▢ ▣ ▢ ▢ ▣ ▢ ▣ │
14
+ │ ▢ ▢ ▣ ▣ ▢ ▢ ▣ ▢ │
15
+ │ ▣ ▢ ▢ ▣ ▣ ▢ ▢ ▣ │ ← QR matrix
16
+ │ ▢ ▣ ▣ ▢ ▢ ▣ ▣ ▢ │
17
+ │ ▣ ▢ ▣ ▢ ▣ ▢ ▣ ▢ │
18
+ └─────────────────────┘
19
+ [logo] ← optional center logo
20
+ ```
21
+
22
+ ## API
23
+
24
+ ```tsx
25
+ <QRCode
26
+ value="https://app.example.com/pay/abc123"
27
+ size={200}
28
+ errorLevel="M"
29
+ iconSrc="/logo.png"
30
+ bgColor="#ffffff"
31
+ fgColor="#000000"
32
+ />
33
+ ```
34
+
35
+ | Prop | Type | Default | Description |
36
+ | --- | --- | --- | --- |
37
+ | `value` | `string` | — | URL or text to encode |
38
+ | `size` | `number` | `160` | Pixel size (square) |
39
+ | `errorLevel` | `"L" \| "M" \| "Q" \| "H"` | `"M"` | Error correction; H tolerates more damage / supports center logo better |
40
+ | `bgColor` | `string` | `"#FFFFFF"` | |
41
+ | `fgColor` | `string` | `"#000000"` | |
42
+ | `iconSrc` | `string` | — | Center logo URL |
43
+ | `iconSize` | `number` | `40` | |
44
+ | `padding` | `number` | `16` | Quiet zone around code |
45
+ | `loading` | `boolean` | `false` | |
46
+ | `errorState` | `boolean` | `false` | Show error placeholder |
47
+
48
+ ## Error correction levels
49
+
50
+ QR codes can recover from damage. Higher levels tolerate more but require more dense matrix:
51
+
52
+ | Level | Recovery | Use |
53
+ | --- | --- | --- |
54
+ | `L` | 7% | Print, small QRs without logos |
55
+ | `M` (default) | 15% | Most cases |
56
+ | `Q` | 25% | Outdoor / damaged contexts |
57
+ | `H` | 30% | Required if you put a center logo (logo replaces QR data) |
58
+
59
+ ## Sizes
60
+
61
+ | Use | Size (px) |
62
+ | --- | --- |
63
+ | Inline (in a card) | 120–160 |
64
+ | Standard | 200–240 |
65
+ | Modal / dedicated screen | 280–320 |
66
+ | Full-screen sharing | 400+ |
67
+
68
+ Always render at integer pixel sizes (no fractional) — fractional pixels blur.
69
+
70
+ ## Color customization
71
+
72
+ - **High contrast required**: `fg` and `bg` need ~7:1+ contrast for scanning reliability.
73
+ - **Brand colors**: tempting but risky. Black-on-white is most reliable. If using brand color: dark navy or deep purple work; avoid yellows / pastels.
74
+ - **Inverted (light fg on dark bg)**: scannable but less reliable on older devices.
75
+
76
+ ## Center logo
77
+
78
+ Adding a center logo (brand mark) replaces some of the QR data. Requires error level `H` (30% recovery) for reliable scanning.
79
+
80
+ ```tsx
81
+ <QRCode
82
+ value="..."
83
+ errorLevel="H"
84
+ iconSrc="/logo.png"
85
+ iconSize={size * 0.2} // ~20% of total size
86
+ />
87
+ ```
88
+
89
+ Don't make the logo too large — exceeds QR's recovery capacity, fails to scan.
90
+
91
+ ## States
92
+
93
+ | State | Visual |
94
+ | --- | --- |
95
+ | Default | QR rendered |
96
+ | Loading | Skeleton or spinner |
97
+ | Error (failed to encode) | Placeholder + retry |
98
+ | Refreshing | Brief fade (for time-limited QRs) |
99
+
100
+ For time-limited QRs (e.g., KakaoPay session-based codes): show a countdown OR auto-refresh before expiration.
101
+
102
+ ## Tokens consumed
103
+
104
+ ```
105
+ --color-bg-default (default QR bg)
106
+ --color-text-primary (default QR fg)
107
+ --color-bg-subtle (loading skeleton)
108
+ --color-error (error state)
109
+ --space-md
110
+ --radius-md (around the QR container, not the QR itself)
111
+ ```
112
+
113
+ ## Accessibility
114
+
115
+ - Wrap in a labeled container: `<div role="img" aria-label="QR 코드: payment session abc123">`.
116
+ - Provide a **text alternative** as a fallback:
117
+ ```tsx
118
+ <QRCode value={url} />
119
+ <p>또는 직접 방문: <a href={url}>{url}</a></p>
120
+ ```
121
+ - For session-based QRs (KakaoPay, banking): provide an alternative input method (manual code entry).
122
+
123
+ ## Korean fintech use cases
124
+
125
+ - **계좌이체 QR**: 송금자가 받는 계좌의 QR을 스캔 → 계좌번호 자동 입력
126
+ - **결제 QR**: 사장님 화면에 QR → 손님이 KakaoPay/NaverPay로 스캔 → 결제
127
+ - **인증 QR**: 본인인증 / 로그인 — 모바일 앱이 QR을 보여주고 데스크톱이 스캔 (또는 반대)
128
+ - **공유 QR**: 가게 정보, 친구 추천 코드 등
129
+
130
+ For 결제 QR: the QR usually encodes a session token + payment URL, refreshing every ~60s for security. Implement with `key={refreshKey}` to force re-render on refresh.
131
+
132
+ ## Code example
133
+
134
+ ```tsx
135
+ // Static URL
136
+ <QRCode value="https://example.com/me" size={200} />
137
+
138
+ // Payment QR with logo and time limit
139
+ function PaymentQRScreen({ session }) {
140
+ const [refreshKey, setRefreshKey] = useState(0);
141
+
142
+ useEffect(() => {
143
+ const timer = setInterval(() => {
144
+ session.refresh();
145
+ setRefreshKey(k => k + 1);
146
+ }, 60_000);
147
+ return () => clearInterval(timer);
148
+ }, [session]);
149
+
150
+ return (
151
+ <div className="flex flex-col items-center">
152
+ <QRCode
153
+ key={refreshKey}
154
+ value={session.paymentUrl}
155
+ size={280}
156
+ errorLevel="H"
157
+ iconSrc="/brand.png"
158
+ iconSize={56}
159
+ />
160
+ <p className="text-sm text-text-secondary">
161
+ QR이 자동 갱신됩니다 · 60초 후 갱신
162
+ </p>
163
+ <p className="mt-2">
164
+ 결제 금액: <strong>₩{amount.toLocaleString()}</strong>
165
+ </p>
166
+ </div>
167
+ );
168
+ }
169
+ ```
170
+
171
+ ## Edge cases
172
+
173
+ - **Very long URL** encoded: QR matrix becomes dense. Cap to ~500 chars; for longer, shorten via your own URL shortener service.
174
+ - **No internet** at scan time: pre-encode locally; don't rely on online encoding service.
175
+ - **Color-blind users**: don't use red/green for QR — black or dark navy on white.
176
+ - **Print at small size**: use error level `Q` or `H` and minimum 25mm physical size.
177
+ - **Encoding errors**: if `value` is unencodable (rare), show fallback with the text URL plain.
178
+
179
+ ## Don't
180
+
181
+ - Don't restyle a QR with very low contrast — defeats the purpose.
182
+ - Don't put logo without error level `H`.
183
+ - Don't omit text alternative — assistive tech can't read QRs.
184
+ - Don't make the user wait > 1s for QR to render. Pre-compute when possible.
185
+ - Don't use animated QR (rotating, color-changing). It's a static identifier — animation breaks scans.
186
+
187
+ ## References
188
+
189
+ - Ant Design: [`refs/ant-design/components/qr-code/`](../refs/ant-design/components/qr-code/) — `QRCode` with all options.
190
+ - MUI: no built-in. Use libraries like `qrcode.react` or `react-qr-code`.
191
+ - shadcn-ui: no built-in. Use libraries.
192
+
193
+ Common libraries:
194
+ - `qrcode` (Node-style, can run in browser)
195
+ - `qrcode.react` (React component)
196
+ - `react-qr-code` (lightweight)
197
+
198
+ ## Cross-reference
199
+
200
+ - [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — KakaoPay/NaverPay QR contexts
201
+ - [`examples/component-payment-method-selector.md`](component-payment-method-selector.md) — QR as a payment option
@@ -0,0 +1,167 @@
1
+ # `Radio` (and `RadioGroup`) — spec
2
+
3
+ > Synthesized from Ant Design `Radio`, MUI `Radio`/`RadioGroup`, shadcn-ui `radio-group`. Mutually exclusive choice control. See also [`component-form-controls.md`](component-form-controls.md).
4
+
5
+ ## Radio vs Select
6
+
7
+ > Radio for **2-5 visible options**. Select / Combobox for **6+** OR when space is constrained.
8
+
9
+ | | Radio | Select |
10
+ | --- | --- | --- |
11
+ | All options visible | Yes | No (one at a time) |
12
+ | Use | Few visible options; explicit choice | Many options; chosen value visible |
13
+ | Visual | Each option as a row | Compact dropdown |
14
+
15
+ ## Anatomy
16
+
17
+ ```
18
+ Pick payment method:
19
+
20
+ ○ Credit card
21
+ ● KakaoPay
22
+ ○ Toss
23
+ ○ Bank transfer
24
+ ```
25
+
26
+ ## API
27
+
28
+ ```tsx
29
+ <RadioGroup value={method} onValueChange={setMethod}>
30
+ <RadioGroup.Item value="card" id="card" />
31
+ <label htmlFor="card">Credit card</label>
32
+
33
+ <RadioGroup.Item value="kakao" id="kakao" />
34
+ <label htmlFor="kakao">KakaoPay</label>
35
+
36
+ <RadioGroup.Item value="toss" id="toss" />
37
+ <label htmlFor="toss">Toss</label>
38
+ </RadioGroup>
39
+ ```
40
+
41
+ | Prop | Type | Default | Description |
42
+ | --- | --- | --- | --- |
43
+ | `value` | `string` | controlled | Selected value |
44
+ | `defaultValue` | `string` | — | Uncontrolled initial |
45
+ | `onValueChange` | `(value: string) => void` | — | Callback |
46
+ | `disabled` | `boolean` | `false` | Disable all items |
47
+ | `required` | `boolean` | `false` | One must be selected |
48
+ | `orientation` | `"vertical" \| "horizontal"` | `"vertical"` | Layout |
49
+
50
+ ## States
51
+
52
+ | State | Visual |
53
+ | --- | --- |
54
+ | Unselected | Empty circle with border |
55
+ | Selected | Filled circle with brand-color dot inside |
56
+ | Hover | Border color shift |
57
+ | Focus-visible | Ring around the focused item |
58
+ | Disabled | Reduced opacity |
59
+
60
+ ## Layouts
61
+
62
+ ### Vertical (default)
63
+
64
+ ```
65
+ ○ Option 1
66
+ ○ Option 2
67
+ ● Option 3
68
+ ```
69
+
70
+ ### Horizontal
71
+
72
+ ```
73
+ ○ Option 1 ○ Option 2 ● Option 3
74
+ ```
75
+
76
+ For 2-3 short options.
77
+
78
+ ### Card-style (visual-rich)
79
+
80
+ ```
81
+ ┌─────────────────────┐ ┌─────────────────────┐
82
+ │ ● KakaoPay │ │ ○ Toss │
83
+ │ No fees │ │ 1.5% fee │
84
+ └─────────────────────┘ └─────────────────────┘
85
+ ```
86
+
87
+ Whole card clickable; radio dot in corner OR replaced by border highlight.
88
+
89
+ ## Tokens consumed
90
+
91
+ ```
92
+ --radio-bg-unchecked
93
+ --radio-bg-checked-dot (brand color dot inside)
94
+ --radio-border
95
+ --radio-border-checked
96
+ --radio-error-border
97
+ --radio-size (typically 16-20px)
98
+ --space-sm (item gap)
99
+ --motion-fast
100
+ ```
101
+
102
+ ## Accessibility
103
+
104
+ - `RadioGroup`: `role="radiogroup"` + `aria-labelledby` (often referencing a heading).
105
+ - `Radio.Item`: `role="radio"` + `aria-checked`.
106
+ - Keyboard:
107
+ - Tab moves into the group (focuses the selected one or first if none).
108
+ - Arrow keys navigate within the group AND change selection.
109
+ - Space activates if not already activated.
110
+ - For required: `aria-required="true"` on group; show error if no selection on submit.
111
+ - Label every radio with linked `<label htmlFor>`.
112
+
113
+ ## Code example — Korean fintech payment method
114
+
115
+ ```tsx
116
+ function PaymentMethodPicker({ value, onChange }: Props) {
117
+ return (
118
+ <fieldset>
119
+ <legend>결제 수단</legend>
120
+ <RadioGroup value={value} onValueChange={onChange}>
121
+ <div className="radio-row">
122
+ <RadioGroup.Item value="kakao" id="pay-kakao" />
123
+ <label htmlFor="pay-kakao">
124
+ <Image src="/kakaopay-logo.svg" alt="KakaoPay" />
125
+ 카카오페이
126
+ </label>
127
+ </div>
128
+ <div className="radio-row">
129
+ <RadioGroup.Item value="naver" id="pay-naver" />
130
+ <label htmlFor="pay-naver">
131
+ <Image src="/naverpay-logo.svg" alt="NaverPay" />
132
+ 네이버페이
133
+ </label>
134
+ </div>
135
+ <div className="radio-row">
136
+ <RadioGroup.Item value="toss" id="pay-toss" />
137
+ <label htmlFor="pay-toss">
138
+ <Image src="/toss-logo.svg" alt="Toss" />
139
+ 토스페이
140
+ </label>
141
+ </div>
142
+ </RadioGroup>
143
+ </fieldset>
144
+ );
145
+ }
146
+ ```
147
+
148
+ ## Don't
149
+
150
+ - Don't use Radio for binary on/off — use Switch (immediate effect) or Checkbox (form).
151
+ - Don't allow zero selection in a required group. Validation must catch it.
152
+ - Don't make the visual circle smaller than 16x16. Touch target ≥ 44pt via padding.
153
+ - Don't omit `<fieldset>` + `<legend>` for the group context.
154
+ - Don't have only one radio in a group. That's a Checkbox or just a single button.
155
+
156
+ ## References
157
+
158
+ - Ant: [`Radio`](../refs/ant-design/components/radio)
159
+ - MUI: [`Radio`](../refs/mui/packages/mui-material/src/Radio)
160
+ - shadcn-ui: [`radio-group`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/radio-group.tsx)
161
+ - WAI-ARIA: [Radio Group pattern](https://www.w3.org/WAI/ARIA/apg/patterns/radio/)
162
+
163
+ ## Cross-reference
164
+
165
+ - [`examples/component-form-controls.md`](component-form-controls.md) — combined with Switch + Checkbox
166
+ - [`examples/component-checkbox.md`](component-checkbox.md)
167
+ - [`examples/component-payment-method-selector.md`](component-payment-method-selector.md) — KR payment specialization
@@ -0,0 +1,202 @@
1
+ # `Rate` (Rating) — spec
2
+
3
+ > Citing Ant Design `Rate`, MUI `Rating`, shadcn-ui (composed)
4
+
5
+ ## Purpose
6
+
7
+ A row of star (or other) icons for capturing or displaying a rating. Used for: product reviews, satisfaction scoring, content quality feedback.
8
+
9
+ ## Two distinct uses
10
+
11
+ | Use | Mode | Example |
12
+ | --- | --- | --- |
13
+ | **Input rating** | Interactive | "Rate your experience" |
14
+ | **Display rating** | Read-only | "4.3 ★ (1,247 reviews)" |
15
+
16
+ The component is the same; the props differ. Always implement input behavior accessibly.
17
+
18
+ ## Anatomy
19
+
20
+ ```
21
+ Input mode (hover state):
22
+ ☆ ☆ ☆ ☆ ☆ ← empty (default)
23
+ ★ ★ ★ ☆ ☆ ← user picked 3
24
+ ★ ★ ★ ⭑ ☆ ← user hovering 4 (preview)
25
+
26
+ With half-star precision:
27
+ ★ ★ ⯨ ☆ ☆ ← 2.5 stars
28
+
29
+ Display mode:
30
+ ★ ★ ★ ★ ⯨ 4.5 (1,247)
31
+
32
+ Other shapes:
33
+ 😡 😞 😐 🙂 😍 emoji-based scale
34
+ 👎 👍 binary
35
+ 1 2 3 4 5 numeric scale (NPS-style 0-10 also)
36
+ ```
37
+
38
+ ## API
39
+
40
+ ```tsx
41
+ <Rate value={rating} onValueChange={setRating} />
42
+ <Rate value={4.3} readOnly count={5} />
43
+ <Rate value={3} max={10} /> {/* 10-point scale */}
44
+ ```
45
+
46
+ | Prop | Type | Default | Description |
47
+ | --- | --- | --- | --- |
48
+ | `value` | `number` | `0` | Current value |
49
+ | `onValueChange` | `(value: number) => void` | — | (Input mode only) |
50
+ | `defaultValue` | `number` | — | Uncontrolled |
51
+ | `count` | `number` | `5` | Number of icons (rating max) |
52
+ | `precision` | `number` | `1` | Smallest increment (0.5 for half-star, 0.1 for finer) |
53
+ | `readOnly` | `boolean` | `false` | Display only — no hover/click |
54
+ | `disabled` | `boolean` | `false` | |
55
+ | `allowClear` | `boolean` | `true` | Click on the active value to clear (input mode only) |
56
+ | `icon` | `ReactNode \| ((index, value) => ReactNode)` | star | Custom icon |
57
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
58
+ | `label` | `string` | — | Accessible label |
59
+ | `tooltips` | `string[]` | — | Per-rating tooltip ("나쁨", "보통", "좋음", "아주 좋음", "최고") |
60
+
61
+ ## Sizes
62
+
63
+ | Size | Icon size |
64
+ | --- | --- |
65
+ | `sm` | 16px |
66
+ | `md` (default) | 20px |
67
+ | `lg` | 28px |
68
+
69
+ For input mode on mobile: `lg`. The hit area extends ~8px around each icon.
70
+
71
+ ## Behavior
72
+
73
+ ### Input mode
74
+
75
+ - Hover over an icon: preview that rating (and lower stars filled).
76
+ - Click: commit value.
77
+ - If `allowClear`: clicking on the currently-selected icon clears.
78
+ - Half-star: clicking the left half of an icon = `n - 0.5`, right half = `n`.
79
+
80
+ ### Display mode
81
+
82
+ - Renders the value as filled icons (with partial fill for fractional values).
83
+ - No hover effects.
84
+ - Often paired with numeric value + count.
85
+
86
+ ## States
87
+
88
+ | State | Visual |
89
+ | --- | --- |
90
+ | Empty | All icons in `--color-text-tertiary` |
91
+ | Hovered | Preview rating in primary or yellow |
92
+ | Selected | Filled icons in `--color-warning` (yellow stars) or brand color |
93
+ | Half | Filled half + empty half |
94
+ | Disabled | Muted, no events |
95
+ | Read-only | Non-interactive, no hover |
96
+
97
+ ## Tokens consumed
98
+
99
+ ```
100
+ --color-warning (default star color — yellow)
101
+ OR
102
+ --color-primary-default (when brand-aligned)
103
+ --color-text-tertiary (empty icons)
104
+ --color-text-secondary (numeric value beside)
105
+ --color-focus-ring
106
+ --space-xs
107
+ --motion-fast (hover transition)
108
+ ```
109
+
110
+ ## Accessibility — WAI-ARIA Slider pattern (input)
111
+
112
+ For input mode, use `role="slider"`:
113
+
114
+ - `role="slider"`
115
+ - `aria-valuenow={value}`
116
+ - `aria-valuemin={0}`
117
+ - `aria-valuemax={count}`
118
+ - `aria-valuetext={tooltip[value-1]}` if tooltips defined (more descriptive than just the number)
119
+ - `aria-label="Rating"`
120
+ - `tabIndex={0}` to be keyboard-reachable
121
+
122
+ For display mode (readOnly):
123
+ - `aria-label="Rating: 4.3 out of 5"`
124
+ - No interactive role needed — it's text equivalent
125
+
126
+ ### Keyboard
127
+
128
+ | Key | Behavior |
129
+ | --- | --- |
130
+ | `Tab` | Reach the rating control (single tab stop) |
131
+ | `←` / `↓` | Decrement by `precision` |
132
+ | `→` / `↑` | Increment by `precision` |
133
+ | `Home` | 0 |
134
+ | `End` | max |
135
+ | `Enter` (with focus) | (no-op or commit, depending on UX) |
136
+ | `Esc` | (Input form context) cancel |
137
+ | `0`–`9` | Jump to that rating value |
138
+
139
+ ## Code example
140
+
141
+ ```tsx
142
+ // Standard 5-star input with tooltips
143
+ <Rate
144
+ value={rating}
145
+ onValueChange={setRating}
146
+ tooltips={["나쁨", "보통", "좋음", "아주 좋음", "최고"]}
147
+ label="만족도"
148
+ size="lg"
149
+ />
150
+
151
+ // Half-star precision
152
+ <Rate value={rating} onValueChange={setRating} precision={0.5} />
153
+
154
+ // Display mode with details
155
+ <div className="flex items-center gap-2">
156
+ <Rate value={4.3} readOnly />
157
+ <span className="font-medium">4.3</span>
158
+ <span className="text-text-secondary">(1,247 리뷰)</span>
159
+ </div>
160
+
161
+ // Custom icon (heart for favorite)
162
+ <Rate value={1} count={1} icon={(i, v) => v === 0 ? <HeartIcon /> : <HeartFilled />} />
163
+
164
+ // Emoji-based satisfaction
165
+ <Rate
166
+ value={mood}
167
+ onValueChange={setMood}
168
+ count={5}
169
+ icon={(i, v) => <span>{["😡", "😞", "😐", "🙂", "😍"][i]}</span>}
170
+ tooltips={["아주 별로", "별로", "보통", "좋음", "최고"]}
171
+ />
172
+ ```
173
+
174
+ ## Edge cases
175
+
176
+ - **Fractional displays**: `value=4.3` renders 4 full + a partial 5th. CSS clip-path or width-based fill.
177
+ - **Hover then click outside**: revert to actual value.
178
+ - **`allowClear` with hover preview**: hovering the current value should NOT preview clear. Clear only on click.
179
+ - **Touch devices**: no hover. Click-only commits. Drag-to-rate is uncommon — stick to tap.
180
+ - **Very large counts (10+)**: stars become small/cramped. Switch to numeric input or NPS-style 0–10 number row.
181
+ - **Required rating in form**: render error state if value=0 on submit.
182
+ - **Localized labels**: tooltips ("나쁨" / "Bad") matching locale.
183
+
184
+ ## Don't
185
+
186
+ - Don't show stars without numeric value when display mode — users want both.
187
+ - Don't auto-submit a form on rating click.
188
+ - Don't use 5-star for binary feedback (helpful / not helpful). Use thumbs.
189
+ - Don't disable arrow keys — rating is a slider semantically.
190
+ - Don't use yellow stars on yellow backgrounds. Pick a contrasting color.
191
+ - Don't omit tooltips for input ratings — without them, the rating values are abstract.
192
+
193
+ ## References
194
+
195
+ - Ant Design: [`refs/ant-design/components/rate/`](../refs/ant-design/components/rate/) — `Rate` with `count`, `allowHalf`, `tooltips`, custom `character`. Most flexible.
196
+ - MUI: [`refs/mui/packages/mui-material/src/Rating/`](../refs/mui/packages/mui-material/src/Rating/) — `Rating` with `precision`, `IconContainerComponent`, `getLabelText` for a11y. Solid impl.
197
+ - shadcn-ui: no built-in. Compose from icons + state.
198
+
199
+ ## Cross-reference
200
+
201
+ - [`examples/component-slider.md`](component-slider.md) — Rate is essentially a discrete-step slider
202
+ - [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md) — slider keyboard contract