@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,148 @@
1
+ # `Backdrop` — spec
2
+
3
+ > Synthesized from MUI `Backdrop`. A semi-opaque overlay that dims the page behind a foreground element. Used by `Modal`, `Drawer`, `Sheet`, `AlertDialog` internally — and standalone for full-page loading screens.
4
+
5
+ ## When to use
6
+
7
+ - **Standalone**: full-page loading state ("Saving... please wait").
8
+ - **Inside other components**: as the scrim behind Modal / Drawer / Sheet (usually internal to those components).
9
+ - **Focus / attention**: dim everything else to point at one task.
10
+
11
+ When NOT to use:
12
+ - Modal-like UI — use `Modal` (it includes Backdrop).
13
+ - Loading inside a card — use Skeleton or Spinner inline.
14
+
15
+ ## Anatomy
16
+
17
+ ```
18
+ ┌─────────────────────────────────────┐
19
+ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
20
+ │ ░░░░ (dimmed page content) ░░░░░░░░░ │
21
+ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
22
+ │ ░░░░░░░░░░░ [spinner] ░░░░░░░░░░░░░░ │
23
+ │ ░░░░░░░░░ Loading... ░░░░░░░░░░░░░░ │
24
+ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
25
+ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
26
+ └─────────────────────────────────────┘
27
+ ```
28
+
29
+ ## API
30
+
31
+ ```tsx
32
+ <Backdrop open={loading}>
33
+ <CircularProgress />
34
+ </Backdrop>
35
+
36
+ <Backdrop open={open} onClick={() => setOpen(false)}>
37
+ <p>Click anywhere to dismiss</p>
38
+ </Backdrop>
39
+ ```
40
+
41
+ | Prop | Type | Default | Description |
42
+ | --- | --- | --- | --- |
43
+ | `open` | `boolean` | controlled | Visibility |
44
+ | `onClick` | `() => void` | — | Click handler (often dismisses) |
45
+ | `transitionDuration` | `number` | `300` | Fade ms |
46
+ | `invisible` | `boolean` | `false` | Backdrop is transparent (still blocks clicks) |
47
+ | `children` | `ReactNode` | — | Foreground content (centered by default) |
48
+
49
+ ## States
50
+
51
+ | State | Visual |
52
+ | --- | --- |
53
+ | Closed | `display: none` |
54
+ | Opening | Fade in from 0 to opacity (300ms) |
55
+ | Open | Fully visible |
56
+ | Closing | Reverse |
57
+
58
+ ## Tokens consumed
59
+
60
+ ```
61
+ --backdrop-bg (rgba(0,0,0,0.5) typical)
62
+ --backdrop-bg-light (lighter for dark themes)
63
+ --motion-medium (fade duration)
64
+ --ease-out
65
+ --z-backdrop (above content, below modals/dialogs)
66
+ ```
67
+
68
+ ## CSS
69
+
70
+ ```css
71
+ .backdrop {
72
+ position: fixed;
73
+ inset: 0;
74
+ background: var(--backdrop-bg);
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ z-index: var(--z-backdrop);
79
+ opacity: 0;
80
+ transition: opacity var(--motion-medium) var(--ease-out);
81
+ pointer-events: none;
82
+ }
83
+
84
+ .backdrop[data-state="open"] {
85
+ opacity: 1;
86
+ pointer-events: auto;
87
+ }
88
+
89
+ @media (prefers-reduced-motion: reduce) {
90
+ .backdrop { transition: opacity 0ms; }
91
+ }
92
+ ```
93
+
94
+ ## Accessibility
95
+
96
+ - Backdrop with content: usually wrap content in `<div role="status" aria-live="polite">` (for loading) or `<div role="alertdialog">` (for confirmations).
97
+ - Standalone Backdrop is a focus trap when modal — keyboard can't escape until Backdrop closes.
98
+ - Esc to close (when dismissible).
99
+ - Click-outside to close (configurable).
100
+ - `aria-busy="true"` on the entire affected page region during loading.
101
+
102
+ ## Code example — full-page loading
103
+
104
+ ```tsx
105
+ function App() {
106
+ const { isAuthenticating } = useAuth();
107
+
108
+ return (
109
+ <>
110
+ <Backdrop open={isAuthenticating}>
111
+ <Stack align="center" gap={4}>
112
+ <Spinner size="lg" color="white" />
113
+ <Text color="white">로그인 중...</Text>
114
+ </Stack>
115
+ </Backdrop>
116
+
117
+ <main>{/* main content */}</main>
118
+ </>
119
+ );
120
+ }
121
+ ```
122
+
123
+ ## Edge cases
124
+
125
+ - **Multiple Backdrops at once**: stack via z-index but visually messy. Avoid; use one at a time.
126
+ - **Backdrop doesn't cover virtual keyboard on mobile**: position: fixed handles most, but iOS Safari has quirks with input focus.
127
+ - **Backdrop above modals**: usually wrong — modals own their Backdrop. Don't double-stack.
128
+ - **Reduced motion**: skip fade; instant.
129
+ - **Print**: hide via `@media print`.
130
+
131
+ ## Don't
132
+
133
+ - Don't use Backdrop where Modal / Drawer / Sheet handles it for you.
134
+ - Don't make Backdrop too transparent — should clearly signal "background is inactive".
135
+ - Don't make Backdrop too opaque (>0.7) — feels suffocating.
136
+ - Don't disable Esc / click-outside without a clear dismiss button.
137
+ - Don't pile multiple Backdrops.
138
+
139
+ ## References
140
+
141
+ - MUI: [`Backdrop`](../refs/mui/packages/mui-material/src/Backdrop)
142
+ - Used internally by: Modal, Drawer, Sheet, AlertDialog
143
+
144
+ ## Cross-reference
145
+
146
+ - [`examples/component-modal.md`](component-modal.md) — uses Backdrop internally
147
+ - [`examples/component-spinner.md`](component-spinner.md) — common Backdrop child
148
+ - [`knowledge/motion/principles.md`](../knowledge/motion/principles.md) — fade timing
@@ -0,0 +1,181 @@
1
+ # `Badge` — spec
2
+
3
+ > Synthesized from Ant Design `Badge`, MUI `Badge`, shadcn-ui `badge`. A small status / count indicator anchored to another element OR used standalone as a label.
4
+
5
+ ## Two modes
6
+
7
+ | Mode | Use |
8
+ | --- | --- |
9
+ | **Standalone label** (shadcn-style) | Status pill rendered inline as text content ("New", "Beta", "Sale 30%") |
10
+ | **Indicator** (Ant + MUI style) | Small dot or count anchored to a parent — typically an avatar or icon (notification count, online status) |
11
+
12
+ These are conceptually different and often shipped as different components in larger systems. shadcn ships only the standalone form; Ant + MUI ship both. Pick one mental model per system.
13
+
14
+ ## Standalone Badge — anatomy
15
+
16
+ ```
17
+ [● New] [Beta] [Sale 30%] [PRO]
18
+ ```
19
+
20
+ A pill with optional icon + text, brand-colored.
21
+
22
+ ## Indicator Badge — anatomy
23
+
24
+ ```
25
+ ┌────────┐
26
+ │ Inbox │● 3 ← positioned top-right of the parent
27
+ └────────┘
28
+ ```
29
+
30
+ A wrapper around a child element, with a count or dot floating at a corner.
31
+
32
+ ## API — Standalone
33
+
34
+ ```tsx
35
+ <Badge variant="default">New</Badge>
36
+ <Badge variant="secondary">Beta</Badge>
37
+ <Badge variant="destructive">Failed</Badge>
38
+ <Badge variant="outline">Draft</Badge>
39
+ ```
40
+
41
+ | Prop | Type | Default | Description |
42
+ | --- | --- | --- | --- |
43
+ | `variant` | `"default" \| "secondary" \| "destructive" \| "outline" \| "success" \| "warning"` | `"default"` | Visual style |
44
+ | `size` | `"sm" \| "md"` | `"md"` | Dense vs default |
45
+ | `asChild` | `boolean` | `false` | Render as child element (Slot pattern) |
46
+ | `children` | `ReactNode` | — | Content (text, optional icon) |
47
+
48
+ ## API — Indicator
49
+
50
+ ```tsx
51
+ <IndicatorBadge count={3} max={99}>
52
+ <BellIcon />
53
+ </IndicatorBadge>
54
+
55
+ <IndicatorBadge variant="dot" status="online">
56
+ <Avatar src={url} />
57
+ </IndicatorBadge>
58
+ ```
59
+
60
+ | Prop | Type | Default | Description |
61
+ | --- | --- | --- | --- |
62
+ | `count` | `number \| undefined` | — | Number to display; `undefined` = no count |
63
+ | `max` | `number` | `99` | Cap; `count > max` displays as `max+` |
64
+ | `variant` | `"count" \| "dot"` | `"count"` | Number vs solid dot |
65
+ | `status` | `"online" \| "offline" \| "away" \| "busy" \| "default"` | `"default"` | Color preset |
66
+ | `placement` | `"top-right" \| "top-left" \| "bottom-right" \| "bottom-left"` | `"top-right"` | Anchor corner |
67
+ | `offset` | `[x, y]` | `[0, 0]` | Pixel offset from corner |
68
+ | `showZero` | `boolean` | `false` | Show count when `count === 0` |
69
+ | `children` | `ReactNode` | — | Element being decorated |
70
+
71
+ ## Variants
72
+
73
+ | Variant | Visual | Use |
74
+ | --- | --- | --- |
75
+ | `default` | Brand-color filled | Primary badges (New, Featured) |
76
+ | `secondary` | Muted bg | Neutral status (Beta, Draft) |
77
+ | `destructive` | Red filled | Error, blocked |
78
+ | `outline` | Bordered transparent | Subtle (Optional, Coming soon) |
79
+ | `success` | Green | Success markers |
80
+ | `warning` | Amber | Caution markers |
81
+
82
+ ## Status colors (Indicator)
83
+
84
+ ```
85
+ online → green
86
+ offline → gray
87
+ away → yellow
88
+ busy → red
89
+ default → brand
90
+ ```
91
+
92
+ ## States
93
+
94
+ | State | Visual |
95
+ | --- | --- |
96
+ | Default | Resting |
97
+ | Hover (if interactive) | Slight bg darken |
98
+ | Active / pressed | Deeper bg |
99
+ | Disabled | Reduced opacity, no events |
100
+
101
+ Most badges are non-interactive. If clickable: render as `<button>` or wrap in `<Link>`; styles add hover + focus ring.
102
+
103
+ ## Tokens consumed
104
+
105
+ ```
106
+ --color-bg-default (outline / secondary)
107
+ --color-bg-secondary (secondary fill)
108
+ --color-brand-default (default variant)
109
+ --color-on-brand (text on default)
110
+ --color-error-default (destructive)
111
+ --color-success-default (success)
112
+ --color-warning-default (warning)
113
+ --color-border-default (outline)
114
+ --radius-full (pill shape)
115
+ --space-xs, --space-sm
116
+ --font-size-xs (typically 11-12px)
117
+ --font-weight-medium (500)
118
+ --motion-fast (hover transition if interactive)
119
+ ```
120
+
121
+ ## Accessibility
122
+
123
+ - **Standalone**: `<span>` with brand styling; text reads as part of context. No special role.
124
+ - **Indicator**:
125
+ - **Dot variant**: visual only; meaning conveyed via parent (`aria-label="3 unread notifications"` on the parent button).
126
+ - **Count variant**: include the number in `aria-label` of the wrapper; or place a hidden `<span class="sr-only">{count} new</span>` adjacent.
127
+ - Don't rely on color alone for status (online vs busy = green vs red). Add `aria-label` describing state.
128
+ - Touch targets: badges with click handlers need ≥ 24×24 (small badges hard to tap; consider expanding hit area).
129
+
130
+ ## Edge cases
131
+
132
+ - **Count 0 + showZero false**: hide badge; render only children.
133
+ - **Count > max**: render `99+` (or `${max}+`).
134
+ - **Very long text** (Standalone): truncate with ellipsis at max-width; don't wrap to two lines.
135
+ - **Indicator on small parent** (24px icon): badge may overflow; place outside parent's bounding box (positioning offset).
136
+ - **RTL**: flip `top-right` / `top-left` mappings.
137
+ - **Dark mode**: tokens cascade; verify outline variant has visible border.
138
+
139
+ ## Code example
140
+
141
+ ```tsx
142
+ function NotificationBell({ count }: { count: number }) {
143
+ return (
144
+ <IndicatorBadge count={count} max={99}>
145
+ <button aria-label={`${count} unread notifications`} className="icon-button">
146
+ <BellIcon />
147
+ </button>
148
+ </IndicatorBadge>
149
+ );
150
+ }
151
+
152
+ function ProductCard({ name, isNew, isOnSale }: Props) {
153
+ return (
154
+ <article>
155
+ <h3>{name}</h3>
156
+ {isNew && <Badge variant="default">New</Badge>}
157
+ {isOnSale && <Badge variant="destructive">Sale</Badge>}
158
+ </article>
159
+ );
160
+ }
161
+ ```
162
+
163
+ ## Don't
164
+
165
+ - Don't use Badge as a primary CTA. It looks like a button but isn't.
166
+ - Don't pile up 5+ badges next to a single item — visual noise.
167
+ - Don't make badges so small the text is unreadable (< 10px).
168
+ - Don't use color-only status (online/busy as just green/red without label).
169
+ - Don't animate badge appearance (count 1 → 2 with spring) on every render — distracting; use only for meaningful state changes.
170
+
171
+ ## References
172
+
173
+ - Ant: [`Badge`](../refs/ant-design/components/badge)
174
+ - MUI: [`Badge`](../refs/mui/packages/mui-material/src/Badge)
175
+ - shadcn-ui: [`badge`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/badge.tsx)
176
+
177
+ ## Cross-reference
178
+
179
+ - [`examples/component-avatar.md`](component-avatar.md) — common Indicator parent
180
+ - [`examples/component-tag-badge.md`](component-tag-badge.md) — closely related (filterable tags)
181
+ - [`examples/component-alert.md`](component-alert.md) — for full alerts vs small badges
@@ -0,0 +1,237 @@
1
+ # `Banner` — spec
2
+
3
+ > A persistent in-page or app-wide notification strip. Distinct from `Alert` (page-level inline message) and `Toast` (transient floating notification). Used for upgrade prompts, system status, cookie consent, ongoing announcements.
4
+
5
+ ## Banner vs Alert vs Toast
6
+
7
+ | | Banner | Alert | Toast |
8
+ | --- | --- | --- | --- |
9
+ | Position | Top of page or app-wide strip | Inline within page content | Floating, usually corner |
10
+ | Persistence | Persistent until dismissed (or context changes) | Visible while relevant | Auto-dismisses (3-7s) |
11
+ | Width | Full-width edge-to-edge | Constrained to content area | Card-width |
12
+ | Use | System-level announcements | Page-level state info | Action confirmation |
13
+ | Dismissible | Often (but persistent until dismissed) | Sometimes | Yes (auto + manual) |
14
+
15
+ ## Common Banner use cases
16
+
17
+ - **System status**: "We're experiencing degraded performance."
18
+ - **Cookie / consent**: "We use cookies. [Accept] [Customize]"
19
+ - **Trial / upgrade**: "Your trial ends in 3 days. [Upgrade]"
20
+ - **Migration / version**: "We've updated our terms. [Read more]"
21
+ - **Maintenance window**: "Scheduled maintenance: Sunday 2am UTC."
22
+ - **Promo / announcement**: "Save 30% on annual plans."
23
+ - **Korean spam law (정보통신망법)**: marketing consent banner where required.
24
+
25
+ ## Anatomy
26
+
27
+ ```
28
+ ┌─────────────────────────────────────────────────────────┐
29
+ │ ⚠ Your trial ends in 3 days. Upgrade now to keep access. │
30
+ │ [Upgrade] [×] │
31
+ └─────────────────────────────────────────────────────────┘
32
+ (above the page content; full-width)
33
+ ```
34
+
35
+ ## API
36
+
37
+ ```tsx
38
+ <Banner
39
+ variant="warning"
40
+ icon={<ClockIcon />}
41
+ dismissible
42
+ onDismiss={handleDismiss}
43
+ action={
44
+ <Button size="sm" variant="primary" onClick={handleUpgrade}>
45
+ Upgrade
46
+ </Button>
47
+ }
48
+ >
49
+ <strong>Your trial ends in 3 days.</strong>
50
+ <span>Upgrade now to keep access.</span>
51
+ </Banner>
52
+ ```
53
+
54
+ | Prop | Type | Default | Description |
55
+ | --- | --- | --- | --- |
56
+ | `variant` | `"info" \| "success" \| "warning" \| "error" \| "promo" \| "neutral"` | `"info"` | Visual treatment |
57
+ | `icon` | `ReactNode` | per variant | Leading icon |
58
+ | `dismissible` | `boolean` | `false` | Show dismiss × |
59
+ | `onDismiss` | `() => void` | — | Dismiss callback |
60
+ | `action` | `ReactNode` | — | Right-aligned action(s) |
61
+ | `position` | `"top" \| "bottom" \| "inline"` | `"top"` | Where in the layout |
62
+ | `sticky` | `boolean` | `false` | Stick to viewport edge |
63
+ | `id` | `string` | — | For dismissal persistence (localStorage) |
64
+
65
+ ## Variants
66
+
67
+ | Variant | Color | Use |
68
+ | --- | --- | --- |
69
+ | `info` | Blue | General announcements, info |
70
+ | `success` | Green | Positive milestones (account verified) |
71
+ | `warning` | Amber | Time-sensitive (trial expiring) |
72
+ | `error` | Red | System issues (degraded service) |
73
+ | `promo` | Brand | Marketing, discounts |
74
+ | `neutral` | Gray | Quiet announcements |
75
+
76
+ ## States
77
+
78
+ | State | Visual |
79
+ | --- | --- |
80
+ | Default | Per variant; full-width strip |
81
+ | Dismissing | Slide / fade out 200ms |
82
+ | Hidden (dismissed) | Removed; remembered via `id` + localStorage |
83
+
84
+ ## Persistence
85
+
86
+ For dismissible banners, persist dismissal across sessions:
87
+
88
+ ```tsx
89
+ const [dismissed, setDismissed] = useLocalStorage(`banner-dismissed-${id}`, false);
90
+
91
+ if (dismissed) return null;
92
+
93
+ return <Banner id={id} dismissible onDismiss={() => setDismissed(true)}>...</Banner>;
94
+ ```
95
+
96
+ Reset dismissal when the underlying content changes (new `id` for new announcement).
97
+
98
+ ## Position variants
99
+
100
+ ### `top` (default)
101
+
102
+ Above all content. Typically sticky or scrolls with page top.
103
+
104
+ ### `bottom`
105
+
106
+ Bottom of viewport. Common for cookie consent (less intrusive on first paint).
107
+
108
+ ### `inline`
109
+
110
+ Within page content as a contextual block.
111
+
112
+ ## Tokens consumed
113
+
114
+ ```
115
+ --banner-bg-info (variant bgs)
116
+ --banner-bg-success
117
+ --banner-bg-warning
118
+ --banner-bg-error
119
+ --banner-bg-promo (often brand-color)
120
+ --banner-bg-neutral
121
+ --banner-fg (text on banner)
122
+ --banner-icon (icon color, slightly emphasized)
123
+ --banner-action (action button styling)
124
+ --banner-dismiss (× button color)
125
+ --space-md (banner padding)
126
+ --font-size-sm (typically smaller than body)
127
+ --font-weight-medium (slight emphasis)
128
+ --motion-medium (dismiss animation)
129
+ --ease-out
130
+ --z-banner (above content, below modals)
131
+ ```
132
+
133
+ ## Accessibility
134
+
135
+ - `<div role="status">` for non-urgent (info, promo, neutral).
136
+ - `<div role="alert">` ONLY for time-sensitive errors / warnings (avoid otherwise — interrupts screen readers).
137
+ - Dismiss button: `<button aria-label="Dismiss banner">`.
138
+ - Action button: standard button accessibility.
139
+ - Don't auto-dismiss critical banners (system status). User must acknowledge or fix the issue.
140
+ - For trial-expiring / cookie consent: don't trap focus or block interaction — banner is informational, not a modal.
141
+ - Sufficient color contrast on all variants (WCAG AA minimum).
142
+
143
+ ## Korean conventions
144
+
145
+ - 시스템 점검 안내 (system maintenance)
146
+ - 무료 체험 만료 안내 (trial expiration)
147
+ - 쿠키 / 마케팅 정보 수신 동의 (cookie / marketing consent — required by 정보통신망법)
148
+ - "확인" / "동의" / "거부" / "닫기" — typical Korean button labels
149
+ - 합쇼체 for formal banners ("점검을 진행합니다"); 해요체 for casual ("이벤트가 시작됐어요").
150
+
151
+ For 정보통신망법 marketing consent banner:
152
+ ```
153
+ 저희는 이메일 / SMS로 마케팅 정보를 보낼 수 있도록 동의를 요청합니다.
154
+ [동의] [거부] [자세히 보기]
155
+ ```
156
+
157
+ ## Code example — System status
158
+
159
+ ```tsx
160
+ function SystemStatusBanner() {
161
+ const { status } = useSystemStatus();
162
+
163
+ if (status === "operational") return null;
164
+
165
+ return (
166
+ <Banner
167
+ variant={status === "degraded" ? "warning" : "error"}
168
+ icon={<AlertCircleIcon />}
169
+ action={
170
+ <a href="/status" className="link">
171
+ {status === "degraded" ? "자세히 보기" : "상태 페이지"}
172
+ </a>
173
+ }
174
+ >
175
+ {status === "degraded"
176
+ ? "일부 기능이 정상 작동하지 않고 있어요."
177
+ : "서비스 장애가 발생했습니다. 빠르게 복구하겠습니다."}
178
+ </Banner>
179
+ );
180
+ }
181
+ ```
182
+
183
+ ## Code example — Promo banner
184
+
185
+ ```tsx
186
+ function PromoBanner() {
187
+ return (
188
+ <Banner
189
+ id="annual-discount-2025"
190
+ variant="promo"
191
+ dismissible
192
+ icon={<SparklesIcon />}
193
+ action={
194
+ <Button size="sm" asChild>
195
+ <a href="/pricing">자세히 보기</a>
196
+ </Button>
197
+ }
198
+ >
199
+ <strong>연간 결제 30% 할인</strong>
200
+ {" "}
201
+ <span>1월 31일까지 신규 가입자 대상.</span>
202
+ </Banner>
203
+ );
204
+ }
205
+ ```
206
+
207
+ ## Edge cases
208
+
209
+ - **Multiple banners stacked**: prioritize one (most important first); cap at 1-2 visible at any time.
210
+ - **Banner with action that requires modal confirmation**: action opens modal; banner stays until resolved.
211
+ - **Banner on print**: hide via `@media print`.
212
+ - **Mobile narrow width**: stack content (text + action) vertically; ensure action remains tappable (≥ 44pt).
213
+ - **RTL**: swap icon position (right) and action position (left); dismiss × stays on far end.
214
+ - **Keyboard nav**: Tab through Banner content (link, action, dismiss).
215
+ - **Screen-reader spam**: don't make banner update per-second (every counter tick announced); update at significant intervals.
216
+
217
+ ## Don't
218
+
219
+ - Don't use Banner for transient confirmation. That's Toast.
220
+ - Don't put more than one primary action in a Banner.
221
+ - Don't use Banner inside content cards. That's an Alert.
222
+ - Don't trap focus or block interaction. Banner is informational.
223
+ - Don't auto-show after every page navigation (annoying). Show once, persist dismissal.
224
+ - Don't use Banner for required confirmation (terms acceptance) without a modal. Banner can dismiss too easily.
225
+ - Don't omit dismissal for non-critical banners — users hate persistent unkillable strips.
226
+
227
+ ## References
228
+
229
+ - Patterns: GitHub system status banner, Stripe Trial banner, Vercel deploy notifications, KR cookie consent banners
230
+ - WAI-ARIA: `role="status"` for non-urgent, `role="alert"` for time-sensitive
231
+
232
+ ## Cross-reference
233
+
234
+ - [`examples/component-alert.md`](component-alert.md) — inline page-level message
235
+ - [`examples/component-toast.md`](component-toast.md) — transient floating notification
236
+ - [`knowledge/patterns/email-design.md`](../knowledge/patterns/email-design.md) — KR 정보통신망법 marketing consent
237
+ - [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md)