@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,433 @@
|
|
|
1
|
+
# Dogfood: Korean fintech mobile app — design system bootstrap
|
|
2
|
+
|
|
3
|
+
> **Scenario**: A 가계부 (personal finance tracker) mobile app for Korean millennials/Gen-Z. Brand-new product, no existing design system. Single-founder team — needs to ship MVP in 6 weeks.
|
|
4
|
+
>
|
|
5
|
+
> **Inputs given to the agent**:
|
|
6
|
+
> - Product type: fintech, consumer mobile, Korean primary
|
|
7
|
+
> - Brand: undecided — wants "trustworthy + approachable + youthful"
|
|
8
|
+
> - Stack: React Native + Tailwind via NativeWind, no MUI/Ant
|
|
9
|
+
> - Light + dark mode
|
|
10
|
+
>
|
|
11
|
+
> **Skill used**: `design-system-builder` (which itself orchestrates `color-palette`, `component-spec-writer` patterns)
|
|
12
|
+
>
|
|
13
|
+
> **Output**: this document — a complete bootstrap deliverable a frontend dev could implement against without follow-up.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Foundations
|
|
18
|
+
|
|
19
|
+
### Why this palette
|
|
20
|
+
|
|
21
|
+
Korean fintech consumer apps live or die on **trust** and **approachability**. Trust says cool blue. Approachability says soft saturation, never neon. Youthful says not corporate-Samsung-blue (too cold) — closer to Toss's coral-brand or Kakao Bank's golden warmth, but distinct.
|
|
22
|
+
|
|
23
|
+
Picked: **teal-600 primary** (`#0D9488`). Reasoning:
|
|
24
|
+
- Cool enough to read as financial / trustworthy.
|
|
25
|
+
- Warm enough to not feel sterile (closer to nature than pure blue).
|
|
26
|
+
- Differentiated from the dominant Korean fintech blues (Toss `#3182F6`, KakaoBank `#FFEB00`, NH Bank green `#10B981`).
|
|
27
|
+
- Pairs cleanly with a coral accent for "money in" affordances and slate neutrals for surfaces.
|
|
28
|
+
|
|
29
|
+
Tradeoff accepted: teal is less established as "money color" than blue or green. We claim it intentionally — differentiation matters more than instant-recognition for an MVP.
|
|
30
|
+
|
|
31
|
+
### Tokens — color (light)
|
|
32
|
+
|
|
33
|
+
Generated via `color-palette` skill, citing [knowledge/colors/color-theory.md](../knowledge/colors/color-theory.md), [knowledge/colors/palettes-by-product-type.md](../knowledge/colors/palettes-by-product-type.md), [knowledge/a11y/contrast.md](../knowledge/a11y/contrast.md).
|
|
34
|
+
|
|
35
|
+
```css
|
|
36
|
+
:root {
|
|
37
|
+
/* Primary — teal */
|
|
38
|
+
--color-primary-50: #F0FDFA;
|
|
39
|
+
--color-primary-100: #CCFBF1;
|
|
40
|
+
--color-primary-200: #99F6E4;
|
|
41
|
+
--color-primary-300: #5EEAD4;
|
|
42
|
+
--color-primary-400: #2DD4BF;
|
|
43
|
+
--color-primary-500: #14B8A6;
|
|
44
|
+
--color-primary-600: #0D9488; /* brand anchor — 5.6:1 on white ✓ */
|
|
45
|
+
--color-primary-700: #0F766E;
|
|
46
|
+
--color-primary-800: #115E59;
|
|
47
|
+
--color-primary-900: #134E4A;
|
|
48
|
+
--color-primary-950: #042F2E;
|
|
49
|
+
|
|
50
|
+
/* Accent — coral (money-in / positive amount) */
|
|
51
|
+
--color-accent-50: #FFF1F2;
|
|
52
|
+
--color-accent-500: #F43F5E;
|
|
53
|
+
--color-accent-600: #E11D48; /* 4.8:1 on white ✓ */
|
|
54
|
+
|
|
55
|
+
/* Neutrals — warm-leaning slate (cleaner with Hangul) */
|
|
56
|
+
--color-neutral-50: #F8FAFC;
|
|
57
|
+
--color-neutral-100: #F1F5F9;
|
|
58
|
+
--color-neutral-200: #E2E8F0;
|
|
59
|
+
--color-neutral-300: #CBD5E1;
|
|
60
|
+
--color-neutral-400: #94A3B8;
|
|
61
|
+
--color-neutral-500: #64748B;
|
|
62
|
+
--color-neutral-600: #475569;
|
|
63
|
+
--color-neutral-700: #334155;
|
|
64
|
+
--color-neutral-800: #1E293B;
|
|
65
|
+
--color-neutral-900: #0F172A;
|
|
66
|
+
|
|
67
|
+
/* Semantic — light */
|
|
68
|
+
--color-bg-default: #FFFFFF;
|
|
69
|
+
--color-bg-elevated: #F8FAFC; /* cards */
|
|
70
|
+
--color-bg-subtle: #F1F5F9; /* section bg, hover */
|
|
71
|
+
|
|
72
|
+
--color-text-primary: #0F172A; /* 18.7:1 on white */
|
|
73
|
+
--color-text-secondary: #475569; /* 7.4:1 */
|
|
74
|
+
--color-text-tertiary: #64748B; /* 4.9:1 — passes AA body */
|
|
75
|
+
--color-text-disabled: #94A3B8; /* aria-disabled only */
|
|
76
|
+
|
|
77
|
+
--color-border-default: #E2E8F0;
|
|
78
|
+
--color-border-strong: #CBD5E1;
|
|
79
|
+
--color-divider: #F1F5F9;
|
|
80
|
+
|
|
81
|
+
--color-primary-default: #0D9488;
|
|
82
|
+
--color-primary-hover: #0F766E;
|
|
83
|
+
--color-primary-active: #115E59;
|
|
84
|
+
--color-primary-subtle-bg: #F0FDFA;
|
|
85
|
+
--color-on-primary: #FFFFFF;
|
|
86
|
+
|
|
87
|
+
--color-focus-ring: #5EEAD4; /* primary-300 — 3:1 on both white and primary */
|
|
88
|
+
|
|
89
|
+
/* Money-specific (fintech essential) */
|
|
90
|
+
--color-money-positive: #16A34A; /* income, deposits — green-600 */
|
|
91
|
+
--color-money-negative: #DC2626; /* expense, withdrawal — red-600 */
|
|
92
|
+
--color-money-neutral: #475569; /* unchanged amount, transfer */
|
|
93
|
+
|
|
94
|
+
--color-success: #16A34A;
|
|
95
|
+
--color-success-subtle-bg: #F0FDF4;
|
|
96
|
+
--color-warning: #D97706;
|
|
97
|
+
--color-warning-subtle-bg: #FFFBEB;
|
|
98
|
+
--color-error: #DC2626;
|
|
99
|
+
--color-error-subtle-bg: #FEF2F2;
|
|
100
|
+
--color-info: #0D9488; /* matches primary */
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Tokens — color (dark)
|
|
105
|
+
|
|
106
|
+
Recomputed, not inverted. Cite [knowledge/colors/color-theory.md](../knowledge/colors/color-theory.md) for the recompute approach.
|
|
107
|
+
|
|
108
|
+
```css
|
|
109
|
+
.dark {
|
|
110
|
+
--color-bg-default: #020617; /* near-black with slate hue */
|
|
111
|
+
--color-bg-elevated: #0F172A;
|
|
112
|
+
--color-bg-subtle: #1E293B;
|
|
113
|
+
|
|
114
|
+
--color-text-primary: #F8FAFC; /* 17.4:1 on bg-default */
|
|
115
|
+
--color-text-secondary: #CBD5E1;
|
|
116
|
+
--color-text-tertiary: #94A3B8;
|
|
117
|
+
--color-text-disabled: #64748B;
|
|
118
|
+
|
|
119
|
+
--color-border-default: #334155;
|
|
120
|
+
--color-border-strong: #475569;
|
|
121
|
+
--color-divider: #1E293B;
|
|
122
|
+
|
|
123
|
+
--color-primary-default: #2DD4BF; /* primary-400 — pops on dark */
|
|
124
|
+
--color-primary-hover: #5EEAD4;
|
|
125
|
+
--color-primary-active: #99F6E4;
|
|
126
|
+
--color-primary-subtle-bg: #042F2E; /* primary-950 */
|
|
127
|
+
--color-on-primary: #042F2E;
|
|
128
|
+
|
|
129
|
+
--color-focus-ring: #2DD4BF;
|
|
130
|
+
|
|
131
|
+
--color-money-positive: #4ADE80; /* green-400 — chroma boost for low-light eye */
|
|
132
|
+
--color-money-negative: #F87171; /* red-400 */
|
|
133
|
+
--color-money-neutral: #94A3B8;
|
|
134
|
+
|
|
135
|
+
--color-success: #4ADE80;
|
|
136
|
+
--color-warning: #FBBF24;
|
|
137
|
+
--color-error: #F87171;
|
|
138
|
+
--color-info: #2DD4BF;
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Contrast matrix
|
|
143
|
+
|
|
144
|
+
| Pair (light) | Ratio | AA body | AA UI |
|
|
145
|
+
| --- | --- | --- | --- |
|
|
146
|
+
| text-primary on bg-default | 18.7:1 | ✓ | — |
|
|
147
|
+
| text-secondary on bg-default | 7.4:1 | ✓ | — |
|
|
148
|
+
| text-tertiary on bg-default | 4.9:1 | ✓ | — |
|
|
149
|
+
| primary-default on bg-default | 5.6:1 | ✓ | — |
|
|
150
|
+
| on-primary on primary-default | 8.0:1 | ✓ | — |
|
|
151
|
+
| focus-ring on bg-default | 3.1:1 | — | ✓ |
|
|
152
|
+
| focus-ring on primary-default | 3.0:1 | — | ✓ |
|
|
153
|
+
| money-positive on bg-default | 4.5:1 | ✓ | — |
|
|
154
|
+
| money-negative on bg-default | 4.8:1 | ✓ | — |
|
|
155
|
+
|
|
156
|
+
| Pair (dark) | Ratio | AA body | AA UI |
|
|
157
|
+
| --- | --- | --- | --- |
|
|
158
|
+
| text-primary on bg-default | 17.4:1 | ✓ | — |
|
|
159
|
+
| text-secondary on bg-default | 11.6:1 | ✓ | — |
|
|
160
|
+
| primary-default on bg-default | 7.2:1 | ✓ | — |
|
|
161
|
+
| focus-ring on bg-default | 7.2:1 | — | ✓ |
|
|
162
|
+
|
|
163
|
+
### Typography
|
|
164
|
+
|
|
165
|
+
Korean primary → Pretendard. Cite [knowledge/i18n/korean-typography.md](../knowledge/i18n/korean-typography.md) for stack rationale.
|
|
166
|
+
|
|
167
|
+
```css
|
|
168
|
+
:root {
|
|
169
|
+
--font-family-base: 'Pretendard', -apple-system, BlinkMacSystemFont,
|
|
170
|
+
'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif;
|
|
171
|
+
--font-family-mono: 'Pretendard JetBrains Mono', ui-monospace, Menlo, monospace;
|
|
172
|
+
|
|
173
|
+
/* Numerals — tabular for amounts */
|
|
174
|
+
--font-feature-amount: 'tnum' 1;
|
|
175
|
+
|
|
176
|
+
/* Scale — base 15 for mobile-primary, ratio 1.25 (major third) */
|
|
177
|
+
--font-size-xs: 12px;
|
|
178
|
+
--font-size-sm: 13px;
|
|
179
|
+
--font-size-base: 15px;
|
|
180
|
+
--font-size-lg: 17px;
|
|
181
|
+
--font-size-xl: 20px;
|
|
182
|
+
--font-size-2xl: 24px;
|
|
183
|
+
--font-size-3xl: 30px;
|
|
184
|
+
--font-size-4xl: 38px; /* hero amount displays */
|
|
185
|
+
|
|
186
|
+
/* Line heights — Korean +10% from Latin defaults */
|
|
187
|
+
--line-height-tight: 1.25;
|
|
188
|
+
--line-height-base: 1.6; /* body — Korean adjustment */
|
|
189
|
+
--line-height-relaxed: 1.75;
|
|
190
|
+
|
|
191
|
+
/* Weights */
|
|
192
|
+
--font-weight-regular: 400;
|
|
193
|
+
--font-weight-medium: 500;
|
|
194
|
+
--font-weight-semibold: 600; /* body emphasis — Korean reads thin at 500 */
|
|
195
|
+
--font-weight-bold: 700;
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Variants:
|
|
200
|
+
|
|
201
|
+
| Token | Family | Weight | Size | LH | LS | Use |
|
|
202
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
203
|
+
| `display` | base | 700 | 38px | 1.2 | -0.01em | hero amounts, balance display |
|
|
204
|
+
| `heading-lg` | base | 700 | 24px | 1.3 | 0 | screen titles |
|
|
205
|
+
| `heading-md` | base | 600 | 20px | 1.4 | 0 | section titles |
|
|
206
|
+
| `heading-sm` | base | 600 | 17px | 1.4 | 0 | card titles |
|
|
207
|
+
| `body-lg` | base | 400 | 17px | 1.6 | 0 | important body |
|
|
208
|
+
| `body` | base | 400 | 15px | 1.6 | 0 | default body |
|
|
209
|
+
| `body-sm` | base | 400 | 13px | 1.6 | 0 | secondary text |
|
|
210
|
+
| `caption` | base | 400 | 12px | 1.5 | 0 | timestamps, metadata |
|
|
211
|
+
| `amount` | base | 600 | varies | 1.2 | -0.01em | monetary amounts (tnum) |
|
|
212
|
+
|
|
213
|
+
`amount` variant has `font-feature-settings: 'tnum'` so digits align in columns (essential for transaction lists). Cite [knowledge/typography/type-scale-fundamentals.md](../knowledge/typography/type-scale-fundamentals.md).
|
|
214
|
+
|
|
215
|
+
### Spacing
|
|
216
|
+
|
|
217
|
+
4-base scale per [knowledge/layout/spacing-and-grid.md](../knowledge/layout/spacing-and-grid.md):
|
|
218
|
+
|
|
219
|
+
```css
|
|
220
|
+
:root {
|
|
221
|
+
--space-2xs: 2px;
|
|
222
|
+
--space-xs: 4px;
|
|
223
|
+
--space-sm: 8px;
|
|
224
|
+
--space-md: 12px;
|
|
225
|
+
--space-base: 16px;
|
|
226
|
+
--space-lg: 20px;
|
|
227
|
+
--space-xl: 24px;
|
|
228
|
+
--space-2xl: 32px;
|
|
229
|
+
--space-3xl: 48px;
|
|
230
|
+
--space-4xl: 64px;
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Density bias for Korean consumer apps: **higher than Western defaults** (cite [knowledge/i18n/korean-product-conventions.md](../knowledge/i18n/korean-product-conventions.md)). List items use `--space-md` vertical padding (not `--space-base`); cards use `--space-base` (not `--space-lg`).
|
|
235
|
+
|
|
236
|
+
### Radius
|
|
237
|
+
|
|
238
|
+
```css
|
|
239
|
+
:root {
|
|
240
|
+
--radius-sm: 6px;
|
|
241
|
+
--radius-md: 10px; /* default — friendly but not toy */
|
|
242
|
+
--radius-lg: 16px; /* cards, sheets */
|
|
243
|
+
--radius-xl: 24px; /* hero modules */
|
|
244
|
+
--radius-full: 9999px; /* pills, avatars */
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Elevation
|
|
249
|
+
|
|
250
|
+
Mobile-first: avoid heavy shadows (battery, GPU). Use border-default for separation; reserve shadow for floating UI.
|
|
251
|
+
|
|
252
|
+
```css
|
|
253
|
+
:root {
|
|
254
|
+
--shadow-none: none;
|
|
255
|
+
--shadow-card: 0 1px 2px rgba(15, 23, 42, 0.04), 0 0 0 1px rgba(15, 23, 42, 0.04); /* very soft border-shadow combo */
|
|
256
|
+
--shadow-popover: 0 12px 24px rgba(15, 23, 42, 0.10); /* dropdown, popover */
|
|
257
|
+
--shadow-modal: 0 24px 48px rgba(15, 23, 42, 0.18); /* sheet, modal */
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.dark {
|
|
261
|
+
--shadow-card: none; /* in dark, use --color-bg-elevated for separation, no shadow */
|
|
262
|
+
--shadow-popover: 0 12px 24px rgba(0, 0, 0, 0.5);
|
|
263
|
+
--shadow-modal: 0 24px 48px rgba(0, 0, 0, 0.6);
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Motion
|
|
268
|
+
|
|
269
|
+
Cite [knowledge/motion/principles.md](../knowledge/motion/principles.md):
|
|
270
|
+
|
|
271
|
+
```css
|
|
272
|
+
:root {
|
|
273
|
+
--motion-fast: 150ms;
|
|
274
|
+
--motion-default: 250ms;
|
|
275
|
+
--motion-slow: 400ms;
|
|
276
|
+
|
|
277
|
+
--easing-out: cubic-bezier(0, 0, 0.2, 1); /* entrances */
|
|
278
|
+
--easing-in: cubic-bezier(0.4, 0, 1, 1); /* exits */
|
|
279
|
+
--easing-in-out: cubic-bezier(0.4, 0, 0.2, 1); /* position changes */
|
|
280
|
+
--easing-emphasized: cubic-bezier(0.2, 0, 0, 1); /* hero moments */
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
@media (prefers-reduced-motion: reduce) {
|
|
284
|
+
:root {
|
|
285
|
+
--motion-fast: 0ms;
|
|
286
|
+
--motion-default: 0ms;
|
|
287
|
+
--motion-slow: 0ms;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 2. Component baseline
|
|
295
|
+
|
|
296
|
+
**Picked: shadcn-ui (NativeWind/Tailwind compatible variants).**
|
|
297
|
+
|
|
298
|
+
Reasoning:
|
|
299
|
+
- Stack mandate (NativeWind) → tokens-via-CSS-variables, not theme-prop pattern.
|
|
300
|
+
- Solo founder → wants to **own** the components, not depend on a library that locks the API.
|
|
301
|
+
- Korean market → expect to override copy, validation rules, payment integrations heavily; copy-paste suits.
|
|
302
|
+
- Speed → shadcn add-by-name is the fastest path to "shipped".
|
|
303
|
+
|
|
304
|
+
Rejected:
|
|
305
|
+
- **MUI**: ThemeProvider-based, doesn't translate cleanly to React Native.
|
|
306
|
+
- **Ant Design Mobile**: powerful but Chinese-market-coded; less common in Korean consumer apps; aesthetic doesn't fit modern Korean fintech.
|
|
307
|
+
- **NativeBase / Tamagui**: Tailwind-adjacent but smaller community in Korea.
|
|
308
|
+
|
|
309
|
+
For React Native specifically: shadcn-ui has community RN ports (`gluestack-ui` is the closest 1:1, or use shadcn web → adapt). Spec the components per [skills/component-spec-writer/PLAYBOOK.md](../skills/component-spec-writer/PLAYBOOK.md) and pick the implementation per platform.
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## 3. Starter component set (v0.1.0)
|
|
314
|
+
|
|
315
|
+
The minimum to ship MVP. Each one is either **derived** (use shadcn baseline + token override) or **custom** (needs its own spec — fintech-specific).
|
|
316
|
+
|
|
317
|
+
### Derived from shadcn baseline
|
|
318
|
+
|
|
319
|
+
- Button — see [examples/component-button.md](component-button.md)
|
|
320
|
+
- Input — see [examples/component-input.md](component-input.md)
|
|
321
|
+
- Modal / Sheet — see [examples/component-modal.md](component-modal.md) (use Sheet variant for mobile)
|
|
322
|
+
- Toast — see [examples/component-toast.md](component-toast.md)
|
|
323
|
+
- Card — see [examples/component-card.md](component-card.md)
|
|
324
|
+
- Badge, Tag
|
|
325
|
+
- Tabs (bottom tab bar specifically)
|
|
326
|
+
- Switch, Checkbox, Radio
|
|
327
|
+
- Skeleton
|
|
328
|
+
|
|
329
|
+
### Custom — needs in-house spec (Phase 2 work)
|
|
330
|
+
|
|
331
|
+
- **AmountInput** — number-formatted, comma-separator, ₩ suffix, KRW-rounded validation. Most-used input in the app.
|
|
332
|
+
- **TransactionListItem** — composed of icon + category + memo + amount; tabular numerals; pressable.
|
|
333
|
+
- **CategoryPicker** — emoji + Korean label, scrollable horizontal pill list.
|
|
334
|
+
- **DateRangeSelector** — supports Korean expressions ("이번 달", "지난 달", "최근 7일").
|
|
335
|
+
- **AccountCard** — bank logo + nickname + masked account number + balance.
|
|
336
|
+
- **AmountDisplay** — large display variant for "balance" hero with breakdown chips.
|
|
337
|
+
- **BiometricGate** — fingerprint/face-id wall (Korean fintech expectation).
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 4. Foundations document — color usage
|
|
342
|
+
|
|
343
|
+
When to use each color:
|
|
344
|
+
|
|
345
|
+
- **`--color-primary-default`**: primary CTA only ("이체하기", "확인", "다음"). One per screen.
|
|
346
|
+
- **`--color-money-positive`**: amount text when positive (income line, deposit, balance increase). NOT for buttons.
|
|
347
|
+
- **`--color-money-negative`**: amount text when negative (expense, withdrawal). NOT for "destructive" buttons — use `--color-error` for those.
|
|
348
|
+
- **`--color-error`**: validation errors, destructive button intent.
|
|
349
|
+
- **`--color-text-primary`**: body, neutral amounts.
|
|
350
|
+
- **`--color-accent`**: rarely — promotional banners, "new" badges. Not for amount semantics.
|
|
351
|
+
|
|
352
|
+
Don't:
|
|
353
|
+
- Don't use `--color-primary-default` for amount text. Money color is its own axis.
|
|
354
|
+
- Don't use `--color-money-positive` for success buttons — use `--color-success`. Money colors are noun-scoped (the amount is income), not adjective-scoped (the action succeeded).
|
|
355
|
+
- Don't use `--color-error` for the negative-amount text. Negative != bad.
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
## 5. Foundations document — Korean considerations
|
|
360
|
+
|
|
361
|
+
Cite [knowledge/i18n/korean-product-conventions.md](../knowledge/i18n/korean-product-conventions.md), [knowledge/i18n/korean-publishing.md](../knowledge/i18n/korean-publishing.md).
|
|
362
|
+
|
|
363
|
+
- **Phone-first auth**: KakaoTalk login as primary social, SMS verification for native sign-up. Apple/Google login below.
|
|
364
|
+
- **본인인증**: integrate PASS or NICE for transactions over ₩500K (typical fintech threshold).
|
|
365
|
+
- **Address**: Daum Postcode API for any address field.
|
|
366
|
+
- **Payment integrations**: Toss Payments SDK (cards), KakaoPay/NaverPay (wallets), 휴대폰결제 (small amounts).
|
|
367
|
+
- **Currency display**: `1,200,000원` (Korean consumer convention) or `₩1,200,000` (Western/fintech). Pick one — default to `원` suffix for consumer warmth.
|
|
368
|
+
- **Date format**: `2026.05.07` (compact) or `2026년 5월 7일` (formal). Default compact in tables, formal in transaction details.
|
|
369
|
+
- **Tone**: polite/honorific in error messages ("오류가 발생했습니다"), casual in CTAs ("저장", not "저장하시겠습니까").
|
|
370
|
+
- **Submission compliance**: separate marketing-consent checkbox at signup; in-app permission disclosure popups before requesting Android permissions; GRAC age rating not needed (non-game).
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## 6. Output structure (what to commit)
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
fintech-app/
|
|
378
|
+
├── tokens/
|
|
379
|
+
│ ├── source.json # Style Dictionary source (W3C DTCG)
|
|
380
|
+
│ └── README.md
|
|
381
|
+
├── src/
|
|
382
|
+
│ ├── styles/
|
|
383
|
+
│ │ ├── tokens.css # generated
|
|
384
|
+
│ │ └── tokens.tailwind.js # generated
|
|
385
|
+
│ ├── components/
|
|
386
|
+
│ │ ├── Button/
|
|
387
|
+
│ │ ├── Input/
|
|
388
|
+
│ │ ├── AmountInput/ # custom
|
|
389
|
+
│ │ ├── TransactionListItem/ # custom
|
|
390
|
+
│ │ └── ...
|
|
391
|
+
│ └── theme/
|
|
392
|
+
│ └── ThemeProvider.tsx
|
|
393
|
+
├── docs/
|
|
394
|
+
│ ├── FOUNDATIONS.md # color, type, spacing, motion, iconography rules
|
|
395
|
+
│ ├── KOREAN.md # Korean-specific patterns
|
|
396
|
+
│ └── COMPONENTS.md # component inventory + status
|
|
397
|
+
└── style-dictionary.config.json
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
`tokens/source.json` is the canonical source. Style Dictionary builds the rest.
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## 7. Hand-off — what eng needs to do
|
|
405
|
+
|
|
406
|
+
1. `npm install -D style-dictionary` and copy `style-dictionary.config.json` (see [docs/TOKEN-SYNC.md](../docs/TOKEN-SYNC.md)).
|
|
407
|
+
2. Create `tokens/source.json` from this document (use Style Dictionary V4 W3C format).
|
|
408
|
+
3. Run `npx style-dictionary build`. Outputs land in `src/styles/`.
|
|
409
|
+
4. `npx shadcn@latest add button input dialog sheet sonner card badge tabs switch checkbox radio skeleton` — pulls baseline components.
|
|
410
|
+
5. For each baseline, override the CSS-vars usage to point at our token names (a 5-min find-replace per component).
|
|
411
|
+
6. Implement custom components from the Phase 2 list. Each gets its own spec via `component-spec-writer` skill.
|
|
412
|
+
7. Wire up Toss Payments / KakaoPay SDKs.
|
|
413
|
+
8. Add Daum Postcode for address fields.
|
|
414
|
+
9. Implement Korean publishing checklist before submission to App Store / Play.
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## Cited sources
|
|
419
|
+
|
|
420
|
+
- [knowledge/colors/color-theory.md](../knowledge/colors/color-theory.md)
|
|
421
|
+
- [knowledge/colors/palettes-by-product-type.md](../knowledge/colors/palettes-by-product-type.md)
|
|
422
|
+
- [knowledge/a11y/contrast.md](../knowledge/a11y/contrast.md)
|
|
423
|
+
- [knowledge/typography/type-scale-fundamentals.md](../knowledge/typography/type-scale-fundamentals.md)
|
|
424
|
+
- [knowledge/typography/font-pairings.md](../knowledge/typography/font-pairings.md)
|
|
425
|
+
- [knowledge/layout/spacing-and-grid.md](../knowledge/layout/spacing-and-grid.md)
|
|
426
|
+
- [knowledge/motion/principles.md](../knowledge/motion/principles.md)
|
|
427
|
+
- [knowledge/i18n/korean-typography.md](../knowledge/i18n/korean-typography.md)
|
|
428
|
+
- [knowledge/i18n/korean-product-conventions.md](../knowledge/i18n/korean-product-conventions.md)
|
|
429
|
+
- [knowledge/i18n/korean-publishing.md](../knowledge/i18n/korean-publishing.md)
|
|
430
|
+
- [knowledge/components/INDEX.md](../knowledge/components/INDEX.md)
|
|
431
|
+
- [skills/design-system-builder/PLAYBOOK.md](../skills/design-system-builder/PLAYBOOK.md)
|
|
432
|
+
- [skills/color-palette/PLAYBOOK.md](../skills/color-palette/PLAYBOOK.md)
|
|
433
|
+
- [docs/TOKEN-SYNC.md](../docs/TOKEN-SYNC.md)
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Worked example: transactional email (Korean fintech)
|
|
2
|
+
|
|
3
|
+
> Generated by `skills/document-author` (with email subtype) or by direct application of `knowledge/patterns/email-design.md`. Demonstrates a Korean transactional email with all the required elements: preheader, bulletproof button, sender info per Korean spam law, receipt-style breakdown.
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
|
|
7
|
+
A Korean 가계부 / fintech app sends a "결제 완료" email after each transaction. Required:
|
|
8
|
+
- Korean ~합니다 voice (formal — fintech)
|
|
9
|
+
- Order detail prominent
|
|
10
|
+
- Single primary CTA
|
|
11
|
+
- Sender info per 정보통신망법
|
|
12
|
+
- Mobile + desktop responsive
|
|
13
|
+
- Tested in Apple Mail, Gmail, Outlook, Naver Mail, Daum Hanmail
|
|
14
|
+
|
|
15
|
+
## Subject + preheader
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Subject: 결제 완료 — 주문번호 #1234
|
|
19
|
+
Preheader: 스타벅스 강남점 ₩9,000 · 카카오페이로 결제됨
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Subject under 50 chars. Preheader specific (amount + merchant).
|
|
23
|
+
|
|
24
|
+
## Email body (rendered React Email / MJML output)
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { EmailLayout, Heading, Paragraph, Button, Section, Hr, Img } from "@/email";
|
|
28
|
+
|
|
29
|
+
export function PaymentReceiptEmail({ user, order }: Props) {
|
|
30
|
+
return (
|
|
31
|
+
<EmailLayout
|
|
32
|
+
preheader={`${order.merchant} ${formatKRW(order.total)} · ${order.paymentMethodLabel}로 결제됨`}
|
|
33
|
+
lang="ko"
|
|
34
|
+
brandColor="#0D9488"
|
|
35
|
+
>
|
|
36
|
+
<EmailLayout.Header>
|
|
37
|
+
<Img src="https://example.com/logo.png" alt="우리 가계부" width="120" height="40" />
|
|
38
|
+
</EmailLayout.Header>
|
|
39
|
+
|
|
40
|
+
<EmailLayout.Body>
|
|
41
|
+
<Heading style={{ fontSize: 24, fontWeight: 700, marginBottom: 8 }}>
|
|
42
|
+
결제가 완료되었습니다
|
|
43
|
+
</Heading>
|
|
44
|
+
<Paragraph style={{ color: "#475569", fontSize: 14, marginBottom: 24 }}>
|
|
45
|
+
{formatKRDate(order.completedAt, "long")}
|
|
46
|
+
</Paragraph>
|
|
47
|
+
|
|
48
|
+
<Paragraph>
|
|
49
|
+
{user.name} 님, 안녕하세요.
|
|
50
|
+
</Paragraph>
|
|
51
|
+
<Paragraph>
|
|
52
|
+
<strong>{order.merchant}</strong>에서 {formatKRW(order.total)} 결제가
|
|
53
|
+
정상적으로 처리되었습니다.
|
|
54
|
+
</Paragraph>
|
|
55
|
+
|
|
56
|
+
{/* Receipt-style summary box */}
|
|
57
|
+
<Section style={{
|
|
58
|
+
background: "#F8FAFC",
|
|
59
|
+
padding: 20,
|
|
60
|
+
borderRadius: 8,
|
|
61
|
+
marginTop: 24,
|
|
62
|
+
}}>
|
|
63
|
+
<Heading as="h2" style={{ fontSize: 16, fontWeight: 600, marginBottom: 12 }}>
|
|
64
|
+
주문 정보
|
|
65
|
+
</Heading>
|
|
66
|
+
<Hr style={{ borderColor: "#E2E8F0", borderStyle: "dashed", margin: "12px 0" }} />
|
|
67
|
+
|
|
68
|
+
<table role="presentation" cellPadding="0" cellSpacing="0" style={{ width: "100%" }}>
|
|
69
|
+
<tbody>
|
|
70
|
+
<tr><td style={{ color: "#64748B", padding: "4px 0" }}>주문번호</td>
|
|
71
|
+
<td style={{ textAlign: "right", padding: "4px 0", fontFamily: "monospace" }}>
|
|
72
|
+
#{order.id}
|
|
73
|
+
</td></tr>
|
|
74
|
+
<tr><td style={{ color: "#64748B", padding: "4px 0" }}>결제 수단</td>
|
|
75
|
+
<td style={{ textAlign: "right", padding: "4px 0" }}>
|
|
76
|
+
{order.paymentMethodLabel}
|
|
77
|
+
</td></tr>
|
|
78
|
+
<tr><td style={{ color: "#64748B", padding: "4px 0" }}>결제 시각</td>
|
|
79
|
+
<td style={{ textAlign: "right", padding: "4px 0" }}>
|
|
80
|
+
{formatKRTime(order.completedAt)}
|
|
81
|
+
</td></tr>
|
|
82
|
+
</tbody>
|
|
83
|
+
</table>
|
|
84
|
+
|
|
85
|
+
<Hr style={{ borderColor: "#E2E8F0", borderStyle: "dashed", margin: "16px 0" }} />
|
|
86
|
+
|
|
87
|
+
{/* Items */}
|
|
88
|
+
{order.items.map(item => (
|
|
89
|
+
<table key={item.id} role="presentation" style={{ width: "100%", marginBottom: 8 }}>
|
|
90
|
+
<tr>
|
|
91
|
+
<td style={{ padding: "4px 0" }}>
|
|
92
|
+
{item.name}
|
|
93
|
+
{item.quantity > 1 && <span style={{ color: "#64748B" }}> × {item.quantity}</span>}
|
|
94
|
+
</td>
|
|
95
|
+
<td style={{ textAlign: "right", padding: "4px 0", fontFeatureSettings: "'tnum'" }}>
|
|
96
|
+
{formatKRW(item.totalPrice)}
|
|
97
|
+
</td>
|
|
98
|
+
</tr>
|
|
99
|
+
</table>
|
|
100
|
+
))}
|
|
101
|
+
|
|
102
|
+
<Hr style={{ borderColor: "#E2E8F0", borderStyle: "dashed", margin: "16px 0" }} />
|
|
103
|
+
|
|
104
|
+
{/* Total */}
|
|
105
|
+
<table role="presentation" style={{ width: "100%" }}>
|
|
106
|
+
<tr>
|
|
107
|
+
<td style={{ fontWeight: 700, padding: "8px 0" }}>총 결제 금액</td>
|
|
108
|
+
<td style={{
|
|
109
|
+
textAlign: "right",
|
|
110
|
+
fontWeight: 700,
|
|
111
|
+
fontSize: 18,
|
|
112
|
+
fontFeatureSettings: "'tnum'",
|
|
113
|
+
padding: "8px 0",
|
|
114
|
+
}}>
|
|
115
|
+
{formatKRW(order.total)}
|
|
116
|
+
</td>
|
|
117
|
+
</tr>
|
|
118
|
+
</table>
|
|
119
|
+
</Section>
|
|
120
|
+
|
|
121
|
+
{/* Primary CTA — bulletproof button */}
|
|
122
|
+
<table role="presentation" cellPadding="0" cellSpacing="0" style={{ marginTop: 32 }}>
|
|
123
|
+
<tr>
|
|
124
|
+
<td bgcolor="#0D9488" style={{ borderRadius: 8 }}>
|
|
125
|
+
<a href={`https://example.com/orders/${order.id}`}
|
|
126
|
+
style={{
|
|
127
|
+
display: "inline-block",
|
|
128
|
+
padding: "14px 32px",
|
|
129
|
+
color: "#FFFFFF",
|
|
130
|
+
textDecoration: "none",
|
|
131
|
+
fontFamily: "Pretendard, -apple-system, sans-serif",
|
|
132
|
+
fontSize: 16,
|
|
133
|
+
fontWeight: 600,
|
|
134
|
+
borderRadius: 8,
|
|
135
|
+
}}>
|
|
136
|
+
주문 상세 보기
|
|
137
|
+
</a>
|
|
138
|
+
</td>
|
|
139
|
+
</tr>
|
|
140
|
+
</table>
|
|
141
|
+
|
|
142
|
+
<Paragraph style={{ color: "#64748B", fontSize: 14, marginTop: 32 }}>
|
|
143
|
+
본인이 결제하지 않으셨다면 즉시{" "}
|
|
144
|
+
<a href="https://example.com/support" style={{ color: "#0D9488" }}>
|
|
145
|
+
고객센터
|
|
146
|
+
</a>
|
|
147
|
+
로 문의해 주세요.
|
|
148
|
+
</Paragraph>
|
|
149
|
+
</EmailLayout.Body>
|
|
150
|
+
|
|
151
|
+
<EmailLayout.Footer>
|
|
152
|
+
<Paragraph style={{ fontSize: 12, color: "#94A3B8", lineHeight: 1.6 }}>
|
|
153
|
+
(주)우리가계부 · 대표 김민지 · 사업자등록번호 123-45-67890<br />
|
|
154
|
+
서울특별시 강남구 테헤란로 123, 5층<br />
|
|
155
|
+
문의: <a href="mailto:support@example.com" style={{ color: "#94A3B8" }}>support@example.com</a>
|
|
156
|
+
{" · "}
|
|
157
|
+
전화 02-1234-5678 (평일 09:00–18:00)
|
|
158
|
+
</Paragraph>
|
|
159
|
+
<Paragraph style={{ fontSize: 12, color: "#94A3B8", marginTop: 12 }}>
|
|
160
|
+
본 메일은 결제 완료 안내를 위한 발송 메일입니다. 광고가 아닙니다.
|
|
161
|
+
</Paragraph>
|
|
162
|
+
</EmailLayout.Footer>
|
|
163
|
+
</EmailLayout>
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## What this demonstrates
|
|
169
|
+
|
|
170
|
+
- **Subject + preheader pair**: subject is action-specific, preheader fills inbox preview with detail.
|
|
171
|
+
- **Greeting**: 사용자 이름 + 안녕하세요 (Korean polite opener).
|
|
172
|
+
- **Receipt structure**: dashed dividers between sections (Korean receipt convention — see [`examples/component-payment-receipt.md`](component-payment-receipt.md)).
|
|
173
|
+
- **Tabular numerals** on amounts (`fontFeatureSettings: 'tnum'`).
|
|
174
|
+
- **Bulletproof button** for "주문 상세 보기" — works in Outlook desktop.
|
|
175
|
+
- **Single primary CTA** — no marketing tacked on.
|
|
176
|
+
- **Help text** below CTA — fraud-detection path ("본인이 결제하지 않으셨다면").
|
|
177
|
+
- **Footer with sender info** per 정보통신망법: company, representative, business registration, address, contact.
|
|
178
|
+
- **Explicit "광고가 아닙니다"** — distinguishes from marketing emails (which require `[광고]` prefix in subject).
|
|
179
|
+
|
|
180
|
+
## Sender + identity guarantees
|
|
181
|
+
|
|
182
|
+
For DKIM / SPF / DMARC:
|
|
183
|
+
- Send from `noreply@example.com` (different from contact `support@`).
|
|
184
|
+
- Reply-To set to `support@example.com` (real address).
|
|
185
|
+
- DMARC policy `p=quarantine` minimum.
|
|
186
|
+
- For Korean delivery to Naver / Daum: register sender domain with KISA (Korea Internet & Security Agency) for whitelist treatment.
|
|
187
|
+
|
|
188
|
+
## Mobile rendering
|
|
189
|
+
|
|
190
|
+
The `EmailLayout` wrapper applies the `@media (max-width: 480px)` rules:
|
|
191
|
+
- Container goes full-width.
|
|
192
|
+
- Padding reduces 24px → 16px.
|
|
193
|
+
- Receipt table cells stay legible.
|
|
194
|
+
|
|
195
|
+
## Test matrix
|
|
196
|
+
|
|
197
|
+
Before shipping any new transactional template, render through:
|
|
198
|
+
|
|
199
|
+
| Client | Expected behavior |
|
|
200
|
+
| --- | --- |
|
|
201
|
+
| Gmail (web) | Renders cleanly with brand color |
|
|
202
|
+
| Gmail iOS | Renders cleanly |
|
|
203
|
+
| Apple Mail (Mac) | Renders cleanly; "Hide image" doesn't break content |
|
|
204
|
+
| Apple Mail (iOS 17+) | Renders cleanly; loads images without privacy alert |
|
|
205
|
+
| Outlook desktop (Windows) | Bulletproof button works; no broken layout |
|
|
206
|
+
| Outlook web | Renders cleanly |
|
|
207
|
+
| Naver Mail | Renders cleanly with Korean characters |
|
|
208
|
+
| Daum Hanmail | Renders cleanly with Korean characters |
|
|
209
|
+
|
|
210
|
+
Use Litmus or Email on Acid for parallel client previews.
|
|
211
|
+
|
|
212
|
+
## Common variations
|
|
213
|
+
|
|
214
|
+
### Order failed (transactional, but bad outcome)
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
Subject: 결제 실패 — 주문번호 #1234
|
|
218
|
+
Preheader: 결제 처리 중 오류가 발생했습니다. 다시 시도해 주세요.
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Body:
|
|
222
|
+
- Status header in `--color-warning` color (not error-red — failed-payment is recoverable).
|
|
223
|
+
- "왜 실패했는지" explanation (insufficient funds / declined / timeout).
|
|
224
|
+
- "다시 시도하기" CTA.
|
|
225
|
+
- Help text + 1:1 inquiry link.
|
|
226
|
+
|
|
227
|
+
### Refund completed
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
Subject: 환불 완료 — 주문번호 #1234
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Body:
|
|
234
|
+
- Status header.
|
|
235
|
+
- Refund amount + original order link.
|
|
236
|
+
- Bank info / KakaoPay account where refund was sent.
|
|
237
|
+
- Expected arrival time ("영업일 1–3일").
|
|
238
|
+
|
|
239
|
+
## Why this is a good transactional email example
|
|
240
|
+
|
|
241
|
+
- **One purpose**: confirms payment. No marketing.
|
|
242
|
+
- **Subject specific**: "주문번호 #1234" not "주문 안내".
|
|
243
|
+
- **Preheader fills the preview**: amount + merchant + payment method in one line.
|
|
244
|
+
- **Body leads with the answer**: "결제가 완료되었습니다".
|
|
245
|
+
- **Receipt section is scannable**: dashed dividers, tabular numerals, total bolder.
|
|
246
|
+
- **One CTA, bulletproof button**.
|
|
247
|
+
- **Sender info per 정보통신망법**: required by Korean law.
|
|
248
|
+
- **Self-distinguishes from marketing**: "본 메일은 ... 광고가 아닙니다."
|
|
249
|
+
- **Polite tone (~합니다)** — fintech context.
|
|
250
|
+
|
|
251
|
+
Cite [`knowledge/patterns/email-design.md`](../knowledge/patterns/email-design.md) and [`knowledge/i18n/korean-document-style.md`](../knowledge/i18n/korean-document-style.md).
|
|
252
|
+
|
|
253
|
+
## Cross-reference
|
|
254
|
+
|
|
255
|
+
- [`knowledge/patterns/email-design.md`](../knowledge/patterns/email-design.md) — broader email rules
|
|
256
|
+
- [`examples/component-email-layout.md`](component-email-layout.md) — email scaffolding
|
|
257
|
+
- [`examples/component-payment-receipt.md`](component-payment-receipt.md) — in-app receipt pattern
|
|
258
|
+
- [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — payment context
|
|
259
|
+
- [`knowledge/i18n/korean-document-style.md`](../knowledge/i18n/korean-document-style.md) — voice
|