@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,271 @@
|
|
|
1
|
+
# `InputOTP` (one-time password input) — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Input.OTP`, MUI (no built-in), shadcn-ui `input-otp`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A multi-cell input for one-time passwords / verification codes. Each digit lives in its own visual cell. Used for: SMS verification, 2FA codes, app verification (KakaoTalk login auth).
|
|
8
|
+
|
|
9
|
+
In Korean fintech: **mandatory** for SMS-based 본인인증 verification flows.
|
|
10
|
+
|
|
11
|
+
## Anatomy
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐
|
|
15
|
+
│ 1│ │ 2│ │ 3│ │ 4│ │ 5│ │ 6│ ← 6-digit code (Korean SMS standard)
|
|
16
|
+
└──┘ └──┘ └──┘ └──┘ └──┘ └──┘
|
|
17
|
+
[Resend] in 30s
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Slot | Required | Notes |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Cells | yes | One per digit, square boxes |
|
|
23
|
+
| Active cell indicator | yes | Cursor / border emphasis on current input |
|
|
24
|
+
| Resend button | optional | Below the input — re-request the code |
|
|
25
|
+
|
|
26
|
+
## API
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
<InputOTP
|
|
30
|
+
length={6}
|
|
31
|
+
value={code}
|
|
32
|
+
onValueChange={setCode}
|
|
33
|
+
onComplete={(code) => verify(code)}
|
|
34
|
+
autoFocus
|
|
35
|
+
/>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Prop | Type | Default | Description |
|
|
39
|
+
| --- | --- | --- | --- |
|
|
40
|
+
| `length` | `number` | `6` | Number of cells |
|
|
41
|
+
| `value` | `string` | — | Current value |
|
|
42
|
+
| `onValueChange` | `(value: string) => void` | — | Fires on each cell change |
|
|
43
|
+
| `onComplete` | `(value: string) => void` | — | Fires when all cells filled |
|
|
44
|
+
| `autoFocus` | `boolean` | `false` | Focus first cell on mount |
|
|
45
|
+
| `disabled` | `boolean` | `false` | |
|
|
46
|
+
| `error` / `errorText` | — | — | |
|
|
47
|
+
| `pattern` | `"numeric" \| "alphanumeric"` | `"numeric"` | Allowed chars per cell |
|
|
48
|
+
| `mask` | `boolean` | `false` | Mask digits as ` • ` (security; rare for SMS codes) |
|
|
49
|
+
| `separator` | `ReactNode` | — | Visual separator after N cells (e.g., `-` after 3) |
|
|
50
|
+
|
|
51
|
+
## Behavior
|
|
52
|
+
|
|
53
|
+
### Per-cell typing
|
|
54
|
+
|
|
55
|
+
- User types in cell 1: digit appears, focus auto-advances to cell 2.
|
|
56
|
+
- Continues until all cells filled.
|
|
57
|
+
- On complete: `onComplete` fires.
|
|
58
|
+
|
|
59
|
+
### Backspace
|
|
60
|
+
|
|
61
|
+
- Backspace in an empty cell: focus moves back, deletes previous cell's digit.
|
|
62
|
+
- Backspace in a filled cell: deletes that digit, focus stays.
|
|
63
|
+
|
|
64
|
+
### Paste
|
|
65
|
+
|
|
66
|
+
User pastes a 6-digit code (e.g., from SMS). Distribute across cells:
|
|
67
|
+
- "123456" → cells become 1, 2, 3, 4, 5, 6.
|
|
68
|
+
- "12 34 56" → strip spaces, distribute.
|
|
69
|
+
- "123-456" → strip non-digits, distribute.
|
|
70
|
+
- Mid-paste: cursor lands on the last filled cell or after.
|
|
71
|
+
|
|
72
|
+
This is the most-tested path — get it right.
|
|
73
|
+
|
|
74
|
+
### Auto-fill (mobile)
|
|
75
|
+
|
|
76
|
+
iOS / Android can auto-fill SMS codes from the most recent text message. Set `autoComplete="one-time-code"` on the input:
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
<input
|
|
80
|
+
type="text"
|
|
81
|
+
inputMode="numeric"
|
|
82
|
+
autoComplete="one-time-code"
|
|
83
|
+
pattern="[0-9]*"
|
|
84
|
+
maxLength={1}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
iOS reads the SMS notification, extracts the code, and offers to autofill.
|
|
89
|
+
|
|
90
|
+
## States
|
|
91
|
+
|
|
92
|
+
| State | Visual |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| Empty | Cells empty, first cell focus ring |
|
|
95
|
+
| Active cell | Border highlighted (primary), cursor visible |
|
|
96
|
+
| Filled cell | Digit visible, border default |
|
|
97
|
+
| Complete | All filled; `onComplete` fired |
|
|
98
|
+
| Error | All cells red border |
|
|
99
|
+
| Disabled | Muted, no events |
|
|
100
|
+
| Loading (verifying) | Cells dimmed, spinner overlay |
|
|
101
|
+
|
|
102
|
+
## Sizes
|
|
103
|
+
|
|
104
|
+
| Size | Cell | Font | Gap |
|
|
105
|
+
| --- | --- | --- | --- |
|
|
106
|
+
| `sm` | 32×40 | 16px | 4px |
|
|
107
|
+
| `md` (default) | 40×48 | 20px | 8px |
|
|
108
|
+
| `lg` | 48×56 | 24px | 12px |
|
|
109
|
+
|
|
110
|
+
For mobile primary auth: `lg` is right (large touch targets, clear digits).
|
|
111
|
+
|
|
112
|
+
## Tokens consumed
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
--color-bg-default
|
|
116
|
+
--color-border-default (cell border)
|
|
117
|
+
--color-border-strong (hover)
|
|
118
|
+
--color-primary-default (active cell, complete state)
|
|
119
|
+
--color-text-primary
|
|
120
|
+
--color-error (error state)
|
|
121
|
+
--color-focus-ring
|
|
122
|
+
--space-xs, --space-sm
|
|
123
|
+
--radius-md
|
|
124
|
+
--font-size-xl (digit display)
|
|
125
|
+
--font-feature-amount: 'tnum' 1 (tabular numerals — digits align)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Accessibility
|
|
129
|
+
|
|
130
|
+
- Container: `<fieldset>` with `<legend>` ("인증번호 입력").
|
|
131
|
+
- Each cell: `<input type="text" inputMode="numeric" maxLength={1}>` with `aria-label="N번째 자리"`.
|
|
132
|
+
- Group: `role="group"` for screen reader awareness.
|
|
133
|
+
- Error: `role="alert"` on errorText.
|
|
134
|
+
|
|
135
|
+
```html
|
|
136
|
+
<fieldset>
|
|
137
|
+
<legend class="sr-only">인증번호 입력</legend>
|
|
138
|
+
<div role="group">
|
|
139
|
+
<input aria-label="1번째 자리" maxlength="1" inputmode="numeric" autocomplete="one-time-code" />
|
|
140
|
+
<input aria-label="2번째 자리" maxlength="1" inputmode="numeric" />
|
|
141
|
+
...
|
|
142
|
+
</div>
|
|
143
|
+
</fieldset>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Keyboard
|
|
147
|
+
|
|
148
|
+
| Key | Behavior |
|
|
149
|
+
| --- | --- |
|
|
150
|
+
| `Tab` | Reach first cell |
|
|
151
|
+
| Type digit | Auto-advance to next |
|
|
152
|
+
| `Backspace` | Delete + go back |
|
|
153
|
+
| `←` / `→` | Move between cells |
|
|
154
|
+
| `Home` / `End` | First / last cell |
|
|
155
|
+
| `Cmd+V` / `Ctrl+V` | Paste full code |
|
|
156
|
+
|
|
157
|
+
## Korean SMS verification flow
|
|
158
|
+
|
|
159
|
+
Standard pattern in Korean fintech / banking:
|
|
160
|
+
|
|
161
|
+
1. User enters phone number.
|
|
162
|
+
2. App sends SMS via vendor (NICE, KCB, Toss).
|
|
163
|
+
3. SMS arrives: `[XXX 인증번호] 123456 입력해주세요.`
|
|
164
|
+
4. User enters code in InputOTP.
|
|
165
|
+
5. App verifies via vendor API.
|
|
166
|
+
6. Either: success → proceed; OR: 3+ failures → reset.
|
|
167
|
+
|
|
168
|
+
### Resend timer
|
|
169
|
+
|
|
170
|
+
Always include a "재전송" (resend) button with a 30–60s cooldown:
|
|
171
|
+
|
|
172
|
+
```tsx
|
|
173
|
+
<div>
|
|
174
|
+
<InputOTP length={6} onComplete={verify} />
|
|
175
|
+
<ResendButton cooldown={30} onResend={requestNewCode} />
|
|
176
|
+
{/* Shows: "30초 후 재전송" → "재전송하기" after countdown */}
|
|
177
|
+
</div>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Rate-limit re-sends server-side (max 5/hour typical).
|
|
181
|
+
|
|
182
|
+
## Error states
|
|
183
|
+
|
|
184
|
+
| Cause | Message |
|
|
185
|
+
| --- | --- |
|
|
186
|
+
| Wrong code | "인증번호가 올바르지 않습니다." |
|
|
187
|
+
| Expired code | "인증번호가 만료되었습니다. 다시 발급해 주세요." |
|
|
188
|
+
| Too many attempts | "인증 시도 횟수를 초과했습니다. 잠시 후 다시 시도해 주세요." |
|
|
189
|
+
| Network | "네트워크 연결을 확인해 주세요." |
|
|
190
|
+
|
|
191
|
+
Clear the input on error so user can re-type.
|
|
192
|
+
|
|
193
|
+
## Code example
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
function VerifyPhoneScreen({ phone }: Props) {
|
|
197
|
+
const [code, setCode] = useState("");
|
|
198
|
+
const [error, setError] = useState<string>();
|
|
199
|
+
const [verifying, setVerifying] = useState(false);
|
|
200
|
+
const [cooldown, setCooldown] = useCountdown(30);
|
|
201
|
+
|
|
202
|
+
const handleVerify = async (otpCode: string) => {
|
|
203
|
+
setVerifying(true);
|
|
204
|
+
try {
|
|
205
|
+
await api.verifyCode({ phone, code: otpCode });
|
|
206
|
+
navigation.navigate("Success");
|
|
207
|
+
} catch (err) {
|
|
208
|
+
setError(err.message);
|
|
209
|
+
setCode("");
|
|
210
|
+
} finally {
|
|
211
|
+
setVerifying(false);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
return (
|
|
216
|
+
<Page>
|
|
217
|
+
<h1>인증번호 입력</h1>
|
|
218
|
+
<p>{phone}로 보낸 6자리 인증번호를 입력해 주세요.</p>
|
|
219
|
+
|
|
220
|
+
<InputOTP
|
|
221
|
+
length={6}
|
|
222
|
+
value={code}
|
|
223
|
+
onValueChange={setCode}
|
|
224
|
+
onComplete={handleVerify}
|
|
225
|
+
autoFocus
|
|
226
|
+
disabled={verifying}
|
|
227
|
+
errorText={error}
|
|
228
|
+
/>
|
|
229
|
+
|
|
230
|
+
<Button
|
|
231
|
+
variant="link"
|
|
232
|
+
onClick={() => { resendCode(); setCooldown(30); }}
|
|
233
|
+
disabled={cooldown > 0}
|
|
234
|
+
>
|
|
235
|
+
{cooldown > 0 ? `${cooldown}초 후 재전송` : "재전송하기"}
|
|
236
|
+
</Button>
|
|
237
|
+
</Page>
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Edge cases
|
|
243
|
+
|
|
244
|
+
- **Paste includes non-digits**: filter to digits only, distribute remaining across cells.
|
|
245
|
+
- **Paste shorter than length**: fill from start, leave rest empty.
|
|
246
|
+
- **Paste longer than length**: take first N digits.
|
|
247
|
+
- **User types fast**: each cell may flicker — make sure auto-advance doesn't skip.
|
|
248
|
+
- **Auto-fill replaces manual entry**: respect user's intent — auto-fill once if user hasn't typed yet; don't override mid-typing.
|
|
249
|
+
- **Lost focus**: when user dismisses keyboard then returns, focus the next empty cell.
|
|
250
|
+
|
|
251
|
+
## Don't
|
|
252
|
+
|
|
253
|
+
- Don't omit `autoComplete="one-time-code"` — auto-fill is a major UX win.
|
|
254
|
+
- Don't allow non-digit input (unless `pattern="alphanumeric"` for special cases).
|
|
255
|
+
- Don't reset entire input on error — let user just fix the wrong cells.
|
|
256
|
+
- Don't skip the resend cooldown — user-initiated DoS risk.
|
|
257
|
+
- Don't show the digits as plaintext in screen readers if `mask=true` was requested.
|
|
258
|
+
- Don't make cells too small to tap reliably (≥ 40px on mobile).
|
|
259
|
+
|
|
260
|
+
## References
|
|
261
|
+
|
|
262
|
+
- Ant Design: [`refs/ant-design/components/input/`](../refs/ant-design/components/input/) — `Input.OTP`. Length, formatting, paste handling.
|
|
263
|
+
- MUI: no built-in. Compose individual `<TextField>` cells.
|
|
264
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/input-otp.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/input-otp.tsx) — wraps `input-otp` library. **Default for new projects.**
|
|
265
|
+
|
|
266
|
+
## Cross-reference
|
|
267
|
+
|
|
268
|
+
- [`examples/component-input.md`](component-input.md) — base Input
|
|
269
|
+
- [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md) — phone-first auth + 본인인증
|
|
270
|
+
- [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — payment-related verification
|
|
271
|
+
- [`examples/component-biometric-gate.md`](component-biometric-gate.md) — biometric fallback path
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# `Input` — spec
|
|
2
|
+
|
|
3
|
+
> Status: example artifact for `component-spec-writer` skill
|
|
4
|
+
> Generated by: `skills/component-spec-writer`, citing Ant Design `Input`, MUI `TextField`, shadcn-ui `input` + `label`
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
A single-line text input. The most-used form control. Must compose with labels, help text, and errors; must accept controlled and uncontrolled values; must clear WCAG AA in every state.
|
|
9
|
+
|
|
10
|
+
## Anatomy
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
Field (the row)
|
|
14
|
+
├── Label (above input)
|
|
15
|
+
├── Input
|
|
16
|
+
│ ├── [iconStart]? prefix slot
|
|
17
|
+
│ ├── input element
|
|
18
|
+
│ ├── [iconEnd]? suffix slot (status icon, clear button, password toggle, etc.)
|
|
19
|
+
│ └── [addonStart/End]? text/button addon (e.g., `https://`, `/page`)
|
|
20
|
+
├── HelpText (below — neutral hint)
|
|
21
|
+
└── ErrorText (below — replaces HelpText in error state)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Part | Purpose | Required |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| Label | What this field is | yes (visible OR `aria-label`) |
|
|
27
|
+
| Input | The control | yes |
|
|
28
|
+
| HelpText | Why or how (constraints, format) | optional |
|
|
29
|
+
| ErrorText | What's wrong, how to fix | required when `error` |
|
|
30
|
+
| iconStart/End | Icon affordance inside the field | optional |
|
|
31
|
+
| addonStart/End | Text or control attached to the side | optional |
|
|
32
|
+
|
|
33
|
+
## API
|
|
34
|
+
|
|
35
|
+
| Prop | Type | Default | Description |
|
|
36
|
+
| --- | --- | --- | --- |
|
|
37
|
+
| `value` | `string` | — | Controlled value. |
|
|
38
|
+
| `defaultValue` | `string` | — | Uncontrolled initial value. |
|
|
39
|
+
| `onChange` | `(value: string, e: ChangeEvent) => void` | — | Fires per keystroke. First arg is value (most-used), event second. |
|
|
40
|
+
| `onBlur` | `(e: FocusEvent) => void` | — | Fires when input loses focus. Use to trigger validation. |
|
|
41
|
+
| `label` | `string \| ReactNode` | — | Visible label. If omitted, **`aria-label` is required**. |
|
|
42
|
+
| `placeholder` | `string` | — | Format hint. Never the label. Disappears on input. |
|
|
43
|
+
| `helpText` | `string \| ReactNode` | — | Below-field hint. Always visible until error replaces it. |
|
|
44
|
+
| `errorText` | `string` | — | Below-field error. Setting non-empty implies `error={true}`. |
|
|
45
|
+
| `error` | `boolean` | inferred from `errorText` | Force error styling without text. |
|
|
46
|
+
| `required` | `boolean` | `false` | Marks visually + sets `aria-required`. Visible label gets `(optional)` on others. |
|
|
47
|
+
| `disabled` | `boolean` | `false` | Removes interactivity. |
|
|
48
|
+
| `readOnly` | `boolean` | `false` | Value visible but not editable. Different from disabled — focus/copy still work. |
|
|
49
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
|
|
50
|
+
| `type` | `"text" \| "email" \| "password" \| "tel" \| "url" \| "search"` | `"text"` | Drives mobile keyboard via native attr. |
|
|
51
|
+
| `inputMode` | `HTMLAttributes['inputMode']` | derived from `type` | Override mobile keyboard. |
|
|
52
|
+
| `autoComplete` | `string` | — | `"email"`, `"new-password"`, `"current-password"`, `"tel"`, etc. **Always set** for known semantic fields. |
|
|
53
|
+
| `iconStart` | `ReactNode` | — | Icon inside left side of input. |
|
|
54
|
+
| `iconEnd` | `ReactNode` | — | Icon inside right side. Auto-rendered for password toggle, clear button, status. |
|
|
55
|
+
| `addonStart` | `ReactNode` | — | Attached element outside the input on the left (e.g., `https://`). |
|
|
56
|
+
| `addonEnd` | `ReactNode` | — | Attached element outside the input on the right. |
|
|
57
|
+
| `clearable` | `boolean` | `false` | Renders an `×` clear button when value is non-empty. |
|
|
58
|
+
| `showPasswordToggle` | `boolean` | `true` for `type="password"` | Eye icon to show/hide. |
|
|
59
|
+
| `maxLength` | `number` | — | Hard limit. If set, render counter `0/100`. |
|
|
60
|
+
| `name` | `string` | — | Form name. Required for native form submission. |
|
|
61
|
+
| `id` | `string` | auto-generated | Used by `<label htmlFor>`. |
|
|
62
|
+
| `fullWidth` | `boolean` | `true` | Inputs default full-width within their parent. |
|
|
63
|
+
|
|
64
|
+
## States
|
|
65
|
+
|
|
66
|
+
| State | Trigger | Visual |
|
|
67
|
+
| --- | --- | --- |
|
|
68
|
+
| Default | resting | 1px border `--color-border-default`, bg `--color-bg-default` |
|
|
69
|
+
| Hover | mouse-over | border `--color-border-strong` |
|
|
70
|
+
| Focus-visible | keyboard tab | 2px ring `--color-focus-ring`, 2px offset; border `--color-primary-default` |
|
|
71
|
+
| Filled | `value` non-empty | unchanged (don't darken) |
|
|
72
|
+
| Error | `error` | border `--color-error`, focus ring `--color-error/40`, errorText shown |
|
|
73
|
+
| Disabled | `disabled` | bg `--color-bg-subtle`, text `--color-text-disabled`, no border emphasis |
|
|
74
|
+
| Read-only | `readOnly` | bg `--color-bg-subtle`, no border emphasis, cursor `text` |
|
|
75
|
+
| Loading (async validation) | `loading` (custom prop) | spinner in iconEnd slot |
|
|
76
|
+
|
|
77
|
+
## Sizes
|
|
78
|
+
|
|
79
|
+
| Size | Height | Font | Padding-x | Icon size | Use |
|
|
80
|
+
| --- | --- | --- | --- | --- | --- |
|
|
81
|
+
| `sm` | 32px | 13px | 8px | 14px | dense forms, compact UIs |
|
|
82
|
+
| `md` | 40px | 14px | 12px | 16px | default |
|
|
83
|
+
| `lg` | 48px | 16px | 16px | 20px | mobile-priority forms |
|
|
84
|
+
|
|
85
|
+
## Tokens consumed
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
--color-border-default
|
|
89
|
+
--color-border-strong
|
|
90
|
+
--color-bg-default
|
|
91
|
+
--color-bg-subtle
|
|
92
|
+
--color-text-primary
|
|
93
|
+
--color-text-secondary
|
|
94
|
+
--color-text-tertiary
|
|
95
|
+
--color-text-disabled
|
|
96
|
+
--color-primary-default
|
|
97
|
+
--color-error
|
|
98
|
+
--color-focus-ring
|
|
99
|
+
--space-sm
|
|
100
|
+
--space-md
|
|
101
|
+
--radius-md
|
|
102
|
+
--font-size-sm
|
|
103
|
+
--font-size-base
|
|
104
|
+
--font-size-lg
|
|
105
|
+
--transition-fast
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Accessibility
|
|
109
|
+
|
|
110
|
+
- **Semantic**: native `<input>`. Always paired with `<label>` (visible) or `aria-label`.
|
|
111
|
+
- `<label htmlFor={id}>` is the strongest pattern — clicking the label focuses the input.
|
|
112
|
+
- **Required**:
|
|
113
|
+
- `required` attribute (HTML).
|
|
114
|
+
- `aria-required="true"` (explicit for AT).
|
|
115
|
+
- Visible "Required" indicator (or `(optional)` on optionals — see [knowledge/patterns/form-design.md](../knowledge/patterns/form-design.md)).
|
|
116
|
+
- **Error**:
|
|
117
|
+
- `aria-invalid="true"` when `error`.
|
|
118
|
+
- `aria-describedby` pointing to the error text element's id.
|
|
119
|
+
- Error text in `role="alert"` for assertive announcement, or `aria-live="polite"` for non-blocking.
|
|
120
|
+
- **Help text**: `aria-describedby` pointing to the help element (in addition to error when present, both ids).
|
|
121
|
+
- **Password show/hide**: the toggle button needs its own `aria-label="Show password"` / `"Hide password"`.
|
|
122
|
+
- **Clear button**: `aria-label="Clear"`.
|
|
123
|
+
- **Touch target**: input height ≥ 40px for mobile. `sm` (32px) is too small for touch primary forms.
|
|
124
|
+
- **Keyboard**:
|
|
125
|
+
- `Tab` reaches.
|
|
126
|
+
- `Esc` clears search-type inputs (convention, not native).
|
|
127
|
+
- For comboboxes built on top of input, follow [WAI-ARIA APG combobox pattern](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/).
|
|
128
|
+
- **Autofill**: `autoComplete` attribute is required for password manager and browser autofill. Skipping it is a real friction cost.
|
|
129
|
+
|
|
130
|
+
## Code example
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
// Default — labeled, with help text
|
|
134
|
+
<Input
|
|
135
|
+
label="Email"
|
|
136
|
+
type="email"
|
|
137
|
+
placeholder="name@company.com"
|
|
138
|
+
helpText="We'll only use this for password recovery."
|
|
139
|
+
autoComplete="email"
|
|
140
|
+
value={email}
|
|
141
|
+
onChange={setEmail}
|
|
142
|
+
required
|
|
143
|
+
/>
|
|
144
|
+
|
|
145
|
+
// Error state
|
|
146
|
+
<Input
|
|
147
|
+
label="Password"
|
|
148
|
+
type="password"
|
|
149
|
+
value={password}
|
|
150
|
+
onChange={setPassword}
|
|
151
|
+
errorText="Password must include a number."
|
|
152
|
+
autoComplete="new-password"
|
|
153
|
+
required
|
|
154
|
+
/>
|
|
155
|
+
|
|
156
|
+
// With icon and clearable
|
|
157
|
+
<Input
|
|
158
|
+
label="Search"
|
|
159
|
+
type="search"
|
|
160
|
+
iconStart={<SearchIcon />}
|
|
161
|
+
clearable
|
|
162
|
+
value={query}
|
|
163
|
+
onChange={setQuery}
|
|
164
|
+
/>
|
|
165
|
+
|
|
166
|
+
// With addon (URL prefix)
|
|
167
|
+
<Input
|
|
168
|
+
label="Site URL"
|
|
169
|
+
addonStart="https://"
|
|
170
|
+
placeholder="example.com"
|
|
171
|
+
value={url}
|
|
172
|
+
onChange={setUrl}
|
|
173
|
+
/>
|
|
174
|
+
|
|
175
|
+
// Read-only display
|
|
176
|
+
<Input label="Account ID" value="acc_8f2k...3jq" readOnly />
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Edge cases
|
|
180
|
+
|
|
181
|
+
- **Pasting overflows `maxLength`**: native truncates. Surface the behavior with the counter going red and a help-text update.
|
|
182
|
+
- **`type="number"` quirks**: avoid for currency/decimals — strips leading zeros, rejects formatting, scrolls on accidental wheel. Use `type="text" inputMode="decimal"` and parse on blur.
|
|
183
|
+
- **Password manager covering iconEnd**: 1Password and similar overlay over the right side of password fields. Don't put critical UI there for `type="password"`.
|
|
184
|
+
- **iOS auto-zoom on font-size < 16px**: focusing an input with smaller font triggers Safari zoom. Either set `font-size: 16px` or add `<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">` (the latter is debated for a11y).
|
|
185
|
+
- **RTL**: `iconStart` mirrors right, `iconEnd` mirrors left, padding swaps. Use logical CSS properties.
|
|
186
|
+
- **Korean input**: IME (input method editor) generates intermediate states (조합 중). Don't validate per-keystroke during composition. Listen to `compositionstart`/`compositionend` and skip validation between them.
|
|
187
|
+
|
|
188
|
+
## Don't
|
|
189
|
+
|
|
190
|
+
- Don't use `placeholder` as the only label.
|
|
191
|
+
- Don't make `label` the only error indicator (color alone fails contrast for color-blind users — always have `errorText`).
|
|
192
|
+
- Don't disable submit until "valid" without showing why each field is invalid.
|
|
193
|
+
- Don't validate on every keystroke before user has had a chance to finish typing — validate on blur for the first error, then on change after.
|
|
194
|
+
- Don't mask password length with fixed-width dots — show actual length in the bullet count.
|
|
195
|
+
- Don't put `iconStart` and `addonStart` together — pick one to indicate the leading affordance.
|
|
196
|
+
|
|
197
|
+
## References
|
|
198
|
+
|
|
199
|
+
- Ant Design: [`refs/ant-design/components/input/`](../refs/ant-design/components/input/) — `Input`, `Input.Search`, `Input.Password`, `Input.TextArea`, `Input.Group`, `Input.OTP`. Most exhaustive split-by-purpose API.
|
|
200
|
+
- MUI: [`refs/mui/packages/mui-material/src/Input/Input.tsx`](../refs/mui/packages/mui-material/src/Input/) and [`TextField/TextField.tsx`](../refs/mui/packages/mui-material/src/TextField/) — separates `Input` (raw) from `TextField` (Input + label + helper). MUI's split is cleaner conceptually.
|
|
201
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/input.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/input.tsx) — minimal styling layer over native `<input>`. Pairs with separate `label.tsx`. Composition over configuration.
|
|
202
|
+
|
|
203
|
+
API choices made:
|
|
204
|
+
- **`label`/`helpText`/`errorText` as props** rather than separate components: 80% of inputs need all three; props keep usage compact. Composition (`<Field><Label/>...`) for the 20% that need finer control.
|
|
205
|
+
- **`onChange(value, e)` ordering**: value-first since that's what 95% of consumers want. Event is escape hatch.
|
|
206
|
+
- **`autoComplete` is documented as critical**: ant-design and shadcn don't emphasize it; skipping is a real loss for forms.
|
|
207
|
+
- **`clearable` and `showPasswordToggle` as props**: ant-design has them, MUI doesn't. They're worth the surface area — every product UI re-implements them otherwise.
|
|
208
|
+
|
|
209
|
+
## Cross-reference
|
|
210
|
+
|
|
211
|
+
- [knowledge/patterns/form-design.md](../knowledge/patterns/form-design.md)
|
|
212
|
+
- [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md)
|
|
213
|
+
- [knowledge/a11y/contrast.md](../knowledge/a11y/contrast.md)
|