@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,243 @@
1
+ # `Item` — spec
2
+
3
+ > Synthesized from shadcn-ui `item` (a flexible list-item primitive). The "Item family" — `Item`, `ItemMedia`, `ItemContent`, `ItemTitle`, `ItemDescription`, `ItemActions`, `ItemSeparator`, `ItemHeader`, `ItemFooter`. The atomic building block for lists, tables-of-things, settings rows, account rows, search results.
4
+
5
+ ## When to use
6
+
7
+ - **Settings rows** (with leading icon, title, description, trailing chevron / switch).
8
+ - **Account / profile rows** (avatar + name + role + actions).
9
+ - **Search results** (icon / image + title + meta + actions).
10
+ - **List rows** in any list-of-entities surface (mail inbox, notifications, files).
11
+
12
+ When NOT to use:
13
+ - Data-grid rows — use `Table`.
14
+ - Card-style entities — use `Card`.
15
+ - Pure text list — use `<ul>` / `<ol>`.
16
+
17
+ ## Anatomy
18
+
19
+ ```
20
+ ┌────────────────────────────────────┐
21
+ │ [icon] [title] [⋮] │ ← single-line, with action
22
+ │ [description] │
23
+ └────────────────────────────────────┘
24
+
25
+ ┌────────────────────────────────────┐
26
+ │ [avatar 40px] Sungjin Park │ ← list / contact pattern
27
+ │ Senior Designer │
28
+ │ ▶ │
29
+ └────────────────────────────────────┘
30
+ ```
31
+
32
+ ## API
33
+
34
+ ```tsx
35
+ <Item>
36
+ <ItemMedia>
37
+ <Avatar src={user.avatar} />
38
+ </ItemMedia>
39
+ <ItemContent>
40
+ <ItemTitle>{user.name}</ItemTitle>
41
+ <ItemDescription>{user.role}</ItemDescription>
42
+ </ItemContent>
43
+ <ItemActions>
44
+ <Button variant="ghost" size="icon">
45
+ <ChevronRightIcon />
46
+ </Button>
47
+ </ItemActions>
48
+ </Item>
49
+ ```
50
+
51
+ ## Composition
52
+
53
+ | Part | Purpose |
54
+ | --- | --- |
55
+ | `Item` | Outer row wrapper |
56
+ | `ItemMedia` | Leading visual (icon, avatar, image) |
57
+ | `ItemContent` | Middle text region (Title + Description) |
58
+ | `ItemTitle` | Primary text |
59
+ | `ItemDescription` | Secondary muted text |
60
+ | `ItemActions` | Trailing action(s) (button, switch, count, chevron) |
61
+ | `ItemHeader` | Above-content metadata (date, author) |
62
+ | `ItemFooter` | Below-content secondary content |
63
+ | `ItemSeparator` | Divider between consecutive Items |
64
+
65
+ ## Variants
66
+
67
+ ### Density
68
+
69
+ | Density | Padding | Typical Title size |
70
+ | --- | --- | --- |
71
+ | `comfortable` (default) | `--space-md` | 14-16px |
72
+ | `compact` | `--space-sm` | 13-14px |
73
+ | `relaxed` | `--space-lg` | 16-18px |
74
+
75
+ ### Interactive
76
+
77
+ ```tsx
78
+ <Item asChild>
79
+ <a href={`/users/${user.id}`}>...</a>
80
+ </Item>
81
+
82
+ <Item interactive onClick={onClick}>...</Item>
83
+ ```
84
+
85
+ When interactive, the entire row is the click target (block link pattern).
86
+
87
+ ### Selectable
88
+
89
+ ```tsx
90
+ <Item selected={isSelected} onSelect={handleSelect}>
91
+ ...
92
+ </Item>
93
+ ```
94
+
95
+ Used in selection lists (mail, files). Selected state has highlight bg + persistent indicator.
96
+
97
+ ## States
98
+
99
+ | State | Visual |
100
+ | --- | --- |
101
+ | Default | Resting |
102
+ | Hover (interactive) | Subtle bg shift |
103
+ | Pressed | Deeper bg (touch) or stable (mouse) |
104
+ | Focus-visible | 2px focus ring on the entire row |
105
+ | Selected | Persistent bg highlight + brand-color indicator |
106
+ | Disabled | Reduced opacity, no events, `aria-disabled` |
107
+
108
+ ## Tokens consumed
109
+
110
+ ```
111
+ --item-bg (default; transparent)
112
+ --item-bg-hover (interactive hover)
113
+ --item-bg-selected (selected state)
114
+ --item-fg (Title)
115
+ --item-fg-muted (Description)
116
+ --item-padding-y (varies by density)
117
+ --item-padding-x (typically --space-md)
118
+ --item-gap (between Media / Content / Actions)
119
+ --item-divider (Separator color)
120
+ --space-sm, --space-md, --space-lg
121
+ --radius-md (rounded item highlight)
122
+ --motion-fast (hover transition)
123
+ ```
124
+
125
+ ## Accessibility
126
+
127
+ - `Item`:
128
+ - If interactive (clickable row): use real `<a>` or `<button>`. Apply `block` styles. Focus goes to the wrapper.
129
+ - If non-interactive: plain `<li>` inside parent `<ul>` / `<ol>`.
130
+ - For multi-action items (selectable + has trailing actions): outer is `<button>` for select, but Trailing buttons inside can't be nested. Use a different pattern (separate select + actions, or label-for-checkbox pattern).
131
+ - `ItemTitle`: typically `<h3>` or `<h4>` if list is a section's content, or just text in a list of homogenous items.
132
+ - `ItemActions`: each action is an independent button with its own `aria-label`.
133
+ - Touch target: ≥ 44pt for the row OR the action(s).
134
+ - Selected state: `aria-selected="true"` (in selection list) or `aria-checked` if checkbox-style.
135
+
136
+ ## Korean apps
137
+
138
+ Korean list patterns:
139
+ - **Account row**: avatar + name + role / phone + "더보기" arrow
140
+ - **Settings row**: icon + label + value (e.g., "언어 — 한국어 ▶") + chevron
141
+ - **Notification row**: icon + title (bold) + body (muted) + timestamp + unread dot
142
+ - **Transaction row** (fintech): merchant logo + name + amount (right) + date below — see [`examples/component-transaction-list-item.md`](component-transaction-list-item.md) for KR fintech specifics.
143
+
144
+ Common labels:
145
+ - 더보기 (more)
146
+ - 설정 (settings)
147
+ - 알림 (notifications)
148
+ - 자세히 (details)
149
+
150
+ ## Code example — settings list
151
+
152
+ ```tsx
153
+ function SettingsList() {
154
+ return (
155
+ <div role="list">
156
+ <Item asChild interactive>
157
+ <Link href="/settings/profile">
158
+ <ItemMedia><UserIcon /></ItemMedia>
159
+ <ItemContent>
160
+ <ItemTitle>프로필</ItemTitle>
161
+ <ItemDescription>이름, 사진, 자기소개</ItemDescription>
162
+ </ItemContent>
163
+ <ItemActions>
164
+ <ChevronRightIcon className="text-muted" />
165
+ </ItemActions>
166
+ </Link>
167
+ </Item>
168
+
169
+ <ItemSeparator />
170
+
171
+ <Item asChild interactive>
172
+ <Link href="/settings/notifications">
173
+ <ItemMedia><BellIcon /></ItemMedia>
174
+ <ItemContent>
175
+ <ItemTitle>알림</ItemTitle>
176
+ <ItemDescription>이메일, 푸시, SMS 설정</ItemDescription>
177
+ </ItemContent>
178
+ <ItemActions>
179
+ <ChevronRightIcon className="text-muted" />
180
+ </ItemActions>
181
+ </Link>
182
+ </Item>
183
+
184
+ <ItemSeparator />
185
+
186
+ <Item>
187
+ <ItemMedia><MoonIcon /></ItemMedia>
188
+ <ItemContent>
189
+ <ItemTitle>다크 모드</ItemTitle>
190
+ </ItemContent>
191
+ <ItemActions>
192
+ <Switch checked={isDark} onCheckedChange={setIsDark} />
193
+ </ItemActions>
194
+ </Item>
195
+
196
+ <ItemSeparator />
197
+
198
+ <Item asChild interactive>
199
+ <Link href="/help">
200
+ <ItemMedia><QuestionIcon /></ItemMedia>
201
+ <ItemContent>
202
+ <ItemTitle>도움말</ItemTitle>
203
+ </ItemContent>
204
+ <ItemActions>
205
+ <ChevronRightIcon className="text-muted" />
206
+ </ItemActions>
207
+ </Link>
208
+ </Item>
209
+ </div>
210
+ );
211
+ }
212
+ ```
213
+
214
+ ## Edge cases
215
+
216
+ - **Long Title**: truncate with ellipsis (`overflow: hidden; text-overflow: ellipsis; white-space: nowrap`). Don't wrap unless ItemDescription expects to wrap too.
217
+ - **Long Description**: typically 1-2 lines; truncate with `-webkit-line-clamp`.
218
+ - **Multiple actions in ItemActions**: tightest is 2-3; if more, group into "More" menu.
219
+ - **Toggle / Switch in row**: the whole row clickable also toggles? Decide; consistency matters.
220
+ - **Selectable + interactive conflict**: can't have entire row as `<a>` AND `<button>` for select. Pattern: row is `<a>`, leading checkbox handles select.
221
+ - **RTL**: Media and Actions positions flip.
222
+ - **Reduced motion**: skip hover bg transition.
223
+
224
+ ## Don't
225
+
226
+ - Don't pile up 4+ actions in ItemActions. Use overflow menu.
227
+ - Don't make Title and Description the same weight / size — hierarchy matters.
228
+ - Don't auto-truncate Description without showing user the rest is hidden (line-clamp + ellipsis OK; silent crop bad).
229
+ - Don't put inputs (text fields) inside ItemActions. Use a different pattern (or Field row).
230
+ - Don't omit `aria-label` on icon-only Action buttons.
231
+ - Don't make rows shorter than 44pt on mobile primary surfaces.
232
+
233
+ ## References
234
+
235
+ - shadcn-ui: [`item`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/item.tsx)
236
+ - iOS UITableViewCell; Material 3 List item
237
+
238
+ ## Cross-reference
239
+
240
+ - [`examples/component-transaction-list-item.md`](component-transaction-list-item.md) — KR fintech specialization
241
+ - [`examples/component-card.md`](component-card.md) — for richer / card-style entities
242
+ - [`examples/component-table.md`](component-table.md) — for tabular data
243
+ - [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md)
@@ -0,0 +1,197 @@
1
+ # `Kbd` — spec
2
+
3
+ > Synthesized from shadcn-ui `kbd` and the HTML5 `<kbd>` element. Renders a keyboard shortcut as a small key cap. Used in tooltips, command palettes, dropdown menu shortcuts, documentation.
4
+
5
+ ## When to use
6
+
7
+ - **Inline keyboard shortcut** in tooltips: "⌘ S to save".
8
+ - **Command palette / dropdown menu shortcuts**: right-aligned shortcut hint.
9
+ - **Documentation**: "Press ⌘ K to open the command palette".
10
+ - **Help overlays**: keyboard shortcut cheatsheets.
11
+
12
+ ## Anatomy
13
+
14
+ ```
15
+ [ ⌘ ] [ K ] or [ Ctrl ] [ K ] or [ ⇧ ] [ ⌘ ] [ P ]
16
+ ```
17
+
18
+ A small bordered + shadowed key cap with the key label inside.
19
+
20
+ ## API
21
+
22
+ ```tsx
23
+ <Kbd>⌘</Kbd> <Kbd>K</Kbd>
24
+
25
+ <Kbd combo>
26
+ <Kbd.Key>⇧</Kbd.Key>
27
+ <Kbd.Key>⌘</Kbd.Key>
28
+ <Kbd.Key>P</Kbd.Key>
29
+ </Kbd>
30
+
31
+ <Kbd shortcut="cmd+k" /> {/* Helper that auto-renders cmd / ctrl based on platform */}
32
+ ```
33
+
34
+ | Prop | Type | Default | Description |
35
+ | --- | --- | --- | --- |
36
+ | `size` | `"sm" \| "md"` | `"sm"` | Size of the key cap |
37
+ | `variant` | `"default" \| "outline"` | `"default"` | Visual style |
38
+ | `shortcut` | `string` | — | Convenience: parses "cmd+k" → renders ⌘ K |
39
+ | `children` | `ReactNode` | — | Manual content (one key or multiple `<Kbd.Key>`) |
40
+
41
+ ## Platform-aware shortcut parser
42
+
43
+ ```tsx
44
+ function Kbd({ shortcut }: { shortcut?: string }) {
45
+ if (!shortcut) return /* manual */;
46
+
47
+ const isMac = /Mac/.test(navigator.platform);
48
+ const keys = shortcut.split("+").map(k => {
49
+ const lower = k.toLowerCase();
50
+ if (lower === "cmd" || lower === "meta") return isMac ? "⌘" : "Ctrl";
51
+ if (lower === "ctrl") return "Ctrl";
52
+ if (lower === "shift") return "⇧";
53
+ if (lower === "alt" || lower === "option") return isMac ? "⌥" : "Alt";
54
+ if (lower === "enter") return "↵";
55
+ if (lower === "esc") return "Esc";
56
+ if (lower === "tab") return "⇥";
57
+ if (lower === "space") return "␣";
58
+ if (lower === "backspace") return "⌫";
59
+ return k.toUpperCase();
60
+ });
61
+
62
+ return <kbd>{keys.map((k, i) => <span key={i}>{k}</span>)}</kbd>;
63
+ }
64
+ ```
65
+
66
+ ## Symbols (Mac convention)
67
+
68
+ | Key | Symbol |
69
+ | --- | --- |
70
+ | Cmd / Meta | ⌘ (U+2318) |
71
+ | Shift | ⇧ (U+21E7) |
72
+ | Option / Alt | ⌥ (U+2325) |
73
+ | Control | ⌃ (U+2303) |
74
+ | Enter / Return | ↵ (U+21B5) or ⏎ (U+23CE) |
75
+ | Escape | Esc |
76
+ | Tab | ⇥ (U+21E5) |
77
+ | Space | ␣ (U+2423) |
78
+ | Backspace | ⌫ (U+232B) |
79
+ | Delete | ⌦ (U+2326) |
80
+ | Up / Down / Left / Right | ↑ ↓ ← → |
81
+ | Caps Lock | ⇪ (U+21EA) |
82
+ | Function | Fn |
83
+
84
+ For Windows / Linux: use text labels — "Ctrl", "Alt", "Shift", "Win".
85
+
86
+ ## States
87
+
88
+ Stateless. `<kbd>` is presentational.
89
+
90
+ ## Tokens consumed
91
+
92
+ ```
93
+ --kbd-bg (key cap bg, slightly different from page bg)
94
+ --kbd-fg (text on key)
95
+ --kbd-border (key border)
96
+ --kbd-shadow (subtle inset shadow for "cap" effect)
97
+ --radius-sm (key corners)
98
+ --font-family-mono (typically monospace for the key label)
99
+ --font-size-xs
100
+ --space-xxs (key padding)
101
+ ```
102
+
103
+ ## CSS
104
+
105
+ ```css
106
+ kbd, .kbd {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ padding: 1px 6px;
110
+ font-family: var(--font-family-mono);
111
+ font-size: var(--font-size-xs);
112
+ line-height: 1.4;
113
+ background: var(--kbd-bg);
114
+ color: var(--kbd-fg);
115
+ border: 1px solid var(--kbd-border);
116
+ border-radius: var(--radius-sm);
117
+ box-shadow: 0 1px 0 var(--kbd-border), 0 1px 0 inset rgba(255, 255, 255, 0.5);
118
+ min-width: 1.5em;
119
+ justify-content: center;
120
+ }
121
+
122
+ kbd + kbd {
123
+ margin-left: 2px;
124
+ }
125
+ ```
126
+
127
+ ## Accessibility
128
+
129
+ - Use the semantic `<kbd>` element. Screen readers announce as "keyboard input".
130
+ - For complex shortcuts: wrap in a `<span>` with `aria-label` describing the shortcut, since reading individual symbols may be confusing.
131
+
132
+ ```html
133
+ <span aria-label="Command K">
134
+ <kbd>⌘</kbd><kbd>K</kbd>
135
+ </span>
136
+ ```
137
+
138
+ - Don't rely on visual symbols alone for non-Mac users; provide text fallback.
139
+
140
+ ## Code example
141
+
142
+ ```tsx
143
+ function ShortcutTooltip({ children, shortcut }: Props) {
144
+ return (
145
+ <Tooltip>
146
+ <Tooltip.Trigger asChild>{children}</Tooltip.Trigger>
147
+ <Tooltip.Content>
148
+ Save <Kbd shortcut="cmd+s" />
149
+ </Tooltip.Content>
150
+ </Tooltip>
151
+ );
152
+ }
153
+
154
+ function CommandList() {
155
+ return (
156
+ <DropdownMenu>
157
+ <DropdownMenu.Trigger>Actions</DropdownMenu.Trigger>
158
+ <DropdownMenu.Content>
159
+ <DropdownMenu.Item>
160
+ New file <DropdownMenu.Shortcut><Kbd shortcut="cmd+n" /></DropdownMenu.Shortcut>
161
+ </DropdownMenu.Item>
162
+ <DropdownMenu.Item>
163
+ Open <DropdownMenu.Shortcut><Kbd shortcut="cmd+o" /></DropdownMenu.Shortcut>
164
+ </DropdownMenu.Item>
165
+ </DropdownMenu.Content>
166
+ </DropdownMenu>
167
+ );
168
+ }
169
+ ```
170
+
171
+ ## Edge cases
172
+
173
+ - **Korean keyboard mapping**: 한영 toggle uses dedicated key; can render as "한/영". Most app shortcuts use Latin characters even on Korean keyboards.
174
+ - **Ctrl + Cmd ambiguity**: prefer one canonical name per platform. Don't say "Cmd / Ctrl" — render the platform-correct symbol.
175
+ - **Mobile**: shortcut display rare on touch (no keyboard); hide or replace with alternative gesture description.
176
+ - **Multi-key combos**: render each key in its own `<kbd>`; combine with small gap.
177
+ - **Very long key labels** (e.g., "Backspace"): use the label not symbol in such cases.
178
+
179
+ ## Don't
180
+
181
+ - Don't render shortcut as plain text. The boxed appearance is the affordance.
182
+ - Don't use Mac symbols on Windows users (or vice-versa). Detect platform.
183
+ - Don't make the cap so small the label is unreadable.
184
+ - Don't put non-keyboard things in `<kbd>` (it's specifically for keys).
185
+
186
+ ## References
187
+
188
+ - HTML5 `<kbd>` element
189
+ - shadcn-ui: `kbd` component
190
+ - Apple HIG: keyboard shortcut conventions
191
+
192
+ ## Cross-reference
193
+
194
+ - [`examples/component-tooltip.md`](component-tooltip.md) — common consumer
195
+ - [`examples/component-dropdown.md`](component-dropdown.md) — Shortcut sub-component
196
+ - [`examples/component-command.md`](component-command.md) — heavy shortcut display
197
+ - [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md)
@@ -0,0 +1,219 @@
1
+ # `KRWAmount` (custom — display-only currency formatter) — spec
2
+
3
+ > Custom component pattern. Display-only counterpart to AmountInput. Renders KRW amounts consistently across the app — receipts, balances, transaction details, summaries.
4
+
5
+ ## Purpose
6
+
7
+ Formats and displays a KRW amount with the right separator, suffix/prefix, sign, and color. Read-only. Use everywhere money is displayed but not entered.
8
+
9
+ ## Why a separate component (not just `formatKRW(...)`)
10
+
11
+ A centralized component:
12
+ - Consistent formatting across the entire app.
13
+ - Single place to switch convention (suffix `원` vs prefix `₩`).
14
+ - Tabular numerals applied consistently.
15
+ - Color semantics consistent (money-positive / money-negative / neutral).
16
+ - Smaller payload than AmountInput (no input wiring).
17
+
18
+ ## Anatomy
19
+
20
+ ```
21
+ Default: Negative (expense): Hero (large display):
22
+ ₩2,847,500 -₩5,500 ₩12,847,500
23
+ ↑ 12,500원 이번 달
24
+
25
+ Korean number format: With sign explicit: Foreign currency:
26
+ 1,200만원 +₩2,500,000 $25.00 (약 ₩33,300)
27
+ ```
28
+
29
+ ## API
30
+
31
+ ```tsx
32
+ <KRWAmount value={2847500} />
33
+ <KRWAmount value={-5500} type="expense" />
34
+ <KRWAmount value={user.balance} variant="hero" delta={{ value: 12500, period: "이번 달" }} />
35
+ <KRWAmount value={1200000} format="korean" /> // "1,200만원"
36
+ ```
37
+
38
+ | Prop | Type | Default | Description |
39
+ | --- | --- | --- | --- |
40
+ | `value` | `number` | — | Amount in won (smallest unit) |
41
+ | `currency` | `"KRW"` (locked) | `"KRW"` | Reserved for future i18n |
42
+ | `type` | `"income" \| "expense" \| "transfer" \| "neutral"` | inferred from sign | Drives color |
43
+ | `variant` | `"default" \| "compact" \| "hero" \| "inline"` | `"default"` | Size + emphasis |
44
+ | `format` | `"comma" \| "korean"` | `"comma"` | "1,200,000" vs "120만" |
45
+ | `affixStyle` | `"prefix" \| "suffix"` | `"suffix"` | `1,200,000원` vs `₩1,200,000` |
46
+ | `showSign` | `boolean` | `false` | Force `+` for positive |
47
+ | `precision` | `number` | `0` | Decimals (always 0 for KRW) |
48
+ | `delta` | `Delta` | — | Below-amount comparison |
49
+ | `compactThreshold` | `number` | `10000` | When format=korean: only convert above this |
50
+
51
+ ## Variants
52
+
53
+ ### `default`
54
+
55
+ Standard inline display. Body-size text, tabular numerals.
56
+
57
+ ```tsx
58
+ <KRWAmount value={2847500} />
59
+ ```
60
+ Renders: `₩2,847,500` or `2,847,500원` depending on convention.
61
+
62
+ ### `compact`
63
+
64
+ Smaller text, for table cells / sidebars.
65
+
66
+ ```tsx
67
+ <KRWAmount value={2847500} variant="compact" />
68
+ ```
69
+
70
+ ### `hero`
71
+
72
+ Large display for hero amounts (account balance, total order):
73
+ - Font: 32–48px
74
+ - Weight: 700
75
+ - Tabular numerals
76
+ - Optional delta below
77
+
78
+ ```tsx
79
+ <KRWAmount
80
+ value={user.balance}
81
+ variant="hero"
82
+ delta={{ value: 12500, period: "이번 달", goalDirection: "up" }}
83
+ />
84
+ ```
85
+
86
+ Renders:
87
+ ```
88
+ ₩12,847,500
89
+ ↑ 12,500원 이번 달
90
+ ```
91
+
92
+ ### `inline`
93
+
94
+ Minimal styling — fits inside a sentence:
95
+
96
+ ```tsx
97
+ <p>총 결제 금액은 <KRWAmount value={45000} variant="inline" />입니다.</p>
98
+ ```
99
+
100
+ ## Format styles
101
+
102
+ ### `comma` (default)
103
+
104
+ Standard thousands separator: `2,847,500원` or `₩2,847,500`.
105
+
106
+ ### `korean`
107
+
108
+ Korean number names (만, 억) for compact display:
109
+ - < 10,000 won: `123원`
110
+ - 10,000–9,999,999 won: `1,234만원` (showing 만 as the unit)
111
+ - ≥ 10,000,000 won: `1억 2,345만원`
112
+
113
+ Use `korean` format for:
114
+ - Real estate prices (massive amounts)
115
+ - Investment account totals
116
+ - Hero displays in casual consumer apps
117
+
118
+ Don't use for transactional amounts (cart totals, transfers) — full digits required for accuracy.
119
+
120
+ ## Type / color mapping
121
+
122
+ Per [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md):
123
+
124
+ | `type` | Color | Sign default |
125
+ | --- | --- | --- |
126
+ | `expense` | `--color-money-negative` | `-` |
127
+ | `income` | `--color-money-positive` | `+` (if `showSign`) |
128
+ | `transfer` | `--color-money-neutral` | `-` or none |
129
+ | `neutral` | `--color-text-primary` | none |
130
+
131
+ Inferred from sign by default; override with `type` prop.
132
+
133
+ ## Tokens consumed
134
+
135
+ ```
136
+ --color-text-primary
137
+ --color-money-positive
138
+ --color-money-negative
139
+ --color-money-neutral
140
+ --font-feature-amount: 'tnum' 1 (critical)
141
+ --font-size-sm, --font-size-base, --font-size-2xl, --font-size-4xl
142
+ --font-weight-semibold, --font-weight-bold
143
+ ```
144
+
145
+ ## Accessibility
146
+
147
+ - Render as `<span>` with semantic-aware `aria-label`:
148
+ ```html
149
+ <span aria-label="290만 원">₩2,847,500</span>
150
+ ```
151
+ - For type="expense": `aria-label="5,500원 지출"`.
152
+ - For income: `aria-label="2,500,000원 수입"`.
153
+ - Color is supplementary; don't encode meaning by color alone — sign + label do the work for screen readers.
154
+
155
+ ## Code examples
156
+
157
+ ```tsx
158
+ // Transaction list cell
159
+ <KRWAmount value={tx.amount} type={tx.type} variant="compact" />
160
+
161
+ // Account balance hero
162
+ <KRWAmount
163
+ value={account.balance}
164
+ variant="hero"
165
+ delta={{
166
+ value: account.monthlyChange,
167
+ period: "이번 달",
168
+ goalDirection: account.balanceType === "savings" ? "up" : undefined,
169
+ }}
170
+ />
171
+
172
+ // Receipt total
173
+ <KRWAmount value={order.total} variant="default" affixStyle="prefix" />
174
+
175
+ // Inline in narrative
176
+ <p>이번 달 지출: <KRWAmount value={monthlyExpense} type="expense" variant="inline" /></p>
177
+
178
+ // Korean compact for property listing
179
+ <KRWAmount value={propertyPrice} format="korean" variant="hero" />
180
+ {/* Renders: 5억 2,000만원 */}
181
+
182
+ // Foreign equivalent
183
+ <div>
184
+ <span>$25.00</span>
185
+ <span className="text-text-secondary">
186
+ (약 <KRWAmount value={33300} variant="inline" />)
187
+ </span>
188
+ </div>
189
+ ```
190
+
191
+ ## Edge cases
192
+
193
+ - **Zero**: render as `0원` or `₩0` (not `-원`).
194
+ - **Negative amount with `showSign`**: prefer `-₩5,500` not `₩-5,500`.
195
+ - **Very large** (조 level): always full digits or with 조 unit. Don't crash.
196
+ - **Floating-point error in input**: round to integer at the boundary (`Math.round(value)`).
197
+ - **Currency conversion display**: pair with `KRWAmount` for the Korean half + native span for the foreign currency.
198
+
199
+ ## Don't
200
+
201
+ - Don't show decimals for KRW. Round to integer at compute.
202
+ - Don't omit tabular numerals. Tables with mixed widths look broken.
203
+ - Don't auto-convert to `korean` format for transactional values — accuracy matters.
204
+ - Don't forget signed-amount color logic — silently positive amounts colored as negative is a real bug.
205
+ - Don't use `--color-error` for expense color. `money-negative` is its own axis.
206
+
207
+ ## API rationale
208
+
209
+ - **`value` is a number, not a formatted string**: source of truth. KRWAmount is the single point of formatting.
210
+ - **`type` separate from sign**: a positive transfer (e.g., +₩100,000 to your savings account) is "neutral", not "income".
211
+ - **`format` opt-in for Korean compact**: full digits is the safer default; `korean` is the display option.
212
+
213
+ ## Cross-reference
214
+
215
+ - [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — full money-display rules
216
+ - [`examples/component-amount-input.md`](component-amount-input.md) — editable counterpart
217
+ - [`examples/component-statistic.md`](component-statistic.md) — for KPI hero amounts (alternative)
218
+ - [`examples/component-transaction-list-item.md`](component-transaction-list-item.md) — uses KRWAmount internally
219
+ - [`examples/component-account-card.md`](component-account-card.md) — uses KRWAmount internally