@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,178 @@
1
+ # `Skeleton` — spec
2
+
3
+ > Citing Ant Design `Skeleton`, MUI `Skeleton`, shadcn-ui `skeleton`
4
+
5
+ ## Purpose
6
+
7
+ A placeholder rendered while content loads. Shows the **shape** of what's coming — title bar, paragraph lines, image, etc. Reduces perceived load time and prevents layout shift when the real content arrives.
8
+
9
+ ## When Skeleton vs Spinner
10
+
11
+ | Use Skeleton | Use Spinner |
12
+ | --- | --- |
13
+ | First load of a screen (we know the shape) | Async action with no shape (form submit, API call) |
14
+ | List of items where each item has a known structure | Indeterminate "thinking" state |
15
+ | Component with predictable layout | Inline loading on a button |
16
+
17
+ For pagination or refresh of an existing list: **don't replace items with skeletons**. Show a small inline spinner. Keep the loaded data.
18
+
19
+ ## Anatomy — primitives
20
+
21
+ A Skeleton is composed from three primitive shapes:
22
+
23
+ ```
24
+ Text line: ▔▔▔▔▔▔▔▔▔▔▔▔▔
25
+ Block: ▢▢▢▢
26
+ Circle: ◯
27
+ ```
28
+
29
+ ```tsx
30
+ <Skeleton variant="text" width="80%" />
31
+ <Skeleton variant="rect" width={120} height={120} />
32
+ <Skeleton variant="circle" size={48} />
33
+ ```
34
+
35
+ ## API
36
+
37
+ | Prop | Type | Default | Description |
38
+ | --- | --- | --- | --- |
39
+ | `variant` | `"text" \| "rect" \| "circle"` | `"text"` | Shape |
40
+ | `width` | `string \| number` | `"100%"` (text) | Pixels or CSS unit |
41
+ | `height` | `string \| number` | scaled to text size | |
42
+ | `size` | `number` | — | Convenience for circle (W=H) |
43
+ | `lines` | `number` | `1` | For variant="text" — render N lines |
44
+ | `animation` | `"shimmer" \| "pulse" \| "none"` | `"shimmer"` | |
45
+
46
+ ## Composition for higher-level shapes
47
+
48
+ Build screen-specific skeletons by composing primitives:
49
+
50
+ ```tsx
51
+ // Card skeleton
52
+ <Card>
53
+ <Skeleton variant="rect" height={160} /> {/* hero image */}
54
+ <Card.Body>
55
+ <Skeleton variant="text" width="60%" /> {/* title */}
56
+ <Skeleton variant="text" width="100%" /> {/* desc line 1 */}
57
+ <Skeleton variant="text" width="80%" /> {/* desc line 2 */}
58
+ </Card.Body>
59
+ </Card>
60
+
61
+ // List item skeleton
62
+ <div className="flex gap-3 py-3">
63
+ <Skeleton variant="circle" size={40} /> {/* avatar */}
64
+ <div className="flex-1">
65
+ <Skeleton variant="text" width="40%" /> {/* name */}
66
+ <Skeleton variant="text" width="80%" /> {/* preview */}
67
+ </div>
68
+ </div>
69
+ ```
70
+
71
+ For frequent shapes, expose a higher-level skeleton: `<Skeleton.Card />`, `<Skeleton.ListItem />`.
72
+
73
+ ## Animation
74
+
75
+ | Animation | Look | Use |
76
+ | --- | --- | --- |
77
+ | `shimmer` (default) | Diagonal gradient sweeps left → right, 1500ms loop linear | Universal — most polished |
78
+ | `pulse` | Opacity 0.5 → 1 fade-pulse | Calmer, less attention-grabbing |
79
+ | `none` | Static | Reduced-motion mode, or when many skeletons are on screen |
80
+
81
+ Implement shimmer as:
82
+ ```css
83
+ .skeleton {
84
+ background: linear-gradient(90deg, var(--color-bg-subtle), var(--color-bg-elevated), var(--color-bg-subtle));
85
+ background-size: 200% 100%;
86
+ animation: shimmer 1500ms linear infinite;
87
+ }
88
+ @keyframes shimmer {
89
+ 0% { background-position: -200% 0; }
90
+ 100% { background-position: 200% 0; }
91
+ }
92
+ ```
93
+
94
+ ## States
95
+
96
+ The Skeleton itself doesn't have states — it's a placeholder. The transition is from skeleton → real content.
97
+
98
+ ### Transition rules
99
+
100
+ - Show skeleton immediately on mount when waiting for data.
101
+ - If data arrives in < 200ms: never show skeleton. (Avoid flicker.)
102
+ - If data arrives in 200–600ms: showing skeleton helps perceived speed.
103
+ - If data arrives in > 600ms: skeleton is **essential**.
104
+ - On data arrive: skeleton unmounts, real content appears. Match heights to prevent layout shift.
105
+
106
+ ```tsx
107
+ {isLoading ? <Skeleton.Card /> : <ProductCard data={data} />}
108
+ ```
109
+
110
+ ## Tokens consumed
111
+
112
+ ```
113
+ --color-bg-subtle (skeleton base)
114
+ --color-bg-elevated (shimmer highlight)
115
+ --radius-sm (text shape)
116
+ --radius-md (rect shape)
117
+ --radius-full (circle shape)
118
+ ```
119
+
120
+ ## Accessibility
121
+
122
+ - Wrap a group of skeletons in `aria-busy="true"` with `aria-label="Loading"`.
123
+ - The skeletons themselves can be `aria-hidden="true"` — they don't add information for screen readers.
124
+ - **Don't** announce "loading loading loading" for each skeleton. One container-level announcement.
125
+ - When data loads, remove `aria-busy` and announce result if helpful (`role="status"` with `"5 results loaded"`).
126
+
127
+ ```tsx
128
+ <div aria-busy={isLoading} aria-live="polite" aria-label={isLoading ? "Loading transactions" : undefined}>
129
+ {isLoading ? (
130
+ <>
131
+ <Skeleton.ListItem />
132
+ <Skeleton.ListItem />
133
+ <Skeleton.ListItem />
134
+ </>
135
+ ) : (
136
+ <TransactionList items={data} />
137
+ )}
138
+ </div>
139
+ ```
140
+
141
+ ## Reduced motion
142
+
143
+ Honor `prefers-reduced-motion`:
144
+
145
+ ```css
146
+ @media (prefers-reduced-motion: reduce) {
147
+ .skeleton { animation: none; }
148
+ }
149
+ ```
150
+
151
+ The skeleton still renders (showing layout); just no animation.
152
+
153
+ ## Edge cases
154
+
155
+ - **Skeleton matched to wrong content shape**: real content arrives, layout shifts. Bug. Always preview the skeleton vs the real component.
156
+ - **Skeleton everywhere**: a page entirely of skeletons feels slow even at fast TTI. Try to render at least the page chrome (header, nav) immediately and skeleton only the data area.
157
+ - **Skeleton inside a Skeleton**: don't nest. Compose at the outer level.
158
+ - **Skeleton on a dark mode card**: token `--color-bg-subtle` is darker than `--color-bg-default` in dark mode — confirm visibility.
159
+ - **Variable-width text**: skeleton width should approximate the average. 60% / 80% / 100% mix reads natural.
160
+
161
+ ## Don't
162
+
163
+ - Don't show a skeleton for < 200ms. The flicker is worse than briefly-empty.
164
+ - Don't show a skeleton on user actions (button clicks). Use a button loading state.
165
+ - Don't replace existing data with skeletons during refresh — keep stale data + show subtle progress.
166
+ - Don't ship without `prefers-reduced-motion` handling.
167
+ - Don't use skeletons as decorative loading bars. They're for content shape.
168
+
169
+ ## References
170
+
171
+ - Ant Design: [`refs/ant-design/components/skeleton/`](../refs/ant-design/components/skeleton/) — most exhaustive: `Skeleton.Avatar`, `Skeleton.Button`, `Skeleton.Image`, `Skeleton.Input`, `Skeleton.Node`. Pre-composed shapes for common components.
172
+ - MUI: [`refs/mui/packages/mui-material/src/Skeleton/`](../refs/mui/packages/mui-material/src/Skeleton/) — primitive only. Composition is up to the consumer.
173
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/skeleton.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/skeleton.tsx) — minimal Tailwind-based primitive.
174
+
175
+ ## Cross-reference
176
+
177
+ - [knowledge/patterns/list-and-feed.md](../knowledge/patterns/list-and-feed.md) — list-loading patterns
178
+ - [knowledge/patterns/ux-guidelines.md](../knowledge/patterns/ux-guidelines.md) — broader loading-state rules
@@ -0,0 +1,89 @@
1
+ # `Slide` — spec
2
+
3
+ > Synthesized from MUI `Slide`. Transition primitive that slides a child in / out from a specified direction. Sibling to `Fade`, `Zoom`, `Grow`, `Collapse`.
4
+
5
+ ## When to use
6
+
7
+ - Drawer / Sheet entrance (slides from edge).
8
+ - Toast / Snackbar entrance (slides up from bottom).
9
+ - Sequential reveals on scroll-into-view.
10
+
11
+ ## API
12
+
13
+ ```tsx
14
+ <Slide direction="up" in={open} mountOnEnter unmountOnExit>
15
+ <div className="card">
16
+ Content
17
+ </div>
18
+ </Slide>
19
+ ```
20
+
21
+ | Prop | Type | Default | Description |
22
+ | --- | --- | --- | --- |
23
+ | `in` | `boolean` | required | Show / hide |
24
+ | `direction` | `"up" \| "down" \| "left" \| "right"` | `"down"` | Slide-from direction |
25
+ | `timeout` | `number \| { enter, exit }` | `225` | Ms |
26
+ | `easing` | `string \| { enter, exit }` | per Material | CSS easing |
27
+ | `appear` | `boolean` | `false` | Animate on first mount |
28
+ | `mountOnEnter` / `unmountOnExit` | `boolean` | `false` | DOM mount control |
29
+
30
+ ## CSS
31
+
32
+ ```css
33
+ .slide-up-enter {
34
+ transform: translateY(100%);
35
+ }
36
+ .slide-up-enter-active {
37
+ transform: translateY(0);
38
+ transition: transform 250ms var(--ease-out);
39
+ }
40
+ .slide-up-exit-active {
41
+ transform: translateY(100%);
42
+ transition: transform 195ms var(--ease-out);
43
+ }
44
+ ```
45
+
46
+ Direction variants flip the translate axis.
47
+
48
+ ## Reduced motion
49
+
50
+ ```css
51
+ @media (prefers-reduced-motion: reduce) {
52
+ .slide-* { transition: none; }
53
+ }
54
+ ```
55
+
56
+ ## Tokens consumed
57
+
58
+ ```
59
+ --motion-medium
60
+ --ease-out
61
+ ```
62
+
63
+ ## Code example — bottom sheet entrance
64
+
65
+ ```tsx
66
+ <Slide in={open} direction="up" mountOnEnter unmountOnExit>
67
+ <div className="bottom-sheet">
68
+ <SheetContent />
69
+ </div>
70
+ </Slide>
71
+ ```
72
+
73
+ ## Don't
74
+
75
+ - Don't slide horizontally large amounts on narrow viewports — content invisible mid-transition.
76
+ - Don't ignore reduced motion.
77
+ - Don't combine Slide with Fade and Zoom together — pick one motion idiom.
78
+
79
+ ## References
80
+
81
+ - MUI: [`Slide`](../refs/mui/packages/mui-material/src/Slide)
82
+ - Material Design motion
83
+
84
+ ## Cross-reference
85
+
86
+ - [`examples/component-zoom.md`](component-zoom.md)
87
+ - [`examples/component-sheet.md`](component-sheet.md) — uses slide internally
88
+ - [`examples/component-drawer.md`](component-drawer.md) — uses slide internally
89
+ - [`knowledge/motion/principles.md`](../knowledge/motion/principles.md)
@@ -0,0 +1,208 @@
1
+ # `Slider` — spec
2
+
3
+ > Citing Ant Design `Slider`, MUI `Slider`, shadcn-ui `slider`
4
+
5
+ ## Purpose
6
+
7
+ A control for selecting a numeric value (or a range) by dragging. Used for: volume, price filter, opacity, brightness, age range.
8
+
9
+ ## When Slider vs Input
10
+
11
+ | Use Slider | Use Input (numeric) |
12
+ | --- | --- |
13
+ | Approximate value matters more than exact | Exact value matters |
14
+ | Continuous range with no obvious snap points | Discrete options or precise numbers |
15
+ | Visual feedback as the user adjusts | User knows the value (e.g., DOB year, transaction amount) |
16
+
17
+ For amounts (currency, distance), prefer Input. For preferences (volume, contrast adjustment), Slider.
18
+
19
+ ## Anatomy
20
+
21
+ ```
22
+ Single value:
23
+ 0 ──────●─────────── 100
24
+ 45
25
+
26
+ Range:
27
+ 0 ─────●━━━━━━━●─── 100
28
+ 20 80
29
+ ```
30
+
31
+ | Slot | Required | Notes |
32
+ | --- | --- | --- |
33
+ | Track | yes | Background line |
34
+ | Range fill | yes | Filled portion (single: 0→thumb, range: thumb1→thumb2) |
35
+ | Thumb(s) | yes | Draggable circle(s) |
36
+ | Tick marks | optional | Small lines at intervals |
37
+ | Step labels | optional | Numbers at tick positions |
38
+ | Value display | optional | Tooltip at thumb OR fixed display nearby |
39
+
40
+ ## API
41
+
42
+ ```tsx
43
+ <Slider
44
+ value={volume}
45
+ onValueChange={setVolume}
46
+ min={0}
47
+ max={100}
48
+ step={1}
49
+ label="볼륨"
50
+ showValue
51
+ />
52
+
53
+ <Slider
54
+ value={priceRange}
55
+ onValueChange={setPriceRange}
56
+ min={0}
57
+ max={1000000}
58
+ step={10000}
59
+ range
60
+ label="가격대"
61
+ formatValue={(v) => `₩${v.toLocaleString()}`}
62
+ />
63
+ ```
64
+
65
+ | Prop | Type | Default | Description |
66
+ | --- | --- | --- | --- |
67
+ | `value` / `defaultValue` | `number \| [number, number]` | — | Single or range. `[number, number]` triggers range mode |
68
+ | `onValueChange` | `(value) => void` | — | Fires while dragging (debounced) |
69
+ | `onValueCommit` | `(value) => void` | — | Fires only on drag-end (use for expensive updates) |
70
+ | `range` | `boolean` | inferred from value type | Force range mode |
71
+ | `min` / `max` | `number` | `0` / `100` | |
72
+ | `step` | `number` | `1` | Increment per arrow key / tick |
73
+ | `marks` | `{ value: number, label?: string }[]` | — | Custom marks |
74
+ | `disabled` | `boolean` | `false` | |
75
+ | `label` | `string` | — | Visible label (above slider) |
76
+ | `showValue` | `boolean` | `false` | Render value as tooltip on thumb |
77
+ | `formatValue` | `(value) => string` | `String(value)` | Custom format |
78
+ | `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | |
79
+ | `inverted` | `boolean` | `false` | Right-to-left direction |
80
+
81
+ ## States
82
+
83
+ | State | Visual |
84
+ | --- | --- |
85
+ | Default | Track + thumb at value position |
86
+ | Hover (thumb) | Thumb slightly larger or shadow |
87
+ | Focus-visible | 2px ring around thumb |
88
+ | Dragging | Cursor: grabbing; thumb scaled up; tooltip visible |
89
+ | Disabled | Track + thumb muted, no events |
90
+
91
+ ## Sizes
92
+
93
+ | Size | Track height | Thumb size |
94
+ | --- | --- | --- |
95
+ | `sm` | 2px | 14px |
96
+ | `md` (default) | 4px | 18px |
97
+ | `lg` | 6px | 22px |
98
+
99
+ For mobile touch: `md` minimum. The thumb's hit area extends beyond the visible thumb by ~12px each side to support thumb dragging.
100
+
101
+ ## Tokens consumed
102
+
103
+ ```
104
+ --color-bg-subtle (track)
105
+ --color-primary-default (range fill, thumb)
106
+ --color-bg-default (thumb center, ring)
107
+ --color-text-primary (value display)
108
+ --color-focus-ring
109
+ --space-xs, --space-sm
110
+ --radius-full (thumb)
111
+ --motion-fast, --easing-out
112
+ --shadow-card (thumb shadow)
113
+ ```
114
+
115
+ ## Accessibility — WAI-ARIA Slider pattern
116
+
117
+ - Single thumb: `role="slider"`, `aria-valuenow`, `aria-valuemin`, `aria-valuemax`, `aria-orientation`, `aria-label` (or `aria-labelledby`).
118
+ - Range: two `role="slider"` thumbs, each with their own valuenow + label ("Minimum price" / "Maximum price").
119
+ - `aria-valuetext` if the displayed value isn't a plain number (e.g., "₩50,000" instead of "50000").
120
+
121
+ ### Keyboard
122
+
123
+ | Key | Behavior |
124
+ | --- | --- |
125
+ | `Tab` | Reach slider (thumb 1; if range, then thumb 2) |
126
+ | `←` / `↓` | Decrement by `step` |
127
+ | `→` / `↑` | Increment by `step` |
128
+ | `Home` | min value |
129
+ | `End` | max value |
130
+ | `PageUp` / `PageDown` | Larger step (typically 10× step) |
131
+
132
+ For range slider with overlapping thumbs: each thumb maintains independent focus + keyboard control. Thumb that would cross the other "pushes" it (or stops at the other's position).
133
+
134
+ ## Touch / drag behavior
135
+
136
+ - Hit area for thumb: 44×44 pt minimum (extend with invisible padding).
137
+ - Drag the track: should jump-to-value-and-start-drag from any track position.
138
+ - Snap to step: cleanly, no fractional positions.
139
+ - Vibration / haptic feedback (mobile): subtle haptic at each step crossing for some apps; off by default for sliders that are continuous-feeling.
140
+
141
+ ## Edge cases
142
+
143
+ - **Range thumbs overlap**: when min and max meet, thumbs occupy the same space. Allow this (they're interchangeable). Visual: render z-index so the active one is on top.
144
+ - **`step` doesn't divide `max - min` evenly**: thumb snaps to nearest step; the max position might not be reachable. Prefer round-numbered max + step combinations.
145
+ - **Very large ranges with small step**: 0–1,000,000 with step=1 gives a million positions but only ~1000 px of track. Thumb position is still continuous; consider bumping step to 1000 or showing a numeric input next to the slider for precision.
146
+ - **Vertical orientation**: arrow keys reverse on `↑`/`↓` semantically (up = increase). Keep that.
147
+ - **RTL**: track flows right-to-left automatically with `dir="rtl"`. Use logical CSS.
148
+ - **Dragging while page scrolls**: prevent accidental page scroll on touch — use `touch-action: none` on the slider.
149
+
150
+ ## Code example
151
+
152
+ ```tsx
153
+ // Volume control
154
+ <Slider
155
+ label="볼륨"
156
+ value={volume}
157
+ onValueChange={setVolume}
158
+ min={0}
159
+ max={100}
160
+ step={1}
161
+ showValue
162
+ formatValue={(v) => `${v}%`}
163
+ />
164
+
165
+ // Price range filter
166
+ <Slider
167
+ label="가격대"
168
+ value={priceRange}
169
+ onValueChange={setPriceRange} // updates UI live
170
+ onValueCommit={fetchResults} // server-fetch only on release
171
+ min={0}
172
+ max={1000000}
173
+ step={10000}
174
+ range
175
+ marks={[
176
+ { value: 0, label: "₩0" },
177
+ { value: 250000, label: "₩25만" },
178
+ { value: 500000, label: "₩50만" },
179
+ { value: 750000, label: "₩75만" },
180
+ { value: 1000000, label: "₩100만+" },
181
+ ]}
182
+ formatValue={(v) => `₩${v.toLocaleString()}`}
183
+ />
184
+
185
+ // Disabled state with explanation
186
+ <Slider value={50} disabled aria-label="요금제 한도 도달" />
187
+ ```
188
+
189
+ ## Don't
190
+
191
+ - Don't use Slider for exact numeric input where the exact value matters. Use a number input (or both — common in price filters: slider + two number inputs synced).
192
+ - Don't omit `aria-label` (or `label` prop). Sliders without an accessible name are unusable.
193
+ - Don't fire expensive operations on `onValueChange` (debounce 100ms minimum, or use `onValueCommit`).
194
+ - Don't disable the slider without explaining why (tooltip or inline help).
195
+ - Don't have `step` so small that arrow keys feel useless (1 over a 0–1,000,000 range — 1,000,000 keypresses).
196
+ - Don't show a slider for binary choices. Use a Switch.
197
+ - Don't layer two sliders on top of each other to fake range. Use proper range mode.
198
+
199
+ ## References
200
+
201
+ - Ant Design: [`refs/ant-design/components/slider/`](../refs/ant-design/components/slider/) — `Slider` with `range`, `marks`, `step`, `included` (whether range fill shows). Solid impl.
202
+ - MUI: [`refs/mui/packages/mui-material/src/Slider/`](../refs/mui/packages/mui-material/src/Slider/) — `Slider` with rich `marks`, `valueLabelDisplay`, `track="normal" | "false" | "inverted"`. Most comprehensive.
203
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/slider.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/slider.tsx) — Radix Slider primitive. Simplest API.
204
+
205
+ ## Cross-reference
206
+
207
+ - [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md) — keyboard contract for slider
208
+ - [`examples/component-input.md`](component-input.md) — when number input is the right choice instead
@@ -0,0 +1,92 @@
1
+ # `SnackbarContent` — spec
2
+
3
+ > Synthesized from MUI `SnackbarContent`. The default visual surface inside a `Snackbar` — message text + optional action button. Use for custom Snackbars beyond the simple message-string case.
4
+
5
+ ## When to use
6
+
7
+ - Snackbars with rich content (icon + text + action button).
8
+ - Inline banners that look like Snackbars but live in-page (rare).
9
+ - For simple toasts, `Snackbar message="..."` auto-renders SnackbarContent — no direct use needed.
10
+
11
+ ## API
12
+
13
+ ```tsx
14
+ <Snackbar open={open} onClose={handleClose}>
15
+ <SnackbarContent
16
+ message="저장됐어요"
17
+ action={
18
+ <Button color="inherit" size="small" onClick={handleUndo}>
19
+ 실행 취소
20
+ </Button>
21
+ }
22
+ />
23
+ </Snackbar>
24
+ ```
25
+
26
+ | Prop | Type | Default | Description |
27
+ | --- | --- | --- | --- |
28
+ | `message` | `ReactNode` | — | The message |
29
+ | `action` | `ReactNode` | — | Action button (right-aligned) |
30
+ | `role` | `string` | `'alert'` | ARIA role |
31
+
32
+ ## Tokens consumed
33
+
34
+ ```
35
+ --snackbar-bg /* dark surface (high-contrast for floating ephemeral UI) */
36
+ --snackbar-fg
37
+ --snackbar-padding
38
+ --snackbar-radius
39
+ --snackbar-shadow-md
40
+ ```
41
+
42
+ ## Accessibility
43
+
44
+ - Default `role="alert"` makes the message announce to screen readers immediately on appear.
45
+ - Use `role="status"` for less-urgent updates ("저장 중...").
46
+ - Action button's accessible name comes from its label — keep concise (1-2 words).
47
+
48
+ ## Edge cases
49
+
50
+ - **Korean message brevity** — Snackbars auto-dismiss in ~5s; keep messages short ("저장됐어요" not "변경사항이 성공적으로 저장됐습니다").
51
+ - **Multiple actions** — limit to 1 action; if more needed, use a Dialog instead.
52
+ - **Long messages** — wrap to 2 lines max.
53
+
54
+ ## Code example
55
+
56
+ ```tsx
57
+ <Snackbar
58
+ open={state.open}
59
+ autoHideDuration={5000}
60
+ onClose={handleClose}
61
+ anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}
62
+ >
63
+ <SnackbarContent
64
+ message={
65
+ <Stack direction="row" alignItems="center" gap={1}>
66
+ <CheckCircleIcon fontSize="small" aria-hidden />
67
+ <span>저장됐어요</span>
68
+ </Stack>
69
+ }
70
+ action={
71
+ <Button color="inherit" size="small" onClick={handleUndo}>
72
+ 실행 취소
73
+ </Button>
74
+ }
75
+ />
76
+ </Snackbar>
77
+ ```
78
+
79
+ ## Don't
80
+
81
+ - Don't use for errors that block flow — those are Dialogs.
82
+ - Don't pile multiple Snackbars on screen — at most one at a time.
83
+
84
+ ## References
85
+
86
+ - MUI: [`SnackbarContent`](../refs/mui/packages/mui-material/src/SnackbarContent/)
87
+
88
+ ## Cross-reference
89
+
90
+ - [`component-snackbar.md`](component-snackbar.md)
91
+ - [`component-alert.md`](component-alert.md)
92
+ - [`component-toast.md`](component-toast.md)
@@ -0,0 +1,121 @@
1
+ # `Snackbar` — spec
2
+
3
+ > Synthesized from MUI `Snackbar` and Material 3 snackbar pattern. Bottom-anchored brief notification with optional action — Material's specific name for the Toast pattern. See [`component-toast.md`](component-toast.md) for the broader Toast family.
4
+
5
+ ## Snackbar vs Toast vs Message vs Notification
6
+
7
+ | Library | Position | Use |
8
+ | --- | --- | --- |
9
+ | Snackbar (Material) | Bottom-center / bottom-left | Brief result + optional Undo |
10
+ | Toast (Sonner / shadcn / Ant) | Bottom-right (configurable) | Same as Snackbar |
11
+ | Message (Ant) | Top-center | Brief inline confirmation |
12
+ | Notification (Ant) | Top-right corner card | Rich title + description |
13
+
14
+ In design-ai's canonical synthesis: **Snackbar = MUI's name for Toast**. Pick one terminology per project.
15
+
16
+ ## Anatomy
17
+
18
+ ```
19
+ ┌────────────────────────┐
20
+ │ Marked as read [Undo] [×] │
21
+ └────────────────────────┘
22
+ ↑ bottom-center (Material default)
23
+ ```
24
+
25
+ ## API
26
+
27
+ ```tsx
28
+ <Snackbar
29
+ open={open}
30
+ onClose={() => setOpen(false)}
31
+ message="읽음 처리됨"
32
+ action={
33
+ <Button size="sm" onClick={undo}>실행 취소</Button>
34
+ }
35
+ autoHideDuration={6000}
36
+ anchorOrigin={{ vertical: "bottom", horizontal: "center" }}
37
+ />
38
+ ```
39
+
40
+ | Prop | Type | Default | Description |
41
+ | --- | --- | --- | --- |
42
+ | `open` | `boolean` | controlled | Visibility |
43
+ | `onClose` | `(reason) => void` | — | Close callback (auto / manual / clickaway) |
44
+ | `message` | `string \| ReactNode` | — | Content |
45
+ | `action` | `ReactNode` | — | Trailing action button(s) |
46
+ | `autoHideDuration` | `number` | `6000` | Ms before auto-close; null = persistent |
47
+ | `anchorOrigin` | `{ vertical, horizontal }` | bottom-left | Position |
48
+ | `severity` | `"success" \| "info" \| "warning" \| "error"` | none | Color preset |
49
+
50
+ ## States
51
+
52
+ | State | Visual |
53
+ | --- | --- |
54
+ | Closed | Hidden |
55
+ | Opening | Slide up + fade in (200ms) |
56
+ | Open | Visible; auto-hide timer ticks |
57
+ | Closing | Slide down + fade out |
58
+
59
+ ## Tokens consumed
60
+
61
+ ```
62
+ --snackbar-bg (default; near-black on light, near-white on dark)
63
+ --snackbar-fg
64
+ --snackbar-action (action button text)
65
+ --snackbar-shadow
66
+ --radius-md
67
+ --motion-medium
68
+ --ease-out
69
+ --z-snackbar (above content, below modals)
70
+ ```
71
+
72
+ ## Accessibility
73
+
74
+ - `role="status"` (informational) or `role="alert"` (errors).
75
+ - `aria-live="polite"` (status) or `assertive` (alert) — be sparing.
76
+ - Auto-hide pauses on hover / focus (don't dismiss while user is reading or interacting).
77
+ - Esc closes if focusable.
78
+
79
+ ## Code example — undo pattern
80
+
81
+ ```tsx
82
+ async function deleteItem(id: string) {
83
+ const item = items.find(i => i.id === id);
84
+ setItems(prev => prev.filter(i => i.id !== id));
85
+
86
+ toast.snackbar({
87
+ message: "삭제되었어요",
88
+ action: <Button onClick={() => setItems(prev => [...prev, item])}>실행 취소</Button>,
89
+ autoHideDuration: 5000,
90
+ onClose: (reason) => {
91
+ if (reason !== "clickaway") {
92
+ api.deleteItem(id); // commit deletion when snackbar closes
93
+ }
94
+ },
95
+ });
96
+ }
97
+ ```
98
+
99
+ ## Korean conventions
100
+
101
+ - 삭제됐어요 / 저장됐어요 / 복사됐어요 — typical 해요체 messages
102
+ - 실행 취소 (Undo) — standard label
103
+ - For network errors: "네트워크 오류 — 다시 시도하시겠어요?" + Retry button
104
+
105
+ ## Don't
106
+
107
+ - Don't use Snackbar for blocking errors. Use Modal / AlertDialog.
108
+ - Don't show 3+ Snackbars stacked. Queue them.
109
+ - Don't auto-dismiss persistent errors (let user dismiss manually).
110
+ - Don't make autoHide < 4 seconds for messages with Undo. Users need time to act.
111
+
112
+ ## References
113
+
114
+ - MUI: [`Snackbar`](../refs/mui/packages/mui-material/src/Snackbar)
115
+ - Material 3: Snackbar pattern
116
+
117
+ ## Cross-reference
118
+
119
+ - [`examples/component-toast.md`](component-toast.md) — broader Toast family
120
+ - [`examples/component-message.md`](component-message.md) — top-positioned alternative
121
+ - [`examples/component-notification.md`](component-notification.md) — richer card variant