@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,114 @@
1
+ # `TextareaAutosize` — spec
2
+
3
+ > Synthesized from MUI `TextareaAutosize`. A `<textarea>` that grows with its content. Sibling to `Textarea` (with optional `autoResize`); shipped as separate primitive in MUI for use without other Textarea behaviors.
4
+
5
+ ## When to use
6
+
7
+ - Comment fields that should grow as user types.
8
+ - Chat input that expands to multiple lines.
9
+ - Form fields where content length varies wildly (description, bio).
10
+
11
+ ## API
12
+
13
+ ```tsx
14
+ <TextareaAutosize
15
+ minRows={2}
16
+ maxRows={8}
17
+ placeholder="Type a message..."
18
+ value={message}
19
+ onChange={(e) => setMessage(e.target.value)}
20
+ />
21
+ ```
22
+
23
+ | Prop | Type | Default | Description |
24
+ | --- | --- | --- | --- |
25
+ | `minRows` | `number` | `1` | Floor — height matches at least this many rows |
26
+ | `maxRows` | `number` | — | Cap — past this, scroll inside |
27
+ | `value` / `onChange` | controlled | — | Standard textarea props |
28
+ | `placeholder` | `string` | — | — |
29
+
30
+ ## Implementation note
31
+
32
+ CSS-only autoResize via field-sizing (modern):
33
+
34
+ ```css
35
+ textarea {
36
+ field-sizing: content;
37
+ min-height: 2lh;
38
+ max-height: 8lh;
39
+ }
40
+ ```
41
+
42
+ `field-sizing: content` (CSS Working Draft, in Chrome / Safari / Firefox 2024+) handles this natively.
43
+
44
+ For older browsers: JS measurement via hidden cloned textarea OR a ref + scrollHeight.
45
+
46
+ ```tsx
47
+ const ref = useRef<HTMLTextAreaElement>(null);
48
+
49
+ useEffect(() => {
50
+ if (!ref.current) return;
51
+ ref.current.style.height = "auto";
52
+ ref.current.style.height = `${ref.current.scrollHeight}px`;
53
+ }, [value]);
54
+ ```
55
+
56
+ ## States
57
+
58
+ Same as Textarea. Grows in addition to standard states.
59
+
60
+ ## Tokens consumed
61
+
62
+ Same as `component-textarea.md`. Plus:
63
+
64
+ ```
65
+ --textarea-line-height (lh unit base)
66
+ ```
67
+
68
+ ## Accessibility
69
+
70
+ - Same as Textarea — `<label>` linking, `aria-invalid`, IME handling.
71
+ - Resize handle (browser-default) usually visible. For `field-sizing: content`, no manual handle.
72
+
73
+ ## Code example — chat input
74
+
75
+ ```tsx
76
+ function ChatInput() {
77
+ const [message, setMessage] = useState("");
78
+
79
+ return (
80
+ <div className="chat-input">
81
+ <TextareaAutosize
82
+ minRows={1}
83
+ maxRows={5}
84
+ placeholder="메시지를 입력하세요..."
85
+ value={message}
86
+ onChange={(e) => setMessage(e.target.value)}
87
+ onKeyDown={(e) => {
88
+ if (e.key === "Enter" && !e.shiftKey && !e.nativeEvent.isComposing) {
89
+ e.preventDefault();
90
+ send();
91
+ }
92
+ }}
93
+ />
94
+ <Button onClick={send}>Send</Button>
95
+ </div>
96
+ );
97
+ }
98
+ ```
99
+
100
+ ## Don't
101
+
102
+ - Don't auto-grow beyond viewport. Always set `maxRows`.
103
+ - Don't break Korean IME with Enter handler — check `isComposing` before submit.
104
+ - Don't measure on every keystroke without debouncing.
105
+
106
+ ## References
107
+
108
+ - MUI: [`TextareaAutosize`](../refs/mui/packages/mui-material/src/TextareaAutosize)
109
+ - CSS `field-sizing` property (Working Draft)
110
+
111
+ ## Cross-reference
112
+
113
+ - [`examples/component-textarea.md`](component-textarea.md)
114
+ - [`examples/component-chat-interface.md`](component-chat-interface.md)
@@ -0,0 +1,173 @@
1
+ # `Textarea` — spec
2
+
3
+ > Synthesized from shadcn-ui `textarea` and HTML5 `<textarea>`. Multi-line text input. Distinct from `Input` (single line) and rich text editors.
4
+
5
+ ## When to use
6
+
7
+ - Multi-line text: comments, descriptions, messages, addresses.
8
+ - Code / config snippets (use a code editor for syntax highlighting).
9
+ - Long-form notes.
10
+
11
+ ## Anatomy
12
+
13
+ ```
14
+ ┌──────────────────────────────────┐
15
+ │ Description │ ← Label (separate)
16
+ └──────────────────────────────────┘
17
+ ┌──────────────────────────────────┐
18
+ │ │
19
+ │ Textarea content... │
20
+ │ │
21
+ │ │
22
+ └──────────────────────────────────┘
23
+ 2-5 rows visible by default; scrolls or grows.
24
+ ```
25
+
26
+ ## API
27
+
28
+ ```tsx
29
+ <Textarea
30
+ rows={4}
31
+ placeholder="Tell us about yourself..."
32
+ value={bio}
33
+ onChange={(e) => setBio(e.target.value)}
34
+ maxLength={500}
35
+ />
36
+
37
+ <Textarea autoResize /> {/* MUI's textarea-autosize variant */}
38
+ ```
39
+
40
+ | Prop | Type | Default | Description |
41
+ | --- | --- | --- | --- |
42
+ | `rows` | `number` | `3` | Visible row count |
43
+ | `maxRows` | `number` | — | Cap when autoResize=true |
44
+ | `minRows` | `number` | `1` | Floor when autoResize=true |
45
+ | `autoResize` | `boolean` | `false` | Grow with content (MUI textarea-autosize) |
46
+ | `value` / `onChange` | controlled | — | Standard input props |
47
+ | `placeholder` | `string` | — | — |
48
+ | `maxLength` | `number` | — | Char limit + counter |
49
+ | `disabled` / `readOnly` | `boolean` | — | — |
50
+ | `resize` | `"none" \| "vertical" \| "horizontal" \| "both"` | `"vertical"` | CSS resize behavior |
51
+
52
+ ## Variants
53
+
54
+ ### Fixed rows
55
+
56
+ ```tsx
57
+ <Textarea rows={3} />
58
+ ```
59
+
60
+ Standard. User can resize (per `resize` prop) or scroll if content overflows.
61
+
62
+ ### Auto-resize (MUI textarea-autosize)
63
+
64
+ ```tsx
65
+ <Textarea autoResize minRows={2} maxRows={8} />
66
+ ```
67
+
68
+ Grows with content up to `maxRows`, then scrolls.
69
+
70
+ ### With character counter
71
+
72
+ ```tsx
73
+ const [text, setText] = useState("");
74
+ <Textarea
75
+ value={text}
76
+ onChange={(e) => setText(e.target.value)}
77
+ maxLength={500}
78
+ />
79
+ <FieldDescription>{text.length} / 500</FieldDescription>
80
+ ```
81
+
82
+ Show counter when approaching max (>80%).
83
+
84
+ ## States
85
+
86
+ | State | Visual |
87
+ | --- | --- |
88
+ | Default | Border + transparent bg |
89
+ | Focused | Brand-color border ring |
90
+ | Filled | Same as default with content |
91
+ | Disabled | Reduced opacity, no events |
92
+ | Read-only | No focus ring, muted bg |
93
+ | Error | Red border |
94
+
95
+ ## Tokens consumed
96
+
97
+ ```
98
+ --textarea-bg
99
+ --textarea-fg
100
+ --textarea-placeholder
101
+ --textarea-border
102
+ --textarea-border-focus (brand)
103
+ --textarea-border-error
104
+ --textarea-resize-handle (drag corner)
105
+ --radius-md
106
+ --space-sm (padding)
107
+ --font-size-base
108
+ --font-family-text (or monospace for code)
109
+ --motion-fast
110
+ ```
111
+
112
+ ## Accessibility
113
+
114
+ - Always use `<label htmlFor>` linking. Or `aria-label` for inline.
115
+ - `aria-invalid="true"` when error.
116
+ - `aria-describedby` references help text + error.
117
+ - For maxLength: `aria-label` should NOT include "(max 500)" — visible counter is enough.
118
+ - Korean IME composition: don't fire onChange / submit during composition.
119
+
120
+ ## Korean IME
121
+
122
+ ```tsx
123
+ const [composing, setComposing] = useState(false);
124
+
125
+ <Textarea
126
+ value={text}
127
+ onChange={(e) => !composing && setText(e.target.value)}
128
+ onCompositionStart={() => setComposing(true)}
129
+ onCompositionEnd={(e) => {
130
+ setComposing(false);
131
+ setText(e.currentTarget.value);
132
+ }}
133
+ />
134
+ ```
135
+
136
+ Critical for Hangul input — composition events span multiple keystrokes.
137
+
138
+ ## Code example
139
+
140
+ ```tsx
141
+ <Field>
142
+ <Label htmlFor="bio">자기소개</Label>
143
+ <Textarea
144
+ id="bio"
145
+ rows={4}
146
+ maxLength={500}
147
+ placeholder="자기소개를 입력해 주세요"
148
+ {...register("bio")}
149
+ />
150
+ <FieldDescription>
151
+ {watch("bio")?.length ?? 0} / 500
152
+ </FieldDescription>
153
+ </Field>
154
+ ```
155
+
156
+ ## Don't
157
+
158
+ - Don't omit `<label>`.
159
+ - Don't auto-grow beyond viewport. Cap with `maxRows`.
160
+ - Don't use Textarea for rich-text needs (bold / italic / link). Use a real RTE.
161
+ - Don't ignore Korean IME composition events.
162
+
163
+ ## References
164
+
165
+ - HTML5 `<textarea>`
166
+ - shadcn-ui: [`textarea`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/textarea.tsx)
167
+ - MUI: TextareaAutosize
168
+
169
+ ## Cross-reference
170
+
171
+ - [`examples/component-input.md`](component-input.md) — single-line variant
172
+ - [`examples/component-textarea-autosize.md`](component-textarea-autosize.md) — autoResize specifics
173
+ - [`examples/component-field.md`](component-field.md) — common wrapper
@@ -0,0 +1,205 @@
1
+ # `TimePicker` — spec
2
+
3
+ > Synthesized from Ant Design `TimePicker` and MUI `TimePicker`. A picker for hour / minute / second selection. Distinct from `DatePicker` (date only) and `DateTimePicker` (combined).
4
+
5
+ ## When to use
6
+
7
+ - Schedule pickers (meeting time, alarm, reservation).
8
+ - Time-only inputs (no date context).
9
+ - Time range selection (start + end time).
10
+
11
+ When NOT to use:
12
+ - Date-only — use `DatePicker`.
13
+ - Date + time combined — use `DateTimePicker`.
14
+ - Duration (e.g., "30 minutes") — use a duration input (numeric stepper).
15
+
16
+ ## Anatomy
17
+
18
+ ```
19
+ [ 14:30 ▾ ] ← trigger field
20
+ ↓ open
21
+ ┌─────────────────────┐
22
+ │ 10 ▲ 20 ▲ 00 ▲ │
23
+ │ 11 21 45 │
24
+ │ 12 22 50 │
25
+ │ 13 23 55 │
26
+ │ 14 ◀ 30 ◀ 00 ◀ │ ← currently selected
27
+ │ 15 31 05 │
28
+ │ ... │
29
+ │ │
30
+ │ [Now] [Confirm] │
31
+ └─────────────────────┘
32
+ ```
33
+
34
+ ## API
35
+
36
+ ```tsx
37
+ <TimePicker
38
+ value={time}
39
+ onChange={setTime}
40
+ format="HH:mm"
41
+ use12Hours={false}
42
+ step={5}
43
+ />
44
+
45
+ <TimeRangePicker
46
+ value={[start, end]}
47
+ onChange={([s, e]) => { setStart(s); setEnd(e); }}
48
+ />
49
+ ```
50
+
51
+ | Prop | Type | Default | Description |
52
+ | --- | --- | --- | --- |
53
+ | `value` | `Date \| Dayjs \| null` | controlled | Selected time |
54
+ | `onChange` | `(time) => void` | — | Callback |
55
+ | `format` | `string` | `"HH:mm:ss"` | Display format |
56
+ | `use12Hours` | `boolean` | `false` | 12-hour with AM/PM |
57
+ | `step` | `number` | `1` | Minute granularity (5, 10, 15, 30) |
58
+ | `showSecond` | `boolean` | `true` | Include seconds picker |
59
+ | `disabled` | `boolean` | `false` | — |
60
+ | `disabledHours` | `() => number[]` | — | Hours unavailable |
61
+ | `disabledMinutes` | `(hour) => number[]` | — | Minutes unavailable per hour |
62
+ | `placeholder` | `string` | locale default | Placeholder |
63
+
64
+ ## Variants
65
+
66
+ ### Granularity
67
+
68
+ | Step | Use |
69
+ | --- | --- |
70
+ | 1 | Precise scheduling |
71
+ | 5 | Most consumer apps |
72
+ | 15 | Calendar appointments |
73
+ | 30 | Hourly time slots |
74
+
75
+ Avoid step=2 / 3 — feels arbitrary.
76
+
77
+ ### 12 vs 24 hour
78
+
79
+ | Format | Default region |
80
+ | --- | --- |
81
+ | 24-hour (HH:mm) | Korea, EU, military |
82
+ | 12-hour (h:mm AM/PM) | US, casual contexts |
83
+
84
+ Korean apps default to 24-hour. Some consumer apps offer toggle.
85
+
86
+ ### Range
87
+
88
+ ```tsx
89
+ <TimeRangePicker value={[start, end]} onChange={...} />
90
+ ```
91
+
92
+ For appointments, schedules. End must be after start (validate inline).
93
+
94
+ ## States
95
+
96
+ | State | Visual |
97
+ | --- | --- |
98
+ | Default | Field shows placeholder or value |
99
+ | Focus | Field highlighted; picker can open on click |
100
+ | Open | Time grid overlay |
101
+ | Selected | Highlighted hour / minute / second columns |
102
+ | Disabled hour/min | Grayed in picker |
103
+ | Error | Red border (validation) |
104
+
105
+ ## Tokens consumed
106
+
107
+ ```
108
+ --time-picker-bg (panel)
109
+ --time-picker-fg
110
+ --time-picker-bg-hover
111
+ --time-picker-bg-selected
112
+ --time-picker-border
113
+ --space-sm, --space-md
114
+ --font-size-sm
115
+ --motion-fast
116
+ --z-overlay
117
+ ```
118
+
119
+ ## Accessibility
120
+
121
+ - Trigger: `<input>` with `role="combobox" aria-haspopup="dialog"`.
122
+ - Picker: `role="dialog"` (or `listbox`).
123
+ - Each column (hours / minutes / seconds): `role="listbox"` with `<li role="option">` items.
124
+ - Keyboard:
125
+ - Arrow Up/Down within column.
126
+ - Tab moves between columns.
127
+ - Enter confirms selection.
128
+ - Esc closes picker.
129
+ - Touch: large tap targets (≥ 44pt) for each cell.
130
+ - Format announcement: read selected time clearly ("오후 2시 30분" or "14시 30분").
131
+
132
+ ## Korean conventions
133
+
134
+ - 24-hour default; some apps toggle 오전/오후 (AM/PM).
135
+ - Format: "14:30" or "오후 2:30".
136
+ - Speaker: "오후 두 시 삼십 분" (TTS).
137
+ - Korean step convention: 30분 (half-hour) for appointments; 5분 / 10분 for finer-grained.
138
+
139
+ ```tsx
140
+ <TimePicker
141
+ value={time}
142
+ onChange={setTime}
143
+ format="HH:mm"
144
+ step={5}
145
+ placeholder="시간 선택"
146
+ locale={koLocale}
147
+ />
148
+ ```
149
+
150
+ ## Code example — appointment booking
151
+
152
+ ```tsx
153
+ function AppointmentBooking() {
154
+ const [date, setDate] = useState(null);
155
+ const [time, setTime] = useState(null);
156
+
157
+ // Disable past times today
158
+ const disabledHours = () => {
159
+ if (!isSameDay(date, today)) return [];
160
+ const now = new Date().getHours();
161
+ return Array.from({ length: now }, (_, i) => i);
162
+ };
163
+
164
+ return (
165
+ <Field>
166
+ <Label>예약 시간</Label>
167
+ <TimePicker
168
+ value={time}
169
+ onChange={setTime}
170
+ format="HH:mm"
171
+ step={30}
172
+ disabled={!date}
173
+ disabledHours={disabledHours}
174
+ />
175
+ </Field>
176
+ );
177
+ }
178
+ ```
179
+
180
+ ## Edge cases
181
+
182
+ - **DST transitions**: spring-forward / fall-back hours may have valid time pairs (1:30 AM happens twice on fall-back). Disambiguate via timezone.
183
+ - **Different timezones**: clearly label which zone is being selected.
184
+ - **Async-disabled times**: server checks "is this slot available?" — show loading + filter.
185
+ - **End-time before start-time** (range picker): validate inline; show error before submit.
186
+ - **Reduced motion**: skip column-scroll animation.
187
+ - **RTL**: column order may flip (hours/min/sec right-to-left).
188
+
189
+ ## Don't
190
+
191
+ - Don't use 24-hour AM/PM ("14:30 PM"). One or the other.
192
+ - Don't use step=1 minute by default for casual schedulers — 30 picks per hour is overwhelming.
193
+ - Don't omit "Now" button on time-of-day pickers.
194
+ - Don't allow seconds for casual scheduling (most users don't care).
195
+
196
+ ## References
197
+
198
+ - Ant: [`TimePicker`](../refs/ant-design/components/time-picker)
199
+ - MUI: `TimePicker` (in @mui/x-date-pickers)
200
+ - HTML5: `<input type="time">` (limited but accessible default)
201
+
202
+ ## Cross-reference
203
+
204
+ - [`examples/component-date-picker.md`](component-date-picker.md)
205
+ - [`examples/component-calendar.md`](component-calendar.md)
@@ -0,0 +1,170 @@
1
+ # `Timeline` — spec
2
+
3
+ > Citing Ant Design `Timeline`, MUI (no built-in), shadcn-ui (composition)
4
+
5
+ ## Purpose
6
+
7
+ A vertical (or horizontal) sequence of events. Used for: activity feeds, order tracking, history logs, project milestones, audit trails.
8
+
9
+ ## Anatomy
10
+
11
+ ```
12
+ Vertical (default):
13
+ ●─── 2026.05.07 14:30 ────
14
+ │ 주문이 접수되었습니다
15
+ │ 주문번호 #1234
16
+
17
+ ●─── 2026.05.07 15:00 ────
18
+ │ 결제가 완료되었습니다
19
+ │ KakaoPay
20
+
21
+ ○─── 2026.05.07 (예정) ────
22
+ │ 배송 준비 중
23
+
24
+ ○─── 2026.05.10 (예정) ────
25
+ 배송 완료 예정
26
+ ```
27
+
28
+ | Slot | Required | Notes |
29
+ | --- | --- | --- |
30
+ | Indicator (per event) | yes | Dot, icon, or filled vs outline |
31
+ | Connector line | yes | Vertical line connecting events |
32
+ | Event title | yes | The event name |
33
+ | Timestamp | yes | When |
34
+ | Description | optional | Detail |
35
+ | Custom content | optional | Image, link, button |
36
+
37
+ ## API
38
+
39
+ ```tsx
40
+ <Timeline>
41
+ <Timeline.Item status="completed" timestamp="2026.05.07 14:30">
42
+ <h4>주문이 접수되었습니다</h4>
43
+ <p>주문번호 #1234</p>
44
+ </Timeline.Item>
45
+ <Timeline.Item status="completed" timestamp="2026.05.07 15:00">
46
+ <h4>결제가 완료되었습니다</h4>
47
+ <p>KakaoPay</p>
48
+ </Timeline.Item>
49
+ <Timeline.Item status="pending" timestamp="2026.05.07 (예정)">
50
+ <h4>배송 준비 중</h4>
51
+ </Timeline.Item>
52
+ <Timeline.Item status="pending" timestamp="2026.05.10 (예정)">
53
+ <h4>배송 완료 예정</h4>
54
+ </Timeline.Item>
55
+ </Timeline>
56
+ ```
57
+
58
+ | Prop (root) | Type | Default | Description |
59
+ | --- | --- | --- | --- |
60
+ | `mode` | `"left" \| "right" \| "alternate"` | `"left"` | Indicator placement |
61
+ | `orientation` | `"vertical" \| "horizontal"` | `"vertical"` | |
62
+ | `compact` | `boolean` | `false` | Tighter spacing |
63
+
64
+ | Prop (Item) | Type | Description |
65
+ | --- | --- | --- |
66
+ | `status` | `"pending" \| "completed" \| "active" \| "error"` | Drives indicator color |
67
+ | `timestamp` | `string \| ReactNode` | When this happened |
68
+ | `icon` | `ReactNode` | Custom indicator (overrides dot) |
69
+ | `color` | `string` | Override indicator color |
70
+ | `position` | `"left" \| "right"` | (alternate mode only) which side |
71
+
72
+ ## Variants
73
+
74
+ ### Modes
75
+
76
+ | Mode | Indicator placement | Use |
77
+ | --- | --- | --- |
78
+ | `left` (default) | Left side, content right | Most common, KR convention |
79
+ | `right` | Right side, content left | RTL contexts |
80
+ | `alternate` | Alternates left/right | Marketing pages, "story" timelines |
81
+
82
+ ### Status → indicator
83
+
84
+ | Status | Indicator |
85
+ | --- | --- |
86
+ | `completed` | Filled circle, primary color |
87
+ | `active` (current) | Filled circle, larger or pulsing |
88
+ | `pending` | Empty / outline circle |
89
+ | `error` | Filled circle, error red, X icon |
90
+
91
+ ## States
92
+
93
+ A timeline doesn't have hover/focus states unless individual items are interactive (links, drill-ins).
94
+
95
+ ## Tokens consumed
96
+
97
+ ```
98
+ --color-primary-default (completed indicator)
99
+ --color-text-tertiary (pending indicator + connector line)
100
+ --color-error (error status)
101
+ --color-text-primary
102
+ --color-text-secondary (timestamp)
103
+ --space-md, --space-base
104
+ --radius-full (indicator circle)
105
+ ```
106
+
107
+ ## Accessibility
108
+
109
+ - Container: `<ol>` (ordered list — order matters in a timeline).
110
+ - Each item: `<li>`.
111
+ - Timestamps: `<time datetime="ISO-format">` for machine-readable.
112
+ - Status: include in screen reader text — "Completed: 결제가 완료되었습니다".
113
+
114
+ ```html
115
+ <ol>
116
+ <li>
117
+ <time datetime="2026-05-07T14:30:00+09:00">2026.05.07 14:30</time>
118
+ <span class="sr-only">완료됨: </span>
119
+ <h4>주문이 접수되었습니다</h4>
120
+ </li>
121
+ ...
122
+ </ol>
123
+ ```
124
+
125
+ ## Use cases
126
+
127
+ | Where | Pattern |
128
+ | --- | --- |
129
+ | Order tracking (e-commerce) | `left` mode, completed → pending sequence |
130
+ | Activity feed (social, project) | `left`, all completed, scrollable |
131
+ | Audit log | Compact mode, dense |
132
+ | Marketing "story" page | `alternate` mode with images |
133
+ | Project milestones | Horizontal, large indicators with dates |
134
+
135
+ ## Korean convention
136
+
137
+ For order/transaction tracking (대표적인 한국 e-commerce / fintech):
138
+
139
+ ```
140
+ ● 주문 접수 2026.05.07 14:30
141
+ ● 결제 완료 2026.05.07 15:00
142
+ ● 상품 준비 2026.05.08 09:30
143
+ ○ 배송 시작 예정
144
+ ○ 배송 완료 예정
145
+ ```
146
+
147
+ Status terms:
148
+ - 완료 (completed)
149
+ - 진행 중 (in progress)
150
+ - 대기 (pending)
151
+ - 실패 (failed)
152
+ - 취소됨 (cancelled)
153
+
154
+ ## Don't
155
+
156
+ - Don't use Timeline for non-sequential data. Use a list.
157
+ - Don't omit timestamps. Timeline without "when" is just a list.
158
+ - Don't use 50+ items. Paginate or virtualize. For activity feeds, use a scroll-load pattern.
159
+ - Don't use horizontal Timeline on mobile (cramped).
160
+
161
+ ## References
162
+
163
+ - Ant Design: [`refs/ant-design/components/timeline/`](../refs/ant-design/components/timeline/) — `Timeline` with modes, custom icons, color overrides.
164
+ - MUI: `@mui/lab` `Timeline` (separate package) — alternate mode well-supported.
165
+ - shadcn-ui: no built-in. Compose from primitives.
166
+
167
+ ## Cross-reference
168
+
169
+ - [`examples/component-steps.md`](component-steps.md) — when sequence has discrete user actions
170
+ - [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md) — activity feed patterns