@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,202 @@
1
+ # `Table` — spec
2
+
3
+ > Citing Ant Design `Table`, MUI `DataGrid` / `Table`, shadcn-ui `data-table` (TanStack Table)
4
+
5
+ ## Purpose
6
+
7
+ Displays multi-column data for comparison and analysis. Optimized for desktop. On mobile, **most tables should become stacked card lists** — see edge cases.
8
+
9
+ When NOT to use: single-attribute lists (use `List`); items where each row is a self-contained card (use card list).
10
+
11
+ ## Anatomy
12
+
13
+ ```
14
+ [Toolbar?] search · filter · density · column-toggle · export
15
+ ┌──────────────────────────────────────────────────────────────────────┐
16
+ │ ☐ Header 1 ▾ Header 2 Header 3 ▾ Actions ▾ │ ← sticky
17
+ ├──────────────────────────────────────────────────────────────────────┤
18
+ │ ☐ cell 1.1 cell 1.2 cell 1.3 [...] │
19
+ │ ☐ cell 2.1 cell 2.2 cell 2.3 [...] │
20
+ │ ─────────────────────────────────────────────────────────────────── │
21
+ │ ... │
22
+ └──────────────────────────────────────────────────────────────────────┘
23
+ [Footer] selected count · pagination · summary
24
+ ```
25
+
26
+ ## API (TanStack Table-flavored, framework-agnostic)
27
+
28
+ ```tsx
29
+ <Table
30
+ columns={[
31
+ { id: "name", header: "이름", accessor: (row) => row.name, sortable: true, width: 180 },
32
+ { id: "email", header: "이메일", accessor: (row) => row.email, width: 220 },
33
+ { id: "amount", header: "금액", accessor: (row) => row.amount, sortable: true, align: "right", cell: (v) => formatKRW(v) },
34
+ { id: "actions", header: "", cell: (_, row) => <ActionsMenu row={row} />, width: 64 },
35
+ ]}
36
+ data={data}
37
+ selectable
38
+ onSelectionChange={setSelection}
39
+ sortBy={sort}
40
+ onSortChange={setSort}
41
+ pagination={{ pageSize: 20, total, onChange: setPage }}
42
+ density="md"
43
+ emptyState={<EmptyState />}
44
+ loading={isPending}
45
+ />
46
+ ```
47
+
48
+ | Prop | Type | Default | Description |
49
+ | --- | --- | --- | --- |
50
+ | `columns` | `Column[]` | — | Column definitions |
51
+ | `data` | `T[]` | `[]` | Row data |
52
+ | `selectable` | `boolean` | `false` | Adds checkbox column |
53
+ | `sortable` | per-column | — | Click header to toggle asc/desc/none |
54
+ | `pagination` | `{ pageSize, total, onChange }` | — | Server or client pagination |
55
+ | `density` | `"compact" \| "md" \| "comfortable"` | `"md"` | Row height |
56
+ | `stickyHeader` | `boolean` | `true` | Header pins on scroll |
57
+ | `loading` | `boolean` | `false` | Skeleton rows |
58
+ | `emptyState` | `ReactNode` | default | Replaces tbody when `data.length === 0` |
59
+ | `onRowClick` | `(row) => void` | — | Drill into detail. Doesn't conflict with checkbox. |
60
+ | `getRowId` | `(row) => string` | `row.id` | For React keys + selection |
61
+
62
+ ### Column definition
63
+
64
+ | Prop | Type | Default | Description |
65
+ | --- | --- | --- | --- |
66
+ | `id` | `string` | — | Stable key for sort/visibility |
67
+ | `header` | `ReactNode` | — | Header content |
68
+ | `accessor` | `(row) => any` | `row[id]` | How to extract the value |
69
+ | `cell` | `(value, row) => ReactNode` | `value as string` | How to render |
70
+ | `sortable` | `boolean` | `false` | |
71
+ | `align` | `"left" \| "right" \| "center"` | `"left"` | Right for numbers/amounts |
72
+ | `width` | `number \| string` | auto | Fixed or `min-content`/`1fr` |
73
+ | `sticky` | `"left" \| "right"` | — | Pin column for horizontal scroll (e.g., name on left, actions on right) |
74
+
75
+ ## Density
76
+
77
+ | Density | Row height | Use |
78
+ | --- | --- | --- |
79
+ | `compact` | 32px | Power user, > 100 rows visible |
80
+ | `md` (default) | 40px | Standard product table |
81
+ | `comfortable` | 48px | Marketing pages, fewer rows |
82
+
83
+ User-facing density toggle in toolbar is common. Persist preference to localStorage.
84
+
85
+ ## Sort
86
+
87
+ - Header click cycles: `asc` → `desc` → `none`.
88
+ - Visual: arrow indicator, `▲` asc / `▼` desc / muted both when none.
89
+ - One-column at a time by default. Multi-sort via `Shift+click` (desktop power users). Document in tooltip.
90
+ - Server-side sort: re-fetch on change. Client-side: just re-render.
91
+
92
+ ## Selection
93
+
94
+ - Checkbox column on far left.
95
+ - "Select all" checkbox in header. Three states: unchecked / partial / checked.
96
+ - "Select all 142" affordance when paginated: "All 20 on this page selected. **[Select all 142]**" — clarifies vs. "select all visible".
97
+ - Bulk actions appear in a contextual bar that **replaces the toolbar** when selection > 0:
98
+
99
+ ```
100
+ ┌─────────────────────────────────────────────────────┐
101
+ │ 3 selected [Archive] [Delete] [Export] · ✕ │
102
+ └─────────────────────────────────────────────────────┘
103
+ ```
104
+
105
+ ## Pagination
106
+
107
+ See [examples/component-pagination.md](component-pagination.md) for the standalone Pagination spec.
108
+
109
+ For tables: footer-mounted, right-aligned. Show "1–20 of 142" + page controls + page size selector.
110
+
111
+ ## Empty / loading / error
112
+
113
+ - **Loading first paint**: render header + 5 skeleton rows.
114
+ - **Loading after data exists** (refetch): show subtle progress in header, keep stale data visible.
115
+ - **Empty**: full-row span: illustration + "데이터가 없어요" + optional CTA.
116
+ - **Error**: full-row span: error icon + message + retry. Cite [knowledge/patterns/list-and-feed.md](../knowledge/patterns/list-and-feed.md).
117
+
118
+ ## Accessibility
119
+
120
+ - Use semantic `<table>`, `<thead>`, `<tbody>`, `<tr>`, `<th>`, `<td>`. Don't fake with `<div>` unless absolutely necessary (and then use `role="table"` etc.).
121
+ - `<th scope="col">` on column headers, `<th scope="row">` on row labels.
122
+ - For sortable columns: `aria-sort="ascending" | "descending" | "none"` on `<th>`.
123
+ - Keyboard: arrow keys move focus across cells; Enter/Space activates header (sort) or cell (if interactive).
124
+ - Screen reader: announce row/column count on table render. Announce sort change.
125
+ - Selection: each checkbox has a label like "Select row for 김민지".
126
+ - Bulk action bar: `role="region" aria-label="Bulk actions"`.
127
+
128
+ ## Mobile — break to cards
129
+
130
+ A 5-column table is unusable on a 375px screen. Two approaches:
131
+
132
+ ### 1. Card list
133
+
134
+ Below `md` breakpoint, render as a card per row:
135
+
136
+ ```
137
+ ┌────────────────────────────────────┐
138
+ │ 김민지 │
139
+ │ minji@example.com │
140
+ │ │
141
+ │ 결제: ₩45,000 │
142
+ │ 상태: 완료 │
143
+ │ │
144
+ │ [상세 보기] [더보기 ⋮] │
145
+ └────────────────────────────────────┘
146
+ ```
147
+
148
+ Each card shows the same data as a row but vertically. The "primary" column (name) becomes the heading.
149
+
150
+ ### 2. Horizontal scroll
151
+
152
+ Keep the table but enable horizontal scroll. **Pin** the first column (name) so it stays visible.
153
+
154
+ Pick #1 for product UIs, #2 for power-user data tools.
155
+
156
+ ## Tokens consumed
157
+
158
+ ```
159
+ --color-bg-default
160
+ --color-bg-elevated (sticky header background)
161
+ --color-bg-subtle (zebra rows or hover)
162
+ --color-border-default
163
+ --color-text-primary
164
+ --color-text-secondary
165
+ --color-primary-default (selected row indicator)
166
+ --space-md, --space-base
167
+ --font-size-sm, --font-size-base
168
+ ```
169
+
170
+ ## Edge cases
171
+
172
+ - **Long text in cells**: truncate to 1 line with `…`, `title` attr for full. Optionally allow row expansion to wrap.
173
+ - **Numeric columns**: right-align, tabular numerals. See [knowledge/patterns/money-and-amount.md](../knowledge/patterns/money-and-amount.md).
174
+ - **Sticky columns + horizontal scroll**: pin the leftmost (name/identifier) and the rightmost (actions). Middle columns scroll.
175
+ - **Frozen header on tall tables**: use CSS `position: sticky` on `<thead>`. Not `<table>` height tricks.
176
+ - **Click row to drill in vs. interactive controls in cells**: `onClick` on the row, but `e.stopPropagation()` on inner buttons (checkbox, menu). Or use the block-link pattern from [examples/component-card.md](component-card.md).
177
+ - **CSV export**: include the export button in the toolbar; prefer client-side generation for ≤ 10K rows, server-generated download for larger.
178
+
179
+ ## Don't
180
+
181
+ - Don't use a Table for a 1-column list. Use a List.
182
+ - Don't auto-update sort/filter on every keystroke in toolbar inputs — debounce 300ms.
183
+ - Don't paginate to "1, 2, 3, ..., 142, last" as the only nav. Provide page-size + jump-to-page.
184
+ - Don't allow horizontal scroll on mobile by default — user expects vertical-only.
185
+ - Don't put primary CTAs in cells unless the row is the action target (e.g., "Approve" per row in an admin queue).
186
+
187
+ ## References
188
+
189
+ - Ant Design: [`refs/ant-design/components/table/`](../refs/ant-design/components/table/) — most exhaustive: tree data, expandable rows, virtual scroll, drag-drop column reorder, fixed headers/columns. Heavy but production-grade.
190
+ - MUI: `<Table>` (basic) and `<DataGrid>` (heavy, paid for some features). DataGrid has best DX for filtering/sorting but is a large dep.
191
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/table.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/table.tsx) — primitives only (`<Table>`, `<TableHeader>`, etc.). Pair with TanStack Table for behavior. **Recommended modern pattern.**
192
+
193
+ API choices made:
194
+ - **TanStack Table as the engine** — headless, framework-agnostic, free, mature. Don't reinvent.
195
+ - **Sort/filter state controlled** by default — server-side pagination is the common case.
196
+ - **Mobile fallback as a designed escape hatch** (card list) rather than horizontal scroll.
197
+
198
+ ## Cross-reference
199
+
200
+ - [knowledge/patterns/list-and-feed.md](../knowledge/patterns/list-and-feed.md)
201
+ - [knowledge/patterns/money-and-amount.md](../knowledge/patterns/money-and-amount.md) — amount columns
202
+ - [examples/component-pagination.md](component-pagination.md) — table footer pagination
@@ -0,0 +1,184 @@
1
+ # `Tabs` — spec
2
+
3
+ > Citing Ant Design `Tabs`, MUI `Tabs`, shadcn-ui `tabs`. Includes mobile bottom-tab variant.
4
+
5
+ ## Purpose
6
+
7
+ Tabs let users switch between mutually exclusive views without navigating away. Different from navigation — tabs stay on the same screen.
8
+
9
+ Three variants in one spec, same a11y contract:
10
+
11
+ | Variant | Use |
12
+ | --- | --- |
13
+ | `tabs` (default) | In-page section switcher (Profile / Activity / Settings) |
14
+ | `segmented` (pill group) | Compact filter switch (오늘 / 이번 주 / 이번 달) |
15
+ | `bottom-tab-bar` (mobile) | App-level top destinations — see [knowledge/patterns/mobile-navigation.md](../knowledge/patterns/mobile-navigation.md) |
16
+
17
+ ## Anatomy — `tabs` and `segmented`
18
+
19
+ ```
20
+ ┌─────────────────────────────────────────────────────┐
21
+ │ Profile │ Activity │ Settings │ ← TabList
22
+ ├──────────┴────────────────────────────────────────── │ ← active indicator (underline or pill)
23
+ │ │
24
+ │ TabPanel content for active tab │
25
+ │ │
26
+ └─────────────────────────────────────────────────────┘
27
+ ```
28
+
29
+ ```tsx
30
+ <Tabs defaultValue="profile">
31
+ <Tabs.List>
32
+ <Tabs.Trigger value="profile">Profile</Tabs.Trigger>
33
+ <Tabs.Trigger value="activity">Activity</Tabs.Trigger>
34
+ <Tabs.Trigger value="settings">Settings</Tabs.Trigger>
35
+ </Tabs.List>
36
+ <Tabs.Content value="profile">...</Tabs.Content>
37
+ <Tabs.Content value="activity">...</Tabs.Content>
38
+ <Tabs.Content value="settings">...</Tabs.Content>
39
+ </Tabs>
40
+ ```
41
+
42
+ ## API
43
+
44
+ | Prop (root) | Type | Default | Description |
45
+ | --- | --- | --- | --- |
46
+ | `value` / `defaultValue` | `string` | — | Active tab. Controlled / uncontrolled. |
47
+ | `onValueChange` | `(value: string) => void` | — | Fires on change |
48
+ | `variant` | `"underline" \| "segmented" \| "card" \| "bottom-bar"` | `"underline"` | Visual treatment |
49
+ | `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | Side-tab pattern with vertical |
50
+ | `activationMode` | `"automatic" \| "manual"` | `"automatic"` | Auto-activate on focus (default) or wait for Enter/Space |
51
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
52
+ | `fullWidth` | `boolean` | `false` | TabList stretches; each trigger gets equal width (segmented only) |
53
+
54
+ | Prop (trigger) | Type | Description |
55
+ | --- | --- | --- |
56
+ | `value` | `string` | Required. Matches `Tabs.Content` value. |
57
+ | `disabled` | `boolean` | |
58
+ | `iconStart` | `ReactNode` | Icon before label |
59
+ | `badge` | `ReactNode` | Count or status indicator |
60
+
61
+ ## Variants
62
+
63
+ ### `underline` (default — Ant / Material style)
64
+
65
+ Bottom border under active tab. The tab label sits above a shared baseline. Most common for in-page tab switching.
66
+
67
+ ### `segmented` (iOS-native pill)
68
+
69
+ ```
70
+ ┌────────────────────────────────────────┐
71
+ │ ┌────────┐ ┌────────┐ ┌────────┐ │
72
+ │ │ Today │ │ Week │ │ Month │ │
73
+ │ └────────┘ └────────┘ └────────┘ │
74
+ └────────────────────────────────────────┘
75
+ ```
76
+
77
+ - All tabs in a single rounded container.
78
+ - Active tab has filled background.
79
+ - Use for: time-period filters, view-mode toggles (List / Grid), 3–5 short labels max.
80
+ - iOS-native segmented control is the visual reference.
81
+
82
+ ### `card` (top-edge tabs)
83
+
84
+ Each tab is a card with a top border. Active card "merges" into the panel below. Less common; used in tabbed forms or settings panels.
85
+
86
+ ### `bottom-bar` (mobile only)
87
+
88
+ See [knowledge/patterns/mobile-navigation.md](../knowledge/patterns/mobile-navigation.md). Same a11y contract; visual is fixed at bottom of viewport.
89
+
90
+ ## States
91
+
92
+ | State | Visual |
93
+ | --- | --- |
94
+ | Default (inactive) | Muted text, no border/bg |
95
+ | Hover | Slight bg shift |
96
+ | Active | `--color-primary-default` text + indicator (underline or pill bg) |
97
+ | Focus-visible | 2px ring around the trigger |
98
+ | Disabled | 50% opacity, no events |
99
+
100
+ ## Tokens consumed
101
+
102
+ ```
103
+ --color-text-secondary (inactive)
104
+ --color-text-primary (hover)
105
+ --color-primary-default (active)
106
+ --color-bg-subtle (hover bg, segmented inactive bg)
107
+ --color-bg-default (segmented active bg)
108
+ --space-md, --space-base
109
+ --radius-md (segmented pills)
110
+ --motion-fast, --easing-out (underline indicator slide)
111
+ ```
112
+
113
+ ## Sizes
114
+
115
+ | Size | Trigger height | Font | Padding-x |
116
+ | --- | --- | --- | --- |
117
+ | `sm` | 32px | 13px | 12px |
118
+ | `md` | 40px | 14px | 16px |
119
+ | `lg` | 48px | 16px | 20px |
120
+
121
+ ## Accessibility — WAI-ARIA Tabs Pattern
122
+
123
+ Critical contract — get this exactly right:
124
+
125
+ - `Tabs.List` has `role="tablist"`.
126
+ - Each `Tabs.Trigger` has `role="tab"`, `aria-selected="true|false"`, `aria-controls="<panel-id>"`.
127
+ - Each `Tabs.Content` has `role="tabpanel"`, `aria-labelledby="<trigger-id>"`, `tabIndex={0}`.
128
+
129
+ ### Keyboard
130
+
131
+ | Key | Behavior |
132
+ | --- | --- |
133
+ | `Tab` | Moves into the tab list. Inside the list, focus goes to the active trigger. Tabs again to leave the list (NOT cycle through tabs). |
134
+ | `←` / `→` | Move focus between triggers (horizontal) |
135
+ | `↑` / `↓` | Move focus between triggers (vertical) |
136
+ | `Home` / `End` | First / last trigger |
137
+ | `Enter` / `Space` | Activate the focused trigger (manual mode only) |
138
+
139
+ ### `activationMode`
140
+
141
+ - `"automatic"` (default): focus a trigger → tab activates. Faster scanning. Good for quick browse.
142
+ - `"manual"`: focus moves but tab doesn't activate until Enter/Space. Use when activating is expensive (loads heavy content, makes API call).
143
+
144
+ ### Screen reader
145
+
146
+ - Active tab announces "selected".
147
+ - TabList reads as "tab list" with N tabs.
148
+ - TabPanel content is announced when activated (via `aria-controls` link).
149
+ - Don't add custom `aria-live` to tab content — switching tabs is user-driven.
150
+
151
+ ## Edge cases
152
+
153
+ - **Many tabs (> 5–6)**: scroll horizontally with overflow. Add chevrons (`<` `>`) to scroll. **Don't** use a "More" tab as a dropdown — accessibility breaks.
154
+ - **Tab content height varies**: panel height adjusts on switch; consider `min-height` on the container to prevent layout shift between tab activations.
155
+ - **Lazy loading panels**: render only the active panel for performance, but **mount** all on first activation if you need form state preserved across switches. Trade-off: memory vs. data loss on switch.
156
+ - **URL sync**: tab state often syncs to URL hash or query (`?tab=settings`). Use shadcn/Radix `Tabs` with `value` controlled from `useSearchParams`. Browser back/forward then works.
157
+ - **RTL**: arrow keys reverse, indicator direction reverses. Use logical CSS.
158
+ - **Korean labels**: shorter is better for tabs (1–2 syllables). "프로필" (profile), "활동" (activity), "설정" (settings).
159
+
160
+ ## Don't
161
+
162
+ - Don't put more than 5–6 tabs in a row without scroll. Consider whether a sidebar or different navigation fits better.
163
+ - Don't use tabs as a substitute for navigation. Tabs stay on the same screen; navigation changes URL/screen.
164
+ - Don't add an "All" tab if it shows a union — show "All" by default and let users filter.
165
+ - Don't load all tab content eagerly if any tab is expensive.
166
+ - Don't use bottom-tab-bar variant for in-page switching. It's reserved for app-level navigation.
167
+ - Don't combine tabs + breadcrumbs at the same level — pick one.
168
+
169
+ ## References
170
+
171
+ - Ant Design: [`refs/ant-design/components/tabs/`](../refs/ant-design/components/tabs/) — `Tabs`, `Tabs.TabPane`, supports `card`/`line`/`editable-card` variants. Most variants out of the box.
172
+ - MUI: [`refs/mui/packages/mui-material/src/Tabs/`](../refs/mui/packages/mui-material/src/Tabs/) — `Tabs` + `Tab` + `TabPanel` (separately). MUI has good `scrollable` props.
173
+ - shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/tabs.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/tabs.tsx) — Radix Tabs primitive. Cleanest a11y. **Default for new projects.**
174
+
175
+ API choices made:
176
+ - **Composition with `Tabs.Trigger` / `Tabs.Content`** matching value strings — Radix pattern, lowest surface area.
177
+ - **`activationMode` exposed** rather than hard-coded — different UIs benefit from different defaults.
178
+ - **`bottom-bar` listed as a variant** rather than a separate component — same WAI-ARIA pattern, just a positioning detail.
179
+
180
+ ## Cross-reference
181
+
182
+ - [knowledge/patterns/mobile-navigation.md](../knowledge/patterns/mobile-navigation.md) — bottom-tab-bar specifics
183
+ - [WAI-ARIA Tabs Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/)
184
+ - [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md)