@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,253 @@
1
+ # `PaymentBrandButton` (custom — Korean) — spec
2
+
3
+ > Custom component for KakaoPay / NaverPay / Toss / Apple Pay / Samsung Pay branded buttons.
4
+ >
5
+ > Vendors require their official asset use. Don't restyle. This component encapsulates correct rendering + interaction.
6
+
7
+ ## Purpose
8
+
9
+ Renders a vendor-branded one-tap payment button. Used in:
10
+ - Checkout shortcut: "Pay with KakaoPay"
11
+ - Buy-now flows (Toss merchant button)
12
+ - Login shortcuts (KakaoPay / Toss are also identity providers)
13
+ - Standalone CTAs (Buy with NaverPay)
14
+
15
+ The selector ([`component-payment-method-selector.md`](component-payment-method-selector.md)) lists multiple methods; this component renders one method as a brand-styled CTA.
16
+
17
+ ## Anatomy
18
+
19
+ ```
20
+ KakaoPay (yellow): NaverPay (green):
21
+ ┌────────────────────────┐ ┌────────────────────────┐
22
+ │ [💛] Pay with KakaoPay│ │ [N] Pay with NaverPay │
23
+ └────────────────────────┘ └────────────────────────┘
24
+
25
+ Toss (blue): Apple Pay (black):
26
+ ┌────────────────────────┐ ┌────────────────────────┐
27
+ │ [t.] Toss로 결제 │ │ [logo] Apple Pay │
28
+ └────────────────────────┘ └────────────────────────┘
29
+ ```
30
+
31
+ | Slot | Required | Notes |
32
+ | --- | --- | --- |
33
+ | Brand logo | yes | Official asset, fixed aspect ratio |
34
+ | Label | yes (most brands) | "Pay with [Brand]" or KR equivalent |
35
+ | Loading spinner | when authenticating | Replaces label, brand color background |
36
+
37
+ ## API
38
+
39
+ ```tsx
40
+ <PaymentBrandButton
41
+ brand="kakaopay"
42
+ amount={45000}
43
+ onClick={initiateKakaoPay}
44
+ loading={isInitiating}
45
+ size="lg"
46
+ fullWidth
47
+ />
48
+ ```
49
+
50
+ | Prop | Type | Default | Description |
51
+ | --- | --- | --- | --- |
52
+ | `brand` | `"kakaopay" \| "naverpay" \| "toss" \| "applepay" \| "samsungpay" \| "tosspayments"` | — | Required |
53
+ | `onClick` | `() => void` | — | Required. Triggers the brand SDK. |
54
+ | `amount` | `number` | — | Optional. Some brands display amount in button (e.g., "Pay ₩45,000 with KakaoPay") |
55
+ | `label` | `string` | derived from brand + locale | Override default label |
56
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
57
+ | `fullWidth` | `boolean` | `false` | |
58
+ | `loading` | `boolean` | `false` | Spinner replaces label |
59
+ | `disabled` | `boolean` | `false` | |
60
+
61
+ ## Brand assets — official requirements
62
+
63
+ **Critical**: each vendor publishes brand guidelines. Following them is **required** by their merchant agreements.
64
+
65
+ | Brand | Background | Logo | Text color | Min height | Notes |
66
+ | --- | --- | --- | --- | --- | --- |
67
+ | **KakaoPay** | `#FFCD00` (yellow) | Speech-bubble icon + "kakao pay" wordmark | `#000000` (black) | 44px | Official assets at [pay.kakao.com](https://developers.kakaopay.com/) |
68
+ | **NaverPay** | `#00C73C` (green) | "N" + "Pay" wordmark | `#FFFFFF` (white) | 44px | Naver brand kit |
69
+ | **Toss** | `#3182F6` (blue) | "toss" lowercase wordmark | `#FFFFFF` (white) | 44px | Toss merchant guidelines |
70
+ | **Apple Pay** | `#000000` (black) | Apple Pay logo | `#FFFFFF` (white) | 44px | Strict — see Apple PassKit guidelines. Available only on iOS / Safari. |
71
+ | **Samsung Pay** | `#000000` (black) | Samsung Pay logo | `#FFFFFF` (white) | 44px | Samsung Pay developer guidelines |
72
+
73
+ **Don't**:
74
+ - Don't change the background color.
75
+ - Don't replace the logo with your own.
76
+ - Don't add additional brand colors (no 2-color KakaoPay).
77
+ - Don't add custom text styling that conflicts with the wordmark.
78
+ - Don't use the brand name without the logo.
79
+
80
+ ## Korean localized labels
81
+
82
+ | Brand | Korean label |
83
+ | --- | --- |
84
+ | KakaoPay | "카카오페이 결제" or "카카오페이로 결제" |
85
+ | NaverPay | "네이버페이 결제" |
86
+ | Toss | "토스로 결제" |
87
+ | Apple Pay | "Apple Pay" (don't translate) |
88
+ | Samsung Pay | "Samsung Pay" (don't translate) |
89
+
90
+ If `amount` is provided:
91
+ - "카카오페이로 ₩45,000 결제"
92
+
93
+ ## Sizes
94
+
95
+ Per brand guidelines, minimum height is **44px** (mobile touch target). Recommended:
96
+
97
+ | Size | Height | Min width | Use |
98
+ | --- | --- | --- | --- |
99
+ | `sm` | 36px | 120px | Inline with other content (rare) |
100
+ | `md` (default) | 44px | 160px | Standard CTA |
101
+ | `lg` | 56px | 240px | Hero / primary checkout |
102
+
103
+ For mobile primary checkout: `lg` + `fullWidth: true`.
104
+
105
+ ## States
106
+
107
+ | State | Visual |
108
+ | --- | --- |
109
+ | Default | Brand color bg, logo + label |
110
+ | Hover | Subtle darken / opacity 0.92 |
111
+ | Active (press) | Slight darken / scale 0.98 |
112
+ | Focus-visible | 2px ring (use `--color-focus-ring`, ensure 3:1 against brand bg) |
113
+ | Loading | Logo + spinner replaces label; bg remains brand color |
114
+ | Disabled | Opacity 0.5, no events |
115
+
116
+ ## Tokens consumed
117
+
118
+ In addition to the brand-specific tokens (above), inherits:
119
+
120
+ ```
121
+ --color-focus-ring
122
+ --color-on-brand-yellow (computed: #000 for KakaoPay, etc.)
123
+ --space-sm, --space-md
124
+ --radius-md
125
+ --font-size-base, --font-size-lg
126
+ --font-weight-semibold
127
+ --motion-fast, --easing-out
128
+ ```
129
+
130
+ ## Accessibility
131
+
132
+ - Render as `<button>`. Never `<div onClick>`.
133
+ - `aria-label` includes brand + action ("Pay 45,000 won with KakaoPay") if the visible text is just "KakaoPay 결제".
134
+ - Logo: `aria-hidden="true"` (the label carries meaning).
135
+ - Loading state: `aria-busy="true"`.
136
+ - Disabled state: `aria-disabled="true"` + native `disabled`.
137
+ - Focus indicator: brand-color buttons need a custom focus ring that clears 3:1 against the brand background. Often a 2px ring offset 2px in `--color-bg-default` works (page background visible behind ring).
138
+
139
+ ## Behavior
140
+
141
+ ### Click flow
142
+
143
+ 1. User taps button.
144
+ 2. Button enters loading state.
145
+ 3. Brand SDK opens (popup, redirect, or wallet app handoff).
146
+ 4. User authenticates / approves in the brand UX.
147
+ 5. SDK callback returns success or failure.
148
+ 6. Button exits loading; parent flow handles outcome.
149
+
150
+ ### SDK initialization
151
+
152
+ This component wraps `onClick`. The `onClick` is responsible for calling the brand SDK:
153
+
154
+ ```ts
155
+ const initiateKakaoPay = async () => {
156
+ setLoading(true);
157
+ try {
158
+ const result = await window.Kakao.Pay.requestPayment({
159
+ cid: "TC0ONETIME",
160
+ partner_order_id: orderId,
161
+ partner_user_id: userId,
162
+ item_name: orderName,
163
+ total_amount: amount,
164
+ // ...
165
+ });
166
+ onSuccess(result);
167
+ } catch (err) {
168
+ onError(err);
169
+ } finally {
170
+ setLoading(false);
171
+ }
172
+ };
173
+ ```
174
+
175
+ The SDK setup (script load, init) happens at app bootstrap; the button just triggers.
176
+
177
+ ## Code example
178
+
179
+ ```tsx
180
+ function CheckoutFooter({ amount, orderId }: Props) {
181
+ const [loading, setLoading] = useState<Brand | null>(null);
182
+
183
+ const handlePay = async (brand: Brand) => {
184
+ setLoading(brand);
185
+ try {
186
+ const result = await initiatePayment(brand, { amount, orderId });
187
+ navigate(`/orders/${result.orderId}/success`);
188
+ } catch (err) {
189
+ toast.error("결제에 실패했습니다", { description: err.message });
190
+ } finally {
191
+ setLoading(null);
192
+ }
193
+ };
194
+
195
+ return (
196
+ <FixedFooter className="space-y-2">
197
+ <PaymentBrandButton
198
+ brand="kakaopay"
199
+ amount={amount}
200
+ size="lg"
201
+ fullWidth
202
+ loading={loading === "kakaopay"}
203
+ disabled={loading !== null}
204
+ onClick={() => handlePay("kakaopay")}
205
+ />
206
+ <PaymentBrandButton
207
+ brand="naverpay"
208
+ size="lg"
209
+ fullWidth
210
+ loading={loading === "naverpay"}
211
+ disabled={loading !== null}
212
+ onClick={() => handlePay("naverpay")}
213
+ />
214
+ <Button variant="outline" size="lg" fullWidth onClick={() => navigate("/checkout/card")}>
215
+ 다른 결제 수단
216
+ </Button>
217
+ </FixedFooter>
218
+ );
219
+ }
220
+ ```
221
+
222
+ ## Edge cases
223
+
224
+ - **Brand not available on platform**: Apple Pay only on iOS Safari + WebKit-iOS. Hide the button on unsupported platforms; don't show as "disabled".
225
+ - **Brand SDK fails to load**: log + show non-brand fallback. Don't show a button that won't work.
226
+ - **User dismisses brand modal mid-flow**: button returns to default state, no error toast (user-cancelled, not failure).
227
+ - **Network drops mid-payment**: server-side webhook reconciles; UI shows "결제 처리 중..." until resolved.
228
+ - **A/B testing brand button styles**: don't. Brands require official assets — no creative variants.
229
+ - **Dark mode**: brand assets are designed for light bg. KakaoPay yellow on dark bg is jarring. Some brands publish dark-mode variants; check guidelines.
230
+
231
+ ## Don't
232
+
233
+ - Don't restyle brand colors / logos / wordmarks.
234
+ - Don't omit the brand logo.
235
+ - Don't combine multiple brand logos in one button (e.g., "KakaoPay or NaverPay" — make them separate buttons).
236
+ - Don't disable the button after loading without showing an error.
237
+ - Don't show 5+ brand buttons on one screen — overwhelming. Group via `PaymentMethodSelector` instead.
238
+ - Don't translate the wordmark ("kakao pay" stays English even on Korean app — that's the brand).
239
+ - Don't use brand buttons for non-payment actions (login, sharing). Different buttons for different purposes.
240
+
241
+ ## References
242
+
243
+ - KakaoPay Developers: [https://developers.kakaopay.com/](https://developers.kakaopay.com/)
244
+ - NaverPay merchant: [https://developer.pay.naver.com/](https://developer.pay.naver.com/)
245
+ - Toss Payments: [https://docs.tosspayments.com/](https://docs.tosspayments.com/)
246
+ - Apple Pay HIG: [https://developer.apple.com/design/human-interface-guidelines/apple-pay](https://developer.apple.com/design/human-interface-guidelines/apple-pay)
247
+ - Samsung Pay developers: [https://pay.samsung.com/developers](https://pay.samsung.com/developers)
248
+
249
+ ## Cross-reference
250
+
251
+ - [`examples/component-payment-method-selector.md`](component-payment-method-selector.md) — selector that includes these buttons
252
+ - [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — vendor selection rules
253
+ - [`knowledge/a11y/contrast.md`](../knowledge/a11y/contrast.md) — focus ring contrast on brand-colored buttons
@@ -0,0 +1,272 @@
1
+ # `PaymentMethodSelector` (custom — Korean) — spec
2
+
3
+ > Custom component pattern. The payment method selector is the highest-stakes screen in any e-commerce / fintech checkout. Korean conventions differ significantly from Western ones.
4
+ >
5
+ > Cited knowledge: [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md), [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md)
6
+
7
+ ## Purpose
8
+
9
+ Lets the user pick how to pay during checkout: cards, wallets (KakaoPay/NaverPay/Toss), bank transfer (무통장입금), carrier billing (휴대폰결제), real-time bank transfer (계좌이체).
10
+
11
+ The order, grouping, and visual emphasis matter — Korean users have strong expectations.
12
+
13
+ ## Anatomy
14
+
15
+ ```
16
+ ┌──────────────────────────────────────────────────┐
17
+ │ 결제 수단 선택 │
18
+ │ │
19
+ │ ─── 간편결제 ─────────────────────────────────── │
20
+ │ ◯ [💛 KakaoPay 로고] > │
21
+ │ ◯ [💚 NaverPay 로고] > │
22
+ │ ◯ [💙 Toss 로고] > │
23
+ │ │
24
+ │ ─── 카드 ─────────────────────────────────────── │
25
+ │ ◯ 신용/체크카드 > │
26
+ │ [등록된 카드: 국민카드 ****-1234] │
27
+ │ │
28
+ │ ─── 기타 ─────────────────────────────────────── │
29
+ │ ◯ 휴대폰 결제 > │
30
+ │ ◯ 무통장 입금 > │
31
+ └──────────────────────────────────────────────────┘
32
+ ```
33
+
34
+ | Slot | Required | Notes |
35
+ | --- | --- | --- |
36
+ | Section header per group | yes | "간편결제", "카드", "기타" |
37
+ | Method row | yes | Radio + brand logo + label + chevron |
38
+ | Saved-method indicator | optional | "등록된 카드: ..." |
39
+ | Selection indicator | yes | Radio (`◯` / `●`) or selected state |
40
+ | Drill-in chevron | optional | When picking opens detail screen (card list, account input) |
41
+
42
+ ## API
43
+
44
+ ```tsx
45
+ <PaymentMethodSelector
46
+ value={selectedMethod}
47
+ onValueChange={setSelectedMethod}
48
+ availableMethods={["kakaopay", "naverpay", "toss", "card", "phone", "vbank"]}
49
+ savedCards={user.savedCards}
50
+ audience="consumer"
51
+ amount={45000}
52
+ />
53
+ ```
54
+
55
+ | Prop | Type | Default | Description |
56
+ | --- | --- | --- | --- |
57
+ | `value` | `Method \| null` | — | Selected method |
58
+ | `onValueChange` | `(method) => void` | — | |
59
+ | `availableMethods` | `Method[]` | all | Server-allowed methods |
60
+ | `savedCards` | `Card[]` | `[]` | User's pre-registered cards (display next to "신용카드") |
61
+ | `audience` | `"consumer" \| "b2b" \| "b2b-young"` | `"consumer"` | Drives ordering + emphasis |
62
+ | `amount` | `number` | — | Used to filter (e.g., 휴대폰결제 only for < ₩500K) |
63
+ | `showFees` | `boolean` | `false` | Show per-method fee disclosure |
64
+ | `disabled` | `boolean` | `false` | |
65
+
66
+ ```ts
67
+ type Method =
68
+ | "kakaopay" // KakaoPay wallet
69
+ | "naverpay" // Naver Pay wallet
70
+ | "toss" // Toss wallet
71
+ | "samsungpay" // Samsung Pay
72
+ | "card" // Credit / debit card
73
+ | "phone" // 휴대폰 결제
74
+ | "vbank" // 무통장 입금 (virtual account)
75
+ | "transfer"; // 계좌이체 (real-time)
76
+ ```
77
+
78
+ ## Method ordering by audience
79
+
80
+ Per [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md):
81
+
82
+ ### Consumer (default)
83
+
84
+ ```
85
+ 1. KakaoPay ← top — most-used wallet
86
+ 2. NaverPay
87
+ 3. Toss
88
+ ─── 카드 ───────
89
+ 4. Credit/debit card
90
+ ─── 기타 ───────
91
+ 5. 휴대폰 결제 (if amount eligible)
92
+ 6. 무통장 입금
93
+ ```
94
+
95
+ ### B2B / Older audience
96
+
97
+ ```
98
+ 1. Credit/debit card ← cards first
99
+ 2. 무통장 입금
100
+ 3. 계좌이체
101
+ ─── 간편결제 ───────
102
+ 4. KakaoPay (below the fold)
103
+ 5. NaverPay
104
+ ```
105
+
106
+ ### Young / fintech-coded
107
+
108
+ ```
109
+ 1. Toss ← Toss-first for young audience
110
+ 2. KakaoPay
111
+ 3. Card
112
+ 4. 무통장 입금
113
+ ```
114
+
115
+ ## Brand button design
116
+
117
+ Each wallet brand has official assets — **don't restyle**:
118
+
119
+ | Brand | Color | Logo |
120
+ | --- | --- | --- |
121
+ | KakaoPay | Yellow `#FFCD00` | "KakaoPay" wordmark + speech-bubble icon |
122
+ | NaverPay | Green `#00C73C` | "NaverPay" wordmark + N icon |
123
+ | Toss | Blue `#3182F6` | "toss" wordmark + dot icon |
124
+ | Samsung Pay | Black + brand red | "Samsung Pay" wordmark |
125
+ | Apple Pay | Black | "Apple Pay" wordmark per Apple guidelines |
126
+
127
+ When rendering as a brand button (selected, primary CTA), use the official color as background. When rendering as a list option (radio button), brand logo on left + neutral text label on right.
128
+
129
+ See `component-payment-brand-button.md` for the brand button itself.
130
+
131
+ ## Behavior
132
+
133
+ ### Selection
134
+
135
+ - Click a row: select that method.
136
+ - For methods needing more info (card → which card?, vbank → which bank?): drill into a detail screen on selection.
137
+ - For one-tap wallets: just select and let the parent flow proceed.
138
+
139
+ ### Saved card display
140
+
141
+ If user has saved cards and picks "신용카드":
142
+ - Show the most-recent card inline ("등록된 카드: 국민카드 ****-1234").
143
+ - Drill into card list on tap to choose another or add new.
144
+
145
+ ### Method filtering by amount
146
+
147
+ Example: 휴대폰결제 typically maxes out at ₩500,000. If `amount > 500000`, hide phone option (or show disabled with "한도 초과" hint).
148
+
149
+ ### Disabled methods
150
+
151
+ Server might disable certain methods per-merchant or per-user. Disabled methods stay visible but greyed out, with a brief "사용할 수 없습니다" hint.
152
+
153
+ ## States
154
+
155
+ | State | Visual |
156
+ | --- | --- |
157
+ | Default | Method visible, radio empty |
158
+ | Selected | Filled radio + slight bg highlight |
159
+ | Disabled | Muted, no events, hint text |
160
+ | Hover | Bg slightly darker |
161
+
162
+ ## Tokens consumed
163
+
164
+ ```
165
+ --color-bg-default
166
+ --color-bg-elevated (selected row bg)
167
+ --color-bg-subtle (hover)
168
+ --color-primary-default (selected radio)
169
+ --color-text-primary
170
+ --color-text-secondary (saved-method indicator)
171
+ --color-text-tertiary (disabled hint)
172
+ --color-text-disabled
173
+ --color-border-default
174
+ --color-focus-ring
175
+ --space-md, --space-lg
176
+ --radius-md
177
+ ```
178
+
179
+ Brand colors (from each vendor's official guidelines):
180
+
181
+ ```
182
+ --color-kakaopay-yellow: #FFCD00
183
+ --color-kakaopay-text: #000000
184
+ --color-naverpay-green: #00C73C
185
+ --color-naverpay-text: #FFFFFF
186
+ --color-toss-blue: #3182F6
187
+ --color-toss-text: #FFFFFF
188
+ ```
189
+
190
+ ## Accessibility
191
+
192
+ - Radio group: `<fieldset>` + `<legend>결제 수단</legend>`.
193
+ - Each row: `<input type="radio">` + `<label>`.
194
+ - Brand logos: `alt` attribute or `aria-label` (e.g., "KakaoPay 로고").
195
+ - Section headers: `<h3>` (or appropriate) for each group.
196
+ - Disabled rows: `aria-disabled="true"` with `aria-describedby` pointing to the disabled hint.
197
+ - Saved card info: announced as part of the radio label ("Credit card. 등록된 카드: 국민카드 ****-1234").
198
+
199
+ ## Code example
200
+
201
+ ```tsx
202
+ function CheckoutPaymentScreen() {
203
+ const [method, setMethod] = useState<Method | null>(null);
204
+ const user = useUser();
205
+ const { amount } = useCart();
206
+
207
+ const handleProceed = () => {
208
+ if (!method) return;
209
+ if (method === "card") {
210
+ navigate("/checkout/select-card");
211
+ } else if (method === "kakaopay") {
212
+ initiateKakaoPay({ amount });
213
+ } else if (method === "naverpay") {
214
+ initiateNaverPay({ amount });
215
+ }
216
+ // ...
217
+ };
218
+
219
+ return (
220
+ <Page>
221
+ <PaymentMethodSelector
222
+ value={method}
223
+ onValueChange={setMethod}
224
+ availableMethods={availableMethods}
225
+ savedCards={user.savedCards}
226
+ audience="consumer"
227
+ amount={amount}
228
+ />
229
+ <FixedFooter>
230
+ <p className="font-medium">총 결제 금액: ₩{amount.toLocaleString()}</p>
231
+ <Button size="lg" disabled={!method} onClick={handleProceed}>
232
+ 결제하기
233
+ </Button>
234
+ </FixedFooter>
235
+ </Page>
236
+ );
237
+ }
238
+ ```
239
+
240
+ ## Edge cases
241
+
242
+ - **Saved card expired**: show with warning marker, prevent selection or prompt to update.
243
+ - **All methods disabled** (rare server config issue): show error state suggesting contact support.
244
+ - **Method selected but server rejects on attempt** (e.g., card declined): keep selection, show error, suggest different method.
245
+ - **First-time user with no saved data**: all rows show; "신용카드" requires entering card on next screen.
246
+ - **Quick-checkout with one default method**: hide selector entirely; show one row "결제: KakaoPay [변경]".
247
+ - **Multiple saved cards of same type**: show count ("등록된 카드 3장").
248
+ - **International tourist using KR app**: PayPal or 신용카드 (international) — most apps don't support; explain.
249
+
250
+ ## Don't
251
+
252
+ - Don't restyle brand logos / colors — vendors require official assets.
253
+ - Don't put all methods in one flat list. Group them.
254
+ - Don't reorder by personal preference. Korean conventions are strong.
255
+ - Don't auto-select a default method. Let user choose.
256
+ - Don't show 8+ methods. If you have more, group "기타" with a drill-in.
257
+ - Don't gate the selector behind login. Allow guest checkout where possible (with explicit signup nudge).
258
+ - Don't omit fee disclosure if fees apply (legal in Korea for some categories).
259
+ - Don't make wallets less prominent than cards in consumer flows.
260
+
261
+ ## API rationale
262
+
263
+ - **`audience` prop**: ordering varies dramatically. A B2B SaaS shouldn't show KakaoPay first.
264
+ - **`availableMethods` server-driven**: not all merchants accept all methods; server is the source of truth.
265
+ - **`amount` prop**: enables method filtering (휴대폰결제 cap, etc.) without consumer logic in the parent.
266
+
267
+ ## Cross-reference
268
+
269
+ - [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — vendor selection, ordering rules, integration UX
270
+ - [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md) — Korean payment conventions
271
+ - [`examples/component-payment-brand-button.md`](component-payment-brand-button.md) — the actual brand button rendering
272
+ - [`examples/component-form-controls.md`](component-form-controls.md) — radio group pattern