@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,163 @@
1
+ # `Resizable` — spec
2
+
3
+ > Synthesized from shadcn-ui `resizable`. Resizable panel groups for IDE-style layouts. Distinct from `Splitter` (covered separately) — Resizable here is the shadcn primitive.
4
+
5
+ ## When to use
6
+
7
+ - IDE-style two-pane layouts (sidebar | editor).
8
+ - Three-pane layouts (sidebar | editor | preview).
9
+ - Vertical splits (top pane / bottom pane — terminal below editor).
10
+ - Any UI where users want to manually adjust pane sizes.
11
+
12
+ When NOT to use:
13
+ - Simple two-column layouts that don't need user-resize (use Grid).
14
+ - Mobile (drag handles awkward on touch).
15
+
16
+ ## Anatomy
17
+
18
+ ```
19
+ ┌────────┬─────────────────────────┐
20
+ │ Side │ │
21
+ │ panel ║ Main editor pane │
22
+ │ ║ │
23
+ │ ║ │
24
+ └────────┴─────────────────────────┘
25
+ ↑ draggable handle (vertical bar)
26
+ ```
27
+
28
+ ## API
29
+
30
+ ```tsx
31
+ <Resizable.Group direction="horizontal">
32
+ <Resizable.Panel defaultSize={25} minSize={15}>
33
+ <Sidebar />
34
+ </Resizable.Panel>
35
+
36
+ <Resizable.Handle />
37
+
38
+ <Resizable.Panel defaultSize={75}>
39
+ <Resizable.Group direction="vertical">
40
+ <Resizable.Panel defaultSize={70}>
41
+ <Editor />
42
+ </Resizable.Panel>
43
+
44
+ <Resizable.Handle />
45
+
46
+ <Resizable.Panel defaultSize={30} minSize={20} collapsible>
47
+ <Terminal />
48
+ </Resizable.Panel>
49
+ </Resizable.Group>
50
+ </Resizable.Panel>
51
+ </Resizable.Group>
52
+ ```
53
+
54
+ ## Composition
55
+
56
+ | Part | Purpose |
57
+ | --- | --- |
58
+ | `Resizable.Group` | Wrapper; direction = "horizontal" or "vertical" |
59
+ | `Resizable.Panel` | Single resizable pane |
60
+ | `Resizable.Handle` | Draggable divider |
61
+
62
+ | Panel prop | Type | Description |
63
+ | --- | --- | --- |
64
+ | `defaultSize` | `number` | Initial size as percentage |
65
+ | `minSize` | `number` | Minimum size % |
66
+ | `maxSize` | `number` | Maximum size % |
67
+ | `collapsible` | `boolean` | Allow collapsing to 0 |
68
+ | `collapsedSize` | `number` | Size when collapsed (default 0) |
69
+ | `onResize` | `(size) => void` | Callback during drag |
70
+ | `onCollapse` / `onExpand` | function | State callbacks |
71
+
72
+ ## States
73
+
74
+ | State | Visual |
75
+ | --- | --- |
76
+ | Default | Handles visible (subtle) |
77
+ | Handle hover | Highlights (cursor: col-resize / row-resize) |
78
+ | Handle dragging | Active visual; user dragging |
79
+ | Panel collapsed | Width 0; chevron to expand |
80
+ | Panel min reached | Handle stops at min boundary |
81
+
82
+ ## Tokens consumed
83
+
84
+ ```
85
+ --resizable-handle-bg
86
+ --resizable-handle-bg-hover
87
+ --resizable-handle-bg-active
88
+ --resizable-handle-thickness (typically 4-8px)
89
+ --motion-fast
90
+ ```
91
+
92
+ ## Accessibility
93
+
94
+ - Handle: `role="separator" aria-orientation="vertical|horizontal" aria-valuenow={size} aria-valuemin={minSize} aria-valuemax={maxSize}`.
95
+ - Keyboard:
96
+ - Tab to focus handle.
97
+ - Arrow keys (Left/Right or Up/Down) move handle by 5%.
98
+ - Home / End: snap to min / max.
99
+ - Enter (when collapsible): toggle collapse.
100
+ - Don't make handle thinner than 4px — hard to grab.
101
+
102
+ ## Layout persistence
103
+
104
+ Save panel sizes to localStorage so they persist across sessions:
105
+
106
+ ```tsx
107
+ const [sizes, setSizes] = useLocalStorage("layout-sizes", [25, 75]);
108
+
109
+ <Resizable.Group
110
+ direction="horizontal"
111
+ onLayout={(newSizes) => setSizes(newSizes)}
112
+ >
113
+ ...
114
+ </Resizable.Group>
115
+ ```
116
+
117
+ ## Code example — IDE shell
118
+
119
+ ```tsx
120
+ function IDEShell() {
121
+ return (
122
+ <Resizable.Group direction="horizontal" className="h-screen">
123
+ <Resizable.Panel defaultSize={20} minSize={15} collapsible>
124
+ <FileExplorer />
125
+ </Resizable.Panel>
126
+ <Resizable.Handle />
127
+ <Resizable.Panel defaultSize={60}>
128
+ <Resizable.Group direction="vertical">
129
+ <Resizable.Panel defaultSize={70}>
130
+ <Editor />
131
+ </Resizable.Panel>
132
+ <Resizable.Handle />
133
+ <Resizable.Panel defaultSize={30} minSize={10}>
134
+ <Terminal />
135
+ </Resizable.Panel>
136
+ </Resizable.Group>
137
+ </Resizable.Panel>
138
+ <Resizable.Handle />
139
+ <Resizable.Panel defaultSize={20} minSize={15} collapsible>
140
+ <Outline />
141
+ </Resizable.Panel>
142
+ </Resizable.Group>
143
+ );
144
+ }
145
+ ```
146
+
147
+ ## Don't
148
+
149
+ - Don't ship without min/max sizes — users drag to 0 and lose content.
150
+ - Don't make handles invisible — affordance must be visible.
151
+ - Don't auto-resize on window resize without preserving user adjustments.
152
+ - Don't use Resizable on mobile — touch drag conflicts with scroll.
153
+
154
+ ## References
155
+
156
+ - shadcn-ui: [`resizable`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/resizable.tsx) — wraps `react-resizable-panels`
157
+ - VS Code, Linear, Cursor — IDE layout pattern
158
+
159
+ ## Cross-reference
160
+
161
+ - [`examples/component-splitter.md`](component-splitter.md) — Ant equivalent
162
+ - [`examples/component-sidebar.md`](component-sidebar.md)
163
+ - [`examples/component-layout.md`](component-layout.md)
@@ -0,0 +1,270 @@
1
+ # `Result` + `Empty` — combined spec
2
+
3
+ > Two sibling full-page components. Result for outcome of an action; Empty for no-data state. Same shape, different intent.
4
+ >
5
+ > Citing Ant Design `Result` + `Empty`, MUI (composition), shadcn-ui (composition)
6
+
7
+ ## Semantic difference
8
+
9
+ | Component | Use | Trigger |
10
+ | --- | --- | --- |
11
+ | **Result** | Confirms an outcome (success / error / 404 / etc.) | After user action OR after navigation to a status page |
12
+ | **Empty** | "No data here" placeholder | When data is absent (first-time, filtered, cleared) |
13
+
14
+ Both render full-page-style content (icon + title + description + action). They differ in **what they communicate** and **when they appear**.
15
+
16
+ The patterns for both are detailed in:
17
+ - [`knowledge/patterns/empty-states.md`](../knowledge/patterns/empty-states.md) — full empty-state pattern reference
18
+ - [`knowledge/patterns/error-states.md`](../knowledge/patterns/error-states.md) — full error-state pattern reference
19
+
20
+ This spec provides the **component primitive** for both.
21
+
22
+ ## Anatomy
23
+
24
+ ```
25
+ ┌──────────────────────────────────────────────────┐
26
+ │ │
27
+ │ [icon / illustration] │
28
+ │ │
29
+ │ Title │
30
+ │ │
31
+ │ Description (1–2 sentences) │
32
+ │ │
33
+ │ [Primary CTA] [Secondary] │
34
+ │ │
35
+ └──────────────────────────────────────────────────┘
36
+ ```
37
+
38
+ | Slot | Required | Notes |
39
+ | --- | --- | --- |
40
+ | Icon / illustration | recommended | Conveys outcome; ~80–120px |
41
+ | Title | yes | Plain language outcome |
42
+ | Description | usually | Detail or recovery hint |
43
+ | Primary action | usually | Most likely next step |
44
+ | Secondary action | optional | Alternative path |
45
+ | Extra content | optional | Order ID, error code, transaction details |
46
+
47
+ ## API
48
+
49
+ ### Result
50
+
51
+ ```tsx
52
+ <Result
53
+ status="success"
54
+ title="결제가 완료되었습니다"
55
+ description="주문번호 #1234567 - 영수증이 이메일로 전송되었습니다."
56
+ primaryAction={{ label: "주문 내역 보기", onClick: () => nav("/orders") }}
57
+ secondaryAction={{ label: "쇼핑 계속", onClick: () => nav("/") }}
58
+ extra={<OrderSummary order={order} />}
59
+ />
60
+ ```
61
+
62
+ | Prop | Type | Default | Description |
63
+ | --- | --- | --- | --- |
64
+ | `status` | `"success" \| "info" \| "warning" \| "error" \| "404" \| "403" \| "500"` | `"info"` | Drives icon + color |
65
+ | `title` | `string \| ReactNode` | — | Required |
66
+ | `description` | `string \| ReactNode` | — | |
67
+ | `icon` | `ReactNode` | derived from status | Custom icon override |
68
+ | `primaryAction` | `Action` | — | |
69
+ | `secondaryAction` | `Action` | — | |
70
+ | `extra` | `ReactNode` | — | Below actions: order details, error code, etc. |
71
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
72
+
73
+ ### Empty
74
+
75
+ ```tsx
76
+ <Empty
77
+ title="아직 거래 내역이 없어요"
78
+ description="첫 거래를 추가해 보세요."
79
+ illustration="default"
80
+ primaryAction={{ label: "거래 추가", onClick: openAddModal }}
81
+ />
82
+ ```
83
+
84
+ | Prop | Type | Default | Description |
85
+ | --- | --- | --- | --- |
86
+ | `title` | `string \| ReactNode` | — | Required |
87
+ | `description` | `string \| ReactNode` | — | |
88
+ | `illustration` | `"default" \| "search" \| "error" \| ReactNode` | `"default"` | Pre-set illustrations or custom |
89
+ | `primaryAction` | `Action` | — | |
90
+ | `secondaryAction` | `Action` | — | |
91
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
92
+ | `inline` | `boolean` | `false` | Compact horizontal layout for inside cards/sidebars |
93
+
94
+ ## Status → icon + color
95
+
96
+ | Status | Default icon | Color |
97
+ | --- | --- | --- |
98
+ | `success` | ✓ check circle | `--color-success` |
99
+ | `info` | ℹ info circle | `--color-info` |
100
+ | `warning` | ⚠ warning triangle | `--color-warning` |
101
+ | `error` | ✕ error circle | `--color-error` |
102
+ | `404` | 🗺 map / lost | `--color-text-secondary` |
103
+ | `403` | 🔒 lock | `--color-text-secondary` |
104
+ | `500` | ⚠ alert | `--color-error` |
105
+
106
+ For brand-led products: replace with custom illustrations. Keep size + position consistent.
107
+
108
+ ## Sizes
109
+
110
+ | Size | Icon | Title font | Padding |
111
+ | --- | --- | --- | --- |
112
+ | `sm` | 48px | 16px | 24px |
113
+ | `md` (default) | 80px | 20px | 48px |
114
+ | `lg` | 120px | 24px | 64px |
115
+
116
+ For full-page result (404 page, post-checkout): `lg`. For inline empty in a card: `sm` or `inline`.
117
+
118
+ ## Layout — full-page vs inline
119
+
120
+ ### Full-page (default)
121
+
122
+ Vertical centered. Padding pushes content to ~1/3 from top.
123
+
124
+ ```
125
+ [empty space ~30vh]
126
+ [icon centered]
127
+ [title centered]
128
+ [description centered, max-w 480px]
129
+ [actions centered]
130
+ [empty space below]
131
+ ```
132
+
133
+ ### Inline (Empty only, with `inline={true}`)
134
+
135
+ Horizontal compact. Icon left, text right. For inside small cards/sidebars where vertical centered would waste space.
136
+
137
+ ```
138
+ [icon] [title]
139
+ [description]
140
+ [link CTA]
141
+ ```
142
+
143
+ ## Tokens consumed
144
+
145
+ ```
146
+ --color-text-primary (title)
147
+ --color-text-secondary (description)
148
+ --color-text-tertiary
149
+ --color-success, --color-warning, --color-error, --color-info
150
+ --color-bg-default
151
+ --color-primary-default (primary action)
152
+ --space-xl, --space-2xl, --space-3xl
153
+ --font-size-base, --font-size-xl, --font-size-2xl
154
+ ```
155
+
156
+ ## Accessibility
157
+
158
+ - Wrap in a heading hierarchy: title is `<h1>` for full-page (404), `<h2>` for in-page.
159
+ - Status icons: `aria-hidden="true"` (decorative — title carries meaning).
160
+ - Container: `role="status"` for empty / info / success; `role="alert"` for error / warning.
161
+ - Primary action gets focus when component mounts (full-page Result), so keyboard users land on the recovery path.
162
+
163
+ ```html
164
+ <section role="alert">
165
+ <Icon aria-hidden="true" />
166
+ <h1>찾을 수 없는 페이지입니다</h1>
167
+ <p>주소를 확인하거나 홈으로 돌아가 주세요.</p>
168
+ <Button autoFocus>홈으로</Button>
169
+ </section>
170
+ ```
171
+
172
+ ## Code examples
173
+
174
+ ```tsx
175
+ // 404 page
176
+ <Result
177
+ status="404"
178
+ title="찾을 수 없는 페이지입니다"
179
+ description="주소를 확인하거나 홈으로 돌아가 주세요."
180
+ primaryAction={{ label: "홈으로", onClick: () => nav("/") }}
181
+ secondaryAction={{ label: "검색", onClick: () => nav("/search") }}
182
+ />
183
+
184
+ // Post-checkout success
185
+ <Result
186
+ status="success"
187
+ title="결제가 완료되었습니다"
188
+ description={`주문번호 #${order.id}`}
189
+ primaryAction={{ label: "주문 내역 보기", onClick: () => nav(`/orders/${order.id}`) }}
190
+ secondaryAction={{ label: "쇼핑 계속", onClick: () => nav("/") }}
191
+ extra={
192
+ <Card>
193
+ <p>{order.items.length}개 상품 · ₩{order.total.toLocaleString()}</p>
194
+ <p>예상 도착일: {order.deliveryDate}</p>
195
+ </Card>
196
+ }
197
+ />
198
+
199
+ // Permission error
200
+ <Result
201
+ status="403"
202
+ title="접근 권한이 없습니다"
203
+ description="이 페이지를 보려면 관리자 권한이 필요합니다."
204
+ primaryAction={{ label: "관리자에게 요청", onClick: requestAccess }}
205
+ secondaryAction={{ label: "돌아가기", onClick: () => history.back() }}
206
+ />
207
+
208
+ // First-time empty in a list
209
+ <Empty
210
+ title="아직 거래 내역이 없어요"
211
+ description="첫 거래를 추가해 보세요."
212
+ primaryAction={{ label: "거래 추가", onClick: openAddModal }}
213
+ />
214
+
215
+ // Filtered empty
216
+ <Empty
217
+ title="검색 결과가 없습니다"
218
+ description="다른 검색어를 시도해 보세요."
219
+ illustration="search"
220
+ primaryAction={{ label: "검색어 지우기", onClick: clearQuery }}
221
+ />
222
+
223
+ // Inline empty (small card)
224
+ <Card>
225
+ <Empty
226
+ inline
227
+ size="sm"
228
+ title="할 일이 없어요"
229
+ description="새 작업을 추가하면 여기에 표시됩니다."
230
+ />
231
+ </Card>
232
+ ```
233
+
234
+ ## Edge cases
235
+
236
+ - **Result during async waiting**: don't render Result for "loading" state. Use Skeleton or Spinner.
237
+ - **Result with no actions**: legitimate for "Account closed" or "Operation logged" — but most should have at least one path.
238
+ - **Empty inside a paginated list**: empty applies to page 1 only, not page 5 of 10. Page 5 with no items means "load more" exhausted, which is different.
239
+ - **404 with deep link guess**: detect common patterns and offer ("Did you mean /projects/123?").
240
+ - **Mobile sizing**: full `lg` may overflow on small phones. Cap icon at 100px on mobile.
241
+ - **Long titles** (Korean often verbose): allow 2-line wrap; don't truncate.
242
+
243
+ ## Don't
244
+
245
+ - Don't use Result for inline status indicators (use Tag or Badge).
246
+ - Don't use Empty when there's an error — distinct pattern. See [`error-states.md`](../knowledge/patterns/error-states.md).
247
+ - Don't show a Result with no primary action for failure states — user is stuck.
248
+ - Don't auto-redirect after Result without giving the user time to read.
249
+ - Don't use technical jargon ("Error 404"). Plain language.
250
+ - Don't show stock illustrations from a vendor library — they date.
251
+ - Don't render multiple Results stacked. One per screen.
252
+
253
+ ## References
254
+
255
+ - Ant Design: [`refs/ant-design/components/result/`](../refs/ant-design/components/result/) (Result) + [`refs/ant-design/components/empty/`](../refs/ant-design/components/empty/) (Empty). Both well-developed.
256
+ - MUI: no dedicated components. Compose with Card + Typography.
257
+ - shadcn-ui: no built-in. Compose from primitives.
258
+
259
+ API choices made:
260
+ - **Combined spec for Result + Empty**: 90% of the visual + a11y is shared. Speccing separately would force triplicate maintenance.
261
+ - **`status` prop on Result, not Empty**: Empty doesn't have status semantics ("empty" is the state).
262
+ - **`extra` slot on Result**: outcome confirmations frequently need order/transaction detail.
263
+ - **`inline` mode on Empty**: full-page is overkill for cards/sidebars; provides escape hatch.
264
+
265
+ ## Cross-reference
266
+
267
+ - [`knowledge/patterns/empty-states.md`](../knowledge/patterns/empty-states.md) — comprehensive empty pattern guide
268
+ - [`knowledge/patterns/error-states.md`](../knowledge/patterns/error-states.md) — error pattern guide
269
+ - [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md) — Korean tone for results
270
+ - [`examples/component-button.md`](component-button.md) — primary/secondary actions
@@ -0,0 +1,199 @@
1
+ # `ScrollArea` — spec
2
+
3
+ > Synthesized from shadcn-ui `scroll-area` (Radix). Custom-styled scrollbar that replaces the platform default. Used when native scrollbars don't match the design system or when consistent cross-platform appearance is needed.
4
+
5
+ ## When to use
6
+
7
+ - **Design-system-consistent scrollbars** across macOS / Windows / Linux (native scrollbars vary widely).
8
+ - **Always-visible scrollbars** (macOS hides them by default; some UIs need them visible).
9
+ - **Inside narrow surfaces** (sidebars, dropdowns) where native scrollbars look out of place.
10
+ - **Brand-aligned visual** — color-customized scrollbars.
11
+
12
+ When NOT to use:
13
+ - The whole document body — let the browser handle main scroll.
14
+ - Long-form reading content — native scroll is faster + more familiar.
15
+ - Mobile-primary surfaces — system scroll is deeply integrated with momentum + bounce.
16
+
17
+ ## Anatomy
18
+
19
+ ```
20
+ ┌───────────────────────────┐
21
+ │ Content ▒│ ← thumb (scrollbar)
22
+ │ Item 1 ▒│
23
+ │ Item 2 ▒│
24
+ │ Item 3 ▒│
25
+ │ ... ▒│
26
+ │ │
27
+ └───────────────────────────┘
28
+ ```
29
+
30
+ ## API
31
+
32
+ ```tsx
33
+ <ScrollArea className="h-72 w-48 rounded-md border">
34
+ <div className="p-4">
35
+ {items.map(item => (
36
+ <div key={item.id}>{item.name}</div>
37
+ ))}
38
+ </div>
39
+ </ScrollArea>
40
+ ```
41
+
42
+ | Prop | Type | Default | Description |
43
+ | --- | --- | --- | --- |
44
+ | `type` | `"auto" \| "always" \| "scroll" \| "hover"` | `"hover"` | Scrollbar visibility |
45
+ | `scrollHideDelay` | `number` | `600` | Ms before scrollbar hides (when type is `scroll`) |
46
+ | `dir` | `"ltr" \| "rtl"` | `"ltr"` | Direction (affects scroll position) |
47
+ | `children` | `ReactNode` | — | Scrolling content |
48
+
49
+ ## Visibility modes
50
+
51
+ | `type` | Behavior |
52
+ | --- | --- |
53
+ | `auto` | Show only when content overflows |
54
+ | `always` | Always visible regardless of content |
55
+ | `scroll` | Visible while scrolling, fades after `scrollHideDelay` |
56
+ | `hover` (default) | Visible on hover or while scrolling |
57
+
58
+ ## Composition
59
+
60
+ | Part | Purpose |
61
+ | --- | --- |
62
+ | `ScrollArea` | Wrapper with overflow control |
63
+ | `ScrollAreaViewport` | The clipping container (auto-rendered) |
64
+ | `ScrollAreaScrollbar` | The scrollbar track + thumb (auto-rendered) |
65
+ | `ScrollAreaThumb` | The draggable thumb (auto-rendered) |
66
+ | `ScrollAreaCorner` | Bottom-right corner when both axes scroll (auto-rendered) |
67
+
68
+ In practice, just use `<ScrollArea>` and let it manage subparts.
69
+
70
+ ## Custom scrollbar styles
71
+
72
+ ```css
73
+ [data-radix-scroll-area-scrollbar] {
74
+ display: flex;
75
+ user-select: none;
76
+ touch-action: none;
77
+ padding: 2px;
78
+ background: transparent;
79
+ transition: background 200ms ease;
80
+ }
81
+
82
+ [data-radix-scroll-area-scrollbar][data-orientation="vertical"] {
83
+ width: 10px;
84
+ }
85
+
86
+ [data-radix-scroll-area-scrollbar][data-orientation="horizontal"] {
87
+ height: 10px;
88
+ flex-direction: column;
89
+ }
90
+
91
+ [data-radix-scroll-area-thumb] {
92
+ flex: 1;
93
+ background: var(--color-fg-muted);
94
+ border-radius: 5px;
95
+ position: relative;
96
+ cursor: pointer;
97
+ }
98
+
99
+ [data-radix-scroll-area-thumb]:hover {
100
+ background: var(--color-fg-default);
101
+ }
102
+ ```
103
+
104
+ ## Tokens consumed
105
+
106
+ ```
107
+ --color-fg-muted (scrollbar thumb default)
108
+ --color-fg-default (thumb hover)
109
+ --color-bg-secondary (scrollbar track, optional)
110
+ --space-xxs (scrollbar padding)
111
+ --motion-fast (visibility transition)
112
+ ```
113
+
114
+ ## States
115
+
116
+ | State | Visual |
117
+ | --- | --- |
118
+ | Resting (with `hover` type) | Scrollbar hidden |
119
+ | Hovered or scrolling | Scrollbar visible (fade in 100ms) |
120
+ | Thumb hover | Slightly darker / brighter thumb |
121
+ | Thumb dragged | Active state visual |
122
+ | Idle (after scroll) | Fades out (with `scroll` type) |
123
+
124
+ ## Accessibility
125
+
126
+ - ScrollArea preserves native scroll keyboard handling (PageUp / PageDown / arrows / Space).
127
+ - Don't replace native scroll mechanics — only the visual appearance.
128
+ - Don't trap scroll inside without an obvious "exit" path (lock scroll OR document scroll, not both ambiguously).
129
+ - For overflow-only-on-hover patterns: ensure keyboard users can also access (Tab to focus content, arrow / PageDown to scroll).
130
+ - Mobile: respects native momentum scroll; thumb may be hidden on mobile (system handles it).
131
+
132
+ ## Code example — Sidebar nav with custom scrollbar
133
+
134
+ ```tsx
135
+ function Sidebar() {
136
+ return (
137
+ <aside className="sidebar">
138
+ <header>
139
+ <Logo />
140
+ </header>
141
+
142
+ <ScrollArea className="flex-1 px-2">
143
+ <nav>
144
+ <NavSection title="Workspace">
145
+ {workspaceItems.map(item => <NavItem key={item.id} {...item} />)}
146
+ </NavSection>
147
+ <NavSection title="Projects">
148
+ {projects.map(p => <NavItem key={p.id} {...p} />)}
149
+ </NavSection>
150
+ </nav>
151
+ </ScrollArea>
152
+
153
+ <footer>
154
+ <UserMenu />
155
+ </footer>
156
+ </aside>
157
+ );
158
+ }
159
+ ```
160
+
161
+ ## Code example — Chat history
162
+
163
+ ```tsx
164
+ <ScrollArea type="always" className="chat-history">
165
+ {messages.map(m => (
166
+ <Message key={m.id} message={m} />
167
+ ))}
168
+ </ScrollArea>
169
+ ```
170
+
171
+ ## Edge cases
172
+
173
+ - **Content exact height as ScrollArea**: scrollbar may briefly appear during render; use `type="auto"`.
174
+ - **Mac users with hidden scrollbars**: respect their preference; `type="hover"` works well.
175
+ - **Touch device**: native touch scroll preserved; styled thumb usually invisible.
176
+ - **Very long content (10,000+ items)**: virtualize content, not just the scrollbar (use react-virtual).
177
+ - **RTL**: scrollbar appears on left; content scrolls right-to-left.
178
+ - **Print**: native scroll; ScrollArea custom styling doesn't apply.
179
+ - **Mobile keyboard opens**: viewport shrinks; ScrollArea height adjusts via parent layout.
180
+
181
+ ## Don't
182
+
183
+ - Don't replace document-level scroll with ScrollArea. Browsers + native scroll handle that better.
184
+ - Don't make custom scrollbars wildly different from system convention (users miss them).
185
+ - Don't make the thumb so small it's hard to grab (< 8px width).
186
+ - Don't disable native keyboard scroll keys.
187
+ - Don't trap scroll without an exit (avoid scroll-jacking).
188
+ - Don't add scroll-snap inside ScrollArea unless intentional — can interact unexpectedly with momentum.
189
+
190
+ ## References
191
+
192
+ - shadcn-ui: [`scroll-area`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/scroll-area.tsx) (Radix)
193
+ - CSS `scrollbar-color`, `scrollbar-width` properties (browser-specific styling alternative)
194
+
195
+ ## Cross-reference
196
+
197
+ - [`examples/component-sidebar.md`](component-sidebar.md) — common consumer
198
+ - [`examples/component-chat-interface.md`](component-chat-interface.md) — chat history scroll
199
+ - [`examples/component-table.md`](component-table.md) — table with scrollable body