@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,356 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: Design system QA — visual regression, token drift, a11y regression
4
+ applies_to: [design-system, ci, testing]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # Design system QA
11
+
12
+ A design system without QA decays. Tokens drift from spec, components deviate from their docs, accessibility regresses silently. This is the test pyramid for a design system.
13
+
14
+ ## What can break
15
+
16
+ | What | How it breaks | Detection |
17
+ | --- | --- | --- |
18
+ | **Token values** | Engineer hard-codes a hex instead of using a token | Token drift lint |
19
+ | **Component visual** | Padding off by 4px after refactor | Visual regression test |
20
+ | **Component API** | Prop signature changes silently | TypeScript + breaking-change detection |
21
+ | **A11y** | New change introduces contrast under 4.5:1 | A11y regression (axe / lighthouse) |
22
+ | **Token-to-Figma sync** | Code says brand-600 = #7C3AED; Figma still has #8B5CF6 | Sync diff CI job |
23
+ | **Cross-component consistency** | Button radius is 8px, Input radius is 10px | Token-usage lint |
24
+
25
+ ## Test pyramid
26
+
27
+ ```
28
+ ┌───────────────────────┐
29
+ │ Visual regression │ ← slow, expensive (Chromatic / Percy)
30
+ │ (per release) │
31
+ └───────────────────────┘
32
+ ┌────────────────────────────────┐
33
+ │ A11y regression (axe-core) │ ← per PR, fast
34
+ │ Token-usage lint │
35
+ │ Component contract tests │
36
+ └────────────────────────────────┘
37
+ ┌────────────────────────────────────────────┐
38
+ │ Unit: utility functions (color, format) │ ← per commit, instant
39
+ │ Type: TypeScript on tokens + props │
40
+ └────────────────────────────────────────────┘
41
+ ```
42
+
43
+ ## Layer 1 — token drift detection
44
+
45
+ ### Rule: no raw hex values in component code
46
+
47
+ Engineers should **only reference tokens** — never inline `#7C3AED`. Lint catches violations:
48
+
49
+ ```js
50
+ // .eslintrc — design-tokens-only rule
51
+ {
52
+ rules: {
53
+ "no-restricted-syntax": [
54
+ "error",
55
+ {
56
+ selector: "Literal[value=/^#[0-9A-Fa-f]{3,8}$/]",
57
+ message: "Use a design token, not a raw hex value.",
58
+ },
59
+ ],
60
+ },
61
+ }
62
+ ```
63
+
64
+ Or via Stylelint for CSS:
65
+
66
+ ```js
67
+ // .stylelintrc
68
+ {
69
+ rules: {
70
+ "color-no-hex": [true, { severity: "error" }],
71
+ },
72
+ }
73
+ ```
74
+
75
+ Allow exceptions in:
76
+ - The token source file itself (`tokens/source.json`).
77
+ - Generated outputs (`tokens.css`).
78
+
79
+ ### Rule: tokens must reference, not duplicate
80
+
81
+ Semantic tokens reference primitive tokens; they don't duplicate hex:
82
+
83
+ ```yaml
84
+ # Correct
85
+ color.semantic.primary:
86
+ $value: "{color.brand.primary.600}"
87
+
88
+ # Wrong (duplicates the value)
89
+ color.semantic.primary:
90
+ $value: "#7C3AED"
91
+ ```
92
+
93
+ Style Dictionary and similar tools resolve `{path}` references; CI lints for direct values in semantic layers.
94
+
95
+ ### Token sync diff (Figma ↔ code)
96
+
97
+ If both code and Figma host tokens, drift is inevitable. CI job:
98
+
99
+ ```bash
100
+ #!/bin/bash
101
+ # Pull Figma tokens via REST API
102
+ curl -H "X-Figma-Token: $FIGMA_TOKEN" \
103
+ "https://api.figma.com/v1/files/$FIGMA_FILE/variables/local" \
104
+ | jq '...transform...' > /tmp/figma-tokens.json
105
+
106
+ # Diff against committed tokens
107
+ diff tokens/source.json /tmp/figma-tokens.json && echo "in sync" || {
108
+ echo "DRIFT DETECTED"
109
+ exit 1
110
+ }
111
+ ```
112
+
113
+ Run nightly OR on PR open. Fail PR if Figma tokens have drifted from `source.json`.
114
+
115
+ Decide a direction-of-truth:
116
+ - **Code is source**: drift means Figma needs update. Notify designer.
117
+ - **Figma is source**: drift means code needs regeneration. Auto-PR if possible.
118
+
119
+ See [`docs/TOKEN-SYNC.md`](../../docs/TOKEN-SYNC.md) for the broader sync strategy.
120
+
121
+ ## Layer 2 — visual regression
122
+
123
+ Renders every component (or screen) and pixel-compares against a baseline image. Fails if pixels diverge beyond a threshold.
124
+
125
+ ### Tools
126
+
127
+ | Tool | Cost | Use |
128
+ | --- | --- | --- |
129
+ | **Chromatic** | Paid (Storybook integration) | Best DX. Cloud-based. Diffs per PR. |
130
+ | **Percy** (BrowserStack) | Paid | Similar to Chromatic. Less Storybook-tight. |
131
+ | **Loki** | Free | OSS, pairs with Storybook. Limited features. |
132
+ | **Playwright + image-snapshot** | Free | Roll-your-own with Playwright tests + screenshot diff. |
133
+ | **happo** | Paid | Cross-browser visual regression. |
134
+
135
+ ### What to capture
136
+
137
+ A test catalog (Storybook stories + critical screen flows):
138
+
139
+ ```js
140
+ // Storybook story per component variant
141
+ export const PrimarySolid = () => <Button intent="primary" variant="solid">Save</Button>;
142
+ export const PrimaryDisabled = () => <Button intent="primary" disabled>Save</Button>;
143
+ export const PrimaryLoading = () => <Button intent="primary" loading>Save</Button>;
144
+ // ... for each variant × size × state combination
145
+ ```
146
+
147
+ For a Button with 4 intents × 4 variants × 3 sizes × 6 states ≈ 288 visual tests. Catch any unintended pixel change.
148
+
149
+ ### Threshold tuning
150
+
151
+ Set per-test threshold (typically 0.1–0.2% pixel diff):
152
+
153
+ - **Too tight**: anti-aliasing changes flag every test.
154
+ - **Too loose**: real regressions pass through.
155
+ - Calibrate against your CI runner's font rendering (varies between OSes).
156
+
157
+ ### Approve workflow
158
+
159
+ When a real change happens:
160
+ 1. PR introduces visual change.
161
+ 2. CI flags diffs.
162
+ 3. Reviewer inspects (Chromatic shows side-by-side).
163
+ 4. Reviewer approves diffs as new baseline.
164
+ 5. Merge.
165
+
166
+ Don't mass-approve without inspection — defeats the purpose.
167
+
168
+ ### What to skip
169
+
170
+ - **Chart rendering** with random data — flaky.
171
+ - **Animations mid-frame** — capture at known states (start, settled, end).
172
+ - **Localized text** — separate per-locale snapshot or use a locale-agnostic placeholder.
173
+
174
+ ## Layer 3 — a11y regression
175
+
176
+ Axe-core or Lighthouse catches common a11y violations programmatically.
177
+
178
+ ### Tools
179
+
180
+ - **axe-core**: industry standard. Integrates with Storybook (`storybook-addon-a11y`), Playwright, Cypress.
181
+ - **Lighthouse**: broader audit (a11y, perf, SEO). Run in CI.
182
+ - **pa11y-ci**: CLI a11y testing.
183
+
184
+ ### Per-component (Storybook + axe)
185
+
186
+ ```ts
187
+ // Storybook addon-a11y runs axe on every story
188
+ // Failures block CI
189
+ ```
190
+
191
+ Catches:
192
+ - Missing `<label>` for inputs
193
+ - Missing `alt` on images
194
+ - Insufficient contrast (computed from CSS)
195
+ - Missing `aria-label` on icon-only buttons
196
+ - Invalid ARIA combos
197
+ - Heading hierarchy issues
198
+
199
+ Doesn't catch:
200
+ - Custom keyboard interactions (must hand-test)
201
+ - Focus management on dynamic content (must hand-test)
202
+ - Screen reader announcement quality (must hand-test)
203
+
204
+ ### Per-page (Playwright + axe)
205
+
206
+ ```ts
207
+ import { test, expect } from "@playwright/test";
208
+ import AxeBuilder from "@axe-core/playwright";
209
+
210
+ test("dashboard a11y", async ({ page }) => {
211
+ await page.goto("/dashboard");
212
+ const results = await new AxeBuilder({ page }).analyze();
213
+ expect(results.violations).toEqual([]);
214
+ });
215
+ ```
216
+
217
+ Run on every PR. Fail if new violations appear.
218
+
219
+ ## Layer 4 — component contract tests
220
+
221
+ Tests that verify the component's API contract:
222
+
223
+ ```ts
224
+ // Component spec contract test
225
+ test("Button: aria-disabled when disabled", () => {
226
+ render(<Button disabled>Click</Button>);
227
+ expect(screen.getByRole("button")).toHaveAttribute("aria-disabled", "true");
228
+ });
229
+
230
+ test("Button: type defaults to button (not submit)", () => {
231
+ render(<Button>Click</Button>);
232
+ expect(screen.getByRole("button")).toHaveAttribute("type", "button");
233
+ });
234
+
235
+ test("Button: calls onClick on Enter key", async () => {
236
+ const onClick = vi.fn();
237
+ render(<Button onClick={onClick}>Click</Button>);
238
+ screen.getByRole("button").focus();
239
+ await userEvent.keyboard("{Enter}");
240
+ expect(onClick).toHaveBeenCalled();
241
+ });
242
+ ```
243
+
244
+ These run fast and catch:
245
+ - API contract violations
246
+ - Keyboard handler regressions
247
+ - ARIA attribute regressions
248
+
249
+ Pair these with the spec — every "Don't" or "States" entry in a component spec should have a contract test.
250
+
251
+ ## Layer 5 — TypeScript
252
+
253
+ The strongest, cheapest layer:
254
+
255
+ ```ts
256
+ // Tokens typed as a const tree
257
+ export const tokens = {
258
+ color: {
259
+ primary: {
260
+ 50: "#F5F3FF",
261
+ // ...
262
+ 950: "#2E1065",
263
+ },
264
+ },
265
+ // ...
266
+ } as const;
267
+
268
+ // Component prop validation
269
+ type ButtonProps = {
270
+ intent: "primary" | "secondary" | "danger";
271
+ size: "sm" | "md" | "lg";
272
+ // ...
273
+ };
274
+ ```
275
+
276
+ Catches API breakage at compile time. Pair with `--strict` and ESLint's `@typescript-eslint/strict-boolean-expressions` etc.
277
+
278
+ ## CI pipeline — putting it together
279
+
280
+ ```yaml
281
+ # .github/workflows/design-qa.yml
282
+ on: pull_request
283
+
284
+ jobs:
285
+ qa:
286
+ runs-on: ubuntu-latest
287
+ steps:
288
+ - uses: actions/checkout@v4
289
+
290
+ # Layer 5: TypeScript
291
+ - run: pnpm tsc --noEmit
292
+
293
+ # Layer 1: Token drift / lint
294
+ - run: pnpm lint
295
+ - run: pnpm test:tokens-validate
296
+
297
+ # Layer 4: Component contract tests
298
+ - run: pnpm test:unit
299
+
300
+ # Layer 3: A11y on Storybook
301
+ - run: pnpm storybook:build
302
+ - run: pnpm test:a11y
303
+
304
+ # Layer 2: Visual regression
305
+ - run: pnpm chromatic --auto-accept-changes=false
306
+
307
+ # Optional: Figma sync diff
308
+ - run: pnpm test:figma-sync
309
+ ```
310
+
311
+ PR fails if any step fails. Visual regression is run-of-day (slow); the rest run on every push.
312
+
313
+ ## Per-component QA checklist
314
+
315
+ When shipping a new component (or revising one), verify all five layers:
316
+
317
+ - [ ] **Tokens used** — no raw hex/values inline
318
+ - [ ] **TypeScript** — props typed, no `any`
319
+ - [ ] **Storybook stories** — all variants × sizes × states present
320
+ - [ ] **Contract tests** — required ARIA, keyboard handlers
321
+ - [ ] **A11y** — axe passes; manual keyboard test; manual screen reader spot-check
322
+ - [ ] **Visual regression** — baselines captured
323
+ - [ ] **Spec doc updated** — `examples/component-X.md` reflects API
324
+
325
+ ## Korean considerations
326
+
327
+ - Visual regression for IME composition states — Hangul mid-composition can render differently. Capture states.
328
+ - Brand-color contrast (KakaoPay yellow, Toss blue, etc.) — verify focus rings clear 3:1 on these specific backgrounds.
329
+ - Korean date formatting in components — test that `2026.05.07` renders correctly across locales.
330
+
331
+ ## Maintenance cadence
332
+
333
+ | Cadence | Task |
334
+ | --- | --- |
335
+ | Per PR | TypeScript + tests + a11y + visual regression |
336
+ | Nightly | Figma sync diff |
337
+ | Weekly | Lighthouse score on key pages |
338
+ | Monthly | Manual audit: spec docs vs implementation |
339
+ | Quarterly | Token drift scan: which tokens are unused? Which were added without doc updates? |
340
+
341
+ ## Don't
342
+
343
+ - Don't run visual regression in headless mode without controlling for OS font rendering — false positives.
344
+ - Don't skip a11y tests because they're "annoying". They're catching real problems.
345
+ - Don't write tests after merging — write the test, then the implementation (TDD reveals API issues).
346
+ - Don't approve every diff. Approve diffs that match the intent.
347
+ - Don't gate every PR on a 5-minute Chromatic run if your team can't afford the latency. Run nightly + on release branches.
348
+ - Don't ship without contrast verification on real backgrounds. Tokens-only computation misses real-world overlays.
349
+
350
+ ## Cross-reference
351
+
352
+ - [`docs/TOKEN-SYNC.md`](../../docs/TOKEN-SYNC.md) — token drift detection and Figma sync
353
+ - [`docs/FIGMA-INTEGRATION.md`](../../docs/FIGMA-INTEGRATION.md) — Figma side of QA
354
+ - [`knowledge/a11y/contrast.md`](../a11y/contrast.md) — what a11y regression catches
355
+ - [`knowledge/a11y/keyboard-and-focus.md`](../a11y/keyboard-and-focus.md) — keyboard contract tests
356
+ - [`skills/design-system-qa/PLAYBOOK.md`](../../skills/design-system-qa/PLAYBOOK.md) — the skill that applies this
@@ -0,0 +1,248 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: Document typography (long-form reading)
4
+ applies_to: [docs, articles, reports, books, marketing-prose]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # Document typography
11
+
12
+ Designing for **reading** is fundamentally different from designing for **scanning** (UI). Long-form documents — articles, technical docs, reports, books — need different rules than product UIs.
13
+
14
+ The product UI rules in [`type-scale-fundamentals.md`](../typography/type-scale-fundamentals.md) bias toward scannable, dense, multi-purpose. Document typography biases toward sustained reading, lower fatigue, clear hierarchy.
15
+
16
+ ## Body — the most important decision
17
+
18
+ Body text is what readers actually read. Get this right and everything else can be average; get it wrong and nothing else matters.
19
+
20
+ | Property | Document | Product UI |
21
+ | --- | --- | --- |
22
+ | Font size | **18–20px** (web) / 11–12pt (print) | 14–16px |
23
+ | Line height | **1.5–1.7** | 1.4–1.5 |
24
+ | Line length (measure) | **60–75 characters** | not constrained |
25
+ | Line color | `#1F2937` or similar (slightly off-black) | `#0F172A` |
26
+ | Font | Serif OR humanist sans | Geometric sans |
27
+
28
+ ### Why bigger?
29
+
30
+ At "product UI" 14px, sustained reading is fatiguing. 18px+ is the comfort zone for paragraphs of prose.
31
+
32
+ ### Why constrained measure?
33
+
34
+ Lines too long: eyes lose place returning to next line.
35
+ Lines too short: too many returns, choppy.
36
+
37
+ **60–75 characters per line** is the sweet spot. Use `max-width: 65ch` (CSS).
38
+
39
+ For Korean: 35–40 Hangul characters per line (Hangul syllables ~2× width of Latin chars).
40
+
41
+ ### Why off-black?
42
+
43
+ Pure `#000` on `#FFF` has too much contrast (eye strain over long reads). `#1F2937` / `#272727` reduces glare while staying high-contrast.
44
+
45
+ Print: ≥ 90% black on white paper, never 100%.
46
+
47
+ ## Heading hierarchy
48
+
49
+ Documents need **clearer hierarchy** than UIs. Readers skim before reading; headings are the skim path.
50
+
51
+ ### Default scale (web)
52
+
53
+ | Level | Tag | Size | Weight | Line height | Top margin |
54
+ | --- | --- | --- | --- | --- | --- |
55
+ | Display | h1 | 48–60px | 700 | 1.1 | — |
56
+ | Section | h2 | 32–36px | 700 | 1.2 | 64px |
57
+ | Subsection | h3 | 24px | 600 | 1.3 | 48px |
58
+ | Sub-sub | h4 | 18–20px | 600 | 1.4 | 32px |
59
+ | Body | p | 18–20px | 400 | 1.6 | 16px |
60
+
61
+ The `top margin` matters: hierarchy is reinforced by space above the heading. h2 has more space than h3, signaling a bigger break.
62
+
63
+ ### Korean adjustment
64
+
65
+ For Korean documents:
66
+ - Headings: same size, **weight 600** (heavier than Latin's typical 400 for h3+).
67
+ - Line height +10%: h2 1.3 → 1.35.
68
+ - Line break behavior: `word-break: keep-all` to avoid mid-syllable breaks.
69
+
70
+ ## Vertical rhythm
71
+
72
+ A document with consistent vertical rhythm reads as composed. Inconsistent rhythm reads as messy.
73
+
74
+ ### Single-axis baseline
75
+
76
+ Pick a base line-height (e.g., 32px). Every spacing decision is a multiple:
77
+
78
+ ```
79
+ Body line-height: 32px
80
+ Body paragraph margin: 32px (= 1× line)
81
+ h2 top margin: 64px (= 2× lines)
82
+ h3 top margin: 48px (= 1.5× lines)
83
+ Image bottom margin: 32px
84
+ List item spacing: 16px (= 0.5× lines)
85
+ ```
86
+
87
+ This is "vertical rhythm" — content sits on a consistent baseline, no awkward gaps.
88
+
89
+ CSS for it:
90
+
91
+ ```css
92
+ body {
93
+ --leading: 1.6em;
94
+ }
95
+ p, li, h1, h2, h3, h4 {
96
+ margin-bottom: var(--leading);
97
+ }
98
+ h2 {
99
+ margin-top: calc(var(--leading) * 2);
100
+ }
101
+ ```
102
+
103
+ ## Paragraph styling
104
+
105
+ | Property | Value | Why |
106
+ | --- | --- | --- |
107
+ | Indentation | None (modern web) OR 1em first-line (print/editorial) | Matches medium |
108
+ | Margin between | 1× line-height (no indentation), 0 (with indentation) | Two cues for paragraph break is redundant |
109
+ | First-letter drop cap | Editorial / hero sections only | Distractive in technical docs |
110
+ | Justify | No, on web (rivers and uneven spacing) | Use left-align (LTR) / right-align (RTL) |
111
+
112
+ ### Korean paragraphs
113
+
114
+ - No indentation; modern Korean web/print convention.
115
+ - Paragraph spacing same as Latin (1 line-height).
116
+ - For mixed Korean-English (loanwords, technical terms): use a single font that handles both well (Pretendard, IBM Plex Sans KR).
117
+
118
+ ## Inline text styles
119
+
120
+ | Style | Use | Style |
121
+ | --- | --- | --- |
122
+ | **Bold** | Genuine emphasis (sparingly) | weight 700 |
123
+ | _Italic_ | Title of work, emphasis (rare in tech) | font-style italic |
124
+ | `Code` | Inline code, paths, identifiers | font-family monospace, slight bg tint |
125
+ | ~~Strike~~ | Removed / superseded text | text-decoration line-through |
126
+ | <u>Underline</u> | Avoid for non-link text — confusing | underline reserved for links |
127
+
128
+ Korean-specific: italics don't render well for Hangul (no italic form). For emphasis, use:
129
+ - `font-weight: 600`
130
+ - Color shift (slightly darker)
131
+ - Or wrap in `<mark>` for annotation
132
+
133
+ ## Links in long-form
134
+
135
+ Links break reading flow. Choices:
136
+
137
+ | Style | Use |
138
+ | --- | --- |
139
+ | Underline + brand color | Default. Most discoverable. |
140
+ | Underline only | Editorial / minimal style |
141
+ | Color only (no underline) | Avoid — fails for color-blind |
142
+ | Subtle (low contrast underline) | Footnotes, references |
143
+
144
+ For high-density link content (think Wikipedia): use subtle underline; underline-on-hover for less-noisy default.
145
+
146
+ ## Pull quotes
147
+
148
+ Block quotes / pull quotes break monotony in long-form:
149
+
150
+ ```html
151
+ <blockquote>
152
+ <p>The quote text, often slightly larger and italic or in a contrasting color.</p>
153
+ <cite>— Attribution</cite>
154
+ </blockquote>
155
+ ```
156
+
157
+ Style:
158
+ - Larger font (1.25–1.5× body)
159
+ - Different color (`--color-text-secondary` works)
160
+ - Italic (Latin) / weight 500 (Hangul)
161
+ - Vertical bar on left OR centered with quote marks
162
+
163
+ Don't use for ordinary block content — reserve for actual quotes.
164
+
165
+ ## Image / figure handling
166
+
167
+ In documents:
168
+ - Images full-width to the body container.
169
+ - Captions: smaller text below image (`figcaption`).
170
+ - Image padding: 1 line-height above and below.
171
+ - No drop shadows on documentation images (signals product UI, not editorial).
172
+ - Photographs: rounded corners are jarring for editorial context. Use square corners for serious docs.
173
+
174
+ ## Code blocks in documents
175
+
176
+ Different from inline code:
177
+ - Full-bleed to container (or slightly inset).
178
+ - Background tint (slightly darker than body bg).
179
+ - Monospace font, 14–15px (smaller than body, intentional).
180
+ - Optional language label at top.
181
+ - Optional copy button (top-right, hover-only).
182
+ - Line numbers for very long blocks (>20 lines).
183
+
184
+ Cite [`examples/component-code.md`](../../examples/component-code.md).
185
+
186
+ ## Tables in documents
187
+
188
+ Different from product UI tables:
189
+ - Border-bottom on every row (light) — easier reading.
190
+ - Header: bold + `border-bottom: 2px solid` to separate from body.
191
+ - Row striping: optional. Use `--color-bg-subtle` very lightly OR not at all.
192
+ - No filtering / sorting controls in document context (it's prose, not data).
193
+ - For large data: extract to a separate component, not inline in prose.
194
+
195
+ ## Print-specific
196
+
197
+ For docs meant to be printed (manuals, reports, contracts):
198
+ - Body: 11pt (smaller than screen — print is denser).
199
+ - Margins: 1 inch (2.5 cm) all sides.
200
+ - Page breaks: avoid orphans/widows. CSS `orphans: 3; widows: 3;`.
201
+ - Page numbers: small, bottom-center or bottom-right.
202
+ - No light gray text — minimum 70% black.
203
+ - No background colors that bleed to edges (uses paper, looks weird).
204
+
205
+ ## Document → web → print pipeline
206
+
207
+ A doc may need to render in three contexts:
208
+
209
+ ```
210
+ Markdown source (canonical)
211
+
212
+ Web (your docs site)
213
+
214
+ PDF (download)
215
+
216
+ Print (paper)
217
+ ```
218
+
219
+ Each context overrides the base styling:
220
+
221
+ ```css
222
+ body { font-size: 18px; line-height: 1.6; }
223
+
224
+ @media print {
225
+ body { font-size: 11pt; line-height: 1.5; }
226
+ a { color: #000; text-decoration: underline; }
227
+ a::after { content: " (" attr(href) ")"; } /* show URL after link in print */
228
+ }
229
+ ```
230
+
231
+ ## Common document typography mistakes
232
+
233
+ - **Body too small** (14px) — looks like a UI, fatiguing to read.
234
+ - **Lines too long** (no max-width) — eye fatigue.
235
+ - **Heading too close to next paragraph** — no margin separation.
236
+ - **All text justified** (web) — rivers, awkward gaps.
237
+ - **Pure black text** — eye strain.
238
+ - **Code blocks at body size** — should be slightly smaller.
239
+ - **Pull quotes overused** — every paragraph has one, lose all impact.
240
+ - **Multiple emphasis types in same paragraph** (bold + italic + code + link) — visual chaos.
241
+
242
+ ## Cross-reference
243
+
244
+ - [`knowledge/typography/type-scale-fundamentals.md`](../typography/type-scale-fundamentals.md) — base scale concepts (UI-focused)
245
+ - [`knowledge/i18n/korean-typography.md`](../i18n/korean-typography.md) — Korean adjustments
246
+ - [`knowledge/i18n/korean-document-style.md`](../i18n/korean-document-style.md) — Korean doc-specific conventions
247
+ - [`knowledge/patterns/information-architecture.md`](information-architecture.md) — IA for long docs
248
+ - [`knowledge/patterns/technical-writing.md`](technical-writing.md) — voice and structure