@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,201 @@
|
|
|
1
|
+
# `QRCode` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `QRCode`, MUI (no built-in), shadcn-ui (no built-in)
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Renders a QR code from a string (URL, payment ID, contact info). Used in Korean fintech (계좌이체 QR, KakaoPay QR), authentication flows, content sharing.
|
|
8
|
+
|
|
9
|
+
## Anatomy
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────┐
|
|
13
|
+
│ ▣ ▢ ▣ ▢ ▢ ▣ ▢ ▣ │
|
|
14
|
+
│ ▢ ▢ ▣ ▣ ▢ ▢ ▣ ▢ │
|
|
15
|
+
│ ▣ ▢ ▢ ▣ ▣ ▢ ▢ ▣ │ ← QR matrix
|
|
16
|
+
│ ▢ ▣ ▣ ▢ ▢ ▣ ▣ ▢ │
|
|
17
|
+
│ ▣ ▢ ▣ ▢ ▣ ▢ ▣ ▢ │
|
|
18
|
+
└─────────────────────┘
|
|
19
|
+
[logo] ← optional center logo
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## API
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
<QRCode
|
|
26
|
+
value="https://app.example.com/pay/abc123"
|
|
27
|
+
size={200}
|
|
28
|
+
errorLevel="M"
|
|
29
|
+
iconSrc="/logo.png"
|
|
30
|
+
bgColor="#ffffff"
|
|
31
|
+
fgColor="#000000"
|
|
32
|
+
/>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
| Prop | Type | Default | Description |
|
|
36
|
+
| --- | --- | --- | --- |
|
|
37
|
+
| `value` | `string` | — | URL or text to encode |
|
|
38
|
+
| `size` | `number` | `160` | Pixel size (square) |
|
|
39
|
+
| `errorLevel` | `"L" \| "M" \| "Q" \| "H"` | `"M"` | Error correction; H tolerates more damage / supports center logo better |
|
|
40
|
+
| `bgColor` | `string` | `"#FFFFFF"` | |
|
|
41
|
+
| `fgColor` | `string` | `"#000000"` | |
|
|
42
|
+
| `iconSrc` | `string` | — | Center logo URL |
|
|
43
|
+
| `iconSize` | `number` | `40` | |
|
|
44
|
+
| `padding` | `number` | `16` | Quiet zone around code |
|
|
45
|
+
| `loading` | `boolean` | `false` | |
|
|
46
|
+
| `errorState` | `boolean` | `false` | Show error placeholder |
|
|
47
|
+
|
|
48
|
+
## Error correction levels
|
|
49
|
+
|
|
50
|
+
QR codes can recover from damage. Higher levels tolerate more but require more dense matrix:
|
|
51
|
+
|
|
52
|
+
| Level | Recovery | Use |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| `L` | 7% | Print, small QRs without logos |
|
|
55
|
+
| `M` (default) | 15% | Most cases |
|
|
56
|
+
| `Q` | 25% | Outdoor / damaged contexts |
|
|
57
|
+
| `H` | 30% | Required if you put a center logo (logo replaces QR data) |
|
|
58
|
+
|
|
59
|
+
## Sizes
|
|
60
|
+
|
|
61
|
+
| Use | Size (px) |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| Inline (in a card) | 120–160 |
|
|
64
|
+
| Standard | 200–240 |
|
|
65
|
+
| Modal / dedicated screen | 280–320 |
|
|
66
|
+
| Full-screen sharing | 400+ |
|
|
67
|
+
|
|
68
|
+
Always render at integer pixel sizes (no fractional) — fractional pixels blur.
|
|
69
|
+
|
|
70
|
+
## Color customization
|
|
71
|
+
|
|
72
|
+
- **High contrast required**: `fg` and `bg` need ~7:1+ contrast for scanning reliability.
|
|
73
|
+
- **Brand colors**: tempting but risky. Black-on-white is most reliable. If using brand color: dark navy or deep purple work; avoid yellows / pastels.
|
|
74
|
+
- **Inverted (light fg on dark bg)**: scannable but less reliable on older devices.
|
|
75
|
+
|
|
76
|
+
## Center logo
|
|
77
|
+
|
|
78
|
+
Adding a center logo (brand mark) replaces some of the QR data. Requires error level `H` (30% recovery) for reliable scanning.
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
<QRCode
|
|
82
|
+
value="..."
|
|
83
|
+
errorLevel="H"
|
|
84
|
+
iconSrc="/logo.png"
|
|
85
|
+
iconSize={size * 0.2} // ~20% of total size
|
|
86
|
+
/>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Don't make the logo too large — exceeds QR's recovery capacity, fails to scan.
|
|
90
|
+
|
|
91
|
+
## States
|
|
92
|
+
|
|
93
|
+
| State | Visual |
|
|
94
|
+
| --- | --- |
|
|
95
|
+
| Default | QR rendered |
|
|
96
|
+
| Loading | Skeleton or spinner |
|
|
97
|
+
| Error (failed to encode) | Placeholder + retry |
|
|
98
|
+
| Refreshing | Brief fade (for time-limited QRs) |
|
|
99
|
+
|
|
100
|
+
For time-limited QRs (e.g., KakaoPay session-based codes): show a countdown OR auto-refresh before expiration.
|
|
101
|
+
|
|
102
|
+
## Tokens consumed
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
--color-bg-default (default QR bg)
|
|
106
|
+
--color-text-primary (default QR fg)
|
|
107
|
+
--color-bg-subtle (loading skeleton)
|
|
108
|
+
--color-error (error state)
|
|
109
|
+
--space-md
|
|
110
|
+
--radius-md (around the QR container, not the QR itself)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Accessibility
|
|
114
|
+
|
|
115
|
+
- Wrap in a labeled container: `<div role="img" aria-label="QR 코드: payment session abc123">`.
|
|
116
|
+
- Provide a **text alternative** as a fallback:
|
|
117
|
+
```tsx
|
|
118
|
+
<QRCode value={url} />
|
|
119
|
+
<p>또는 직접 방문: <a href={url}>{url}</a></p>
|
|
120
|
+
```
|
|
121
|
+
- For session-based QRs (KakaoPay, banking): provide an alternative input method (manual code entry).
|
|
122
|
+
|
|
123
|
+
## Korean fintech use cases
|
|
124
|
+
|
|
125
|
+
- **계좌이체 QR**: 송금자가 받는 계좌의 QR을 스캔 → 계좌번호 자동 입력
|
|
126
|
+
- **결제 QR**: 사장님 화면에 QR → 손님이 KakaoPay/NaverPay로 스캔 → 결제
|
|
127
|
+
- **인증 QR**: 본인인증 / 로그인 — 모바일 앱이 QR을 보여주고 데스크톱이 스캔 (또는 반대)
|
|
128
|
+
- **공유 QR**: 가게 정보, 친구 추천 코드 등
|
|
129
|
+
|
|
130
|
+
For 결제 QR: the QR usually encodes a session token + payment URL, refreshing every ~60s for security. Implement with `key={refreshKey}` to force re-render on refresh.
|
|
131
|
+
|
|
132
|
+
## Code example
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
// Static URL
|
|
136
|
+
<QRCode value="https://example.com/me" size={200} />
|
|
137
|
+
|
|
138
|
+
// Payment QR with logo and time limit
|
|
139
|
+
function PaymentQRScreen({ session }) {
|
|
140
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
141
|
+
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
const timer = setInterval(() => {
|
|
144
|
+
session.refresh();
|
|
145
|
+
setRefreshKey(k => k + 1);
|
|
146
|
+
}, 60_000);
|
|
147
|
+
return () => clearInterval(timer);
|
|
148
|
+
}, [session]);
|
|
149
|
+
|
|
150
|
+
return (
|
|
151
|
+
<div className="flex flex-col items-center">
|
|
152
|
+
<QRCode
|
|
153
|
+
key={refreshKey}
|
|
154
|
+
value={session.paymentUrl}
|
|
155
|
+
size={280}
|
|
156
|
+
errorLevel="H"
|
|
157
|
+
iconSrc="/brand.png"
|
|
158
|
+
iconSize={56}
|
|
159
|
+
/>
|
|
160
|
+
<p className="text-sm text-text-secondary">
|
|
161
|
+
QR이 자동 갱신됩니다 · 60초 후 갱신
|
|
162
|
+
</p>
|
|
163
|
+
<p className="mt-2">
|
|
164
|
+
결제 금액: <strong>₩{amount.toLocaleString()}</strong>
|
|
165
|
+
</p>
|
|
166
|
+
</div>
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Edge cases
|
|
172
|
+
|
|
173
|
+
- **Very long URL** encoded: QR matrix becomes dense. Cap to ~500 chars; for longer, shorten via your own URL shortener service.
|
|
174
|
+
- **No internet** at scan time: pre-encode locally; don't rely on online encoding service.
|
|
175
|
+
- **Color-blind users**: don't use red/green for QR — black or dark navy on white.
|
|
176
|
+
- **Print at small size**: use error level `Q` or `H` and minimum 25mm physical size.
|
|
177
|
+
- **Encoding errors**: if `value` is unencodable (rare), show fallback with the text URL plain.
|
|
178
|
+
|
|
179
|
+
## Don't
|
|
180
|
+
|
|
181
|
+
- Don't restyle a QR with very low contrast — defeats the purpose.
|
|
182
|
+
- Don't put logo without error level `H`.
|
|
183
|
+
- Don't omit text alternative — assistive tech can't read QRs.
|
|
184
|
+
- Don't make the user wait > 1s for QR to render. Pre-compute when possible.
|
|
185
|
+
- Don't use animated QR (rotating, color-changing). It's a static identifier — animation breaks scans.
|
|
186
|
+
|
|
187
|
+
## References
|
|
188
|
+
|
|
189
|
+
- Ant Design: [`refs/ant-design/components/qr-code/`](../refs/ant-design/components/qr-code/) — `QRCode` with all options.
|
|
190
|
+
- MUI: no built-in. Use libraries like `qrcode.react` or `react-qr-code`.
|
|
191
|
+
- shadcn-ui: no built-in. Use libraries.
|
|
192
|
+
|
|
193
|
+
Common libraries:
|
|
194
|
+
- `qrcode` (Node-style, can run in browser)
|
|
195
|
+
- `qrcode.react` (React component)
|
|
196
|
+
- `react-qr-code` (lightweight)
|
|
197
|
+
|
|
198
|
+
## Cross-reference
|
|
199
|
+
|
|
200
|
+
- [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — KakaoPay/NaverPay QR contexts
|
|
201
|
+
- [`examples/component-payment-method-selector.md`](component-payment-method-selector.md) — QR as a payment option
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# `Radio` (and `RadioGroup`) — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from Ant Design `Radio`, MUI `Radio`/`RadioGroup`, shadcn-ui `radio-group`. Mutually exclusive choice control. See also [`component-form-controls.md`](component-form-controls.md).
|
|
4
|
+
|
|
5
|
+
## Radio vs Select
|
|
6
|
+
|
|
7
|
+
> Radio for **2-5 visible options**. Select / Combobox for **6+** OR when space is constrained.
|
|
8
|
+
|
|
9
|
+
| | Radio | Select |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| All options visible | Yes | No (one at a time) |
|
|
12
|
+
| Use | Few visible options; explicit choice | Many options; chosen value visible |
|
|
13
|
+
| Visual | Each option as a row | Compact dropdown |
|
|
14
|
+
|
|
15
|
+
## Anatomy
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Pick payment method:
|
|
19
|
+
|
|
20
|
+
○ Credit card
|
|
21
|
+
● KakaoPay
|
|
22
|
+
○ Toss
|
|
23
|
+
○ Bank transfer
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## API
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
<RadioGroup value={method} onValueChange={setMethod}>
|
|
30
|
+
<RadioGroup.Item value="card" id="card" />
|
|
31
|
+
<label htmlFor="card">Credit card</label>
|
|
32
|
+
|
|
33
|
+
<RadioGroup.Item value="kakao" id="kakao" />
|
|
34
|
+
<label htmlFor="kakao">KakaoPay</label>
|
|
35
|
+
|
|
36
|
+
<RadioGroup.Item value="toss" id="toss" />
|
|
37
|
+
<label htmlFor="toss">Toss</label>
|
|
38
|
+
</RadioGroup>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
| Prop | Type | Default | Description |
|
|
42
|
+
| --- | --- | --- | --- |
|
|
43
|
+
| `value` | `string` | controlled | Selected value |
|
|
44
|
+
| `defaultValue` | `string` | — | Uncontrolled initial |
|
|
45
|
+
| `onValueChange` | `(value: string) => void` | — | Callback |
|
|
46
|
+
| `disabled` | `boolean` | `false` | Disable all items |
|
|
47
|
+
| `required` | `boolean` | `false` | One must be selected |
|
|
48
|
+
| `orientation` | `"vertical" \| "horizontal"` | `"vertical"` | Layout |
|
|
49
|
+
|
|
50
|
+
## States
|
|
51
|
+
|
|
52
|
+
| State | Visual |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| Unselected | Empty circle with border |
|
|
55
|
+
| Selected | Filled circle with brand-color dot inside |
|
|
56
|
+
| Hover | Border color shift |
|
|
57
|
+
| Focus-visible | Ring around the focused item |
|
|
58
|
+
| Disabled | Reduced opacity |
|
|
59
|
+
|
|
60
|
+
## Layouts
|
|
61
|
+
|
|
62
|
+
### Vertical (default)
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
○ Option 1
|
|
66
|
+
○ Option 2
|
|
67
|
+
● Option 3
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Horizontal
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
○ Option 1 ○ Option 2 ● Option 3
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
For 2-3 short options.
|
|
77
|
+
|
|
78
|
+
### Card-style (visual-rich)
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
┌─────────────────────┐ ┌─────────────────────┐
|
|
82
|
+
│ ● KakaoPay │ │ ○ Toss │
|
|
83
|
+
│ No fees │ │ 1.5% fee │
|
|
84
|
+
└─────────────────────┘ └─────────────────────┘
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Whole card clickable; radio dot in corner OR replaced by border highlight.
|
|
88
|
+
|
|
89
|
+
## Tokens consumed
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
--radio-bg-unchecked
|
|
93
|
+
--radio-bg-checked-dot (brand color dot inside)
|
|
94
|
+
--radio-border
|
|
95
|
+
--radio-border-checked
|
|
96
|
+
--radio-error-border
|
|
97
|
+
--radio-size (typically 16-20px)
|
|
98
|
+
--space-sm (item gap)
|
|
99
|
+
--motion-fast
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Accessibility
|
|
103
|
+
|
|
104
|
+
- `RadioGroup`: `role="radiogroup"` + `aria-labelledby` (often referencing a heading).
|
|
105
|
+
- `Radio.Item`: `role="radio"` + `aria-checked`.
|
|
106
|
+
- Keyboard:
|
|
107
|
+
- Tab moves into the group (focuses the selected one or first if none).
|
|
108
|
+
- Arrow keys navigate within the group AND change selection.
|
|
109
|
+
- Space activates if not already activated.
|
|
110
|
+
- For required: `aria-required="true"` on group; show error if no selection on submit.
|
|
111
|
+
- Label every radio with linked `<label htmlFor>`.
|
|
112
|
+
|
|
113
|
+
## Code example — Korean fintech payment method
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
function PaymentMethodPicker({ value, onChange }: Props) {
|
|
117
|
+
return (
|
|
118
|
+
<fieldset>
|
|
119
|
+
<legend>결제 수단</legend>
|
|
120
|
+
<RadioGroup value={value} onValueChange={onChange}>
|
|
121
|
+
<div className="radio-row">
|
|
122
|
+
<RadioGroup.Item value="kakao" id="pay-kakao" />
|
|
123
|
+
<label htmlFor="pay-kakao">
|
|
124
|
+
<Image src="/kakaopay-logo.svg" alt="KakaoPay" />
|
|
125
|
+
카카오페이
|
|
126
|
+
</label>
|
|
127
|
+
</div>
|
|
128
|
+
<div className="radio-row">
|
|
129
|
+
<RadioGroup.Item value="naver" id="pay-naver" />
|
|
130
|
+
<label htmlFor="pay-naver">
|
|
131
|
+
<Image src="/naverpay-logo.svg" alt="NaverPay" />
|
|
132
|
+
네이버페이
|
|
133
|
+
</label>
|
|
134
|
+
</div>
|
|
135
|
+
<div className="radio-row">
|
|
136
|
+
<RadioGroup.Item value="toss" id="pay-toss" />
|
|
137
|
+
<label htmlFor="pay-toss">
|
|
138
|
+
<Image src="/toss-logo.svg" alt="Toss" />
|
|
139
|
+
토스페이
|
|
140
|
+
</label>
|
|
141
|
+
</div>
|
|
142
|
+
</RadioGroup>
|
|
143
|
+
</fieldset>
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Don't
|
|
149
|
+
|
|
150
|
+
- Don't use Radio for binary on/off — use Switch (immediate effect) or Checkbox (form).
|
|
151
|
+
- Don't allow zero selection in a required group. Validation must catch it.
|
|
152
|
+
- Don't make the visual circle smaller than 16x16. Touch target ≥ 44pt via padding.
|
|
153
|
+
- Don't omit `<fieldset>` + `<legend>` for the group context.
|
|
154
|
+
- Don't have only one radio in a group. That's a Checkbox or just a single button.
|
|
155
|
+
|
|
156
|
+
## References
|
|
157
|
+
|
|
158
|
+
- Ant: [`Radio`](../refs/ant-design/components/radio)
|
|
159
|
+
- MUI: [`Radio`](../refs/mui/packages/mui-material/src/Radio)
|
|
160
|
+
- shadcn-ui: [`radio-group`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/radio-group.tsx)
|
|
161
|
+
- WAI-ARIA: [Radio Group pattern](https://www.w3.org/WAI/ARIA/apg/patterns/radio/)
|
|
162
|
+
|
|
163
|
+
## Cross-reference
|
|
164
|
+
|
|
165
|
+
- [`examples/component-form-controls.md`](component-form-controls.md) — combined with Switch + Checkbox
|
|
166
|
+
- [`examples/component-checkbox.md`](component-checkbox.md)
|
|
167
|
+
- [`examples/component-payment-method-selector.md`](component-payment-method-selector.md) — KR payment specialization
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# `Rate` (Rating) — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Rate`, MUI `Rating`, shadcn-ui (composed)
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A row of star (or other) icons for capturing or displaying a rating. Used for: product reviews, satisfaction scoring, content quality feedback.
|
|
8
|
+
|
|
9
|
+
## Two distinct uses
|
|
10
|
+
|
|
11
|
+
| Use | Mode | Example |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| **Input rating** | Interactive | "Rate your experience" |
|
|
14
|
+
| **Display rating** | Read-only | "4.3 ★ (1,247 reviews)" |
|
|
15
|
+
|
|
16
|
+
The component is the same; the props differ. Always implement input behavior accessibly.
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Input mode (hover state):
|
|
22
|
+
☆ ☆ ☆ ☆ ☆ ← empty (default)
|
|
23
|
+
★ ★ ★ ☆ ☆ ← user picked 3
|
|
24
|
+
★ ★ ★ ⭑ ☆ ← user hovering 4 (preview)
|
|
25
|
+
|
|
26
|
+
With half-star precision:
|
|
27
|
+
★ ★ ⯨ ☆ ☆ ← 2.5 stars
|
|
28
|
+
|
|
29
|
+
Display mode:
|
|
30
|
+
★ ★ ★ ★ ⯨ 4.5 (1,247)
|
|
31
|
+
|
|
32
|
+
Other shapes:
|
|
33
|
+
😡 😞 😐 🙂 😍 emoji-based scale
|
|
34
|
+
👎 👍 binary
|
|
35
|
+
1 2 3 4 5 numeric scale (NPS-style 0-10 also)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## API
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
<Rate value={rating} onValueChange={setRating} />
|
|
42
|
+
<Rate value={4.3} readOnly count={5} />
|
|
43
|
+
<Rate value={3} max={10} /> {/* 10-point scale */}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
| Prop | Type | Default | Description |
|
|
47
|
+
| --- | --- | --- | --- |
|
|
48
|
+
| `value` | `number` | `0` | Current value |
|
|
49
|
+
| `onValueChange` | `(value: number) => void` | — | (Input mode only) |
|
|
50
|
+
| `defaultValue` | `number` | — | Uncontrolled |
|
|
51
|
+
| `count` | `number` | `5` | Number of icons (rating max) |
|
|
52
|
+
| `precision` | `number` | `1` | Smallest increment (0.5 for half-star, 0.1 for finer) |
|
|
53
|
+
| `readOnly` | `boolean` | `false` | Display only — no hover/click |
|
|
54
|
+
| `disabled` | `boolean` | `false` | |
|
|
55
|
+
| `allowClear` | `boolean` | `true` | Click on the active value to clear (input mode only) |
|
|
56
|
+
| `icon` | `ReactNode \| ((index, value) => ReactNode)` | star | Custom icon |
|
|
57
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
|
|
58
|
+
| `label` | `string` | — | Accessible label |
|
|
59
|
+
| `tooltips` | `string[]` | — | Per-rating tooltip ("나쁨", "보통", "좋음", "아주 좋음", "최고") |
|
|
60
|
+
|
|
61
|
+
## Sizes
|
|
62
|
+
|
|
63
|
+
| Size | Icon size |
|
|
64
|
+
| --- | --- |
|
|
65
|
+
| `sm` | 16px |
|
|
66
|
+
| `md` (default) | 20px |
|
|
67
|
+
| `lg` | 28px |
|
|
68
|
+
|
|
69
|
+
For input mode on mobile: `lg`. The hit area extends ~8px around each icon.
|
|
70
|
+
|
|
71
|
+
## Behavior
|
|
72
|
+
|
|
73
|
+
### Input mode
|
|
74
|
+
|
|
75
|
+
- Hover over an icon: preview that rating (and lower stars filled).
|
|
76
|
+
- Click: commit value.
|
|
77
|
+
- If `allowClear`: clicking on the currently-selected icon clears.
|
|
78
|
+
- Half-star: clicking the left half of an icon = `n - 0.5`, right half = `n`.
|
|
79
|
+
|
|
80
|
+
### Display mode
|
|
81
|
+
|
|
82
|
+
- Renders the value as filled icons (with partial fill for fractional values).
|
|
83
|
+
- No hover effects.
|
|
84
|
+
- Often paired with numeric value + count.
|
|
85
|
+
|
|
86
|
+
## States
|
|
87
|
+
|
|
88
|
+
| State | Visual |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| Empty | All icons in `--color-text-tertiary` |
|
|
91
|
+
| Hovered | Preview rating in primary or yellow |
|
|
92
|
+
| Selected | Filled icons in `--color-warning` (yellow stars) or brand color |
|
|
93
|
+
| Half | Filled half + empty half |
|
|
94
|
+
| Disabled | Muted, no events |
|
|
95
|
+
| Read-only | Non-interactive, no hover |
|
|
96
|
+
|
|
97
|
+
## Tokens consumed
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
--color-warning (default star color — yellow)
|
|
101
|
+
OR
|
|
102
|
+
--color-primary-default (when brand-aligned)
|
|
103
|
+
--color-text-tertiary (empty icons)
|
|
104
|
+
--color-text-secondary (numeric value beside)
|
|
105
|
+
--color-focus-ring
|
|
106
|
+
--space-xs
|
|
107
|
+
--motion-fast (hover transition)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Accessibility — WAI-ARIA Slider pattern (input)
|
|
111
|
+
|
|
112
|
+
For input mode, use `role="slider"`:
|
|
113
|
+
|
|
114
|
+
- `role="slider"`
|
|
115
|
+
- `aria-valuenow={value}`
|
|
116
|
+
- `aria-valuemin={0}`
|
|
117
|
+
- `aria-valuemax={count}`
|
|
118
|
+
- `aria-valuetext={tooltip[value-1]}` if tooltips defined (more descriptive than just the number)
|
|
119
|
+
- `aria-label="Rating"`
|
|
120
|
+
- `tabIndex={0}` to be keyboard-reachable
|
|
121
|
+
|
|
122
|
+
For display mode (readOnly):
|
|
123
|
+
- `aria-label="Rating: 4.3 out of 5"`
|
|
124
|
+
- No interactive role needed — it's text equivalent
|
|
125
|
+
|
|
126
|
+
### Keyboard
|
|
127
|
+
|
|
128
|
+
| Key | Behavior |
|
|
129
|
+
| --- | --- |
|
|
130
|
+
| `Tab` | Reach the rating control (single tab stop) |
|
|
131
|
+
| `←` / `↓` | Decrement by `precision` |
|
|
132
|
+
| `→` / `↑` | Increment by `precision` |
|
|
133
|
+
| `Home` | 0 |
|
|
134
|
+
| `End` | max |
|
|
135
|
+
| `Enter` (with focus) | (no-op or commit, depending on UX) |
|
|
136
|
+
| `Esc` | (Input form context) cancel |
|
|
137
|
+
| `0`–`9` | Jump to that rating value |
|
|
138
|
+
|
|
139
|
+
## Code example
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
// Standard 5-star input with tooltips
|
|
143
|
+
<Rate
|
|
144
|
+
value={rating}
|
|
145
|
+
onValueChange={setRating}
|
|
146
|
+
tooltips={["나쁨", "보통", "좋음", "아주 좋음", "최고"]}
|
|
147
|
+
label="만족도"
|
|
148
|
+
size="lg"
|
|
149
|
+
/>
|
|
150
|
+
|
|
151
|
+
// Half-star precision
|
|
152
|
+
<Rate value={rating} onValueChange={setRating} precision={0.5} />
|
|
153
|
+
|
|
154
|
+
// Display mode with details
|
|
155
|
+
<div className="flex items-center gap-2">
|
|
156
|
+
<Rate value={4.3} readOnly />
|
|
157
|
+
<span className="font-medium">4.3</span>
|
|
158
|
+
<span className="text-text-secondary">(1,247 리뷰)</span>
|
|
159
|
+
</div>
|
|
160
|
+
|
|
161
|
+
// Custom icon (heart for favorite)
|
|
162
|
+
<Rate value={1} count={1} icon={(i, v) => v === 0 ? <HeartIcon /> : <HeartFilled />} />
|
|
163
|
+
|
|
164
|
+
// Emoji-based satisfaction
|
|
165
|
+
<Rate
|
|
166
|
+
value={mood}
|
|
167
|
+
onValueChange={setMood}
|
|
168
|
+
count={5}
|
|
169
|
+
icon={(i, v) => <span>{["😡", "😞", "😐", "🙂", "😍"][i]}</span>}
|
|
170
|
+
tooltips={["아주 별로", "별로", "보통", "좋음", "최고"]}
|
|
171
|
+
/>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Edge cases
|
|
175
|
+
|
|
176
|
+
- **Fractional displays**: `value=4.3` renders 4 full + a partial 5th. CSS clip-path or width-based fill.
|
|
177
|
+
- **Hover then click outside**: revert to actual value.
|
|
178
|
+
- **`allowClear` with hover preview**: hovering the current value should NOT preview clear. Clear only on click.
|
|
179
|
+
- **Touch devices**: no hover. Click-only commits. Drag-to-rate is uncommon — stick to tap.
|
|
180
|
+
- **Very large counts (10+)**: stars become small/cramped. Switch to numeric input or NPS-style 0–10 number row.
|
|
181
|
+
- **Required rating in form**: render error state if value=0 on submit.
|
|
182
|
+
- **Localized labels**: tooltips ("나쁨" / "Bad") matching locale.
|
|
183
|
+
|
|
184
|
+
## Don't
|
|
185
|
+
|
|
186
|
+
- Don't show stars without numeric value when display mode — users want both.
|
|
187
|
+
- Don't auto-submit a form on rating click.
|
|
188
|
+
- Don't use 5-star for binary feedback (helpful / not helpful). Use thumbs.
|
|
189
|
+
- Don't disable arrow keys — rating is a slider semantically.
|
|
190
|
+
- Don't use yellow stars on yellow backgrounds. Pick a contrasting color.
|
|
191
|
+
- Don't omit tooltips for input ratings — without them, the rating values are abstract.
|
|
192
|
+
|
|
193
|
+
## References
|
|
194
|
+
|
|
195
|
+
- Ant Design: [`refs/ant-design/components/rate/`](../refs/ant-design/components/rate/) — `Rate` with `count`, `allowHalf`, `tooltips`, custom `character`. Most flexible.
|
|
196
|
+
- MUI: [`refs/mui/packages/mui-material/src/Rating/`](../refs/mui/packages/mui-material/src/Rating/) — `Rating` with `precision`, `IconContainerComponent`, `getLabelText` for a11y. Solid impl.
|
|
197
|
+
- shadcn-ui: no built-in. Compose from icons + state.
|
|
198
|
+
|
|
199
|
+
## Cross-reference
|
|
200
|
+
|
|
201
|
+
- [`examples/component-slider.md`](component-slider.md) — Rate is essentially a discrete-step slider
|
|
202
|
+
- [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md) — slider keyboard contract
|