@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.
- package/.claude-plugin/plugin.json +164 -0
- package/AGENTS.ko.md +126 -0
- package/AGENTS.md +182 -0
- package/CHANGELOG.md +6883 -0
- package/CLAUDE.md +39 -0
- package/LICENSE +21 -0
- package/README.ko.md +245 -0
- package/README.md +277 -0
- package/agents/README.md +14 -0
- package/agents/a11y-reviewer.md +121 -0
- package/agents/component-architect.md +57 -0
- package/agents/design-critic.md +46 -0
- package/agents/token-extractor.md +63 -0
- package/cli/bin/design-ai-mcp.mjs +6 -0
- package/cli/bin/design-ai.mjs +40 -0
- package/cli/commands/audit.mjs +111 -0
- package/cli/commands/check.mjs +226 -0
- package/cli/commands/doctor.mjs +141 -0
- package/cli/commands/examples.mjs +58 -0
- package/cli/commands/help.mjs +271 -0
- package/cli/commands/install.mjs +161 -0
- package/cli/commands/learn.mjs +1871 -0
- package/cli/commands/list.mjs +143 -0
- package/cli/commands/mcp.mjs +27 -0
- package/cli/commands/pack.mjs +211 -0
- package/cli/commands/prompt.mjs +199 -0
- package/cli/commands/route.mjs +247 -0
- package/cli/commands/search.mjs +60 -0
- package/cli/commands/show.mjs +52 -0
- package/cli/commands/site.mjs +558 -0
- package/cli/commands/status.mjs +161 -0
- package/cli/commands/uninstall.mjs +119 -0
- package/cli/commands/update.mjs +184 -0
- package/cli/commands/version.mjs +94 -0
- package/cli/commands/workspace.mjs +176 -0
- package/cli/lib/brief.mjs +52 -0
- package/cli/lib/check.mjs +642 -0
- package/cli/lib/dispatch.mjs +109 -0
- package/cli/lib/doctor.mjs +505 -0
- package/cli/lib/examples.mjs +258 -0
- package/cli/lib/exec.mjs +63 -0
- package/cli/lib/help-flags.mjs +5 -0
- package/cli/lib/learn.mjs +3694 -0
- package/cli/lib/log.mjs +47 -0
- package/cli/lib/mcp-server.mjs +426 -0
- package/cli/lib/output.mjs +101 -0
- package/cli/lib/pack.mjs +599 -0
- package/cli/lib/paths.mjs +63 -0
- package/cli/lib/prompt.mjs +603 -0
- package/cli/lib/route.mjs +740 -0
- package/cli/lib/search.mjs +158 -0
- package/cli/lib/show.mjs +161 -0
- package/cli/lib/signals.mjs +2337 -0
- package/cli/lib/site.mjs +6617 -0
- package/cli/lib/skill-proposals.mjs +2046 -0
- package/cli/lib/suggest.mjs +66 -0
- package/cli/lib/workspace.mjs +1056 -0
- package/commands/README.md +25 -0
- package/commands/component-spec.md +34 -0
- package/commands/conversational.md +44 -0
- package/commands/design-from-brief.md +141 -0
- package/commands/design-review.md +62 -0
- package/commands/document-from-brief.md +47 -0
- package/commands/extract-tokens.md +38 -0
- package/commands/game-ui.md +40 -0
- package/commands/illustration.md +37 -0
- package/commands/iterate.md +167 -0
- package/commands/motion-design.md +54 -0
- package/commands/palette-from-brand.md +50 -0
- package/commands/print.md +49 -0
- package/commands/slide-deck.md +46 -0
- package/commands/spatial.md +47 -0
- package/commands/stability-review.md +74 -0
- package/commands/video.md +42 -0
- package/commands/website-improvement.md +77 -0
- package/docs/AGENT-DEVELOPMENT.md +658 -0
- package/docs/AI-LEARNING.md +429 -0
- package/docs/AIDER-INTEGRATION.md +224 -0
- package/docs/ARCHITECTURE.ko.md +183 -0
- package/docs/ARCHITECTURE.md +105 -0
- package/docs/CODEX-INTEGRATION.md +311 -0
- package/docs/COMPANY-WEBSITE-DOGFOOD.ko.md +144 -0
- package/docs/COMPANY-WEBSITE-DOGFOOD.md +150 -0
- package/docs/COMPANY-WEBSITE-INTAKE-TEMPLATE.ko.md +153 -0
- package/docs/COMPANY-WEBSITE-INTAKE-TEMPLATE.md +154 -0
- package/docs/CONTRIBUTING.ko.md +203 -0
- package/docs/CONTRIBUTING.md +242 -0
- package/docs/CURSOR-INTEGRATION.md +220 -0
- package/docs/DISTRIBUTION.ko.md +248 -0
- package/docs/DISTRIBUTION.md +253 -0
- package/docs/DOGFOOD-FINDINGS.md +180 -0
- package/docs/DOGFOOD-V4-FINDINGS.md +139 -0
- package/docs/DOGFOOD-V4-MKDOCS-FINDINGS.md +233 -0
- package/docs/DOGFOOD-V4-NPM-FINDINGS.md +157 -0
- package/docs/DOGFOOD-V4-VSCODE-FINDINGS.md +135 -0
- package/docs/FIGMA-INTEGRATION.md +222 -0
- package/docs/MCP-INTEGRATION.md +243 -0
- package/docs/MIGRATION-v4.md +121 -0
- package/docs/PLUGIN-PACKAGING.md +240 -0
- package/docs/PRODUCT-READINESS.md +66 -0
- package/docs/QUICKSTART.ko.md +178 -0
- package/docs/QUICKSTART.md +179 -0
- package/docs/RELEASE-CHECKLIST.md +292 -0
- package/docs/ROADMAP.md +19495 -0
- package/docs/SESSION-LOG.md +940 -0
- package/docs/TOKEN-SYNC.md +237 -0
- package/docs/USING.ko.md +206 -0
- package/docs/USING.md +218 -0
- package/docs/WEBSITE-IMPROVEMENT.ko.md +75 -0
- package/docs/WEBSITE-IMPROVEMENT.md +89 -0
- package/docs/announcements/README.md +56 -0
- package/docs/announcements/dev-to-korea.md +206 -0
- package/docs/announcements/hashnode-post.ko.md +232 -0
- package/docs/announcements/okky-post.ko.md +158 -0
- package/docs/announcements/press-kit.md +101 -0
- package/docs/announcements/reddit-r-korea.md +196 -0
- package/docs/announcements/show-hn.md +114 -0
- package/docs/announcements/twitter-thread.md +255 -0
- package/docs/external-status.md +34 -0
- package/docs/integrations/aider-walkthrough.ko.md +275 -0
- package/docs/integrations/aider-walkthrough.md +274 -0
- package/docs/integrations/codex-walkthrough.ko.md +297 -0
- package/docs/integrations/codex-walkthrough.md +297 -0
- package/docs/integrations/cursor-walkthrough.ko.md +281 -0
- package/docs/integrations/cursor-walkthrough.md +284 -0
- package/docs/integrations/design-ai-mcp-server.md +169 -0
- package/docs/integrations/figma-mcp.md +149 -0
- package/docs/integrations/github-mcp.md +178 -0
- package/docs/integrations/linear-mcp.md +215 -0
- package/docs/integrations/notion-mcp.md +174 -0
- package/docs/integrations/sdk-walkthrough.ko.md +375 -0
- package/docs/integrations/sdk-walkthrough.md +375 -0
- package/docs/integrations/slack-mcp.md +208 -0
- package/docs/integrations/vscode-walkthrough.ko.md +202 -0
- package/docs/integrations/vscode-walkthrough.md +205 -0
- package/docs/requirements.txt +16 -0
- package/docs/site-overrides/extra.css +83 -0
- package/docs/site-overrides/favicon.svg +4 -0
- package/docs/site-overrides/logo.svg +10 -0
- package/docs/site-overrides/main.html +18 -0
- package/docs/website-console/app.js +2540 -0
- package/docs/website-console/index.html +24 -0
- package/docs/website-console/styles.css +975 -0
- package/examples/README.md +252 -0
- package/examples/cases/dogfood-v4-korean-hr-onboarding.md +356 -0
- package/examples/component-accordion-actions.md +153 -0
- package/examples/component-accordion-details.md +147 -0
- package/examples/component-accordion-summary.md +180 -0
- package/examples/component-accordion.md +229 -0
- package/examples/component-account-card.md +284 -0
- package/examples/component-address-input.md +260 -0
- package/examples/component-affix.md +190 -0
- package/examples/component-alert-dialog.md +210 -0
- package/examples/component-alert-title.md +77 -0
- package/examples/component-alert.md +192 -0
- package/examples/component-amount-input.md +278 -0
- package/examples/component-anchor.md +198 -0
- package/examples/component-app-bar.md +249 -0
- package/examples/component-aspect-ratio.md +156 -0
- package/examples/component-auto-complete.md +199 -0
- package/examples/component-avatar-group.md +170 -0
- package/examples/component-avatar.md +191 -0
- package/examples/component-back-top.md +123 -0
- package/examples/component-backdrop.md +148 -0
- package/examples/component-badge.md +181 -0
- package/examples/component-banner.md +237 -0
- package/examples/component-biometric-gate.md +281 -0
- package/examples/component-blockquote.md +153 -0
- package/examples/component-border-beam.md +207 -0
- package/examples/component-bottom-navigation.md +226 -0
- package/examples/component-box.md +112 -0
- package/examples/component-breadcrumb.md +222 -0
- package/examples/component-button-base.md +190 -0
- package/examples/component-button-group.md +117 -0
- package/examples/component-button.md +213 -0
- package/examples/component-calendar.md +280 -0
- package/examples/component-callout.md +131 -0
- package/examples/component-card-actions.md +101 -0
- package/examples/component-card-content.md +90 -0
- package/examples/component-card-header.md +122 -0
- package/examples/component-card-media.md +79 -0
- package/examples/component-card.md +233 -0
- package/examples/component-carousel.md +266 -0
- package/examples/component-cascader.md +135 -0
- package/examples/component-category-picker.md +271 -0
- package/examples/component-chart.md +237 -0
- package/examples/component-chat-interface.md +399 -0
- package/examples/component-checkbox.md +149 -0
- package/examples/component-click-away-listener.md +87 -0
- package/examples/component-code.md +213 -0
- package/examples/component-collapsible.md +219 -0
- package/examples/component-color-picker.md +110 -0
- package/examples/component-combobox.md +267 -0
- package/examples/component-command.md +299 -0
- package/examples/component-config-provider.md +190 -0
- package/examples/component-context-menu.md +179 -0
- package/examples/component-css-baseline.md +148 -0
- package/examples/component-date-picker.md +249 -0
- package/examples/component-descriptions.md +242 -0
- package/examples/component-dialog-actions.md +111 -0
- package/examples/component-dialog-content-text.md +76 -0
- package/examples/component-dialog-content.md +105 -0
- package/examples/component-dialog-title.md +104 -0
- package/examples/component-dialog.md +176 -0
- package/examples/component-divider.md +182 -0
- package/examples/component-doc-page.md +217 -0
- package/examples/component-drawer.md +257 -0
- package/examples/component-dropdown.md +220 -0
- package/examples/component-email-layout.md +253 -0
- package/examples/component-empty-state.md +269 -0
- package/examples/component-empty.md +172 -0
- package/examples/component-fade.md +87 -0
- package/examples/component-feature-grid.md +201 -0
- package/examples/component-field.md +266 -0
- package/examples/component-filled-input.md +114 -0
- package/examples/component-flex.md +117 -0
- package/examples/component-float-button.md +214 -0
- package/examples/component-form-control-label.md +134 -0
- package/examples/component-form-control.md +113 -0
- package/examples/component-form-controls.md +251 -0
- package/examples/component-form-group.md +86 -0
- package/examples/component-form-helper-text.md +95 -0
- package/examples/component-form-label.md +98 -0
- package/examples/component-form.md +291 -0
- package/examples/component-game-hud.md +362 -0
- package/examples/component-game-menu.md +327 -0
- package/examples/component-grid.md +140 -0
- package/examples/component-grow.md +79 -0
- package/examples/component-hero-block.md +252 -0
- package/examples/component-hover-card.md +211 -0
- package/examples/component-icon-button.md +142 -0
- package/examples/component-icon.md +102 -0
- package/examples/component-illustration.md +280 -0
- package/examples/component-image-list.md +107 -0
- package/examples/component-image.md +282 -0
- package/examples/component-input-adornment.md +101 -0
- package/examples/component-input-base.md +134 -0
- package/examples/component-input-number.md +141 -0
- package/examples/component-input-otp.md +271 -0
- package/examples/component-input.md +213 -0
- package/examples/component-item.md +243 -0
- package/examples/component-kbd.md +197 -0
- package/examples/component-krw-amount.md +219 -0
- package/examples/component-label.md +118 -0
- package/examples/component-layout.md +217 -0
- package/examples/component-link.md +223 -0
- package/examples/component-list-item-avatar.md +72 -0
- package/examples/component-list-item-button.md +139 -0
- package/examples/component-list-item-icon.md +82 -0
- package/examples/component-list-item-text.md +98 -0
- package/examples/component-list-item.md +116 -0
- package/examples/component-list-subheader.md +70 -0
- package/examples/component-list.md +198 -0
- package/examples/component-loading-button.md +125 -0
- package/examples/component-loading-sequence.md +254 -0
- package/examples/component-lottie-player.md +279 -0
- package/examples/component-masonry.md +191 -0
- package/examples/component-mentions.md +189 -0
- package/examples/component-menu-item.md +102 -0
- package/examples/component-menu-list.md +98 -0
- package/examples/component-menu.md +139 -0
- package/examples/component-menubar.md +259 -0
- package/examples/component-message.md +162 -0
- package/examples/component-mobile-stepper.md +155 -0
- package/examples/component-modal.md +220 -0
- package/examples/component-navigation-menu.md +295 -0
- package/examples/component-notification.md +166 -0
- package/examples/component-otp-countdown.md +245 -0
- package/examples/component-outlined-input.md +145 -0
- package/examples/component-page-transition.md +281 -0
- package/examples/component-pagination.md +226 -0
- package/examples/component-paper.md +199 -0
- package/examples/component-pass-auth.md +265 -0
- package/examples/component-payment-brand-button.md +253 -0
- package/examples/component-payment-method-selector.md +272 -0
- package/examples/component-payment-receipt.md +277 -0
- package/examples/component-popconfirm.md +144 -0
- package/examples/component-popover.md +239 -0
- package/examples/component-popper.md +129 -0
- package/examples/component-pricing-cards.md +247 -0
- package/examples/component-progress.md +195 -0
- package/examples/component-qr-code.md +201 -0
- package/examples/component-radio.md +167 -0
- package/examples/component-rate.md +202 -0
- package/examples/component-resizable.md +163 -0
- package/examples/component-result.md +270 -0
- package/examples/component-scroll-area.md +199 -0
- package/examples/component-scroll-reveal.md +320 -0
- package/examples/component-segmented.md +178 -0
- package/examples/component-select.md +258 -0
- package/examples/component-separator.md +177 -0
- package/examples/component-sheet.md +277 -0
- package/examples/component-sidebar.md +257 -0
- package/examples/component-skeleton.md +178 -0
- package/examples/component-slide.md +89 -0
- package/examples/component-slider.md +208 -0
- package/examples/component-snackbar-content.md +92 -0
- package/examples/component-snackbar.md +121 -0
- package/examples/component-sonner.md +165 -0
- package/examples/component-space.md +125 -0
- package/examples/component-spatial-locomotion.md +373 -0
- package/examples/component-spatial-panel.md +330 -0
- package/examples/component-speed-dial-action.md +78 -0
- package/examples/component-speed-dial.md +177 -0
- package/examples/component-spin.md +173 -0
- package/examples/component-spinner.md +204 -0
- package/examples/component-splitter.md +210 -0
- package/examples/component-stack.md +130 -0
- package/examples/component-statistic.md +282 -0
- package/examples/component-step-button.md +157 -0
- package/examples/component-step-connector.md +157 -0
- package/examples/component-step-content.md +121 -0
- package/examples/component-step-icon.md +115 -0
- package/examples/component-step-label.md +101 -0
- package/examples/component-step.md +84 -0
- package/examples/component-steps.md +264 -0
- package/examples/component-stock-chart.md +251 -0
- package/examples/component-swipeable-drawer.md +149 -0
- package/examples/component-switch.md +99 -0
- package/examples/component-tab-scroll-button.md +180 -0
- package/examples/component-tab.md +120 -0
- package/examples/component-table-body.md +82 -0
- package/examples/component-table-cell.md +118 -0
- package/examples/component-table-container.md +75 -0
- package/examples/component-table-footer.md +72 -0
- package/examples/component-table-head.md +78 -0
- package/examples/component-table-pagination.md +137 -0
- package/examples/component-table-row.md +113 -0
- package/examples/component-table-sort-label.md +109 -0
- package/examples/component-table.md +202 -0
- package/examples/component-tabs.md +184 -0
- package/examples/component-tag-badge.md +309 -0
- package/examples/component-tag.md +102 -0
- package/examples/component-testimonial-carousel.md +218 -0
- package/examples/component-textarea-autosize.md +114 -0
- package/examples/component-textarea.md +173 -0
- package/examples/component-time-picker.md +205 -0
- package/examples/component-timeline.md +170 -0
- package/examples/component-toast.md +224 -0
- package/examples/component-toggle-button.md +129 -0
- package/examples/component-toggle.md +220 -0
- package/examples/component-toolbar.md +104 -0
- package/examples/component-tooltip.md +178 -0
- package/examples/component-tour.md +176 -0
- package/examples/component-transaction-list-item.md +243 -0
- package/examples/component-transfer.md +156 -0
- package/examples/component-tree-select.md +202 -0
- package/examples/component-tree.md +297 -0
- package/examples/component-typography.md +215 -0
- package/examples/component-upload.md +295 -0
- package/examples/component-video-hero.md +409 -0
- package/examples/component-video-player.md +340 -0
- package/examples/component-voice-input.md +408 -0
- package/examples/component-watermark.md +217 -0
- package/examples/component-zoom.md +92 -0
- package/examples/doc-explanation-example.md +196 -0
- package/examples/doc-how-to-example.md +205 -0
- package/examples/doc-tutorial-example.md +162 -0
- package/examples/dogfood-korean-fintech-system.md +433 -0
- package/examples/email-transactional-example.md +259 -0
- package/examples/palette-saas-violet.md +235 -0
- package/examples/print-business-card-spec.md +205 -0
- package/examples/print-packaging-spec.md +285 -0
- package/examples/report-example.md +228 -0
- package/examples/slide-deck-example.md +237 -0
- package/examples/website-improvement-report.md +128 -0
- package/examples/website-improvement-workspace.json +126 -0
- package/install.sh +189 -0
- package/knowledge/COVERAGE.md +740 -0
- package/knowledge/PRINCIPLES.md +108 -0
- package/knowledge/a11y/contrast.md +70 -0
- package/knowledge/a11y/keyboard-and-focus.md +108 -0
- package/knowledge/colors/color-theory.md +90 -0
- package/knowledge/colors/mui-palette-structure.md +105 -0
- package/knowledge/colors/palettes-by-product-type.md +876 -0
- package/knowledge/components/INDEX.md +231 -0
- package/knowledge/components/index.json +1470 -0
- package/knowledge/components/shadcn-registry.md +159 -0
- package/knowledge/conversational/ai-chat-interfaces.md +323 -0
- package/knowledge/conversational/chatbot-design.md +312 -0
- package/knowledge/conversational/conversational-ui-fundamentals.md +299 -0
- package/knowledge/conversational/korean-voice-conventions.md +281 -0
- package/knowledge/conversational/voice-ui-patterns.md +297 -0
- package/knowledge/design-tokens/ant-design.md +124 -0
- package/knowledge/design-tokens/material-3.md +235 -0
- package/knowledge/design-tokens/polaris-and-carbon.md +231 -0
- package/knowledge/design-tokens/tailwind-v4.md +284 -0
- package/knowledge/game-ui/game-accessibility.md +317 -0
- package/knowledge/game-ui/game-ui-fundamentals.md +281 -0
- package/knowledge/game-ui/hud-design.md +324 -0
- package/knowledge/game-ui/korean-gaming-conventions.md +312 -0
- package/knowledge/game-ui/menu-systems.md +388 -0
- package/knowledge/i18n/korean-app-store-visual.md +223 -0
- package/knowledge/i18n/korean-document-style.md +301 -0
- package/knowledge/i18n/korean-payments.md +211 -0
- package/knowledge/i18n/korean-product-conventions.md +96 -0
- package/knowledge/i18n/korean-publishing.md +139 -0
- package/knowledge/i18n/korean-typography.md +123 -0
- package/knowledge/icons/curated-sets.md +225 -0
- package/knowledge/illustration/hero-illustrations.md +234 -0
- package/knowledge/illustration/illustration-systems.md +221 -0
- package/knowledge/illustration/mascot-design.md +208 -0
- package/knowledge/illustration/spot-illustrations.md +246 -0
- package/knowledge/illustration/svg-optimization.md +308 -0
- package/knowledge/layout/spacing-and-grid.md +119 -0
- package/knowledge/motion/app-loading-sequences.md +277 -0
- package/knowledge/motion/choreography-depth.md +297 -0
- package/knowledge/motion/marketing-motion.md +223 -0
- package/knowledge/motion/micro-interactions.md +266 -0
- package/knowledge/motion/motion-tools.md +281 -0
- package/knowledge/motion/principles.md +126 -0
- package/knowledge/patterns/auth-flow-design.md +316 -0
- package/knowledge/patterns/b2b-onboarding-flows.md +182 -0
- package/knowledge/patterns/brand-identity.md +238 -0
- package/knowledge/patterns/brand-references.md +97 -0
- package/knowledge/patterns/chart-color-encoding.md +269 -0
- package/knowledge/patterns/chart-types.md +344 -0
- package/knowledge/patterns/dashboard-composition.md +299 -0
- package/knowledge/patterns/design-system-qa.md +356 -0
- package/knowledge/patterns/document-typography.md +248 -0
- package/knowledge/patterns/email-design.md +338 -0
- package/knowledge/patterns/empty-states.md +263 -0
- package/knowledge/patterns/error-states.md +318 -0
- package/knowledge/patterns/form-design.md +237 -0
- package/knowledge/patterns/information-architecture.md +341 -0
- package/knowledge/patterns/landing-hero-design.md +283 -0
- package/knowledge/patterns/landing-page-patterns.md +681 -0
- package/knowledge/patterns/list-and-feed.md +371 -0
- package/knowledge/patterns/mobile-navigation.md +278 -0
- package/knowledge/patterns/money-and-amount.md +301 -0
- package/knowledge/patterns/onboarding.md +300 -0
- package/knowledge/patterns/pricing-page-design.md +261 -0
- package/knowledge/patterns/realtime-data.md +280 -0
- package/knowledge/patterns/report-design.md +330 -0
- package/knowledge/patterns/search-ux.md +373 -0
- package/knowledge/patterns/settings-page.md +325 -0
- package/knowledge/patterns/slide-deck-design.md +316 -0
- package/knowledge/patterns/styles-catalog.md +2599 -0
- package/knowledge/patterns/technical-writing.md +306 -0
- package/knowledge/patterns/ui-reasoning.md +1853 -0
- package/knowledge/patterns/ux-guidelines.md +1454 -0
- package/knowledge/platforms/react-native.md +395 -0
- package/knowledge/print/brochures-and-flyers.md +276 -0
- package/knowledge/print/korean-print-conventions.md +284 -0
- package/knowledge/print/packaging.md +321 -0
- package/knowledge/print/print-fundamentals.md +238 -0
- package/knowledge/print/signage-and-posters.md +235 -0
- package/knowledge/print/stationery.md +262 -0
- package/knowledge/spatial/ar-patterns.md +253 -0
- package/knowledge/spatial/comfort-and-accessibility.md +245 -0
- package/knowledge/spatial/spatial-design-fundamentals.md +346 -0
- package/knowledge/spatial/spatial-ui-elements.md +343 -0
- package/knowledge/spatial/vr-patterns.md +302 -0
- package/knowledge/typography/font-pairings.md +332 -0
- package/knowledge/typography/mui-type-scale.md +57 -0
- package/knowledge/typography/type-scale-fundamentals.md +105 -0
- package/knowledge/video/in-product-video.md +277 -0
- package/knowledge/video/korean-video-conventions.md +247 -0
- package/knowledge/video/marketing-video.md +258 -0
- package/knowledge/video/social-and-short-form.md +257 -0
- package/knowledge/video/video-fundamentals.md +296 -0
- package/package.json +106 -0
- package/skills/README.md +39 -0
- package/skills/color-palette/PLAYBOOK.md +175 -0
- package/skills/color-palette/SKILL.md +6 -0
- package/skills/color-palette/TEMPLATE.md +103 -0
- package/skills/component-spec-writer/PLAYBOOK.md +169 -0
- package/skills/component-spec-writer/SKILL.md +6 -0
- package/skills/component-spec-writer/TEMPLATE.md +115 -0
- package/skills/conversational-ui-designer/PLAYBOOK.md +231 -0
- package/skills/conversational-ui-designer/SKILL.md +6 -0
- package/skills/design-broadcast/PLAYBOOK.md +146 -0
- package/skills/design-broadcast/SKILL.md +6 -0
- package/skills/design-critique/PLAYBOOK.md +137 -0
- package/skills/design-critique/SKILL.md +6 -0
- package/skills/design-pr-review/PLAYBOOK.md +171 -0
- package/skills/design-pr-review/SKILL.md +6 -0
- package/skills/design-system-builder/PLAYBOOK.md +218 -0
- package/skills/design-system-builder/SKILL.md +6 -0
- package/skills/design-system-qa/PLAYBOOK.md +163 -0
- package/skills/design-system-qa/SKILL.md +6 -0
- package/skills/document-author/PLAYBOOK.md +167 -0
- package/skills/document-author/SKILL.md +6 -0
- package/skills/figma-token-sync/PLAYBOOK.md +149 -0
- package/skills/figma-token-sync/SKILL.md +6 -0
- package/skills/game-ui-designer/PLAYBOOK.md +209 -0
- package/skills/game-ui-designer/SKILL.md +6 -0
- package/skills/handoff-spec/PLAYBOOK.md +170 -0
- package/skills/handoff-spec/SKILL.md +6 -0
- package/skills/illustration-designer/PLAYBOOK.md +166 -0
- package/skills/illustration-designer/SKILL.md +6 -0
- package/skills/motion-designer/PLAYBOOK.md +223 -0
- package/skills/motion-designer/SKILL.md +6 -0
- package/skills/print-designer/PLAYBOOK.md +209 -0
- package/skills/print-designer/SKILL.md +6 -0
- package/skills/slide-deck-author/PLAYBOOK.md +198 -0
- package/skills/slide-deck-author/SKILL.md +6 -0
- package/skills/spatial-designer/PLAYBOOK.md +238 -0
- package/skills/spatial-designer/SKILL.md +6 -0
- package/skills/ux-audit/PLAYBOOK.md +142 -0
- package/skills/ux-audit/SKILL.md +6 -0
- package/skills/video-designer/PLAYBOOK.md +240 -0
- package/skills/video-designer/SKILL.md +6 -0
- package/skills/website-improvement/PLAYBOOK.md +118 -0
- package/skills/website-improvement/SKILL.md +6 -0
- package/skills/website-improvement/TEMPLATE.md +103 -0
- package/tools/audit/changelog-generate.py +176 -0
- package/tools/audit/check-coverage.py +483 -0
- package/tools/audit/doctor_assertions.py +256 -0
- package/tools/audit/example-qa.py +108 -0
- package/tools/audit/frontmatter-check.py +199 -0
- package/tools/audit/integration-check.py +95 -0
- package/tools/audit/korean-copy-check.py +161 -0
- package/tools/audit/link-check.py +146 -0
- package/tools/audit/local-ci.py +558 -0
- package/tools/audit/package-contents.py +723 -0
- package/tools/audit/package-smoke.py +22443 -0
- package/tools/audit/raw-hex-check.py +252 -0
- package/tools/audit/registry-smoke.py +8188 -0
- package/tools/audit/release-metadata.py +9832 -0
- package/tools/audit/run-all.py +351 -0
- package/tools/audit/smoke_assertions.py +12742 -0
- package/tools/audit/stability-review.py +332 -0
- package/tools/audit/stale-check.py +156 -0
- package/tools/migrations/add-version-frontmatter.py +132 -0
- package/tools/migrations/bump-last-updated.py +131 -0
- package/tools/migrations/promote-stability.py +172 -0
- package/tools/preview/README.md +58 -0
- 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
|