@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,252 @@
1
+ # `HeroBlock` (landing hero) — spec
2
+
3
+ > Marketing-page primitive. The first thing visitors see. Cite [`knowledge/patterns/landing-hero-design.md`](../knowledge/patterns/landing-hero-design.md) for variants and rationale.
4
+
5
+ ## Purpose
6
+
7
+ The top of a landing page. Headline, supporting text, primary CTA, and supporting visual. The single most-iterated element on any product website.
8
+
9
+ ## Anatomy
10
+
11
+ ```
12
+ Pattern A (text-led, image right):
13
+ ┌────────────────────────────────────────────────────────────┐
14
+ │ │
15
+ │ Headline — what you do (40-60pt) │
16
+ │ │
17
+ │ Sub-headline / problem-solution (16-20pt, ~25 words) │
18
+ │ │
19
+ │ [Primary CTA] [Secondary CTA] │
20
+ │ │
21
+ │ Trust signal (logos / "1,000+ 사용자") │
22
+ │ │
23
+ └────────────────────────────────────────────────────────────┘
24
+ ┌──────────────────────────────────┐
25
+ │ │
26
+ │ [Hero visual] │
27
+ │ (product screenshot, photo, │
28
+ │ illustration) │
29
+ │ │
30
+ └──────────────────────────────────┘
31
+
32
+ Pattern B (centered, image below):
33
+ Headline
34
+ Sub-headline
35
+ [Primary] [Secondary]
36
+ Trust signal
37
+ ┌────────────────┐
38
+ │ Hero visual │
39
+ └────────────────┘
40
+ ```
41
+
42
+ | Slot | Required | Notes |
43
+ | --- | --- | --- |
44
+ | Headline | yes | The thing you do, in user words |
45
+ | Sub-headline | yes | One sentence that explains the headline |
46
+ | Primary CTA | yes | One clear action |
47
+ | Secondary CTA | optional | "Learn more" / "View demo" / "Login" |
48
+ | Trust signal | optional | Customer logos, user count, awards |
49
+ | Visual | optional | Image, video, illustration |
50
+
51
+ ## API
52
+
53
+ ```tsx
54
+ <HeroBlock
55
+ headline="가계부, 자동으로 채워줘요"
56
+ subheadline="은행 30곳 자동 연동. 첫 달 무료. 카드 등록 불필요."
57
+ primaryCta={{ label: "무료 시작하기", onClick: signup }}
58
+ secondaryCta={{ label: "데모 보기", onClick: demo }}
59
+ trustSignal={{ type: "userCount", count: 1247000 }}
60
+ visual={<ProductScreenshot />}
61
+ layout="text-left"
62
+ />
63
+ ```
64
+
65
+ | Prop | Type | Default | Description |
66
+ | --- | --- | --- | --- |
67
+ | `headline` | `string \| ReactNode` | — | Required. ≤ 12 words ideal. |
68
+ | `subheadline` | `string \| ReactNode` | — | One sentence (~25 words). |
69
+ | `primaryCta` | `CTA` | — | Required. |
70
+ | `secondaryCta` | `CTA` | — | Optional. |
71
+ | `trustSignal` | `TrustSignal` | — | Below CTAs |
72
+ | `visual` | `ReactNode` | — | Image / video / illustration |
73
+ | `layout` | `"text-left" \| "text-right" \| "centered" \| "split"` | `"text-left"` | |
74
+ | `background` | `"default" \| "tinted" \| "image" \| "video"` | `"default"` | |
75
+ | `backgroundImage` | `string` | — | When `background="image"` |
76
+ | `videoSrc` | `string` | — | When `background="video"` |
77
+
78
+ ## Layout variants
79
+
80
+ | Layout | Use |
81
+ | --- | --- |
82
+ | `text-left` (most common) | Reading order LTR; image-led visual on right |
83
+ | `text-right` | RTL languages; or to vary template across landing pages |
84
+ | `centered` | Highest-conversion for B2C consumer; minimal layout |
85
+ | `split` | 50-50 image and text; demos product prominently |
86
+
87
+ ## Headline rules
88
+
89
+ | Bad | Good |
90
+ | --- | --- |
91
+ | "Welcome to [Company Name]" | "가계부, 자동으로 채워줘요" |
92
+ | "Revolutionary platform" | "은행 30곳 자동 연동" |
93
+ | "Your finance, simplified" | "[concrete what]: [concrete how]" |
94
+
95
+ The headline answers "what does this do?" in user words.
96
+
97
+ For Korean: short, declarative. Verb-led when possible. ~합니다 too formal for marketing — use ~해요 OR colloquial-imperative.
98
+
99
+ ## Sub-headline rules
100
+
101
+ | Pattern | Example |
102
+ | --- | --- |
103
+ | Problem + solution | "은행 앱을 30번씩 보지 않아도 가계부가 자동으로 채워집니다." |
104
+ | Differentiation | "수동 입력 없이, 첫 달 무료로 시작." |
105
+ | Social proof + result | "100만 명이 매달 평균 12만 원을 절약했어요." |
106
+
107
+ ## CTA rules
108
+
109
+ - **Primary**: action-specific verb. "무료 시작" beats "시작하기". "지금 가입" beats "Sign up".
110
+ - **Secondary**: lower-commitment. "데모 보기" / "기능 살펴보기" / "로그인".
111
+ - **One primary**. Two competing primaries dilute.
112
+ - **Contrast**: primary CTA must have brand color + ≥ 7:1 contrast.
113
+
114
+ ## Trust signals
115
+
116
+ 5 patterns:
117
+
118
+ | Type | Example | When |
119
+ | --- | --- | --- |
120
+ | Customer logos | "Used by 토스, KakaoBank, ..." | B2B; logos must be permission-cleared |
121
+ | User count | "100만 명이 사용 중" | Consumer; needs to be honest |
122
+ | Awards | "App Store '오늘의 앱' 선정" | When awarded by reputable source |
123
+ | Reviews | "★★★★★ 평점 4.8" | Consumer; show star count |
124
+ | Press mentions | "TechCrunch에 소개됨" | Press mentions matter (rare to have) |
125
+
126
+ Below the CTA, small (smaller than sub-headline). Don't lead with trust signal — lead with the value proposition.
127
+
128
+ ## Visual choices
129
+
130
+ | Visual | Use |
131
+ | --- | --- |
132
+ | Product screenshot | Most B2C / B2B; shows what the product looks like |
133
+ | Phone mockup | Mobile-first products |
134
+ | Illustration | When product is abstract or service-based |
135
+ | Photo (people using product) | Lifestyle products; risks looking generic |
136
+ | Animated GIF / video loop | Demonstrates interaction |
137
+ | Live interactive demo | Sophisticated; rare |
138
+
139
+ For Korean fintech landing pages: phone mockup with product screenshot is dominant pattern (Toss / KakaoBank style).
140
+
141
+ ## Sizes / typography
142
+
143
+ | Element | Desktop | Mobile |
144
+ | --- | --- | --- |
145
+ | Headline font | 48–60px | 32–40px |
146
+ | Sub-headline | 18–22px | 16–18px |
147
+ | CTA button height | 56px | 48px |
148
+ | Hero visual width | ~50% column | full-width below |
149
+ | Total hero height | 70–90% viewport | scrollable |
150
+
151
+ ## Background variants
152
+
153
+ ### `default`
154
+
155
+ Solid `--color-bg-default` (white or near-white). Cleanest, fastest perceived load.
156
+
157
+ ### `tinted`
158
+
159
+ Subtle brand-color background (`--color-primary-subtle-bg`). Adds brand personality without overwhelming.
160
+
161
+ ### `image`
162
+
163
+ Full-bleed image with overlay scrim for text legibility (`linear-gradient(to right, rgba(0,0,0,0.6), transparent)` typical).
164
+
165
+ ### `video`
166
+
167
+ Hero video (autoplay muted loop). Heavy bandwidth — use sparingly.
168
+ - `prefers-reduced-motion`: still poster image instead.
169
+ - File optimization: H.264 < 5MB, fallback poster always.
170
+
171
+ ## Tokens consumed
172
+
173
+ ```
174
+ --color-bg-default
175
+ --color-bg-tinted (when tinted)
176
+ --color-text-primary (headline)
177
+ --color-text-secondary (sub-headline)
178
+ --color-primary-default (primary CTA)
179
+ --color-on-primary
180
+ --space-lg, --space-xl, --space-2xl, --space-3xl
181
+ --font-size-3xl, --font-size-4xl, --font-size-5xl (headline)
182
+ --font-size-lg, --font-size-xl (sub-headline)
183
+ --font-weight-bold, --font-weight-medium
184
+ --motion-default
185
+ ```
186
+
187
+ ## Accessibility
188
+
189
+ - Render as `<section role="banner">` or `<header>` for the page.
190
+ - Headline is `<h1>`.
191
+ - Sub-headline is `<p>` (not `<h2>` — that's the next section).
192
+ - Primary CTA is `<button>` or `<a href>` per action type.
193
+ - Background video: `<video>` with `aria-hidden="true"` (decorative).
194
+ - Alt text on hero image describes meaning, not "hero image".
195
+
196
+ ## Korean considerations
197
+
198
+ - **Voice**: ~해요 (friendly, consumer) or ~합니다 (formal, B2B). Pick one.
199
+ - **Headline style**: declarative or colloquial-imperative. "가계부, 자동으로!" / "30초 만에 가입".
200
+ - **CTAs**: short. "무료 시작" / "지금 가입" / "체험하기" / "데모 보기".
201
+ - **Trust signals**: Korean star pattern (`★★★★★`) + count. "1,247,000명이 사용 중".
202
+
203
+ ## Code example
204
+
205
+ ```tsx
206
+ function LandingPage() {
207
+ return (
208
+ <main>
209
+ <HeroBlock
210
+ headline="가계부, 자동으로 채워줘요"
211
+ subheadline="은행 30곳 자동 연동. 첫 달 무료. 카드 등록 불필요."
212
+ primaryCta={{ label: "무료 시작", onClick: () => navigate("/signup") }}
213
+ secondaryCta={{ label: "데모 보기", onClick: () => navigate("/demo") }}
214
+ trustSignal={{
215
+ type: "userCount",
216
+ count: 1247000,
217
+ label: "명이 매달 평균 12만 원 절약 중",
218
+ }}
219
+ visual={<PhoneMockup screen="dashboard" />}
220
+ layout="text-left"
221
+ background="tinted"
222
+ />
223
+
224
+ <FeatureGrid />
225
+ <TestimonialCarousel />
226
+ <PricingCards />
227
+ </main>
228
+ );
229
+ }
230
+ ```
231
+
232
+ ## Don't
233
+
234
+ - Don't use marketing prose ("revolutionary", "synergy") in the headline.
235
+ - Don't show 4+ buttons in the hero — clarity dies.
236
+ - Don't autoplay videos with sound.
237
+ - Don't ship a hero without `prefers-reduced-motion` handling for video / animations.
238
+ - Don't put critical info only in the hero image.
239
+ - Don't truncate the headline to fit the design — re-write the headline shorter.
240
+ - Don't make the primary CTA visually weaker than the secondary.
241
+
242
+ ## References
243
+
244
+ - No upstream component is exactly this. Each landing-page builder (Webflow, Framer, Astro Themes) ships their own variant.
245
+ - Cite [`knowledge/patterns/landing-page-patterns.md`](../knowledge/patterns/landing-page-patterns.md) and [`knowledge/patterns/landing-hero-design.md`](../knowledge/patterns/landing-hero-design.md).
246
+
247
+ ## Cross-reference
248
+
249
+ - [`knowledge/patterns/landing-hero-design.md`](../knowledge/patterns/landing-hero-design.md) — hero variants
250
+ - [`knowledge/patterns/landing-page-patterns.md`](../knowledge/patterns/landing-page-patterns.md) — full landing structure
251
+ - [`examples/component-button.md`](component-button.md) — CTA primitive
252
+ - [`knowledge/patterns/brand-identity.md`](../knowledge/patterns/brand-identity.md) — voice in marketing
@@ -0,0 +1,211 @@
1
+ # `HoverCard` — spec
2
+
3
+ > Synthesized from shadcn-ui `hover-card` (Radix). Hover-triggered floating card showing rich preview content. Distinct from Tooltip (text only) and Popover (click-triggered).
4
+
5
+ ## When to use
6
+
7
+ - **User profile preview** on @-mention hover.
8
+ - **Link preview** before navigation.
9
+ - **Glossary** — hover term, see definition.
10
+ - **Card-style metadata** — hover an entity, see image + summary + actions.
11
+
12
+ When NOT to use:
13
+ - Mobile-primary contexts — hover doesn't exist on touch (long-press feels heavy).
14
+ - Critical info — hover is supplemental; user must be able to access without it.
15
+ - Quick text only — use Tooltip (lighter, faster).
16
+ - User-initiated content — use Popover (click-triggered).
17
+
18
+ ## Anatomy
19
+
20
+ ```
21
+ [hover trigger]
22
+
23
+ ┌──────────────────────┐
24
+ │ [avatar] │
25
+ │ User Name │
26
+ │ @username │
27
+ │ │
28
+ │ Joined 2024 │
29
+ │ Following 234 │
30
+ │ │
31
+ │ [Follow] [Message] │
32
+ └──────────────────────┘
33
+ ```
34
+
35
+ ## API
36
+
37
+ ```tsx
38
+ <HoverCard openDelay={400} closeDelay={300}>
39
+ <HoverCard.Trigger asChild>
40
+ <a href={`/users/${user.id}`}>@{user.username}</a>
41
+ </HoverCard.Trigger>
42
+ <HoverCard.Content>
43
+ <div className="hover-card-content">
44
+ <Avatar src={user.avatar} />
45
+ <h4>{user.name}</h4>
46
+ <p>@{user.username}</p>
47
+ <p>{user.bio}</p>
48
+ <div className="actions">
49
+ <button>Follow</button>
50
+ <button>Message</button>
51
+ </div>
52
+ </div>
53
+ </HoverCard.Content>
54
+ </HoverCard>
55
+ ```
56
+
57
+ | Prop | Type | Default | Description |
58
+ | --- | --- | --- | --- |
59
+ | `openDelay` | `number` | `700` | Ms hover before opening (don't trigger on glancing-pass) |
60
+ | `closeDelay` | `number` | `300` | Ms after leave before closing (allows mouse to enter card) |
61
+ | `defaultOpen` | `boolean` | `false` | Open initially (rare) |
62
+ | `open` | `boolean` | controlled | Controlled state |
63
+ | `onOpenChange` | `(open: boolean) => void` | — | State callback |
64
+
65
+ ## Composition
66
+
67
+ | Part | Purpose |
68
+ | --- | --- |
69
+ | `Trigger` | Hover target |
70
+ | `Content` | The floating card |
71
+ | `Arrow` (optional) | Caret pointing at trigger |
72
+ | `Portal` | Render outside parent (default behavior) |
73
+
74
+ Free-form children inside Content — no enforced sub-parts (unlike DropdownMenu).
75
+
76
+ ## Open / close behavior
77
+
78
+ ```
79
+ User hovers trigger
80
+ ↓ wait openDelay (700ms default)
81
+ Card opens with fade + scale (200ms)
82
+ User mouses out of trigger
83
+ ↓ wait closeDelay (300ms)
84
+ ↓ during delay, if mouse enters Card, cancel close
85
+ Card closes if mouse hasn't entered Card
86
+ User mouses out of Card
87
+ ↓ wait closeDelay
88
+ Card closes
89
+ ```
90
+
91
+ The closeDelay + Card-as-hover-target pattern is critical. Without it, users can't reach the card content.
92
+
93
+ ## Positioning
94
+
95
+ Same as DropdownMenu:
96
+ - Default: `bottom-start`.
97
+ - `align`, `side` configurable.
98
+ - Auto-flip on collision.
99
+ - 8px collision padding.
100
+
101
+ For inline triggers (within paragraphs of text): consider `align="start"` to anchor to the trigger's left edge.
102
+
103
+ ## States
104
+
105
+ | State | Visual |
106
+ | --- | --- |
107
+ | Closed | Trigger visible; card hidden |
108
+ | Hover (within openDelay) | Trigger styled (e.g., underline) but card still hidden |
109
+ | Opening | Card fades + scales in (200ms) |
110
+ | Open | Card visible |
111
+ | Closing | Reverse (150ms) |
112
+
113
+ No focus management — HoverCard is hover-only. For keyboard / focus equivalent, use Tooltip OR pair with a Popover triggered by focus.
114
+
115
+ ## Tokens consumed
116
+
117
+ ```
118
+ --color-bg-overlay
119
+ --color-fg-on-overlay
120
+ --color-border-overlay
121
+ --radius-md
122
+ --shadow-overlay
123
+ --space-md, --space-lg
124
+ --font-size-sm, --font-size-base
125
+ --motion-medium (200ms open/close)
126
+ --ease-out
127
+ --z-overlay
128
+ ```
129
+
130
+ ## Accessibility
131
+
132
+ - HoverCard is **decorative / supplemental**. The same content must be reachable elsewhere (linked profile page, accessible label, etc.).
133
+ - Trigger remains a normal interactive element (link, button) — its activation must work without hover.
134
+ - Don't put critical actions ONLY in the HoverCard. Buttons inside should also exist on the destination page.
135
+ - For keyboard users: hovering doesn't fire on `focus` by default. If you need focus-equivalent, use `Popover` or add a dedicated keyboard shortcut.
136
+ - For touch: hover doesn't exist; HoverCard is silently no-op on mobile. Don't ship critical info inside.
137
+ - `aria-label` on Trigger should describe the destination, not "show preview" (hover is internal mechanic).
138
+
139
+ ## Mobile behavior
140
+
141
+ By default, HoverCard does nothing on touch devices. Options:
142
+ - **Tap once = preview, tap again = navigate** (pattern used by some social apps; confusing).
143
+ - **Long-press = preview** (similar to ContextMenu; non-obvious).
144
+ - **Don't show on mobile** — fall back to direct navigation.
145
+
146
+ Default and recommended: **don't show on mobile**. Style the trigger so users see it's tappable, navigate them to a full page on tap.
147
+
148
+ ## Code example
149
+
150
+ ```tsx
151
+ function MentionLink({ user }: { user: User }) {
152
+ return (
153
+ <HoverCard openDelay={500} closeDelay={300}>
154
+ <HoverCard.Trigger asChild>
155
+ <a href={`/users/${user.id}`} className="mention">
156
+ @{user.username}
157
+ </a>
158
+ </HoverCard.Trigger>
159
+ <HoverCard.Content className="mention-preview">
160
+ <div className="header">
161
+ <Avatar src={user.avatar} size="lg" />
162
+ <div>
163
+ <h4>{user.name}</h4>
164
+ <p className="username">@{user.username}</p>
165
+ </div>
166
+ </div>
167
+ <p className="bio">{user.bio}</p>
168
+ <dl className="stats">
169
+ <dt>Following</dt><dd>{user.following}</dd>
170
+ <dt>Followers</dt><dd>{user.followers}</dd>
171
+ </dl>
172
+ <div className="actions">
173
+ <FollowButton userId={user.id} />
174
+ </div>
175
+ </HoverCard.Content>
176
+ </HoverCard>
177
+ );
178
+ }
179
+ ```
180
+
181
+ ## Edge cases
182
+
183
+ - **Trigger inside scrollable container**: card may scroll out of view; `Portal` keeps it visible.
184
+ - **Async content** (fetch user data on hover): show skeleton inside card while loading.
185
+ - **Trigger removed during open**: card auto-closes.
186
+ - **Multiple hover-cards in close proximity**: respect `openDelay` so glancing through doesn't open a chain.
187
+ - **Card content larger than viewport**: cap height; scroll inside card OR truncate.
188
+ - **Right-to-left**: positioning flips automatically.
189
+ - **Reduced motion**: skip fade + scale; instant show / hide.
190
+
191
+ ## Don't
192
+
193
+ - Don't put critical info or actions only inside HoverCard.
194
+ - Don't trigger on click — that's Popover.
195
+ - Don't trigger on focus — use Tooltip for that, or pair with Popover.
196
+ - Don't make HoverCard the only way to view a profile — link the trigger to the full page.
197
+ - Don't ship without `openDelay` — mouse-passing through triggers an avalanche of cards.
198
+ - Don't disable on mobile silently without a fallback path.
199
+ - Don't autofocus inside HoverCard — content is non-interactive aside from links.
200
+
201
+ ## References
202
+
203
+ - shadcn-ui: [`hover-card`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/hover-card.tsx) (Radix)
204
+ - Patterns: Twitter / X profile previews on @mention hover
205
+ - Patterns: GitHub PR review preview on commit hash hover
206
+
207
+ ## Cross-reference
208
+
209
+ - [`examples/component-tooltip.md`](component-tooltip.md) — text-only hover hint
210
+ - [`examples/component-popover.md`](component-popover.md) — click-triggered floating content
211
+ - [`examples/component-dropdown.md`](component-dropdown.md) — menu-style overlay
@@ -0,0 +1,142 @@
1
+ # `IconButton` — spec
2
+
3
+ > Synthesized from MUI `IconButton` and Material 3 icon button patterns. A button that contains only an icon. Distinct from `Button` (text+icon) and `Toggle` (persistent state).
4
+
5
+ ## When to use
6
+
7
+ - Toolbar actions where space is tight (search, settings, more).
8
+ - Card / item trailing actions.
9
+ - Mobile primary action affordances.
10
+
11
+ When NOT to use:
12
+ - The icon's meaning isn't universally recognized — use text Button.
13
+ - The action is the primary CTA — use Button with text.
14
+
15
+ ## Anatomy
16
+
17
+ ```
18
+ [ ⚙ ] [ × ] [ ⋮ ]
19
+ settings close more
20
+ ```
21
+
22
+ A circular or rounded-square button with one icon centered. ≥ 44pt touch target on mobile (44x44 min); ≥ 32x32 desktop.
23
+
24
+ ## API
25
+
26
+ ```tsx
27
+ <IconButton aria-label="설정" onClick={openSettings}>
28
+ <SettingsIcon />
29
+ </IconButton>
30
+
31
+ <IconButton variant="outline" size="sm" aria-label="닫기">
32
+ <CloseIcon />
33
+ </IconButton>
34
+
35
+ <IconButton variant="filled" color="destructive" aria-label="삭제">
36
+ <TrashIcon />
37
+ </IconButton>
38
+ ```
39
+
40
+ | Prop | Type | Default | Description |
41
+ | --- | --- | --- | --- |
42
+ | `aria-label` | `string` | required | Accessible label (icon-only buttons MUST have this) |
43
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Touch target size |
44
+ | `variant` | `"ghost" \| "outline" \| "filled" \| "tonal"` | `"ghost"` | Visual treatment |
45
+ | `color` | `"default" \| "brand" \| "destructive"` | `"default"` | Color token |
46
+ | `disabled` | `boolean` | `false` | — |
47
+ | `loading` | `boolean` | `false` | Replaces icon with spinner |
48
+
49
+ ## Variants
50
+
51
+ | Variant | Look |
52
+ | --- | --- |
53
+ | `ghost` (default) | No bg until hover; subtle |
54
+ | `outline` | Border, no fill |
55
+ | `filled` | Solid bg (brand or destructive) |
56
+ | `tonal` | Soft tinted bg (Material 3 style) |
57
+
58
+ ## Sizes
59
+
60
+ | Size | Touch target | Icon size |
61
+ | --- | --- | --- |
62
+ | `sm` | 32x32 | 16-18px |
63
+ | `md` (default) | 40x40 | 20-24px |
64
+ | `lg` | 48x48 | 24-28px |
65
+
66
+ For mobile primary: ≥ 44pt minimum. Desktop secondary: 32px ok.
67
+
68
+ ## States
69
+
70
+ | State | Visual |
71
+ | --- | --- |
72
+ | Default | Per variant |
73
+ | Hover | Subtle bg shift (ghost) or darker fill (filled) |
74
+ | Focus-visible | Visible 2px ring around the button |
75
+ | Active (press) | Deeper bg |
76
+ | Disabled | Reduced opacity, no events, `aria-disabled` |
77
+ | Loading | Spinner replaces icon; `aria-busy="true"` |
78
+
79
+ ## Tokens consumed
80
+
81
+ ```
82
+ --icon-button-size-sm / -md / -lg
83
+ --icon-button-bg-default
84
+ --icon-button-bg-hover
85
+ --icon-button-bg-pressed
86
+ --icon-button-bg-filled (filled variant)
87
+ --icon-button-bg-destructive
88
+ --icon-button-fg-default
89
+ --icon-button-fg-on-filled
90
+ --icon-button-border (outline variant)
91
+ --radius-md (rounded-square) or --radius-full (circular)
92
+ --motion-fast
93
+ --ease-out
94
+ ```
95
+
96
+ ## Accessibility
97
+
98
+ - **`aria-label` mandatory**. Icon-only buttons without label fail accessibility.
99
+ - Focus-visible ring required.
100
+ - Touch target ≥ 44pt mobile primary.
101
+ - For Korean: `aria-label` in Korean ("설정", "닫기", "삭제") for KR audiences.
102
+
103
+ ## Code example
104
+
105
+ ```tsx
106
+ function ToolbarActions() {
107
+ return (
108
+ <div className="toolbar">
109
+ <IconButton aria-label="이전">
110
+ <ChevronLeftIcon />
111
+ </IconButton>
112
+ <IconButton aria-label="다음">
113
+ <ChevronRightIcon />
114
+ </IconButton>
115
+ <IconButton aria-label="새로고침" loading={refreshing}>
116
+ <RefreshIcon />
117
+ </IconButton>
118
+ <IconButton aria-label="더보기">
119
+ <MoreIcon />
120
+ </IconButton>
121
+ </div>
122
+ );
123
+ }
124
+ ```
125
+
126
+ ## Don't
127
+
128
+ - Don't omit `aria-label`.
129
+ - Don't make IconButton smaller than 32x32 on desktop, 44pt on mobile.
130
+ - Don't use IconButton for primary CTAs. Use text Button.
131
+ - Don't pair IconButton with Tooltip text on mobile (no hover) — `aria-label` is the spoken label.
132
+
133
+ ## References
134
+
135
+ - MUI: [`IconButton`](../refs/mui/packages/mui-material/src/IconButton)
136
+ - Material 3: Icon button variants
137
+
138
+ ## Cross-reference
139
+
140
+ - [`examples/component-button.md`](component-button.md) — text+icon variant
141
+ - [`examples/component-icon.md`](component-icon.md)
142
+ - [`examples/component-tooltip.md`](component-tooltip.md) — pairs with IconButton on desktop