@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,301 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
---
|
|
3
|
+
title: Money and amount — display, input, color semantics
|
|
4
|
+
applies_to: [fintech, e-commerce, all-money-aware-ui]
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
last_updated: 2026-05
|
|
7
|
+
stability: stable
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Money and amount
|
|
11
|
+
|
|
12
|
+
Designing UIs that display and accept money has its own rules. Get them wrong and users misread their balance, miscount their cart, or miss-key a transfer. This is the floor for any product where money is on screen.
|
|
13
|
+
|
|
14
|
+
## Currency display rules
|
|
15
|
+
|
|
16
|
+
### Format
|
|
17
|
+
|
|
18
|
+
| Locale | Recommended | Examples |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| Korea (consumer) | `1,200,000원` (suffix style) | `12,500원` `1,234,567원` |
|
|
21
|
+
| Korea (fintech / Western-coded) | `₩1,200,000` (prefix style) | `₩12,500` `₩1,234,567` |
|
|
22
|
+
| US | `$1,234.56` | `$25.00` `$1,234.56` |
|
|
23
|
+
| Japan | `¥1,234` (no decimal) | `¥250` `¥1,234,567` |
|
|
24
|
+
| EU | `1.234,56 €` (varies) | `25,00 €` `1.234.567,89 €` |
|
|
25
|
+
|
|
26
|
+
For Korean apps:
|
|
27
|
+
- **Suffix `원`** reads as consumer/local — coffee shops, e-commerce, 가계부.
|
|
28
|
+
- **Prefix `₩`** reads as fintech/professional — investment apps, banking, B2B.
|
|
29
|
+
- **Pick one and stay consistent throughout the product.**
|
|
30
|
+
|
|
31
|
+
### Thousands separator
|
|
32
|
+
|
|
33
|
+
Always show. `1234567` is unreadable; `1,234,567` is parseable at a glance.
|
|
34
|
+
|
|
35
|
+
In Korean: comma every 3 digits is the universal convention for the **arabic-numeral** form. The Korean-number form (`123만 4,567`) is used in display contexts (charts, summaries) but not in transactional contexts.
|
|
36
|
+
|
|
37
|
+
### Decimals
|
|
38
|
+
|
|
39
|
+
KRW has no sub-unit (no jeon in modern usage). **Always integer.**
|
|
40
|
+
- Don't display `.00` for KRW. `12,500원`, not `12,500.00원`.
|
|
41
|
+
- For currencies with subunits (USD, JPY without decimals, EUR with), display 2 decimals consistently (or 0 for JPY).
|
|
42
|
+
|
|
43
|
+
### Tabular numerals
|
|
44
|
+
|
|
45
|
+
When amounts appear in lists or tables, use `font-feature-settings: 'tnum' 1` (or a font with built-in tabular figures). This makes digits the same width — `1,234,567` aligns with `1,000,000` cleanly:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
proportional: tabular:
|
|
49
|
+
₩1,234,567 ₩1,234,567
|
|
50
|
+
₩ 100,000 ₩ 100,000
|
|
51
|
+
₩ 9,500 ₩ 9,500
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The tabular column is scannable; the proportional one looks staggered.
|
|
55
|
+
|
|
56
|
+
Pretendard supports `tnum` natively (set via CSS). Most variable fonts do.
|
|
57
|
+
|
|
58
|
+
### Korean number names (만, 억) for display contexts
|
|
59
|
+
|
|
60
|
+
For very large amounts in summaries / hero displays, Korean readers parse `1.2억` faster than `120,000,000`. Common for:
|
|
61
|
+
- Real estate (price)
|
|
62
|
+
- Investment account totals
|
|
63
|
+
- Large transactions
|
|
64
|
+
|
|
65
|
+
Format: `<truncated number>억`, `<truncated number>만`, or full form. Examples:
|
|
66
|
+
|
|
67
|
+
| Raw | Compact | Use |
|
|
68
|
+
| --- | --- | --- |
|
|
69
|
+
| `1,234,567` | `123만 4,567원` | rarely worth the verbosity |
|
|
70
|
+
| `12,345,678` | `1,234만원` | compact display |
|
|
71
|
+
| `123,456,789` | `1억 2,345만원` | hero |
|
|
72
|
+
| `1,234,567,890` | `12억 3,457만원` | hero |
|
|
73
|
+
|
|
74
|
+
**Don't use this format for transactional amounts** (cart totals, transfer amounts) — only for high-level summary displays. Transactional needs full digits for accuracy.
|
|
75
|
+
|
|
76
|
+
## Color semantics for money
|
|
77
|
+
|
|
78
|
+
This is its own axis, **separate from primary/accent/error**.
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
✓ Money colors (semantic):
|
|
82
|
+
--color-money-positive (income, deposit, balance increase)
|
|
83
|
+
--color-money-negative (expense, withdrawal, balance decrease)
|
|
84
|
+
--color-money-neutral (transfer, unchanged)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
| Color | Convention | Example |
|
|
88
|
+
| --- | --- | --- |
|
|
89
|
+
| Positive (Korean) | **Red `#DC2626`** for stock gains (Korean reads red as "rising") OR green `#16A34A` for income/deposit | Korean stock apps: red gain, blue loss. Korean banking: green deposit, red withdrawal. |
|
|
90
|
+
| Positive (US/Western) | Green | Standard everywhere except KR/JP/CN stocks |
|
|
91
|
+
| Negative (Korean) | **Blue `#2563EB`** for stock losses OR red `#DC2626` for expenses/withdrawals | Korean stock apps: blue. Korean banking: red. |
|
|
92
|
+
| Negative (US/Western) | Red | Standard |
|
|
93
|
+
| Neutral | Neutral text color (`--color-text-primary`) | Transfer, account balance display |
|
|
94
|
+
|
|
95
|
+
### The Korean stock convention is INVERTED from the West
|
|
96
|
+
|
|
97
|
+
Korean stock apps (and Japanese, Chinese):
|
|
98
|
+
- 🔴 **Red = up / gain / 상승**
|
|
99
|
+
- 🔵 **Blue = down / loss / 하락**
|
|
100
|
+
|
|
101
|
+
This comes from cultural color associations (red = celebration, blue = somber). Western traders working in Korean apps often misread.
|
|
102
|
+
|
|
103
|
+
If your app handles stocks/crypto for Korean users: **use the Korean convention by default**. Provide a settings toggle for "Western color scheme" but don't default-flip.
|
|
104
|
+
|
|
105
|
+
If your app is Korean banking/fintech (NOT stocks): use the universal expense-red, income-green convention. KakaoBank, Toss show deposit-green, withdrawal-red.
|
|
106
|
+
|
|
107
|
+
### Don't use `--color-error` for negative amounts
|
|
108
|
+
|
|
109
|
+
`--color-error` means **something went wrong**. A negative balance, an outgoing payment, a stock loss — none of those are errors. They're values that happen to be negative. Use `--color-money-negative`.
|
|
110
|
+
|
|
111
|
+
A user who paid for groceries didn't make an error. Coloring the expense as `--color-error` reads as "this expense was a mistake."
|
|
112
|
+
|
|
113
|
+
### Don't use `--color-success` for positive amounts
|
|
114
|
+
|
|
115
|
+
Same reasoning. Income isn't a "success state" of the system; it's a fact about a number.
|
|
116
|
+
|
|
117
|
+
## Display patterns
|
|
118
|
+
|
|
119
|
+
### Hero balance display
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
┌─────────────────────────────────┐
|
|
123
|
+
│ 사용 가능 금액 │
|
|
124
|
+
│ │
|
|
125
|
+
│ ₩2,847,500 │ ← display variant, 38px+, semibold, tnum
|
|
126
|
+
│ │
|
|
127
|
+
│ +12,500원 이번 달 │ ← caption, money-positive color
|
|
128
|
+
└─────────────────────────────────┘
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
- The amount is the largest text on the screen.
|
|
132
|
+
- Sub-line (delta, period, label) immediately below — small caption with semantic color.
|
|
133
|
+
- Optional comparison ("이번 달 +12,500원" or "+0.4% 어제 대비").
|
|
134
|
+
|
|
135
|
+
### Transaction row
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
┌──────────────────────────────────────────────┐
|
|
139
|
+
│ 🍽 점심 식사 -12,500원 │ ← right-aligned tabular num
|
|
140
|
+
│ 스타벅스 강남점 · 12:34 ─2,832,500원 │ ← post-transaction balance
|
|
141
|
+
└──────────────────────────────────────────────┘
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
- Icon (category emoji or icon) on the left.
|
|
145
|
+
- Amount and post-balance on the right, right-aligned.
|
|
146
|
+
- Use tabular numerals so the column is clean across many rows.
|
|
147
|
+
- Sign convention: `-12,500원` for outflow, `+12,500원` for inflow, no sign for neutral. Don't use parentheses `(12,500원)` — Korean readers parse `-` more naturally.
|
|
148
|
+
|
|
149
|
+
### Cart / order summary
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
상품 합계 ₩45,000
|
|
153
|
+
배송비 ₩3,000
|
|
154
|
+
할인 -₩5,000 ← negative (discount), money-positive color (it's good for the user)
|
|
155
|
+
─────────────────────────
|
|
156
|
+
총 결제 금액 ₩43,000 ← bolder, larger, hero tier
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
The convention here is interesting: discount is a **negative number** in the math but a **positive event** for the user. Color it as `--color-money-positive` (green/blue) — the discount is a benefit, not a charge. Then the final total uses neutral / heavy text.
|
|
160
|
+
|
|
161
|
+
### Account balance breakdown
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
┌───────────────────────────────┐
|
|
165
|
+
│ 자유적금 │
|
|
166
|
+
│ 신한은행 ****-321 │
|
|
167
|
+
│ │
|
|
168
|
+
│ ₩5,200,000 │ ← amount in display tier
|
|
169
|
+
│ │
|
|
170
|
+
│ 매월 ₩100,000 자동이체 │ ← caption, neutral
|
|
171
|
+
└───────────────────────────────┘
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Amount input patterns
|
|
175
|
+
|
|
176
|
+
### Auto-format on input
|
|
177
|
+
|
|
178
|
+
User types `1234567`; field shows `1,234,567`. Caret position must NOT jump.
|
|
179
|
+
|
|
180
|
+
Implementation note: format on every keystroke, then carefully restore caret position. Most amount-input libraries (Cleave.js, react-number-format) handle this.
|
|
181
|
+
|
|
182
|
+
### Suffix inside the field
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
┌─────────────────────────────┐
|
|
186
|
+
│ 1,234,567 원 │
|
|
187
|
+
└─────────────────────────────┘
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Or prefix:
|
|
191
|
+
```
|
|
192
|
+
┌─────────────────────────────┐
|
|
193
|
+
│ ₩ 1,234,567 │
|
|
194
|
+
└─────────────────────────────┘
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
The suffix/prefix is **not editable** — it's a visual affordance. User types only digits.
|
|
198
|
+
|
|
199
|
+
### Accepting paste
|
|
200
|
+
|
|
201
|
+
User pastes `12,500.00`. The field should:
|
|
202
|
+
1. Strip non-digits except the decimal point.
|
|
203
|
+
2. For KRW (no decimals), strip the decimal point and following digits.
|
|
204
|
+
3. Re-format with thousands separators.
|
|
205
|
+
4. Land on `12,500`.
|
|
206
|
+
|
|
207
|
+
Pasting `₩12,500` or `$12.50` should work too — strip currency symbols.
|
|
208
|
+
|
|
209
|
+
### Quick-amount chips
|
|
210
|
+
|
|
211
|
+
For common amounts, offer chips above the input:
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
[+1만] [+5만] [+10만] [+100만]
|
|
215
|
+
┌─────────────────────────────┐
|
|
216
|
+
│ 0 원 │
|
|
217
|
+
└─────────────────────────────┘
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Tapping `+5만` adds 50,000 to the current value. This is universal in Korean transfer/송금 apps.
|
|
221
|
+
|
|
222
|
+
### Maximum amount affordance
|
|
223
|
+
|
|
224
|
+
For "send all balance" actions:
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
┌─────────────────────────────┐
|
|
228
|
+
│ 1,000,000 원 ✕ │
|
|
229
|
+
└─────────────────────────────┘
|
|
230
|
+
잔액 ₩1,234,567 [전액 보내기]
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The "전액" (all) button populates the full balance. Common in transfer/send-money apps.
|
|
234
|
+
|
|
235
|
+
### Input mode
|
|
236
|
+
|
|
237
|
+
```html
|
|
238
|
+
<input type="text" inputmode="numeric" autocomplete="transaction-amount" />
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
`type="number"` is wrong for currency — strips leading zeros, rejects `,` formatting, scrolls on accidental wheel.
|
|
242
|
+
|
|
243
|
+
`type="text" inputmode="numeric"` triggers the numeric keypad on mobile while letting you control formatting.
|
|
244
|
+
|
|
245
|
+
For RN: `<TextInput keyboardType="number-pad" />`.
|
|
246
|
+
|
|
247
|
+
### Validation timing
|
|
248
|
+
|
|
249
|
+
- **On input**: format only. Don't show errors yet.
|
|
250
|
+
- **On blur**: validate (min/max, balance sufficient). Show error.
|
|
251
|
+
- **On submit**: re-validate, including server-side balance check.
|
|
252
|
+
|
|
253
|
+
## Edge cases
|
|
254
|
+
|
|
255
|
+
### Zero
|
|
256
|
+
`0원` (not `₩0` for consumer; `₩0` for fintech). Don't render the amount line at all if it would be zero AND the line is decorative ("you saved ₩0 this month").
|
|
257
|
+
|
|
258
|
+
### Negative balance
|
|
259
|
+
Allow display, but with care:
|
|
260
|
+
- `-₩5,000` (overdraft) — color `--color-money-negative`, not `--color-error`.
|
|
261
|
+
- Add an explicit annotation: "마이너스 통장 사용 중" or "(overdraft)".
|
|
262
|
+
|
|
263
|
+
### Very large numbers
|
|
264
|
+
Beyond `999조` (999 trillion), Korean number names break down for most users. Don't try to format these prettily — it's a corner case (tax authority, central bank). Display as `1,000,000,000,000,000원` and accept readability tradeoff.
|
|
265
|
+
|
|
266
|
+
### Foreign currency in Korean app
|
|
267
|
+
Display the foreign amount + KRW equivalent:
|
|
268
|
+
```
|
|
269
|
+
$25.00 (약 ₩33,300)
|
|
270
|
+
```
|
|
271
|
+
- Foreign first if the source is foreign (international purchase).
|
|
272
|
+
- KRW first if source is KRW (overseas trip planning, conversion display).
|
|
273
|
+
- "약" (approximately) is required when the conversion is approximate.
|
|
274
|
+
|
|
275
|
+
### Rounding
|
|
276
|
+
- KRW: always integer. Round at the **point of computation**, not display.
|
|
277
|
+
- Foreign currency display: round to the currency's natural precision (USD: 2 decimals).
|
|
278
|
+
- Tax: separate line, use the country's rounding rule (Korean VAT rounds down per item but up on total — server-side concern, designer just shows the line).
|
|
279
|
+
|
|
280
|
+
### Comma vs period locale issues
|
|
281
|
+
A user pastes a number with `.` as thousands separator (German format, `1.234.567`). Strip and reformat.
|
|
282
|
+
|
|
283
|
+
## Don't
|
|
284
|
+
|
|
285
|
+
- Don't color expenses with `--color-error`. Negative ≠ error.
|
|
286
|
+
- Don't show `.00` for KRW.
|
|
287
|
+
- Don't use `type="number"` for currency input.
|
|
288
|
+
- Don't auto-fill the suffix `원` into the value — keep the raw value as digits only.
|
|
289
|
+
- Don't truncate digits silently for "very large" amounts. Display fully, accept aesthetics.
|
|
290
|
+
- Don't use parentheses for negatives (`(₩12,500)`) in Korean apps. Use `-`.
|
|
291
|
+
- Don't mix `원` and `₩` styles in the same product.
|
|
292
|
+
- Don't right-align amounts with proportional numerals — use tabular.
|
|
293
|
+
- Don't show currency conversions without "약" (approx) annotation when the rate is not real-time.
|
|
294
|
+
- Don't display balance updates with disruptive animation (number-tick animation is fine; flash/shake is not).
|
|
295
|
+
|
|
296
|
+
## Cross-reference
|
|
297
|
+
|
|
298
|
+
- [knowledge/typography/type-scale-fundamentals.md](../typography/type-scale-fundamentals.md) — tabular numerals
|
|
299
|
+
- [knowledge/colors/color-theory.md](../colors/color-theory.md) — semantic naming
|
|
300
|
+
- [knowledge/i18n/korean-payments.md](../i18n/korean-payments.md) — payment-specific UX
|
|
301
|
+
- [knowledge/patterns/form-design.md](form-design.md) — number input patterns
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
---
|
|
3
|
+
title: Onboarding patterns
|
|
4
|
+
applies_to: [web, mobile, all-ui]
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
last_updated: 2026-05
|
|
7
|
+
stability: stable
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Onboarding patterns
|
|
11
|
+
|
|
12
|
+
The user's first ~30 seconds with your product. Done well, they understand the value and complete a first action. Done badly, they bounce.
|
|
13
|
+
|
|
14
|
+
## The four onboarding moments
|
|
15
|
+
|
|
16
|
+
| Moment | Trigger | Goal |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| **Account setup** | After signup, before first feature use | Account complete, profile filled, key permissions granted |
|
|
19
|
+
| **First-run** | First time the app opens | Understand the value, see the core action, complete a first task |
|
|
20
|
+
| **Feature discovery** | First time a feature is encountered | Understand what this feature does without leaving the screen |
|
|
21
|
+
| **Re-engagement** | After absence (≥ 7 days) | Show what's new, restore context |
|
|
22
|
+
|
|
23
|
+
These are NOT all "onboarding". Each needs different patterns.
|
|
24
|
+
|
|
25
|
+
## When you don't need onboarding
|
|
26
|
+
|
|
27
|
+
- Single-purpose tools (search engine, calculator)
|
|
28
|
+
- Apps where the UI explains itself in 2 seconds
|
|
29
|
+
- Returning users on familiar flows
|
|
30
|
+
|
|
31
|
+
If you can show the value within 2 seconds of opening the app, **don't gate it with onboarding**. Onboarding is a tax — pay it only when necessary.
|
|
32
|
+
|
|
33
|
+
## Account setup
|
|
34
|
+
|
|
35
|
+
Post-signup, pre-first-use. Goal: get the minimum necessary data to make the product work for this user.
|
|
36
|
+
|
|
37
|
+
### The Steve Krug rule for account setup
|
|
38
|
+
|
|
39
|
+
**Cut every field that isn't immediately necessary.** You can ask for more later.
|
|
40
|
+
|
|
41
|
+
| Don't ask now | Ask later |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| Full address (only at first checkout) | Phone number "for security" (only when 2FA setup) |
|
|
44
|
+
| Birthday (unless legally required) | Profile photo (after first action) |
|
|
45
|
+
| Bio / about | Notification preferences (when first relevant notification) |
|
|
46
|
+
|
|
47
|
+
### Multi-step wizard
|
|
48
|
+
|
|
49
|
+
For genuinely multi-step setup (e.g., onboarding to a fintech with bank connection):
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
[1. 본인인증] [2. 계좌 연결] [3. 카테고리 선택] [4. 완료]
|
|
53
|
+
● ○ ○ ○
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- Progress indicator (numbered or dots).
|
|
57
|
+
- Back button always available except on step 1.
|
|
58
|
+
- Skip option for non-essential steps with a note ("나중에 설정")
|
|
59
|
+
- Save progress between steps (localStorage).
|
|
60
|
+
- Total step count visible at start ("3분 소요").
|
|
61
|
+
|
|
62
|
+
Don't:
|
|
63
|
+
- Don't show 8+ steps. The user thinks "ugh" at step 4.
|
|
64
|
+
- Don't reset progress on back.
|
|
65
|
+
- Don't make every step required for entry.
|
|
66
|
+
|
|
67
|
+
### Smart defaults > asking
|
|
68
|
+
|
|
69
|
+
For each field, ask: "Can I derive this instead of asking?"
|
|
70
|
+
|
|
71
|
+
| Field | Derive from |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| Time zone | Browser / device |
|
|
74
|
+
| Language | Browser locale |
|
|
75
|
+
| Country | IP location (with prompt to confirm) |
|
|
76
|
+
| Currency | Country (KRW for KR, USD for US) |
|
|
77
|
+
| Notification frequency | Sensible default; let user adjust later |
|
|
78
|
+
|
|
79
|
+
### Korean account setup
|
|
80
|
+
|
|
81
|
+
Per [`knowledge/i18n/korean-product-conventions.md`](../i18n/korean-product-conventions.md):
|
|
82
|
+
|
|
83
|
+
- **Phone-first**: phone + SMS verification is the canonical primary identity.
|
|
84
|
+
- **KakaoTalk login** as a one-tap shortcut (above email).
|
|
85
|
+
- **Address** via Daum Postcode lookup, NOT free-form.
|
|
86
|
+
- **Marketing consent** as a separate, opt-in checkbox (legal — see [`korean-publishing.md`](../i18n/korean-publishing.md)).
|
|
87
|
+
- **본인인증** if required (financial / age-gated): use PASS or NICE, not roll-your-own.
|
|
88
|
+
- **DOB**: ask year only when possible; full DOB when legally required.
|
|
89
|
+
|
|
90
|
+
## First-run
|
|
91
|
+
|
|
92
|
+
User opens the app for the first time. Goal: aha moment + first action.
|
|
93
|
+
|
|
94
|
+
### The three patterns
|
|
95
|
+
|
|
96
|
+
| Pattern | Best for | Friction |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| **Activation flow** (set up demo data, walk through one task) | Productivity, content tools | Medium |
|
|
99
|
+
| **Empty state with prompt** (drop into the main UI, empty state shows the path) | Most consumer apps | Low |
|
|
100
|
+
| **Tour with overlays** (highlights UI elements one at a time) | Complex products with non-obvious UI | High |
|
|
101
|
+
|
|
102
|
+
**Pick the lowest-friction pattern that achieves the goal.** Tours are the highest tax — use only when the UI genuinely needs explaining and an empty-state CTA can't carry the weight.
|
|
103
|
+
|
|
104
|
+
### Activation flow
|
|
105
|
+
|
|
106
|
+
For tools where the user genuinely needs setup before they can do anything:
|
|
107
|
+
|
|
108
|
+
1. Welcome screen (one screen, value prop, one CTA).
|
|
109
|
+
2. Connect / configure (1–3 screens).
|
|
110
|
+
3. Sample data or first action prompt.
|
|
111
|
+
4. Land in the populated main UI.
|
|
112
|
+
|
|
113
|
+
Don't:
|
|
114
|
+
- Don't make activation a 10-screen wall.
|
|
115
|
+
- Don't ask for permissions / payment before the user's seen the value.
|
|
116
|
+
- Don't skip the "completed" celebration — confirm "you're all set" before dropping into the UI.
|
|
117
|
+
|
|
118
|
+
### Empty state with prompt (recommended default)
|
|
119
|
+
|
|
120
|
+
Drop the user into the main UI. The empty state IS the onboarding:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
[main UI chrome — nav, header]
|
|
124
|
+
┌────────────────────────────────────────┐
|
|
125
|
+
│ Welcome! Let's get started. │
|
|
126
|
+
│ │
|
|
127
|
+
│ [illustration] │
|
|
128
|
+
│ │
|
|
129
|
+
│ Add your first transaction. │
|
|
130
|
+
│ │
|
|
131
|
+
│ [거래 추가] │
|
|
132
|
+
└────────────────────────────────────────┘
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
See [`empty-states.md`](empty-states.md) for the empty-state pattern. The first-time empty IS the first-run.
|
|
136
|
+
|
|
137
|
+
### Tour with overlays
|
|
138
|
+
|
|
139
|
+
Coachmark-style highlights pointing at UI elements:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
[main UI in background]
|
|
143
|
+
[overlay dim except a callout area]
|
|
144
|
+
┌──────────────────┐
|
|
145
|
+
│ 1/4 │
|
|
146
|
+
│ 여기서 거래를 │
|
|
147
|
+
│ 추가할 수 있어요 │
|
|
148
|
+
│ [Next] │
|
|
149
|
+
└──────────────────┘
|
|
150
|
+
▼
|
|
151
|
+
[Add button]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Rules:
|
|
155
|
+
- ≤ 5 steps. More than that, you're explaining the manual.
|
|
156
|
+
- "Skip" button always available.
|
|
157
|
+
- Don't dim the entire screen black — fades the user out of the product.
|
|
158
|
+
- Each step focuses on **one** UI element with a clear action.
|
|
159
|
+
- Don't tour features the user might never use — tour the core path.
|
|
160
|
+
|
|
161
|
+
For complex products (Figma, Linear, AfterEffects), tours can run 6–8 steps but with clear "you can come back later" affordances.
|
|
162
|
+
|
|
163
|
+
### The "skip" question
|
|
164
|
+
|
|
165
|
+
Always allow skipping onboarding. The user has already committed to opening your app — don't make them work harder.
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
[Skip] [Next]
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
For users who skip:
|
|
172
|
+
- Drop into the empty state (which then carries the "first action" prompt).
|
|
173
|
+
- Don't force the tour back onto them.
|
|
174
|
+
- Optionally: a small `?` button in the header that reopens the tour.
|
|
175
|
+
|
|
176
|
+
## Feature discovery (in-context)
|
|
177
|
+
|
|
178
|
+
When a user encounters a feature for the first time **inside** the app:
|
|
179
|
+
|
|
180
|
+
| Pattern | Use |
|
|
181
|
+
| --- | --- |
|
|
182
|
+
| **Inline tooltip** (one-time, dismissable) | Small affordance — "여기에서 정렬할 수 있어요" |
|
|
183
|
+
| **Coachmark dot** | Indicates "new" without text until clicked |
|
|
184
|
+
| **What's new banner** | Top of page, dismissable |
|
|
185
|
+
| **Spotlight modal** | Major feature — dedicated screen, bigger ask |
|
|
186
|
+
|
|
187
|
+
Don't:
|
|
188
|
+
- Don't show 3 tooltips at once.
|
|
189
|
+
- Don't auto-show on every visit. Show once, dismiss, never again.
|
|
190
|
+
- Don't gate the feature behind the tooltip — let the user use it without reading.
|
|
191
|
+
|
|
192
|
+
Persistence: store dismissals in user state (server-side or localStorage). A returning user shouldn't see the same coachmark forever.
|
|
193
|
+
|
|
194
|
+
## Re-engagement
|
|
195
|
+
|
|
196
|
+
User has been away for ≥ 7 days. They open the app. What changed?
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
┌────────────────────────────────────────┐
|
|
200
|
+
│ 오랜만이에요! │
|
|
201
|
+
│ │
|
|
202
|
+
│ 그동안 새로 추가된 기능을 확인해 보세요. │
|
|
203
|
+
│ • 새 차트 (지난 주 추가) │
|
|
204
|
+
│ • 다크모드 지원 │
|
|
205
|
+
│ │
|
|
206
|
+
│ [확인] │
|
|
207
|
+
└────────────────────────────────────────┘
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
- Brief, not a tour.
|
|
211
|
+
- Optionally: restore last-viewed context ("계속하기: Aurora 프로젝트").
|
|
212
|
+
- Don't force them to read every release note.
|
|
213
|
+
|
|
214
|
+
For absences > 30 days:
|
|
215
|
+
- Show "what's new" banner persistently for the session.
|
|
216
|
+
- Optionally: re-introduce key flows that may have changed.
|
|
217
|
+
|
|
218
|
+
## Sample data vs blank slate
|
|
219
|
+
|
|
220
|
+
For products where the user creates content (note-taking, project management):
|
|
221
|
+
|
|
222
|
+
| Approach | Pro | Con |
|
|
223
|
+
| --- | --- | --- |
|
|
224
|
+
| **Blank slate** | Authentic — user owns from day 1 | Empty feels intimidating |
|
|
225
|
+
| **Sample data** | Demonstrates value, easy to explore | User has to delete it; "demo project" residue |
|
|
226
|
+
| **Templated start** | Halfway — pre-filled structure, user adds real content | Best for productivity tools |
|
|
227
|
+
|
|
228
|
+
Best practice for most consumer tools: **blank slate** with a strong empty state. The empty state's CTA is the first action.
|
|
229
|
+
|
|
230
|
+
For tools where the value lives in seeing data populated (analytics, dashboards): **sample data** with clear labels ("Demo data — replace with yours").
|
|
231
|
+
|
|
232
|
+
## Tokens consumed
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
--color-bg-default
|
|
236
|
+
--color-bg-elevated (modal / coachmark bg)
|
|
237
|
+
--color-bg-overlay (dim overlay for tour)
|
|
238
|
+
--color-text-primary
|
|
239
|
+
--color-primary-default (coachmark accent, CTAs)
|
|
240
|
+
--space-lg, --space-xl
|
|
241
|
+
--radius-lg
|
|
242
|
+
--shadow-modal (coachmarks elevated above page)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Accessibility
|
|
246
|
+
|
|
247
|
+
- All onboarding content is keyboard-reachable. Tab through every step.
|
|
248
|
+
- Tour overlays: focus moves into the coachmark on appearance. Escape dismisses.
|
|
249
|
+
- Skip is reachable in tab order.
|
|
250
|
+
- Coachmark text is announced via `role="dialog" aria-labelledby`.
|
|
251
|
+
- Don't trap focus indefinitely — there must always be an escape.
|
|
252
|
+
|
|
253
|
+
## Korean considerations
|
|
254
|
+
|
|
255
|
+
- Polite tone ("~해 주세요") in instructions.
|
|
256
|
+
- "환영합니다" / "오랜만이에요" common openers.
|
|
257
|
+
- Length: Korean is more verbose; budget more vertical space.
|
|
258
|
+
- Tour text typically 1–2 lines max per step.
|
|
259
|
+
|
|
260
|
+
## Code example
|
|
261
|
+
|
|
262
|
+
```tsx
|
|
263
|
+
function App() {
|
|
264
|
+
const user = useUser();
|
|
265
|
+
const onboardingState = useOnboardingState(user.id);
|
|
266
|
+
|
|
267
|
+
if (!user.isVerified) return <AccountVerification />;
|
|
268
|
+
if (!user.isProfileComplete) return <ProfileSetupWizard />;
|
|
269
|
+
|
|
270
|
+
return (
|
|
271
|
+
<>
|
|
272
|
+
<MainApp />
|
|
273
|
+
{onboardingState.shouldShowFirstRun && (
|
|
274
|
+
<FirstRunTour onComplete={onboardingState.markFirstRunDone} onSkip={onboardingState.markFirstRunDone} />
|
|
275
|
+
)}
|
|
276
|
+
{onboardingState.unseenFeatures.map(f => (
|
|
277
|
+
<FeatureCoachmark key={f.id} feature={f} onDismiss={() => onboardingState.markFeatureSeen(f.id)} />
|
|
278
|
+
))}
|
|
279
|
+
</>
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Don't
|
|
285
|
+
|
|
286
|
+
- Don't ask for everything upfront. Defer everything you can.
|
|
287
|
+
- Don't gate the product behind multi-screen tutorials before showing value.
|
|
288
|
+
- Don't show onboarding to returning users.
|
|
289
|
+
- Don't tour every feature. Tour the core path; let discovery happen inline.
|
|
290
|
+
- Don't auto-show notification permission prompt on app open. Wait for the moment it's relevant.
|
|
291
|
+
- Don't force email verification before user can use the product (allow limited use, escalate later).
|
|
292
|
+
- Don't assume the user remembers your last release. They don't.
|
|
293
|
+
- Don't use marketing language during functional onboarding ("Revolutionary new way to...").
|
|
294
|
+
|
|
295
|
+
## Cross-reference
|
|
296
|
+
|
|
297
|
+
- [`knowledge/patterns/empty-states.md`](empty-states.md) — first-time empty IS first-run for most apps
|
|
298
|
+
- [`knowledge/patterns/form-design.md`](form-design.md) — multi-step form pattern
|
|
299
|
+
- [`knowledge/i18n/korean-product-conventions.md`](../i18n/korean-product-conventions.md) — Korean account-setup expectations
|
|
300
|
+
- [`knowledge/i18n/korean-publishing.md`](../i18n/korean-publishing.md) — required permission disclosures (Android)
|