@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,318 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
---
|
|
3
|
+
title: Error states
|
|
4
|
+
applies_to: [web, mobile, all-ui]
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
last_updated: 2026-05
|
|
7
|
+
stability: stable
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Error states
|
|
11
|
+
|
|
12
|
+
Errors are the screens users see when something didn't go right. They're load-bearing: a good error keeps the user in the flow; a bad error makes them leave.
|
|
13
|
+
|
|
14
|
+
## The seven kinds of error
|
|
15
|
+
|
|
16
|
+
Different causes need different UIs. Don't conflate them.
|
|
17
|
+
|
|
18
|
+
| Kind | Cause | UI tier | User can fix? |
|
|
19
|
+
| --- | --- | --- | --- |
|
|
20
|
+
| **Validation** | User input doesn't match rules | Inline (next to field) | Yes — fix input |
|
|
21
|
+
| **Network / connectivity** | No internet, request failed to leave | Full-page or inline banner | Sort of — wait for connection |
|
|
22
|
+
| **Server / 5xx** | Backend crashed, timeout | Full-page or banner | No — retry, escalate |
|
|
23
|
+
| **Permission / 403** | User lacks access | Full-page with explanation | Maybe — request access |
|
|
24
|
+
| **Not found / 404** | Resource doesn't exist | Full-page | No — navigate elsewhere |
|
|
25
|
+
| **Conflict / 409** | Stale data, concurrent edit | Inline modal or banner | Yes — refresh + reapply |
|
|
26
|
+
| **Quota / 429** | Rate limit, plan limit | Banner with upgrade or wait | Yes — wait or upgrade |
|
|
27
|
+
|
|
28
|
+
## Anatomy
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
┌──────────────────────────────────────────────────┐
|
|
32
|
+
│ [error icon — soft] │
|
|
33
|
+
│ │
|
|
34
|
+
│ Title — what happened │
|
|
35
|
+
│ │
|
|
36
|
+
│ Description — what to do (1 sentence) │
|
|
37
|
+
│ │
|
|
38
|
+
│ [Primary action] [Secondary] │
|
|
39
|
+
│ │
|
|
40
|
+
│ (Optional: Error code · contact) │
|
|
41
|
+
└──────────────────────────────────────────────────┘
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
| Slot | Required | Notes |
|
|
45
|
+
| --- | --- | --- |
|
|
46
|
+
| Icon | recommended | Matches kind. Soft, not aggressive. |
|
|
47
|
+
| Title | yes | Plain language: "저장할 수 없어요" not "Error 500" |
|
|
48
|
+
| Description | yes | What user can do. 1 sentence. |
|
|
49
|
+
| Primary action | yes | Most likely recovery — "다시 시도", "Refresh", "Sign in" |
|
|
50
|
+
| Secondary action | optional | Alternative path — "Contact support", "Go back" |
|
|
51
|
+
| Error code | dev-mode only | Hide in prod unless support asks |
|
|
52
|
+
|
|
53
|
+
## Copy guidelines
|
|
54
|
+
|
|
55
|
+
### Tone — apologetic but not abject
|
|
56
|
+
|
|
57
|
+
| Korean | English | Use |
|
|
58
|
+
| --- | --- | --- |
|
|
59
|
+
| "오류가 발생했어요. 다시 시도해 주세요." | "Something went wrong. Please try again." | Generic |
|
|
60
|
+
| "잠시 후 다시 시도해 주세요." | "Please try again in a moment." | Server / temporary |
|
|
61
|
+
| "네트워크 연결을 확인해 주세요." | "Check your network connection." | Connectivity |
|
|
62
|
+
| "권한이 없습니다. 관리자에게 문의해 주세요." | "You don't have access. Contact your admin." | Permission |
|
|
63
|
+
| "찾을 수 없는 페이지입니다." | "Page not found." | 404 |
|
|
64
|
+
|
|
65
|
+
Don't:
|
|
66
|
+
- "Oops!" — twee, content-free.
|
|
67
|
+
- "Error 500" — exposing tech detail. (Optionally show small "Error code: 500" at the bottom for support reference.)
|
|
68
|
+
- "Something terrible happened" — alarming.
|
|
69
|
+
- "User error" — blames the user.
|
|
70
|
+
|
|
71
|
+
### Error message rules
|
|
72
|
+
|
|
73
|
+
1. **Specific over generic**: "Email must include @" beats "Invalid email."
|
|
74
|
+
2. **Actionable**: Tell the user what to do, not just what's wrong.
|
|
75
|
+
3. **Don't blame the user**: "This file is too large" is fine. "You uploaded a file that's too large" is not.
|
|
76
|
+
4. **Korean tone**: polite (존댓말), end errors with `~해 주세요` or `~합니다`.
|
|
77
|
+
|
|
78
|
+
## By error kind
|
|
79
|
+
|
|
80
|
+
### Validation (inline)
|
|
81
|
+
|
|
82
|
+
See [`patterns/form-design.md`](form-design.md) — handled at the field level, not as a separate screen.
|
|
83
|
+
|
|
84
|
+
### Network / connectivity
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
┌─────────────────────────────────────────┐
|
|
88
|
+
│ ⚠ 인터넷 연결이 불안정합니다 │
|
|
89
|
+
│ 잠시 후 다시 시도해 주세요. │
|
|
90
|
+
│ │
|
|
91
|
+
│ [다시 시도] │
|
|
92
|
+
└─────────────────────────────────────────┘
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- Banner at top OR full-screen if it blocks all interaction.
|
|
96
|
+
- Auto-retry with backoff (1s, 2s, 4s, 8s, then stop).
|
|
97
|
+
- If user is offline (browser detects): show "오프라인 상태" banner that auto-clears when online.
|
|
98
|
+
- Don't aggressive-toast every failed background request — collapse to one persistent indicator.
|
|
99
|
+
|
|
100
|
+
### Server / 5xx
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
┌─────────────────────────────────────────┐
|
|
104
|
+
│ ⚠ 일시적인 문제가 발생했어요 │
|
|
105
|
+
│ 잠시 후 다시 시도해 주세요. 문제가 계속되면 │
|
|
106
|
+
│ 고객센터로 문의해 주세요. │
|
|
107
|
+
│ │
|
|
108
|
+
│ [다시 시도] [고객센터] │
|
|
109
|
+
│ │
|
|
110
|
+
│ Error: 500 (req: a1b2c3d4) │ ← small, optional
|
|
111
|
+
└─────────────────────────────────────────┘
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- Include a request ID or error code (small text at bottom) so support can trace.
|
|
115
|
+
- Two actions: retry + contact support.
|
|
116
|
+
- For long-running operations (file upload, video processing): preserve user's work if possible. Don't blow away unsaved state on a 500.
|
|
117
|
+
|
|
118
|
+
### Permission / 403
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
┌─────────────────────────────────────────┐
|
|
122
|
+
│ 🔒 접근 권한이 없습니다 │
|
|
123
|
+
│ 이 항목을 보려면 관리자 권한이 필요합니다.│
|
|
124
|
+
│ │
|
|
125
|
+
│ [관리자에게 권한 요청] [돌아가기] │
|
|
126
|
+
└─────────────────────────────────────────┘
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
- Don't expose what the user **can't** see (security through obscurity).
|
|
130
|
+
- Provide the path to access (request flow, support contact).
|
|
131
|
+
- For SaaS multi-tenant: clarify which org/team they need access in.
|
|
132
|
+
|
|
133
|
+
### Not found / 404
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
┌─────────────────────────────────────────┐
|
|
137
|
+
│ [illustration: 🗺 lost] │
|
|
138
|
+
│ │
|
|
139
|
+
│ 찾을 수 없는 페이지입니다 │
|
|
140
|
+
│ │
|
|
141
|
+
│ 주소를 확인하거나 홈으로 돌아가 주세요. │
|
|
142
|
+
│ │
|
|
143
|
+
│ [홈으로] [검색] │
|
|
144
|
+
└─────────────────────────────────────────┘
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
- Branded 404 (use product personality for consumer apps).
|
|
148
|
+
- Always offer a path forward — home, search, recent activity.
|
|
149
|
+
- Don't show error code "404" prominently — describe in plain language.
|
|
150
|
+
- For deep linking gone bad: detect common patterns and route helpfully ("Did you mean /projects/123?").
|
|
151
|
+
|
|
152
|
+
### Conflict / 409
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
┌─────────────────────────────────────────┐
|
|
156
|
+
│ ⓘ 다른 곳에서 이미 수정되었습니다 │
|
|
157
|
+
│ 최신 내용을 불러오고 다시 저장해 주세요. │
|
|
158
|
+
│ │
|
|
159
|
+
│ [최신 불러오기] [내 변경사항 보기] │
|
|
160
|
+
└─────────────────────────────────────────┘
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
- Don't silently overwrite. The user must decide.
|
|
164
|
+
- For collaborative editing (Google Docs-style): merge automatically when possible; ask for choice when not.
|
|
165
|
+
- Show what's in conflict if possible (your version vs theirs).
|
|
166
|
+
|
|
167
|
+
### Quota / 429
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
┌─────────────────────────────────────────┐
|
|
171
|
+
│ ⓘ 사용 한도에 도달했습니다 │
|
|
172
|
+
│ 1시간 후 다시 사용 가능합니다. │
|
|
173
|
+
│ 더 많이 사용하려면 플랜을 업그레이드하세요.│
|
|
174
|
+
│ │
|
|
175
|
+
│ [플랜 업그레이드] [대기] │
|
|
176
|
+
└─────────────────────────────────────────┘
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
- Be specific about the limit (which? when reset?).
|
|
180
|
+
- Offer upgrade path if applicable.
|
|
181
|
+
- Don't block the entire UI — only the rate-limited action.
|
|
182
|
+
|
|
183
|
+
## Layout
|
|
184
|
+
|
|
185
|
+
| Pattern | Use |
|
|
186
|
+
| --- | --- |
|
|
187
|
+
| **Inline** (next to field, in card) | Validation, conflict on a specific field |
|
|
188
|
+
| **Banner** (page-top strip) | Network, partial server failure, quota |
|
|
189
|
+
| **Full-page replace** | 404, 500 on critical path, permission |
|
|
190
|
+
| **Modal / overlay** | Conflict during save (must decide) |
|
|
191
|
+
| **Toast** | Background failures with auto-recovery (rare for errors — toast is for success/info) |
|
|
192
|
+
|
|
193
|
+
For mobile: prefer inline + banner over full-page modal. Full-page consumes valuable vertical space.
|
|
194
|
+
|
|
195
|
+
## Recovery actions
|
|
196
|
+
|
|
197
|
+
Every error needs at least one user-actionable recovery. The order of preference:
|
|
198
|
+
|
|
199
|
+
1. **Retry** — when the operation can be retried (network, server)
|
|
200
|
+
2. **Refresh / Reload** — when the state is stale (conflict)
|
|
201
|
+
3. **Navigate elsewhere** — when the resource isn't recoverable (404, permission)
|
|
202
|
+
4. **Contact support** — last resort, with context preserved
|
|
203
|
+
|
|
204
|
+
Never just "OK" or "Dismiss" with no path forward.
|
|
205
|
+
|
|
206
|
+
## Error code visibility
|
|
207
|
+
|
|
208
|
+
| Audience | Show error code? |
|
|
209
|
+
| --- | --- |
|
|
210
|
+
| End users | No — plain language |
|
|
211
|
+
| Internal users / admin | Yes, in dev mode |
|
|
212
|
+
| Support flow | Yes — copy-to-clipboard affordance |
|
|
213
|
+
|
|
214
|
+
For support handoff: render a small expandable "Technical details" section:
|
|
215
|
+
```
|
|
216
|
+
> Technical details
|
|
217
|
+
> Code: 500
|
|
218
|
+
> Request ID: a1b2c3d4-e5f6-7890
|
|
219
|
+
> Timestamp: 2026-05-07 14:32:01 KST
|
|
220
|
+
> [Copy details]
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Logging vs displaying
|
|
224
|
+
|
|
225
|
+
The error message you SHOW to users is different from what you LOG to the server:
|
|
226
|
+
|
|
227
|
+
- **Log everything** (stack trace, request, user ID, browser).
|
|
228
|
+
- **Show only what helps the user** (cause + recovery).
|
|
229
|
+
|
|
230
|
+
Don't expose stack traces or technical jargon in user-facing errors.
|
|
231
|
+
|
|
232
|
+
## Tokens consumed
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
--color-error (icon, accent border)
|
|
236
|
+
--color-error-subtle-bg (banner bg)
|
|
237
|
+
--color-warning (for 429 / quota — not full error)
|
|
238
|
+
--color-text-primary (title)
|
|
239
|
+
--color-text-secondary (description)
|
|
240
|
+
--color-text-tertiary (technical details, error code)
|
|
241
|
+
--color-bg-default
|
|
242
|
+
--color-bg-elevated
|
|
243
|
+
--space-md, --space-base
|
|
244
|
+
--radius-md
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Accessibility
|
|
248
|
+
|
|
249
|
+
- Error containers: `role="alert"` (assertive) for blocking errors; `role="status"` (polite) for inline / banner.
|
|
250
|
+
- Title is a heading (`<h2>` or appropriate).
|
|
251
|
+
- Recovery action button: standard accessibility.
|
|
252
|
+
- Don't auto-focus the error icon — focus the recovery button.
|
|
253
|
+
- For form errors: announced via `aria-describedby` linking input to error text. See [`patterns/form-design.md`](form-design.md).
|
|
254
|
+
|
|
255
|
+
## Korean considerations
|
|
256
|
+
|
|
257
|
+
Per [`knowledge/i18n/korean-product-conventions.md`](../i18n/korean-product-conventions.md):
|
|
258
|
+
- Polite (존댓말) tone — "~해 주세요" / "~합니다".
|
|
259
|
+
- "고객센터" (customer center) is the standard term for support.
|
|
260
|
+
- Customer service hours stated when contact is the recommended action.
|
|
261
|
+
- For payment errors: cite [`knowledge/i18n/korean-payments.md`](../i18n/korean-payments.md) — specific failure-mode messages.
|
|
262
|
+
- 1:1 inquiry is a standard expectation: provide that path, not just email.
|
|
263
|
+
|
|
264
|
+
## Code example
|
|
265
|
+
|
|
266
|
+
```tsx
|
|
267
|
+
function PageContent() {
|
|
268
|
+
const { data, error, retry } = useData();
|
|
269
|
+
|
|
270
|
+
if (error?.type === "404") {
|
|
271
|
+
return <NotFoundPage />;
|
|
272
|
+
}
|
|
273
|
+
if (error?.type === "permission") {
|
|
274
|
+
return <PermissionDeniedPage />;
|
|
275
|
+
}
|
|
276
|
+
if (error?.type === "network") {
|
|
277
|
+
return (
|
|
278
|
+
<Banner intent="warning">
|
|
279
|
+
<Banner.Title>인터넷 연결이 불안정합니다</Banner.Title>
|
|
280
|
+
<Banner.Description>잠시 후 다시 시도해 주세요.</Banner.Description>
|
|
281
|
+
<Banner.Action onClick={retry}>다시 시도</Banner.Action>
|
|
282
|
+
</Banner>
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
if (error) {
|
|
286
|
+
return (
|
|
287
|
+
<ErrorState
|
|
288
|
+
title="일시적인 문제가 발생했어요"
|
|
289
|
+
description="잠시 후 다시 시도해 주세요."
|
|
290
|
+
primaryAction={{ label: "다시 시도", onClick: retry }}
|
|
291
|
+
secondaryAction={{ label: "고객센터", href: "/support" }}
|
|
292
|
+
errorCode={error.code}
|
|
293
|
+
requestId={error.requestId}
|
|
294
|
+
/>
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return <Content data={data} />;
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## Don't
|
|
303
|
+
|
|
304
|
+
- Don't show "Error 500" to end users.
|
|
305
|
+
- Don't conflate empty states with errors. They're different.
|
|
306
|
+
- Don't provide an "OK" button as the only action — what's "OK" about an error?
|
|
307
|
+
- Don't auto-retry indefinitely without a stop.
|
|
308
|
+
- Don't lose the user's work on a server error mid-action — preserve form state, draft, etc.
|
|
309
|
+
- Don't expose stack traces, internal IDs without copy affordance, or English error messages in Korean apps.
|
|
310
|
+
- Don't blame the user. Don't shout (no all-caps).
|
|
311
|
+
- Don't pop up a modal for every minor failure. Use inline / banner where the failure happens.
|
|
312
|
+
|
|
313
|
+
## Cross-reference
|
|
314
|
+
|
|
315
|
+
- [`knowledge/patterns/empty-states.md`](empty-states.md) — when there's no data, but it's not an error
|
|
316
|
+
- [`knowledge/patterns/form-design.md`](form-design.md) — validation errors at the field level
|
|
317
|
+
- [`knowledge/i18n/korean-payments.md`](../i18n/korean-payments.md) — payment-specific error messages
|
|
318
|
+
- [`knowledge/i18n/korean-product-conventions.md`](../i18n/korean-product-conventions.md) — Korean tone
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
---
|
|
3
|
+
title: Form design patterns
|
|
4
|
+
applies_to: [web, mobile, all-ui]
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
last_updated: 2026-05
|
|
7
|
+
stability: stable
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Form design patterns
|
|
11
|
+
|
|
12
|
+
Forms are where users do real work. Bad forms cost real conversions and real frustration. This is the floor for any form longer than two fields.
|
|
13
|
+
|
|
14
|
+
## Layout
|
|
15
|
+
|
|
16
|
+
### Single column over multi-column
|
|
17
|
+
|
|
18
|
+
Single column is faster to fill, faster to scan, simpler on mobile. Use multi-column **only** for genuine pairs (first/last name — though for Korean, this is a single field; address line 1/2; city/state/zip).
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
✗ multi-column scattering related fields:
|
|
22
|
+
[Name ] [Email ]
|
|
23
|
+
[Phone ] [Birthday ]
|
|
24
|
+
[Address ] [Postal ]
|
|
25
|
+
|
|
26
|
+
✓ single-column logical flow:
|
|
27
|
+
[Name ]
|
|
28
|
+
[Email ]
|
|
29
|
+
[Phone ]
|
|
30
|
+
[Birthday ]
|
|
31
|
+
[Address ]
|
|
32
|
+
[Postal ]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Label position
|
|
36
|
+
|
|
37
|
+
| Position | Use |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| **Above the field** (default) | Always — fastest scan, accommodates long labels, RTL-safe, mobile-friendly |
|
|
40
|
+
| Inline left | Only for dense desktop forms with predictable short labels (admin tools, settings) |
|
|
41
|
+
| Floating label (Material) | Avoid — animation distracts, label disappears as users start typing, accessibility tooling struggles |
|
|
42
|
+
| Placeholder-as-label | **Never** — vanishes on input, fails contrast, fails screen readers |
|
|
43
|
+
|
|
44
|
+
For Korean labels (often longer than English), above-field is required.
|
|
45
|
+
|
|
46
|
+
### Group with visual grouping, not boxes
|
|
47
|
+
|
|
48
|
+
Use whitespace + section headings to group related fields. Heavy borders or shaded card backgrounds for each section make the form feel like a tax document.
|
|
49
|
+
|
|
50
|
+
## Field anatomy
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
┌──────────────────────────────────┐
|
|
54
|
+
│ Label │ ← always above
|
|
55
|
+
│ ┌──────────────────────────────┐ │
|
|
56
|
+
│ │ optional placeholder hint │ │ ← shows the format, NOT the label
|
|
57
|
+
│ └──────────────────────────────┘ │
|
|
58
|
+
│ Help text — explains what or why │ ← grey, below
|
|
59
|
+
│ ⚠ Error: be specific │ ← red, replaces help text on error
|
|
60
|
+
└──────────────────────────────────┘
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Required vs optional
|
|
64
|
+
|
|
65
|
+
Mark **optional** with `(optional)`, not required with `*`. Reasoning: most fields in a well-designed form are required; visually marking the few exceptions is less noisy than marking the majority.
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
✓ Email
|
|
69
|
+
✓ Phone (optional)
|
|
70
|
+
✓ Company
|
|
71
|
+
|
|
72
|
+
✗ Email *
|
|
73
|
+
✗ Phone
|
|
74
|
+
✗ Company *
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
For forms where most fields ARE optional (e.g., "complete your profile" type pages), reverse: mark required with `Required` text label, not `*`.
|
|
78
|
+
|
|
79
|
+
`*` alone fails accessibility — screen readers read it as "asterisk", not "required". Use `aria-required="true"` plus visible text.
|
|
80
|
+
|
|
81
|
+
### Help text vs placeholder
|
|
82
|
+
|
|
83
|
+
| Type | Use | Example |
|
|
84
|
+
| --- | --- | --- |
|
|
85
|
+
| **Label** | What this field is | `Email address` |
|
|
86
|
+
| **Help text** (under field) | Why or how (constraints, format hints) | `We'll only use this for password recovery.` |
|
|
87
|
+
| **Placeholder** | Optional, format example only | `name@company.com` |
|
|
88
|
+
| **Error** (replaces help text on error) | What's wrong, how to fix | `Email must include @` |
|
|
89
|
+
|
|
90
|
+
Help text is the single most underused affordance. If you're tempted to add a tooltip — make it help text instead.
|
|
91
|
+
|
|
92
|
+
## Validation
|
|
93
|
+
|
|
94
|
+
### When to validate
|
|
95
|
+
|
|
96
|
+
| Trigger | Use |
|
|
97
|
+
| --- | --- |
|
|
98
|
+
| **On blur** (after user leaves the field) | Default for most fields. Don't yell while user is typing. |
|
|
99
|
+
| **On change** (every keystroke) | After the first error has shown — gives real-time feedback once user knows what's wrong. |
|
|
100
|
+
| **On submit** | Always — final pass. Catches anything missed. |
|
|
101
|
+
| **Async (server-side)** | Username availability, email taken, etc. Show a spinner/icon at the field, not a global loader. |
|
|
102
|
+
|
|
103
|
+
**Never** validate on focus (when user lands in field) — there's no input to validate.
|
|
104
|
+
|
|
105
|
+
### Error message rules
|
|
106
|
+
|
|
107
|
+
1. **Be specific**: `Password must be 8+ characters` not `Invalid password`.
|
|
108
|
+
2. **Be actionable**: tell them what to do, not just what's wrong. `Use a different email — this one's already registered.` is better than `Email taken`.
|
|
109
|
+
3. **Don't blame**: avoid "you failed to" or "you must". `This field is required` is fine.
|
|
110
|
+
4. **Korean tone**: be polite/apologetic. `이메일 형식이 올바르지 않습니다` not `잘못된 이메일`.
|
|
111
|
+
5. **Position next to the field**: never just at the top. Users miss top-level error summaries on mobile.
|
|
112
|
+
6. **Plus a top summary on submit-fail** (with anchor links to each field) — for users with screen readers and for forms longer than ~5 fields.
|
|
113
|
+
|
|
114
|
+
### Inline success affirmation
|
|
115
|
+
|
|
116
|
+
For fields with non-obvious correctness (strong password, valid coupon, available username), show a positive checkmark or message:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
✓ Password is strong
|
|
120
|
+
✓ "username123" is available
|
|
121
|
+
✓ Coupon applied — 20% off
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Use sparingly — confirming every field reads as patronizing.
|
|
125
|
+
|
|
126
|
+
## Specific field types
|
|
127
|
+
|
|
128
|
+
### Email
|
|
129
|
+
|
|
130
|
+
- `<input type="email">` — gets correct mobile keyboard, native validation.
|
|
131
|
+
- `inputmode="email"` for older browsers.
|
|
132
|
+
- `autocomplete="email"` always — saves users typing it again.
|
|
133
|
+
- Validate format on blur with regex, but **don't be strict** — RFC-compliant emails are weirder than your regex thinks. Better to send a verification email than to reject `user+tag@subdomain.example.co.kr`.
|
|
134
|
+
|
|
135
|
+
### Password
|
|
136
|
+
|
|
137
|
+
- `<input type="password">` with a **show/hide toggle** (eye icon).
|
|
138
|
+
- `autocomplete="new-password"` for sign-up, `autocomplete="current-password"` for sign-in. This determines whether the password manager prompts to save vs autofill.
|
|
139
|
+
- Strength meter: yes for sign-up, no for sign-in.
|
|
140
|
+
- Show requirements **before** the user types, not as red errors. `Use 8+ chars with a number` listed under the field.
|
|
141
|
+
- Don't mask password length. `••••••••` of fixed width regardless of actual length is harmful — users lose track.
|
|
142
|
+
|
|
143
|
+
### Phone
|
|
144
|
+
|
|
145
|
+
- `<input type="tel">` for mobile keyboard.
|
|
146
|
+
- `inputmode="tel"`.
|
|
147
|
+
- `autocomplete="tel"`.
|
|
148
|
+
- Auto-format as user types: `010-1234-5678` (Korea), `(415) 555-1234` (US).
|
|
149
|
+
- For international, use a country-code dropdown + national number input. Don't ask users to type `+82` manually.
|
|
150
|
+
|
|
151
|
+
### Date
|
|
152
|
+
|
|
153
|
+
- For dates the user knows (birthdate, expiry) — text input + format hint, OR three dropdowns. Calendar pickers are slow for known dates.
|
|
154
|
+
- For dates the user is choosing (appointment, travel) — calendar picker.
|
|
155
|
+
- Format: localize. Korean default `YYYY.MM.DD`, US `MM/DD/YYYY`, ISO `YYYY-MM-DD` for technical.
|
|
156
|
+
|
|
157
|
+
### Address (Korea-specific)
|
|
158
|
+
|
|
159
|
+
- **Always use postcode lookup** (Daum Postcode API). Never free-form.
|
|
160
|
+
- Two-line address structure: 도로명/지번 (lookup) + 상세주소 (detail, free text).
|
|
161
|
+
- See [knowledge/i18n/korean-product-conventions.md](../i18n/korean-product-conventions.md).
|
|
162
|
+
|
|
163
|
+
### Numbers / currency
|
|
164
|
+
|
|
165
|
+
- `<input type="number">` only when free integer input is fine.
|
|
166
|
+
- For currency: `<input type="text" inputmode="decimal">` + format on blur. (`type="number"` strips leading zeros and rejects formatting.)
|
|
167
|
+
- Show the unit (`₩`, `$`, `kg`) inside or beside the field — don't force the user to type it.
|
|
168
|
+
- For Korean currency: comma-separator on display, bare on submit.
|
|
169
|
+
|
|
170
|
+
### File upload
|
|
171
|
+
|
|
172
|
+
- Drag-and-drop **plus** a button — both modalities. Drag-only excludes mobile.
|
|
173
|
+
- Show file name and size after select. Allow remove.
|
|
174
|
+
- State limits clearly **before** upload: `Max 10 MB. JPG, PNG, PDF.`
|
|
175
|
+
- For images, show preview after upload.
|
|
176
|
+
|
|
177
|
+
## Multi-step forms
|
|
178
|
+
|
|
179
|
+
Use multi-step when:
|
|
180
|
+
- Form has > 8 logically separable fields.
|
|
181
|
+
- Steps have completion incentive (progressive disclosure).
|
|
182
|
+
- You can save progress between steps.
|
|
183
|
+
|
|
184
|
+
Don't use multi-step when:
|
|
185
|
+
- All fields could fit on one page comfortably.
|
|
186
|
+
- Steps are arbitrary chunks (no logical grouping).
|
|
187
|
+
|
|
188
|
+
Required affordances:
|
|
189
|
+
- **Progress indicator**: dots, numbered steps, or progress bar.
|
|
190
|
+
- **Back button** on every step except the first.
|
|
191
|
+
- **Save progress** if the form takes > 2 minutes.
|
|
192
|
+
- **Don't reset** on back navigation.
|
|
193
|
+
- **Allow non-linear navigation** if steps are independent.
|
|
194
|
+
|
|
195
|
+
## Submit button
|
|
196
|
+
|
|
197
|
+
- Action-specific label: `Create account` not `Submit`. `Send password reset email` not `Send`.
|
|
198
|
+
- Always one primary submit per form. Multiple primary buttons confuse.
|
|
199
|
+
- Disable while submitting (loading state).
|
|
200
|
+
- After submit, show toast/banner with next-step guidance — don't just clear the form silently.
|
|
201
|
+
- For destructive submits (delete, remove): require confirmation, use red intent.
|
|
202
|
+
|
|
203
|
+
## Mobile considerations
|
|
204
|
+
|
|
205
|
+
- All fields full-width on mobile — no left/right padding wasted.
|
|
206
|
+
- Field height ≥ 44 px for tap target.
|
|
207
|
+
- Spacing between fields ≥ 16 px (so the field above doesn't get accidentally tapped).
|
|
208
|
+
- Use the right `inputmode` for every field — gets users the right keyboard.
|
|
209
|
+
- Submit button at the bottom, sticky if form is long.
|
|
210
|
+
- Avoid datepickers that take over the screen — system native is better.
|
|
211
|
+
|
|
212
|
+
## Accessibility
|
|
213
|
+
|
|
214
|
+
- Every field has a `<label for>` linking to its `id`. (Or `aria-labelledby` for non-label cases.)
|
|
215
|
+
- Required fields: `aria-required="true"` AND visible "required" indicator.
|
|
216
|
+
- Errors: `aria-invalid="true"` on the field + `aria-describedby` pointing to the error message.
|
|
217
|
+
- Error messages live in `role="alert"` or `aria-live="polite"` — announced by screen reader.
|
|
218
|
+
- Group related fields with `<fieldset>` and `<legend>`.
|
|
219
|
+
- For multi-step: announce step changes via live region.
|
|
220
|
+
- Cite [knowledge/a11y/keyboard-and-focus.md](../a11y/keyboard-and-focus.md) for keyboard handling.
|
|
221
|
+
|
|
222
|
+
## Common form anti-patterns
|
|
223
|
+
|
|
224
|
+
- **Reset button**: nobody wants to reset by accident; remove it.
|
|
225
|
+
- **CAPTCHA at the end of a long form**: blocks valid users; use invisible reCAPTCHA or hCaptcha.
|
|
226
|
+
- **Confirm-email field**: just have one. Email validation + verification covers it.
|
|
227
|
+
- **Confirm-password field**: redundant if there's a show/hide toggle. Skip.
|
|
228
|
+
- **Fields that aren't actually used**: cut. Every field is friction.
|
|
229
|
+
- **Asking for info you can derive**: don't ask for "country" if you have IP. Don't ask for "age" if you have DOB.
|
|
230
|
+
- **Soft-disabled submit until "all valid"**: confusing — users can't tell why. Better: let them click, then surface specific errors.
|
|
231
|
+
- **Error summary on top of long form, no anchor links**: users have to scroll to find the field.
|
|
232
|
+
|
|
233
|
+
## Cross-reference
|
|
234
|
+
|
|
235
|
+
- [knowledge/patterns/ux-guidelines.md](ux-guidelines.md) — broader UX rules
|
|
236
|
+
- [knowledge/i18n/korean-product-conventions.md](../i18n/korean-product-conventions.md) — Korean form expectations (phone, address, terms)
|
|
237
|
+
- [knowledge/a11y/keyboard-and-focus.md](../a11y/keyboard-and-focus.md) — keyboard navigation contract
|