@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,320 @@
1
+ <!-- hand-written -->
2
+ # `ScrollReveal` (custom β€” viewport-triggered animation primitive) β€” spec
3
+
4
+ > Animates a child element into view when it enters the viewport. One-shot by default. Used heavily in marketing pages and feature grids; restraint required in product UI. Pairs with [`knowledge/motion/marketing-motion.md`](../knowledge/motion/marketing-motion.md).
5
+
6
+ ## Purpose
7
+
8
+ - Reveal sections / cards / images as user scrolls them into view.
9
+ - One-shot per element (no replaying on every scroll up/down).
10
+ - Reduced-motion safe (instantly visible).
11
+ - Compose with stagger for parent β†’ children sequences.
12
+
13
+ Without this: every team hand-rolls IntersectionObserver wrappers and gets the threshold / once-only / reduced-motion logic subtly wrong.
14
+
15
+ ## Anatomy
16
+
17
+ ```
18
+ [viewport edge]
19
+ ─────────────────────────────────
20
+ ← ScrollReveal child sits below fold
21
+ (opacity 0, translateY +16px)
22
+
23
+ ↓ user scrolls; element crosses 80% threshold
24
+
25
+ [viewport edge]
26
+ ─────────────────────────────────
27
+ [ScrollReveal child] ← animates into place
28
+ (200ms fade + translateY β†’ 0)
29
+ ```
30
+
31
+ ## API
32
+
33
+ ```tsx
34
+ <ScrollReveal>
35
+ <FeatureCard title="..." />
36
+ </ScrollReveal>
37
+
38
+ // With stagger across siblings:
39
+ <ScrollReveal staggerChildren={60}>
40
+ <FeatureCard title="A" />
41
+ <FeatureCard title="B" />
42
+ <FeatureCard title="C" />
43
+ </ScrollReveal>
44
+
45
+ // Custom motion:
46
+ <ScrollReveal effect="fade-up" delay={100} duration={300}>
47
+ <Hero />
48
+ </ScrollReveal>
49
+ ```
50
+
51
+ | Prop | Type | Default | Description |
52
+ | --- | --- | --- | --- |
53
+ | `effect` | `"fade" \| "fade-up" \| "fade-in-blur" \| "scale-in"` | `"fade-up"` | Entrance style |
54
+ | `threshold` | `number` | `0.2` | IntersectionObserver threshold (0–1) |
55
+ | `rootMargin` | `string` | `"0px 0px -10% 0px"` | IO margin (negative bottom = trigger before bottom edge) |
56
+ | `once` | `boolean` | `true` | Trigger only on first intersection |
57
+ | `delay` | `number` | `0` | Ms before animation starts after threshold crossed |
58
+ | `duration` | `number` | `200` | Ms |
59
+ | `easing` | `string` | `"var(--ease-out)"` | CSS easing |
60
+ | `staggerChildren` | `number` | `0` | Ms between sibling reveals (only on direct children) |
61
+ | `disabled` | `boolean` | auto via `prefers-reduced-motion` | Skip animation; show instantly |
62
+ | `as` | `keyof JSX.IntrinsicElements` | `"div"` | Wrapper element |
63
+ | `onReveal` | `() => void` | β€” | Fires when reveal starts |
64
+
65
+ ## Effects
66
+
67
+ ### `fade-up` (default)
68
+
69
+ Most common. Element rises 16px and fades in.
70
+
71
+ ```css
72
+ [data-reveal][data-state="hidden"] {
73
+ opacity: 0;
74
+ transform: translateY(16px);
75
+ }
76
+ [data-reveal][data-state="visible"] {
77
+ opacity: 1;
78
+ transform: translateY(0);
79
+ transition: opacity 200ms var(--ease-out), transform 200ms var(--ease-out);
80
+ }
81
+ ```
82
+
83
+ ### `fade`
84
+
85
+ Pure opacity. Used when motion would compete with surrounding context (e.g., dense data tables).
86
+
87
+ ### `fade-in-blur`
88
+
89
+ Adds `filter: blur(4px) β†’ blur(0)`. Premium / brand feel; expensive on mobile (avoid on long lists).
90
+
91
+ ### `scale-in`
92
+
93
+ `transform: scale(0.95) β†’ scale(1)` + opacity. Used for hero illustrations, feature cards.
94
+
95
+ ## States
96
+
97
+ | State | data-state | Visual |
98
+ | --- | --- | --- |
99
+ | Hidden (not yet intersected) | `hidden` | Pre-animation transform applied; opacity 0 |
100
+ | Revealing (intersected; transition in flight) | `revealing` | Animating to visible |
101
+ | Visible | `visible` | Final state; transitions removed |
102
+ | Reduced motion / disabled | `visible` | Instant final state, no transition |
103
+
104
+ ## Tokens consumed
105
+
106
+ ```
107
+ --motion-medium (200ms default)
108
+ --ease-out
109
+ --space-md (16px translate distance for fade-up)
110
+ ```
111
+
112
+ ## Stagger behavior
113
+
114
+ When `staggerChildren` is set, ScrollReveal applies a CSS variable `--reveal-delay` to each direct child based on its index:
115
+
116
+ ```tsx
117
+ <ScrollReveal staggerChildren={60}>
118
+ {/* index 0: delay 0ms */}
119
+ {/* index 1: delay 60ms */}
120
+ {/* index 2: delay 120ms */}
121
+ </ScrollReveal>
122
+ ```
123
+
124
+ Cap stagger at 5 children. Beyond that:
125
+ - Total delay > 300ms feels glacial.
126
+ - Use a single reveal for the whole group, or paginate the reveal.
127
+
128
+ ## Reduced motion
129
+
130
+ ```css
131
+ @media (prefers-reduced-motion: reduce) {
132
+ [data-reveal] {
133
+ opacity: 1 !important;
134
+ transform: none !important;
135
+ transition: none !important;
136
+ }
137
+ }
138
+ ```
139
+
140
+ The element is **always visible** in reduced-motion mode. Don't hide it β€” that breaks layout for users who never see the animation trigger.
141
+
142
+ ## Implementation
143
+
144
+ ```tsx
145
+ import { useEffect, useRef, useState, Children, cloneElement } from "react";
146
+
147
+ function ScrollReveal({
148
+ children,
149
+ effect = "fade-up",
150
+ threshold = 0.2,
151
+ rootMargin = "0px 0px -10% 0px",
152
+ once = true,
153
+ delay = 0,
154
+ duration = 200,
155
+ staggerChildren = 0,
156
+ as: Tag = "div",
157
+ onReveal,
158
+ }: Props) {
159
+ const ref = useRef<HTMLDivElement>(null);
160
+ const [revealed, setRevealed] = useState(false);
161
+ const reduced = usePrefersReducedMotion();
162
+
163
+ useEffect(() => {
164
+ if (reduced || !ref.current) {
165
+ setRevealed(true);
166
+ return;
167
+ }
168
+ const obs = new IntersectionObserver(
169
+ ([entry]) => {
170
+ if (entry.isIntersecting) {
171
+ setRevealed(true);
172
+ onReveal?.();
173
+ if (once) obs.disconnect();
174
+ } else if (!once) {
175
+ setRevealed(false);
176
+ }
177
+ },
178
+ { threshold, rootMargin }
179
+ );
180
+ obs.observe(ref.current);
181
+ return () => obs.disconnect();
182
+ }, [reduced, threshold, rootMargin, once, onReveal]);
183
+
184
+ const state = revealed ? "visible" : "hidden";
185
+
186
+ return (
187
+ <Tag
188
+ ref={ref}
189
+ data-reveal={effect}
190
+ data-state={state}
191
+ style={{
192
+ "--reveal-duration": `${duration}ms`,
193
+ "--reveal-delay": `${delay}ms`,
194
+ } as React.CSSProperties}
195
+ >
196
+ {staggerChildren > 0
197
+ ? Children.map(children, (child, i) =>
198
+ cloneElement(child as React.ReactElement, {
199
+ style: {
200
+ ...(child as any).props?.style,
201
+ "--reveal-delay": `${delay + i * staggerChildren}ms`,
202
+ transitionDelay: revealed ? `${delay + i * staggerChildren}ms` : "0ms",
203
+ },
204
+ })
205
+ )
206
+ : children}
207
+ </Tag>
208
+ );
209
+ }
210
+ ```
211
+
212
+ CSS:
213
+
214
+ ```css
215
+ [data-reveal] {
216
+ transition-property: opacity, transform, filter;
217
+ transition-duration: var(--reveal-duration, 200ms);
218
+ transition-timing-function: var(--ease-out);
219
+ transition-delay: var(--reveal-delay, 0ms);
220
+ }
221
+
222
+ [data-reveal="fade-up"][data-state="hidden"] {
223
+ opacity: 0;
224
+ transform: translateY(16px);
225
+ }
226
+ [data-reveal="fade"][data-state="hidden"] { opacity: 0; }
227
+ [data-reveal="fade-in-blur"][data-state="hidden"] {
228
+ opacity: 0;
229
+ filter: blur(4px);
230
+ }
231
+ [data-reveal="scale-in"][data-state="hidden"] {
232
+ opacity: 0;
233
+ transform: scale(0.95);
234
+ }
235
+
236
+ [data-reveal][data-state="visible"] {
237
+ opacity: 1;
238
+ transform: none;
239
+ filter: none;
240
+ }
241
+
242
+ @media (prefers-reduced-motion: reduce) {
243
+ [data-reveal] {
244
+ opacity: 1 !important;
245
+ transform: none !important;
246
+ filter: none !important;
247
+ transition: none !important;
248
+ }
249
+ }
250
+ ```
251
+
252
+ ## Where to use vs not
253
+
254
+ ### Good fits
255
+
256
+ - Marketing landing-page sections (hero next, features, testimonials, CTA).
257
+ - Long-scroll storytelling / case-study pages.
258
+ - Pricing tier reveal as user scrolls.
259
+ - Feature grid / icon row entrances.
260
+
261
+ ### Bad fits
262
+
263
+ - Data tables / dense product UIs (motion competes with reading).
264
+ - Above-the-fold content (no scroll happens; element flashes in).
265
+ - Lists with > 20 items (cumulative motion fatigue; use simple fade-in or none).
266
+ - Critical content (CTAs, errors, prices) β€” never gate on intersection.
267
+
268
+ ## Korean market note
269
+
270
+ Korean B2C landing pages often skip ScrollReveal entirely and lean denser, faster-loading static content. Toss-style minimal sites use it sparingly. Naver-style dense pages don't use it. Use restraint β€” over-revealed sections read as foreign / over-designed in Korean context.
271
+
272
+ ## Accessibility
273
+
274
+ - Element is in DOM and accessible to screen readers regardless of visual state. SR users see "hidden" only as a visual.
275
+ - Don't use `display: none` or `visibility: hidden` for hidden state β€” those remove from a11y tree.
276
+ - `prefers-reduced-motion`: enforced via the CSS media query. ScrollReveal becomes a no-op.
277
+ - For decorative reveals (purely visual), leave the wrapper without role.
278
+ - For meaningful content (e.g., a stat or testimonial): the wrapper should pass through ARIA from children.
279
+
280
+ ## Edge cases
281
+
282
+ - **Element taller than viewport**: with default `threshold: 0.2`, element triggers when 20% visible. For very tall sections, lower to `0.05`.
283
+ - **Element starts inside viewport on page load**: IntersectionObserver fires immediately on observe; element reveals on first frame. Fine.
284
+ - **User opens page already scrolled (deep link to mid-page)**: IO fires on already-visible elements; reveals trigger correctly.
285
+ - **Element wrapped in conditional rendering**: ensure ref is stable; use `key` on parent if remounting.
286
+ - **Multiple ScrollReveal nested**: each operates independently. Avoid > 2 levels of nesting (motion fatigue).
287
+ - **`once: false` + rapid scroll up/down**: element re-animates each time. Annoying. Default to `once: true` always.
288
+
289
+ ## Performance
290
+
291
+ - IntersectionObserver is cheap (passive). 100+ instances per page is fine.
292
+ - `transform` and `opacity` are GPU-composited. Don't extend to `width`/`height`.
293
+ - `filter: blur()` (fade-in-blur) is expensive on low-end mobile. Avoid on lists.
294
+ - Stagger across many children: prefer CSS-driven (set delay per child) over JS-driven setTimeout chains.
295
+
296
+ ## Don't
297
+
298
+ - Don't trigger ScrollReveal on every scroll direction. Default `once: true` for sanity.
299
+ - Don't reveal critical content on scroll β€” error messages, prices, CTAs must be present immediately.
300
+ - Don't use heavy effects (blur, large translate) on > 5 items in a row.
301
+ - Don't nest ScrollReveal inside ScrollReveal β€” coordination breaks.
302
+ - Don't skip reduced-motion handling β€” vestibular triggers are real for some users.
303
+ - Don't use ScrollReveal in product UI just because marketing uses it β€” different motion language.
304
+
305
+ ## References
306
+
307
+ Patterns drawn from:
308
+ - AOS (Animate On Scroll) library
309
+ - Framer Motion `whileInView` API
310
+ - View Timeline API (CSS scroll-driven animations, modern web)
311
+
312
+ For 2025+: explore CSS-only via `animation-timeline: view()` β€” ScrollReveal becomes purely CSS in Chrome / Edge. Keep JS implementation as fallback.
313
+
314
+ ## Cross-reference
315
+
316
+ - [`knowledge/motion/marketing-motion.md`](../knowledge/motion/marketing-motion.md) β€” when scroll-triggered reveals fit
317
+ - [`knowledge/motion/choreography-depth.md`](../knowledge/motion/choreography-depth.md) β€” stagger formulas
318
+ - [`knowledge/motion/principles.md`](../knowledge/motion/principles.md) β€” duration / easing tokens
319
+ - [`examples/component-feature-grid.md`](component-feature-grid.md) β€” common ScrollReveal wrapper
320
+ - [`examples/component-page-transition.md`](component-page-transition.md) β€” route-level transitions (different concern)
@@ -0,0 +1,178 @@
1
+ # `Segmented` (Toggle button group) β€” spec
2
+
3
+ > Citing Ant Design `Segmented`, MUI `ToggleButtonGroup`, shadcn-ui `toggle-group`
4
+
5
+ ## Purpose
6
+
7
+ A row of mutually exclusive options shown as connected buttons. Pick one. Used for: view mode (List / Grid), time range (였늘 / 7일 / 30일), filter sort, density toggle (Compact / Standard / Comfortable).
8
+
9
+ ## When Segmented vs alternatives
10
+
11
+ | Pattern | Use |
12
+ | --- | --- |
13
+ | **Segmented** | 2–5 short options, mutually exclusive, frequently switched |
14
+ | **Tabs** | 3–6 sections of content (more weight, often span the page) |
15
+ | **Select** | 6+ options, less-frequent switching |
16
+ | **Radio group** | Form input β€” submit later |
17
+ | **Switch** | Binary on/off, immediate effect |
18
+
19
+ Segmented is the iOS-native pattern (also called "segmented control"). Compact, immediate, ideal for dashboard-style filters.
20
+
21
+ ## Anatomy
22
+
23
+ ```
24
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
25
+ β”‚ β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β” β”‚
26
+ β”‚ β”‚μ˜€λŠ˜ β”‚ β”‚ μ£Ό β”‚ β”‚ μ›” β”‚ β”‚ ← all three inside a container, active filled
27
+ β”‚ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”˜ β”‚
28
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
29
+
30
+ With icons:
31
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
32
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”‚
33
+ β”‚ β”‚ ☰ Listβ”‚ β”‚ ⊞ Gridβ”‚ β”‚ ☰ Cardβ”‚ β”‚
34
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β”‚
35
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
36
+ ```
37
+
38
+ ## API
39
+
40
+ ```tsx
41
+ <Segmented
42
+ value={view}
43
+ onValueChange={setView}
44
+ options={[
45
+ { value: "today", label: "였늘" },
46
+ { value: "week", label: "이번 주" },
47
+ { value: "month", label: "이번 달" },
48
+ ]}
49
+ size="md"
50
+ />
51
+
52
+ <Segmented
53
+ value={layout}
54
+ onValueChange={setLayout}
55
+ options={[
56
+ { value: "list", label: "List", icon: <ListIcon /> },
57
+ { value: "grid", label: "Grid", icon: <GridIcon /> },
58
+ ]}
59
+ />
60
+ ```
61
+
62
+ | Prop | Type | Default | Description |
63
+ | --- | --- | --- | --- |
64
+ | `value` | `string \| number` | β€” | Active option |
65
+ | `onValueChange` | `(value) => void` | β€” | |
66
+ | `options` | `Option[]` or `string[]` | β€” | List of choices |
67
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
68
+ | `disabled` | `boolean` | `false` | Disables all |
69
+ | `block` | `boolean` | `false` | Stretches to full width (each option equal-flex) |
70
+
71
+ ```ts
72
+ type Option = {
73
+ value: string | number;
74
+ label: ReactNode;
75
+ icon?: ReactNode;
76
+ disabled?: boolean;
77
+ };
78
+ ```
79
+
80
+ ## Sizes
81
+
82
+ | Size | Height | Font | Padding-x |
83
+ | --- | --- | --- | --- |
84
+ | `sm` | 28px | 12px | 8px |
85
+ | `md` (default) | 32px | 14px | 12px |
86
+ | `lg` | 40px | 16px | 16px |
87
+
88
+ ## States
89
+
90
+ | State | Visual |
91
+ | --- | --- |
92
+ | Default (inactive option) | Transparent bg, neutral text |
93
+ | Active option | Filled bg `--color-bg-default` (lighter than container), darker text |
94
+ | Hover (inactive) | Slight bg shift |
95
+ | Focus-visible | 2px ring on the active or focused option |
96
+ | Disabled | All options muted |
97
+
98
+ The container background is slightly darker than the page (`--color-bg-subtle`); the active option is lighter (`--color-bg-default`) β€” creating an "indented vs raised" visual distinction.
99
+
100
+ ## Tokens consumed
101
+
102
+ ```
103
+ --color-bg-subtle (container bg)
104
+ --color-bg-default (active option bg)
105
+ --color-text-primary (active option text)
106
+ --color-text-secondary (inactive option)
107
+ --color-focus-ring
108
+ --space-xs, --space-sm
109
+ --radius-md (container)
110
+ --radius-sm (option pills inside)
111
+ --motion-fast, --easing-out (active indicator slide)
112
+ ```
113
+
114
+ ## Active indicator transition
115
+
116
+ When the user clicks a different option, the white "indicator" can slide to the new position (~150ms ease-out). This is iOS-native polish but requires layout-stable rendering.
117
+
118
+ ```css
119
+ .segmented-item {
120
+ transition: background-color 150ms ease-out;
121
+ }
122
+ ```
123
+
124
+ For more sophisticated animation: animate a positioned "indicator" element rather than each item's bg.
125
+
126
+ ## Accessibility
127
+
128
+ - Container: `role="radiogroup"` (since options are mutually exclusive).
129
+ - Each option: `role="radio"`, `aria-checked={value === option.value}`.
130
+ - Container `aria-label` describes the group ("View mode" / "Time range").
131
+
132
+ ### Keyboard
133
+
134
+ | Key | Behavior |
135
+ | --- | --- |
136
+ | `Tab` | Reach the active option (single tab stop) |
137
+ | `←` / `β†’` (or `↑` / `↓`) | Move focus + select next/previous |
138
+ | `Home` / `End` | First / last |
139
+ | `Space` | Activate focused option (if not auto-activate) |
140
+
141
+ By default: auto-activate (focus = select). For expensive operations: manual mode requires Space/Enter.
142
+
143
+ ## Mobile patterns
144
+
145
+ Works fine on touch β€” each option is large enough. For very many options (5+), wraps to multiple rows or scrolls horizontally.
146
+
147
+ For Korean apps: short labels (1–4 syllables) work best.
148
+
149
+ ## Common usage
150
+
151
+ | Where | Options |
152
+ | --- | --- |
153
+ | Time filter on dashboard | "였늘 / 7일 / 30일 / μ‚¬μš©μž μ§€μ •" |
154
+ | View mode toggle | "List / Grid / Card" |
155
+ | Density | "Compact / Standard / Comfortable" |
156
+ | Theme | "Light / Dark / System" |
157
+ | Currency display (KR fintech) | "β‚© / 원 / Korean number" |
158
+ | Stock convention | "Korean (red=up) / Western" |
159
+
160
+ ## Don't
161
+
162
+ - Don't use Segmented for 6+ options. Use Select.
163
+ - Don't use for binary on/off. Use Switch.
164
+ - Don't use as in-page navigation between separate views. Use Tabs.
165
+ - Don't use long labels. Stay under ~10 chars per option.
166
+ - Don't disable the currently-active option. Disable the inactive ones if needed.
167
+
168
+ ## References
169
+
170
+ - Ant Design: [`refs/ant-design/components/segmented/`](../refs/ant-design/components/segmented/) β€” `Segmented` with options, sizes, block mode, custom rendering. Modern Ant addition.
171
+ - MUI: [`refs/mui/packages/mui-material/src/ToggleButtonGroup/`](../refs/mui/packages/mui-material/src/ToggleButtonGroup/) β€” supports both single and multiple. Set `exclusive={true}` for segmented behavior.
172
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/) β€” `toggle-group.tsx`. Radix Toggle Group primitive.
173
+
174
+ ## Cross-reference
175
+
176
+ - [`examples/component-tabs.md`](component-tabs.md) β€” when sections are heavier
177
+ - [`examples/component-form-controls.md`](component-form-controls.md) β€” radio group alternative for forms
178
+ - [`examples/component-button.md`](component-button.md) β€” single-button alternative