@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,77 @@
|
|
|
1
|
+
# `AlertTitle` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `AlertTitle`. The header line inside an `Alert`. Use for alerts with both a short title and a longer body — without it, the alert just shows a one-line message.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Multi-line alerts where the first line is a summary and the rest is detail.
|
|
8
|
+
- Alerts that need a strong visual hierarchy ("Something went wrong" + paragraph of detail).
|
|
9
|
+
|
|
10
|
+
## When NOT to use
|
|
11
|
+
|
|
12
|
+
- One-line alerts → just use `<Alert>` with text content.
|
|
13
|
+
|
|
14
|
+
## API
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
<Alert severity="error">
|
|
18
|
+
<AlertTitle>저장에 실패했어요</AlertTitle>
|
|
19
|
+
네트워크 연결을 확인하고 다시 시도해 주세요. 문제가 계속되면{' '}
|
|
20
|
+
<Link href="/help">도움말</Link>을 참고하세요.
|
|
21
|
+
</Alert>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| `children` | `ReactNode` | — | Title text |
|
|
27
|
+
|
|
28
|
+
Extends `Typography` — typography props work.
|
|
29
|
+
|
|
30
|
+
## Tokens consumed
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
--font-size-heading-sm /* 16px */
|
|
34
|
+
--font-weight-semibold
|
|
35
|
+
--space-xs /* margin-bottom to body */
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Accessibility
|
|
39
|
+
|
|
40
|
+
- Renders inside the Alert's accessible region.
|
|
41
|
+
- For severity changes, the title color follows (error red, warning amber, etc.).
|
|
42
|
+
- Don't omit the title for severity-error multi-paragraph alerts — title gives quick scan.
|
|
43
|
+
|
|
44
|
+
## Edge cases
|
|
45
|
+
|
|
46
|
+
- **Korean honorific** — match the alert severity. Error: 합쇼체 ("저장에 실패하셨습니다"). Info: 해요체 ("저장됐어요").
|
|
47
|
+
- **Long titles** — wrap; for ellipsis, use `noWrap` on Typography.
|
|
48
|
+
|
|
49
|
+
## Code example
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<Alert
|
|
53
|
+
severity="warning"
|
|
54
|
+
action={
|
|
55
|
+
<Button color="inherit" size="small" onClick={handleDismiss}>
|
|
56
|
+
닫기
|
|
57
|
+
</Button>
|
|
58
|
+
}
|
|
59
|
+
>
|
|
60
|
+
<AlertTitle>저장하지 않은 변경사항이 있어요</AlertTitle>
|
|
61
|
+
페이지를 떠나면 변경사항이 사라져요. 저장하시겠어요?
|
|
62
|
+
</Alert>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Don't
|
|
66
|
+
|
|
67
|
+
- Don't use for one-liner alerts.
|
|
68
|
+
- Don't put interactive elements inside the title — they belong in `action`.
|
|
69
|
+
|
|
70
|
+
## References
|
|
71
|
+
|
|
72
|
+
- MUI: [`AlertTitle`](../refs/mui/packages/mui-material/src/AlertTitle/)
|
|
73
|
+
|
|
74
|
+
## Cross-reference
|
|
75
|
+
|
|
76
|
+
- [`component-alert.md`](component-alert.md)
|
|
77
|
+
- [`component-snackbar.md`](component-snackbar.md)
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# `Alert` (Banner) — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Alert`, MUI `Alert`, shadcn-ui `alert`. Different from Toast — Alert is **persistent and inline**, Toast is **transient and floating**.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A persistent in-page message: status info, warnings, errors that the user must see and may need to act on. Sticks until dismissed or until the underlying state changes.
|
|
8
|
+
|
|
9
|
+
## When Alert vs Toast vs Modal
|
|
10
|
+
|
|
11
|
+
| Use | Why |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| **Alert** | The state persists. The user sees it on every render. Inline in the page. |
|
|
14
|
+
| **Toast** | The state is momentary. Auto-dismisses. Floating. |
|
|
15
|
+
| **Modal** | The user must respond before continuing. Blocks interaction. |
|
|
16
|
+
| **InlineError** (form-level) | Single field validation — use form's ErrorText, not Alert. |
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
22
|
+
│ [icon] Title [✕] │
|
|
23
|
+
│ Description (optional) │
|
|
24
|
+
│ │
|
|
25
|
+
│ [primary action] [secondary] │ ← actions row (optional)
|
|
26
|
+
└──────────────────────────────────────────────────────────────┘
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
| Slot | Required | Notes |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| Intent icon | usually | Matches intent: ℹ ✓ ⚠ ✕ — provides redundant cue beyond color |
|
|
32
|
+
| Title | yes | The message; ≤ 80 chars |
|
|
33
|
+
| Description | optional | Detail or remediation hint |
|
|
34
|
+
| Actions | optional | 1–2 buttons (e.g., "Retry", "Learn more") |
|
|
35
|
+
| Close button | optional (always for `error`) | ✕ in top-right |
|
|
36
|
+
|
|
37
|
+
## API
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
<Alert
|
|
41
|
+
intent="warning"
|
|
42
|
+
title="구독 만료가 임박했습니다"
|
|
43
|
+
description="2026년 6월 1일까지 결제 정보를 업데이트해 주세요."
|
|
44
|
+
actions={[
|
|
45
|
+
{ label: "결제 정보 업데이트", onClick: handleUpdate, intent: "primary" },
|
|
46
|
+
{ label: "나중에", onClick: dismiss, variant: "ghost" },
|
|
47
|
+
]}
|
|
48
|
+
dismissible
|
|
49
|
+
onDismiss={handleDismiss}
|
|
50
|
+
/>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
| Prop | Type | Default | Description |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| `intent` | `"info" \| "success" \| "warning" \| "error"` | `"info"` | Sets icon + color + ARIA role |
|
|
56
|
+
| `title` | `string \| ReactNode` | — | Required. The message. |
|
|
57
|
+
| `description` | `string \| ReactNode` | — | Detail line(s). |
|
|
58
|
+
| `actions` | `Action[]` | — | Up to 2 buttons. |
|
|
59
|
+
| `dismissible` | `boolean` | `false` | Show ✕ |
|
|
60
|
+
| `onDismiss` | `() => void` | — | Called on dismiss |
|
|
61
|
+
| `iconStart` | `ReactNode` | derived from intent | Override the intent icon |
|
|
62
|
+
| `variant` | `"subtle" \| "outlined" \| "solid"` | `"subtle"` | Visual emphasis |
|
|
63
|
+
|
|
64
|
+
## Variants — `variant`
|
|
65
|
+
|
|
66
|
+
| Variant | Background | Border | Use |
|
|
67
|
+
| --- | --- | --- | --- |
|
|
68
|
+
| `subtle` (default) | `--color-<intent>-subtle-bg` | none | In-page, low-emphasis |
|
|
69
|
+
| `outlined` | `--color-bg-default` | `1px --color-<intent>` | Light pages, when subtle bg blends |
|
|
70
|
+
| `solid` | `--color-<intent>` | none | High-emphasis, full-bleed banners |
|
|
71
|
+
|
|
72
|
+
`subtle` is the right default for 90% of cases. `solid` is for marketing announcements (top-of-page promo banner).
|
|
73
|
+
|
|
74
|
+
## Intent → token mapping
|
|
75
|
+
|
|
76
|
+
| Intent | Icon | Subtle bg | Border / solid bg | Title color (subtle) |
|
|
77
|
+
| --- | --- | --- | --- | --- |
|
|
78
|
+
| `info` | ℹ | `--color-info-subtle-bg` | `--color-info` | `--color-text-primary` |
|
|
79
|
+
| `success` | ✓ | `--color-success-subtle-bg` | `--color-success` | `--color-text-primary` |
|
|
80
|
+
| `warning` | ⚠ | `--color-warning-subtle-bg` | `--color-warning` | `--color-text-primary` |
|
|
81
|
+
| `error` | ✕ | `--color-error-subtle-bg` | `--color-error` | `--color-text-primary` |
|
|
82
|
+
|
|
83
|
+
For `solid` variant: title and body text become white (or near-black for warning's amber, where contrast inverts).
|
|
84
|
+
|
|
85
|
+
## States
|
|
86
|
+
|
|
87
|
+
| State | Visual |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| Default | resting |
|
|
90
|
+
| Action hovered | nested Button states |
|
|
91
|
+
| Dismissed | unmount with 150ms fade-out |
|
|
92
|
+
|
|
93
|
+
Alerts don't have hover/active themselves — only their nested actions do.
|
|
94
|
+
|
|
95
|
+
## Tokens consumed
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
--color-info, --color-info-subtle-bg
|
|
99
|
+
--color-success, --color-success-subtle-bg
|
|
100
|
+
--color-warning, --color-warning-subtle-bg
|
|
101
|
+
--color-error, --color-error-subtle-bg
|
|
102
|
+
--color-text-primary
|
|
103
|
+
--color-text-secondary
|
|
104
|
+
--color-bg-default
|
|
105
|
+
--space-md, --space-base
|
|
106
|
+
--radius-md
|
|
107
|
+
--font-size-sm, --font-size-base
|
|
108
|
+
--font-weight-medium
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Accessibility
|
|
112
|
+
|
|
113
|
+
- **Role**:
|
|
114
|
+
- `role="alert"` for `error` intent — assertive, interrupts screen reader.
|
|
115
|
+
- `role="status"` for `info` / `success` / `warning` — polite.
|
|
116
|
+
- **`aria-live`** matches role implicitly; explicit on the container is fine.
|
|
117
|
+
- **Live region timing**: if the alert is mounted on page load (not in response to action), wrap in a `<div aria-live="off">` initially, then update to live after first paint — otherwise screen readers announce immediately on mount which is jarring.
|
|
118
|
+
- **Dismiss button**: `aria-label="Dismiss alert"`. Focus returns to a logical neighbor (or the next focusable element after the alert) on dismiss.
|
|
119
|
+
- **Color is not the only signal**: every alert has the intent icon — color-blind users see the icon.
|
|
120
|
+
- **For interactive alerts** (with action buttons): they are NOT modals — page content remains tab-reachable around them.
|
|
121
|
+
|
|
122
|
+
## Code example
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
// Simple info banner at top of page
|
|
126
|
+
<Alert intent="info" title="새 기능이 추가되었습니다" description="대시보드에서 새 차트를 확인하세요." dismissible />
|
|
127
|
+
|
|
128
|
+
// Error with retry
|
|
129
|
+
<Alert
|
|
130
|
+
intent="error"
|
|
131
|
+
title="저장에 실패했습니다"
|
|
132
|
+
description="네트워크 연결을 확인하고 다시 시도해 주세요."
|
|
133
|
+
actions={[
|
|
134
|
+
{ label: "다시 시도", onClick: retry, intent: "primary" },
|
|
135
|
+
]}
|
|
136
|
+
/>
|
|
137
|
+
|
|
138
|
+
// Warning with dismiss
|
|
139
|
+
<Alert
|
|
140
|
+
intent="warning"
|
|
141
|
+
title="계정 보안 경고"
|
|
142
|
+
description="새로운 기기에서 로그인이 감지되었습니다."
|
|
143
|
+
actions={[
|
|
144
|
+
{ label: "확인하기", onClick: review },
|
|
145
|
+
]}
|
|
146
|
+
dismissible
|
|
147
|
+
/>
|
|
148
|
+
|
|
149
|
+
// Solid promotional banner (top of page, full-width)
|
|
150
|
+
<Alert
|
|
151
|
+
intent="info"
|
|
152
|
+
variant="solid"
|
|
153
|
+
title="🎉 신규 가입 시 50% 할인"
|
|
154
|
+
description="6월 30일까지 한정"
|
|
155
|
+
actions={[{ label: "자세히 보기", onClick: nav }]}
|
|
156
|
+
/>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Edge cases
|
|
160
|
+
|
|
161
|
+
- **Multiple alerts stacked**: order by severity (error → warning → info → success). Don't show 5+ alerts simultaneously — collapse to a summary.
|
|
162
|
+
- **Alert with no dismiss + no actions**: legitimate but rare. Make sure the underlying state changes will eventually remove the alert.
|
|
163
|
+
- **Alert that's also a link**: avoid making the entire alert clickable. If it has navigation, use an explicit action button.
|
|
164
|
+
- **Long description that wraps**: title-then-description layout still works; align icon + dismiss to the top, not center.
|
|
165
|
+
- **Inside a modal**: the modal already has assertive-context; Alert inside should use `role="status"` (not `alert`) to avoid double-announcing.
|
|
166
|
+
- **RTL**: dismiss flips to left, actions flow RTL, padding swaps via logical CSS.
|
|
167
|
+
|
|
168
|
+
## Don't
|
|
169
|
+
|
|
170
|
+
- Don't use Alert for transient feedback ("Saved!"). Use a Toast — Alert sticks around until dismissed.
|
|
171
|
+
- Don't use Alert for form-field errors. Forms have their own ErrorText.
|
|
172
|
+
- Don't auto-dismiss errors after a timeout. They're persistent on purpose.
|
|
173
|
+
- Don't put more than 2 actions in an Alert. If there are 3+ paths, the choice is a Modal.
|
|
174
|
+
- Don't use solid variant inside a card or section — too punchy. Reserve solid for full-bleed banners.
|
|
175
|
+
- Don't ship Alert with no icon AND color-only intent — fails for color-blind users. Always include the icon.
|
|
176
|
+
|
|
177
|
+
## References
|
|
178
|
+
|
|
179
|
+
- Ant Design: [`refs/ant-design/components/alert/`](../refs/ant-design/components/alert/) — `Alert`, `Alert.ErrorBoundary`. Supports `closable`, `banner` variant, `showIcon`, `action`. Has a "banner" mode for full-width top banners.
|
|
180
|
+
- MUI: [`refs/mui/packages/mui-material/src/Alert/`](../refs/mui/packages/mui-material/src/Alert/) — `Alert` + `AlertTitle`. Variants: `standard` (subtle), `filled` (solid), `outlined`. Closest to this spec.
|
|
181
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/alert.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/alert.tsx) — primitive (`Alert`, `AlertTitle`, `AlertDescription`). Composition; intent via className variant.
|
|
182
|
+
|
|
183
|
+
API choices made:
|
|
184
|
+
- **`actions` array prop** rather than children-only: 80% of alerts with actions need exactly 1–2 buttons; the prop is faster than composing.
|
|
185
|
+
- **`variant` (subtle / outlined / solid)** matches MUI's three-tier model. Most universal.
|
|
186
|
+
- **`role` derived from `intent`**: explicit only when overriding (rare).
|
|
187
|
+
|
|
188
|
+
## Cross-reference
|
|
189
|
+
|
|
190
|
+
- [examples/component-toast.md](component-toast.md) — transient version
|
|
191
|
+
- [examples/component-modal.md](component-modal.md) — blocking version
|
|
192
|
+
- [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md) — focus management on dismiss
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# `AmountInput` (custom) — spec
|
|
2
|
+
|
|
3
|
+
> Status: example artifact for **custom components** — not derived from Ant/MUI/shadcn. This is the kind of spec the system produces for product-specific components that don't exist upstream.
|
|
4
|
+
>
|
|
5
|
+
> Cited knowledge: [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md), [`knowledge/i18n/korean-typography.md`](../knowledge/i18n/korean-typography.md), [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md)
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
A specialized text input for entering currency amounts — the most-used input in any fintech / 가계부 / e-commerce product. Critical to get right because:
|
|
10
|
+
|
|
11
|
+
- Auto-formatting must not break caret position.
|
|
12
|
+
- Pasting and IME composition must work cleanly.
|
|
13
|
+
- Korean conventions differ from Latin (no decimals for KRW, suffix `원` vs prefix `₩`, comma separator).
|
|
14
|
+
- Validation (positive only, balance ceiling, max amount) is per-context.
|
|
15
|
+
|
|
16
|
+
This is **not a Slider, not a stepper** — it's a text input optimized for amounts.
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌─────────────────────────────────────────┐
|
|
22
|
+
│ 1,234,567 원 │ ← suffix style (consumer)
|
|
23
|
+
└─────────────────────────────────────────┘
|
|
24
|
+
|
|
25
|
+
┌─────────────────────────────────────────┐
|
|
26
|
+
│ ₩ 1,234,567 │ ← prefix style (fintech)
|
|
27
|
+
└─────────────────────────────────────────┘
|
|
28
|
+
|
|
29
|
+
[+1만] [+5만] [+10만] [+100만] ← optional quick chips
|
|
30
|
+
┌─────────────────────────────────────────┐
|
|
31
|
+
│ 0 원 ✕ │
|
|
32
|
+
└─────────────────────────────────────────┘
|
|
33
|
+
잔액 ₩2,500,000 [전액 사용] ← optional balance + max button
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
| Slot | Required | Notes |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| Input field | yes | Numeric-only via `inputmode="numeric"` |
|
|
39
|
+
| Affix (₩ prefix or 원 suffix) | yes | Decorative — visually inside the input but not editable |
|
|
40
|
+
| Clear button | optional | ✕ when value > 0 |
|
|
41
|
+
| Quick chips | optional | Pre-fill amounts (`+1만`, `+5만`, `+10만`, `+100만`) |
|
|
42
|
+
| Max affordance | optional | "전액" / "전액 사용" — populates with full balance |
|
|
43
|
+
| Balance display | optional | "잔액 ₩X" beside or below |
|
|
44
|
+
| Help / error text | optional | Standard Input pattern |
|
|
45
|
+
|
|
46
|
+
## API
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
<AmountInput
|
|
50
|
+
value={amount}
|
|
51
|
+
onValueChange={setAmount}
|
|
52
|
+
currency="KRW"
|
|
53
|
+
affixStyle="suffix"
|
|
54
|
+
max={balance}
|
|
55
|
+
showBalance
|
|
56
|
+
balance={balance}
|
|
57
|
+
showQuickChips
|
|
58
|
+
quickChipAmounts={[10000, 50000, 100000, 1000000]}
|
|
59
|
+
showMaxButton
|
|
60
|
+
errorText={amount > balance ? "잔액이 부족합니다" : undefined}
|
|
61
|
+
/>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
| Prop | Type | Default | Description |
|
|
65
|
+
| --- | --- | --- | --- |
|
|
66
|
+
| `value` | `number \| null` | — | Numeric value (in smallest unit — won for KRW). |
|
|
67
|
+
| `onValueChange` | `(value: number \| null) => void` | — | Numeric, not formatted string |
|
|
68
|
+
| `currency` | `"KRW" \| "USD" \| "JPY" \| "EUR" \| "CNY"` | `"KRW"` | Drives format + decimal precision |
|
|
69
|
+
| `affixStyle` | `"prefix" \| "suffix"` | `"suffix"` (KRW consumer) / `"prefix"` (other) | |
|
|
70
|
+
| `min` | `number` | `0` | Smallest allowed |
|
|
71
|
+
| `max` | `number` | — | Largest (e.g., balance) |
|
|
72
|
+
| `step` | `number` | `1` (KRW) / `0.01` (USD) | Smallest increment |
|
|
73
|
+
| `placeholder` | `string` | `"0"` | |
|
|
74
|
+
| `showBalance` | `boolean` | `false` | Render balance below |
|
|
75
|
+
| `balance` | `number` | — | The user's balance (for display + validation) |
|
|
76
|
+
| `showQuickChips` | `boolean` | `false` | Render add-amount chips above |
|
|
77
|
+
| `quickChipAmounts` | `number[]` | `[10000, 50000, 100000, 1000000]` (KRW) | Chip amounts (added to current value) |
|
|
78
|
+
| `showMaxButton` | `boolean` | `false` | "전액 사용" affordance |
|
|
79
|
+
| `disabled` / `readOnly` | `boolean` | `false` | |
|
|
80
|
+
| `error` / `errorText` | — | — | Validation state |
|
|
81
|
+
| `label` / `helpText` | — | — | Inherited from Input |
|
|
82
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
|
|
83
|
+
| `autoFocus` | `boolean` | `false` | |
|
|
84
|
+
|
|
85
|
+
## Currency-driven format
|
|
86
|
+
|
|
87
|
+
| Currency | Decimal | Separator | Default affix | Example |
|
|
88
|
+
| --- | --- | --- | --- | --- |
|
|
89
|
+
| KRW (₩) | 0 | `,` | `원` suffix (consumer) / `₩` prefix (fintech) | `1,234,567원` / `₩1,234,567` |
|
|
90
|
+
| USD ($) | 2 | `,` decimal `.` | `$` prefix | `$1,234.56` |
|
|
91
|
+
| JPY (¥) | 0 | `,` | `¥` prefix | `¥1,234` |
|
|
92
|
+
| EUR (€) | 2 | `.` decimal `,` | `€` suffix or prefix (locale-dependent) | `1.234,56 €` |
|
|
93
|
+
| CNY (¥) | 2 | `,` decimal `.` | `¥` prefix | `¥1,234.56` |
|
|
94
|
+
|
|
95
|
+
Per [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md).
|
|
96
|
+
|
|
97
|
+
## Behavior
|
|
98
|
+
|
|
99
|
+
### Auto-format
|
|
100
|
+
|
|
101
|
+
- User types `1234567` → field shows `1,234,567`. Caret position must not jump.
|
|
102
|
+
- Implementation: format-on-input, with caret restored to the equivalent visual position.
|
|
103
|
+
- Use `react-number-format` or similar; don't roll from scratch (caret bugs).
|
|
104
|
+
|
|
105
|
+
### Pasting
|
|
106
|
+
|
|
107
|
+
User pastes `12,500.00` (or `₩12,500`, or `$12.50`). The input must:
|
|
108
|
+
|
|
109
|
+
1. Strip all non-digits except decimal separator.
|
|
110
|
+
2. For KRW (no decimals): strip everything after the decimal too.
|
|
111
|
+
3. Re-format with thousands separators.
|
|
112
|
+
4. Land on `12,500`.
|
|
113
|
+
|
|
114
|
+
For input mode in Korean apps, paste handling is the most common bug area — test with locale-formatted clipboard content.
|
|
115
|
+
|
|
116
|
+
### Quick chips
|
|
117
|
+
|
|
118
|
+
Tapping `+5만` adds 50,000 to the current value. Adds, doesn't replace:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
Current: 12,000
|
|
122
|
+
After tap on [+5만]: 62,000
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
This is canonical in Korean transfer / 송금 apps.
|
|
126
|
+
|
|
127
|
+
### Max affordance
|
|
128
|
+
|
|
129
|
+
For "send all balance":
|
|
130
|
+
- "전액" or "전액 사용" button populates the field with the full balance.
|
|
131
|
+
- Useful in transfer flows.
|
|
132
|
+
- Validate that balance is fresh — don't overflow.
|
|
133
|
+
|
|
134
|
+
### IME composition
|
|
135
|
+
|
|
136
|
+
For Korean apps where Hangul keyboard is default:
|
|
137
|
+
- Hangul keys produce non-numeric input that should be filtered.
|
|
138
|
+
- Don't crash on weird character; just ignore non-digit keystrokes.
|
|
139
|
+
- `inputmode="numeric"` on mobile triggers numeric keypad — bypassing Hangul entry.
|
|
140
|
+
|
|
141
|
+
### Validation timing
|
|
142
|
+
|
|
143
|
+
| Trigger | What |
|
|
144
|
+
| --- | --- |
|
|
145
|
+
| Typing | Format only. No errors yet. |
|
|
146
|
+
| Blur | Validate (>= min, <= max). Show error. |
|
|
147
|
+
| Quick chip | Re-validate immediately. If exceeds max, cap or show error. |
|
|
148
|
+
|
|
149
|
+
For "send transfer" flows: server-side validation also runs at submit (balance might have changed).
|
|
150
|
+
|
|
151
|
+
## States
|
|
152
|
+
|
|
153
|
+
| State | Visual |
|
|
154
|
+
| --- | --- |
|
|
155
|
+
| Empty | Placeholder (`0`), affix in muted color |
|
|
156
|
+
| Typing | Live formatting with caret preserved |
|
|
157
|
+
| Filled | Value formatted, affix prominent |
|
|
158
|
+
| Focus-visible | 2px ring (matches Input spec) |
|
|
159
|
+
| Error | Border red, `errorText` shown |
|
|
160
|
+
| Disabled | Muted, no events |
|
|
161
|
+
| Over balance | Amber border + warning text "잔액이 부족합니다" |
|
|
162
|
+
|
|
163
|
+
## Sizes
|
|
164
|
+
|
|
165
|
+
Inherited from Input. `lg` is most common for primary amount inputs (transfer screens, payment) — large touch target + readable digits.
|
|
166
|
+
|
|
167
|
+
| Size | Height | Font | Suggested affix size |
|
|
168
|
+
| --- | --- | --- | --- |
|
|
169
|
+
| `sm` | 32px | 14px | 13px |
|
|
170
|
+
| `md` (default) | 40px | 16px | 15px |
|
|
171
|
+
| `lg` | 56px | 24px (numerals) | 18px |
|
|
172
|
+
|
|
173
|
+
For amounts in primary CTAs: bump font to `display` size — 28–32px tabular numerals.
|
|
174
|
+
|
|
175
|
+
## Tokens consumed
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
--color-bg-default
|
|
179
|
+
--color-border-default
|
|
180
|
+
--color-border-strong
|
|
181
|
+
--color-text-primary
|
|
182
|
+
--color-text-secondary (affix when not focused)
|
|
183
|
+
--color-text-tertiary
|
|
184
|
+
--color-error
|
|
185
|
+
--color-warning (over-balance state)
|
|
186
|
+
--color-focus-ring
|
|
187
|
+
--color-primary-default (chip active state)
|
|
188
|
+
--color-primary-subtle-bg (chip bg)
|
|
189
|
+
--space-md, --space-base
|
|
190
|
+
--radius-md
|
|
191
|
+
--font-feature-amount: 'tnum' 1 (tabular numerals — critical)
|
|
192
|
+
--font-size-base, --font-size-xl, --font-size-2xl
|
|
193
|
+
--motion-fast
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Accessibility
|
|
197
|
+
|
|
198
|
+
- Input role: standard `<input type="text" inputmode="numeric">` (not `type="number"` — see [`patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md)).
|
|
199
|
+
- `aria-label` if no visible label. For a transfer screen, "Amount to send".
|
|
200
|
+
- `aria-describedby` linking to balance / error / help text.
|
|
201
|
+
- `aria-invalid="true"` on error.
|
|
202
|
+
- For `step` semantics: not strictly needed (text input), but `aria-valuemin` / `aria-valuemax` can be added for assistive tech.
|
|
203
|
+
- Quick chips and max button: standard `<button>` with `aria-label` describing what they do.
|
|
204
|
+
|
|
205
|
+
## Code example
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
function TransferScreen() {
|
|
209
|
+
const [amount, setAmount] = useState<number | null>(null);
|
|
210
|
+
const balance = useBalance();
|
|
211
|
+
const isOverBalance = amount && amount > balance;
|
|
212
|
+
|
|
213
|
+
return (
|
|
214
|
+
<div>
|
|
215
|
+
<AmountInput
|
|
216
|
+
label="보낼 금액"
|
|
217
|
+
value={amount}
|
|
218
|
+
onValueChange={setAmount}
|
|
219
|
+
currency="KRW"
|
|
220
|
+
affixStyle="suffix"
|
|
221
|
+
max={balance}
|
|
222
|
+
size="lg"
|
|
223
|
+
showQuickChips
|
|
224
|
+
showMaxButton
|
|
225
|
+
showBalance
|
|
226
|
+
balance={balance}
|
|
227
|
+
errorText={isOverBalance ? "잔액이 부족합니다" : undefined}
|
|
228
|
+
autoFocus
|
|
229
|
+
/>
|
|
230
|
+
|
|
231
|
+
<Button
|
|
232
|
+
size="lg"
|
|
233
|
+
disabled={!amount || isOverBalance}
|
|
234
|
+
loading={isTransferring}
|
|
235
|
+
onClick={() => transfer(amount)}
|
|
236
|
+
>
|
|
237
|
+
{amount ? `${formatKRW(amount)}원 보내기` : "금액을 입력하세요"}
|
|
238
|
+
</Button>
|
|
239
|
+
</div>
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Edge cases
|
|
245
|
+
|
|
246
|
+
- **Pasted negative**: strip the `-`. Use `min` validation, don't allow negative entry.
|
|
247
|
+
- **Decimal in KRW**: strip. KRW is integer.
|
|
248
|
+
- **Very large numbers** (≥ 100조 / 100 trillion): allowed but may not format prettily (Korean number names break down). Display as comma-separated digits.
|
|
249
|
+
- **Amount equal to balance** (sending all): allow if `max=balance`; balance becomes 0 after.
|
|
250
|
+
- **Balance changes mid-edit** (background sync updates): re-validate on next blur. Don't reset typed amount.
|
|
251
|
+
- **Multi-currency conversion display**: outside this component's scope. Pair with a separate display.
|
|
252
|
+
- **Max button when balance not loaded**: disable until balance arrives.
|
|
253
|
+
- **Auto-fill leaves bad format**: most browsers don't autofill amount inputs. If they do, re-format on detection.
|
|
254
|
+
- **0 as a valid value**: usually invalid for transfers (can't send 0). For 가계부, 0 might be valid (record a free meal). Pass `min={0}` as appropriate.
|
|
255
|
+
|
|
256
|
+
## Don't
|
|
257
|
+
|
|
258
|
+
- Don't use `type="number"` — strips formatting, scrolls on wheel, rejects commas.
|
|
259
|
+
- Don't render the affix as an editable character.
|
|
260
|
+
- Don't auto-submit on Enter without confirmation modal for transfer-type actions.
|
|
261
|
+
- Don't show currency conversion approximation without "약" annotation.
|
|
262
|
+
- Don't display the value formatted in a way the user didn't type (e.g., user types `100`, you display `100원`, then on blur convert to `1만`). Stay literal.
|
|
263
|
+
- Don't allow negative amounts via input.
|
|
264
|
+
- Don't fire validation on every keystroke. Wait for blur.
|
|
265
|
+
|
|
266
|
+
## API rationale
|
|
267
|
+
|
|
268
|
+
- **`value: number` (not formatted string)**: the source of truth is the integer. Formatting is presentation. Always pass numbers between AmountInput and the rest of the app.
|
|
269
|
+
- **`currency` prop drives format**: avoids passing 5 separate format props (decimals, separator, affix). One declarative prop.
|
|
270
|
+
- **Quick chips + max button as opt-in**: not all amount inputs need them. Form-field amount in a 가계부 receipt doesn't need quick chips.
|
|
271
|
+
|
|
272
|
+
## Cross-reference
|
|
273
|
+
|
|
274
|
+
- [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — comprehensive money-display rules
|
|
275
|
+
- [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — payment UX context
|
|
276
|
+
- [`knowledge/i18n/korean-typography.md`](../knowledge/i18n/korean-typography.md) — IME composition handling
|
|
277
|
+
- [`examples/component-input.md`](component-input.md) — base Input spec this extends
|
|
278
|
+
- [`examples/component-form.md`](component-form.md) — form orchestration
|