@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,251 @@
|
|
|
1
|
+
# `Switch` / `Checkbox` / `Radio` — combined spec
|
|
2
|
+
|
|
3
|
+
> Three sibling controls. They share patterns (binary/boolean inputs with a label) but differ in semantics. Speccing together avoids duplication.
|
|
4
|
+
>
|
|
5
|
+
> Citing Ant Design `Switch`/`Checkbox`/`Radio`, MUI `Switch`/`Checkbox`/`Radio`, shadcn-ui `switch`/`checkbox`/`radio-group`
|
|
6
|
+
|
|
7
|
+
## Semantic difference
|
|
8
|
+
|
|
9
|
+
| Control | Semantic | Use |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| **Switch** | Apply immediately, on/off | Settings (notifications, dark mode) — change takes effect at toggle. |
|
|
12
|
+
| **Checkbox** | Multi-select, deferred | Form fields, tasks, multi-select lists — user toggles, then submits. |
|
|
13
|
+
| **Radio** | Single-select from a group, deferred | Pick one from N — payment method, plan tier. |
|
|
14
|
+
|
|
15
|
+
**Picking the wrong one is the most common mistake.** A "subscribe to newsletter" checkbox isn't a Switch — its effect is deferred to form submit.
|
|
16
|
+
|
|
17
|
+
## Anatomy — Switch
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Off: On:
|
|
21
|
+
┌─────────────┐ ┌─────────────┐
|
|
22
|
+
│ ⚪ │ │ ⚪ │
|
|
23
|
+
└─────────────┘ └─────────────┘
|
|
24
|
+
gray bg primary bg
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Anatomy — Checkbox
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
Unchecked: Checked: Indeterminate:
|
|
31
|
+
┌────┐ ┌────┐ ┌────┐
|
|
32
|
+
│ │ │ ✓ │ │ ─ │
|
|
33
|
+
└────┘ └────┘ └────┘
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Anatomy — Radio
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
Unselected: Selected:
|
|
40
|
+
○ ●
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## API
|
|
44
|
+
|
|
45
|
+
### Switch
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<Switch
|
|
49
|
+
checked={enabled}
|
|
50
|
+
onCheckedChange={setEnabled}
|
|
51
|
+
label="알림 받기"
|
|
52
|
+
description="새 메시지가 오면 푸시 알림을 보냅니다."
|
|
53
|
+
size="md"
|
|
54
|
+
/>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
| Prop | Type | Default | Description |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
| `checked` / `defaultChecked` | `boolean` | — | Controlled / uncontrolled |
|
|
60
|
+
| `onCheckedChange` | `(checked: boolean) => void` | — | Fires on toggle |
|
|
61
|
+
| `label` | `string \| ReactNode` | — | Visible label (right side). Required for accessible name. |
|
|
62
|
+
| `description` | `string \| ReactNode` | — | Help text below label |
|
|
63
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
|
|
64
|
+
| `disabled` | `boolean` | `false` | |
|
|
65
|
+
| `name` / `value` | — | — | For native form submission |
|
|
66
|
+
|
|
67
|
+
### Checkbox
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
<Checkbox
|
|
71
|
+
checked={agreed}
|
|
72
|
+
onCheckedChange={setAgreed}
|
|
73
|
+
label="이용약관에 동의합니다"
|
|
74
|
+
required
|
|
75
|
+
/>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Same props as Switch, plus:
|
|
79
|
+
|
|
80
|
+
| Prop | Type | Default | Description |
|
|
81
|
+
| --- | --- | --- | --- |
|
|
82
|
+
| `indeterminate` | `boolean` | `false` | Mixed state (some children selected) |
|
|
83
|
+
| `required` | `boolean` | `false` | Required for form |
|
|
84
|
+
| `error` / `errorText` | — | — | Validation state |
|
|
85
|
+
|
|
86
|
+
### RadioGroup + Radio
|
|
87
|
+
|
|
88
|
+
Radios always live in a `RadioGroup`:
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
<RadioGroup
|
|
92
|
+
value={method}
|
|
93
|
+
onValueChange={setMethod}
|
|
94
|
+
label="결제 수단"
|
|
95
|
+
>
|
|
96
|
+
<Radio value="card" label="신용/체크카드" description="국내 모든 카드 사용 가능" />
|
|
97
|
+
<Radio value="kakao" label="KakaoPay" description="간편결제" />
|
|
98
|
+
<Radio value="naver" label="NaverPay" description="간편결제" />
|
|
99
|
+
</RadioGroup>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
| Prop (group) | Type | Default | Description |
|
|
103
|
+
| --- | --- | --- | --- |
|
|
104
|
+
| `value` / `defaultValue` | `string` | — | Currently selected value |
|
|
105
|
+
| `onValueChange` | `(value: string) => void` | — | |
|
|
106
|
+
| `label` | `string` | — | Group label (`<legend>`) |
|
|
107
|
+
| `description` | `string` | — | |
|
|
108
|
+
| `orientation` | `"vertical" \| "horizontal"` | `"vertical"` | |
|
|
109
|
+
| `disabled` | `boolean` | `false` | Disables all radios |
|
|
110
|
+
| `required` | `boolean` | `false` | |
|
|
111
|
+
| `error` / `errorText` | — | — | |
|
|
112
|
+
|
|
113
|
+
| Prop (radio) | Type | Description |
|
|
114
|
+
| --- | --- | --- |
|
|
115
|
+
| `value` | `string` | Required. Matches `RadioGroup.value`. |
|
|
116
|
+
| `label` | `string \| ReactNode` | Required for accessible name. |
|
|
117
|
+
| `description` | `string \| ReactNode` | |
|
|
118
|
+
| `disabled` | `boolean` | |
|
|
119
|
+
|
|
120
|
+
## Sizes
|
|
121
|
+
|
|
122
|
+
| Size | Switch (W×H) | Checkbox / Radio | Label font |
|
|
123
|
+
| --- | --- | --- | --- |
|
|
124
|
+
| `sm` | 28 × 16 | 14 | 13px |
|
|
125
|
+
| `md` (default) | 36 × 20 | 16 | 14px |
|
|
126
|
+
| `lg` | 44 × 24 | 20 | 16px |
|
|
127
|
+
|
|
128
|
+
For mobile primary forms: `md` minimum. The control is small but the **whole row** (control + label) should be the tap target — minimum row height 44px.
|
|
129
|
+
|
|
130
|
+
## States
|
|
131
|
+
|
|
132
|
+
| State | Switch | Checkbox / Radio |
|
|
133
|
+
| --- | --- | --- |
|
|
134
|
+
| Default | Gray track | Gray border |
|
|
135
|
+
| Hover | Track darkens | Border darkens |
|
|
136
|
+
| Focus-visible | 2px ring around control | 2px ring |
|
|
137
|
+
| Active (toggled on) | Primary bg | Primary fill + checkmark/dot |
|
|
138
|
+
| Disabled | 50% opacity, no events | 50% opacity, no events |
|
|
139
|
+
| Error | Red border | Red border |
|
|
140
|
+
| Indeterminate (Checkbox only) | N/A | Filled with horizontal bar |
|
|
141
|
+
|
|
142
|
+
## Tokens consumed
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
--color-bg-default (track off, checkbox bg unchecked)
|
|
146
|
+
--color-border-default (border)
|
|
147
|
+
--color-border-strong (hover border)
|
|
148
|
+
--color-primary-default (track on, fill, dot)
|
|
149
|
+
--color-on-primary (checkmark)
|
|
150
|
+
--color-text-primary (label)
|
|
151
|
+
--color-text-secondary (description)
|
|
152
|
+
--color-error (error border)
|
|
153
|
+
--color-focus-ring
|
|
154
|
+
--space-sm, --space-md
|
|
155
|
+
--radius-sm (checkbox)
|
|
156
|
+
--radius-full (switch track, radio)
|
|
157
|
+
--motion-fast, --easing-out (toggle animation)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Layout
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
┌─────────────────────────────────────────────────┐
|
|
164
|
+
│ [control] Label (clickable to toggle) │
|
|
165
|
+
│ Description (optional) │
|
|
166
|
+
└─────────────────────────────────────────────────┘
|
|
167
|
+
↑
|
|
168
|
+
12px gap between control and label
|
|
169
|
+
|
|
170
|
+
vs.
|
|
171
|
+
|
|
172
|
+
┌─────────────────────────────────────────────────┐
|
|
173
|
+
│ Label [control] │ ← settings list pattern
|
|
174
|
+
│ Description │
|
|
175
|
+
└─────────────────────────────────────────────────┘
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
- **Form field pattern**: control on left, label on right. Default for forms.
|
|
179
|
+
- **Settings row pattern**: label on left, control (Switch) on right. Default for `Settings` pages.
|
|
180
|
+
|
|
181
|
+
## Accessibility
|
|
182
|
+
|
|
183
|
+
### Native HTML preferred
|
|
184
|
+
|
|
185
|
+
- Switch: `<input type="checkbox" role="switch">` (or `<button role="switch" aria-checked>` for custom). Prefer the input.
|
|
186
|
+
- Checkbox: `<input type="checkbox">`.
|
|
187
|
+
- Radio: `<input type="radio" name="...">` (group via `name`).
|
|
188
|
+
|
|
189
|
+
Custom-styled controls hide the input visually but keep it in the DOM for native form submission + a11y.
|
|
190
|
+
|
|
191
|
+
### ARIA
|
|
192
|
+
|
|
193
|
+
- `<label htmlFor={id}>` wraps or is paired with the input (clicking label toggles).
|
|
194
|
+
- `aria-describedby` points to the description's id.
|
|
195
|
+
- `aria-required="true"` when `required`.
|
|
196
|
+
- `aria-invalid="true"` on error.
|
|
197
|
+
- Switch: native `type="checkbox"` + `role="switch"` is the AAA pattern.
|
|
198
|
+
- Indeterminate (Checkbox only): set via JavaScript — `el.indeterminate = true`. There's no HTML attribute.
|
|
199
|
+
- RadioGroup: wrap radios in `<fieldset>` + `<legend>`. Or `role="radiogroup"` + `aria-labelledby`.
|
|
200
|
+
|
|
201
|
+
### Keyboard
|
|
202
|
+
|
|
203
|
+
| Key | Switch | Checkbox | Radio |
|
|
204
|
+
| --- | --- | --- | --- |
|
|
205
|
+
| `Tab` | Reach | Reach | Reach the **selected** radio (first if none selected) |
|
|
206
|
+
| `Space` | Toggle | Toggle | (selects current radio) |
|
|
207
|
+
| `Enter` | Toggle (custom only) | (forms submit if inside form) | (forms submit) |
|
|
208
|
+
| `↑` `↓` | — | — | Move + select within group (radio behavior) |
|
|
209
|
+
| `←` `→` | — | — | Same as ↑ ↓ (when horizontal) |
|
|
210
|
+
|
|
211
|
+
### Touch target
|
|
212
|
+
|
|
213
|
+
The visible control is small (16–24px). The **clickable area** must be ≥ 44×44 — extend via the label/row. The whole `[control + label]` row is the click target.
|
|
214
|
+
|
|
215
|
+
## Edge cases
|
|
216
|
+
|
|
217
|
+
- **"Save changes" pattern with Switches**: anti-pattern. Switches mean immediate effect. If you have a Save button, use Checkboxes.
|
|
218
|
+
- **Required Checkbox (e.g., terms-and-conditions)**: must show validation error if unchecked at submit. `aria-invalid` + visible error text.
|
|
219
|
+
- **Multiple Checkboxes acting as a group**: that's fine, but if exactly-one must be picked, use a RadioGroup.
|
|
220
|
+
- **2 options where Radio would work**: usually a Switch reads cleaner if it's binary. "Light/Dark" → Switch (or 3-radio if "System" is also an option). "Yes/No" → Radio if part of a form, Switch if immediate.
|
|
221
|
+
- **Pre-selected radio**: avoid. Let users actively choose. (Exception: settings forms where defaults are explicit.)
|
|
222
|
+
- **Many radios (10+)**: use a Select. Radio groups become unwieldy.
|
|
223
|
+
- **Korean labels**: typically more verbose ("이용약관에 동의합니다" vs "I agree"). Plan label width.
|
|
224
|
+
|
|
225
|
+
## Don't
|
|
226
|
+
|
|
227
|
+
- Don't use Checkbox for "this takes effect immediately" — that's a Switch.
|
|
228
|
+
- Don't use Switch for "submit later" — that's a Checkbox.
|
|
229
|
+
- Don't use Radio for binary on/off. Use Switch (immediate) or Checkbox (form).
|
|
230
|
+
- Don't pre-check marketing-consent checkboxes. **Illegal in Korea** (e-commerce law) and bad practice everywhere.
|
|
231
|
+
- Don't use Switch as a destructive confirmation ("Delete account: [Switch]"). Confirmation needs explicit action with a button + modal.
|
|
232
|
+
- Don't make the control's hit area smaller than the label's. Make the entire row clickable.
|
|
233
|
+
- Don't combine indeterminate with disabled — visually confusing.
|
|
234
|
+
|
|
235
|
+
## References
|
|
236
|
+
|
|
237
|
+
- Ant Design: `Switch`, `Checkbox`, `Checkbox.Group`, `Radio`, `Radio.Group`, `Radio.Button`. Has `Radio.Button` for segmented-control-style radios.
|
|
238
|
+
- MUI: `Switch`, `Checkbox`, `Radio` + `RadioGroup` + `FormControl` for the wrapper. `FormControlLabel` for label-with-control.
|
|
239
|
+
- shadcn-ui: [`switch.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/switch.tsx), [`checkbox.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/checkbox.tsx), [`radio-group.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/radio-group.tsx). Radix primitives. **Default for new projects.**
|
|
240
|
+
|
|
241
|
+
API choices made:
|
|
242
|
+
- **`onCheckedChange(checked)` for Switch + Checkbox**, **`onValueChange(value)` for RadioGroup**: matches the actual user intent — Switch/Checkbox is "what's the boolean?", RadioGroup is "what's the value?".
|
|
243
|
+
- **`label` and `description` as props**: 90% of forms use both; props are faster than composition. Composition (`<Switch.Label>`) is the escape hatch.
|
|
244
|
+
- **Three components in one spec**: shared a11y rules and visual language; treating them separately would force triplicate maintenance.
|
|
245
|
+
|
|
246
|
+
## Cross-reference
|
|
247
|
+
|
|
248
|
+
- [examples/component-input.md](component-input.md) — also a form input, but text-typed
|
|
249
|
+
- [examples/component-form.md](component-form.md) — orchestration of multiple form controls
|
|
250
|
+
- [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md) — keyboard contracts
|
|
251
|
+
- [knowledge/i18n/korean-product-conventions.md](../knowledge/i18n/korean-product-conventions.md) — required marketing-consent split
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# `FormGroup` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `FormGroup`. A wrapper for grouping multiple `FormControlLabel`-wrapped checkboxes. Provides spacing + optional row layout. Doesn't enforce mutual exclusivity (use `RadioGroup` for that).
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Multi-select checkbox groups (filter options, consent checkboxes, multi-day picker).
|
|
8
|
+
- Inside `FormControl` to group related toggles under one label.
|
|
9
|
+
|
|
10
|
+
## API
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
<FormControl>
|
|
14
|
+
<FormLabel>관심 도메인 (복수 선택)</FormLabel>
|
|
15
|
+
<FormGroup>
|
|
16
|
+
<FormControlLabel control={<Checkbox />} label="UI/UX" />
|
|
17
|
+
<FormControlLabel control={<Checkbox />} label="브랜드" />
|
|
18
|
+
<FormControlLabel control={<Checkbox />} label="모션" />
|
|
19
|
+
</FormGroup>
|
|
20
|
+
</FormControl>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Description |
|
|
24
|
+
| --- | --- | --- | --- |
|
|
25
|
+
| `children` | `ReactNode` | — | `FormControlLabel` children |
|
|
26
|
+
| `row` | `boolean` | `false` | Layout horizontally (default vertical) |
|
|
27
|
+
|
|
28
|
+
## States
|
|
29
|
+
|
|
30
|
+
Layout primitive — no interactive state of its own.
|
|
31
|
+
|
|
32
|
+
## Tokens consumed
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
--space-xs /* gap between rows */
|
|
36
|
+
--space-md /* gap between columns when row */
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Accessibility
|
|
40
|
+
|
|
41
|
+
- Wrap inside `FormControl` with `FormLabel` to give the group an accessible name.
|
|
42
|
+
- For required groups: `FormControl required` propagates to the FormLabel asterisk.
|
|
43
|
+
- Don't rely on FormGroup alone for labeling — screen readers won't announce the group purpose without a parent label.
|
|
44
|
+
|
|
45
|
+
## Edge cases
|
|
46
|
+
|
|
47
|
+
- **Many options (10+)** — switch to a multi-select Autocomplete or a search-filtered list.
|
|
48
|
+
- **`row` with long labels** — wraps to next line; check at narrow viewports (320px).
|
|
49
|
+
- **Mixing checkboxes + switches** — possible but visually inconsistent; prefer one control type per group.
|
|
50
|
+
|
|
51
|
+
## Code example
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
<FormControl required component="fieldset">
|
|
55
|
+
<FormLabel component="legend">법적 동의 사항</FormLabel>
|
|
56
|
+
<FormGroup>
|
|
57
|
+
<FormControlLabel
|
|
58
|
+
control={<Checkbox required name="terms" />}
|
|
59
|
+
label="이용약관에 동의해요"
|
|
60
|
+
/>
|
|
61
|
+
<FormControlLabel
|
|
62
|
+
control={<Checkbox required name="privacy" />}
|
|
63
|
+
label="개인정보 수집·이용에 동의해요"
|
|
64
|
+
/>
|
|
65
|
+
<FormControlLabel
|
|
66
|
+
control={<Checkbox name="marketing" />}
|
|
67
|
+
label="마케팅 수신에 동의해요 (선택)"
|
|
68
|
+
/>
|
|
69
|
+
</FormGroup>
|
|
70
|
+
</FormControl>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Don't
|
|
74
|
+
|
|
75
|
+
- Don't use for radio groups — use `RadioGroup` (handles `name` + mutual exclusivity).
|
|
76
|
+
- Don't omit the parent label — the group needs an accessible name.
|
|
77
|
+
|
|
78
|
+
## References
|
|
79
|
+
|
|
80
|
+
- MUI: [`FormGroup`](../refs/mui/packages/mui-material/src/FormGroup/)
|
|
81
|
+
|
|
82
|
+
## Cross-reference
|
|
83
|
+
|
|
84
|
+
- [`component-form-control.md`](component-form-control.md)
|
|
85
|
+
- [`component-form-control-label.md`](component-form-control-label.md)
|
|
86
|
+
- [`component-checkbox.md`](component-checkbox.md)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# `FormHelperText` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `FormHelperText`. The helper / error text below an input. Inherits `error` and `disabled` state from the parent `FormControl` so consumers don't conditionally style.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Below every input that needs guidance ("회사 이메일을 입력해 주세요").
|
|
8
|
+
- Below every input that can show validation errors.
|
|
9
|
+
- Skip when an input is fully self-explanatory (rare for a sound design).
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<FormControl error={!!emailError} required>
|
|
15
|
+
<FormLabel htmlFor="email">이메일</FormLabel>
|
|
16
|
+
<OutlinedInput id="email" />
|
|
17
|
+
<FormHelperText id="email-help">
|
|
18
|
+
{emailError ?? "회사 도메인 이메일을 입력해 주세요"}
|
|
19
|
+
</FormHelperText>
|
|
20
|
+
</FormControl>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Description |
|
|
24
|
+
| --- | --- | --- | --- |
|
|
25
|
+
| `children` | `ReactNode` | — | The helper / error text |
|
|
26
|
+
| `disabled` | `boolean` | inherited | Mute when disabled |
|
|
27
|
+
| `error` | `boolean` | inherited | Color as error |
|
|
28
|
+
| `filled` | `boolean` | inherited | Match Filled variant spacing |
|
|
29
|
+
| `focused` | `boolean` | inherited | Color when input focused |
|
|
30
|
+
| `margin` | `'dense' \| 'normal' \| 'none'` | `'normal'` | Top spacing |
|
|
31
|
+
| `required` | `boolean` | inherited | (Not visualized; from FormControl) |
|
|
32
|
+
|
|
33
|
+
## States
|
|
34
|
+
|
|
35
|
+
| State | Color |
|
|
36
|
+
| --- | --- |
|
|
37
|
+
| Default | `fg-muted` |
|
|
38
|
+
| Focused | `fg-primary` |
|
|
39
|
+
| Error | `fg-error` |
|
|
40
|
+
| Disabled | reduced opacity |
|
|
41
|
+
|
|
42
|
+
## Tokens consumed
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
--font-size-caption /* 12px */
|
|
46
|
+
--color-fg-muted
|
|
47
|
+
--color-fg-primary
|
|
48
|
+
--color-fg-error
|
|
49
|
+
--space-xs /* margin-top */
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Accessibility
|
|
53
|
+
|
|
54
|
+
- Pair with input via `aria-describedby` matching this element's `id`.
|
|
55
|
+
- For error states, also set `aria-invalid="true"` on the input.
|
|
56
|
+
- Avoid putting links inside helper text — they're hard to spot at this size and easy to miss.
|
|
57
|
+
|
|
58
|
+
## Edge cases
|
|
59
|
+
|
|
60
|
+
- **Switching between helper and error** — keep the same `id`; switch text content. Don't unmount/remount (the screen reader association breaks).
|
|
61
|
+
- **Multi-line helper** — wraps; for long text, consider moving to a Tooltip or below-block info instead.
|
|
62
|
+
- **Korean honorific** — match the form's overall register. Onboarding: 해요체 ("입력해 주세요"). Legal/contracts: 합쇼체 ("입력하시기 바랍니다").
|
|
63
|
+
|
|
64
|
+
## Code example
|
|
65
|
+
|
|
66
|
+
```tsx
|
|
67
|
+
<FormControl error={!!errors.email} fullWidth>
|
|
68
|
+
<FormLabel htmlFor="email">이메일</FormLabel>
|
|
69
|
+
<OutlinedInput
|
|
70
|
+
id="email"
|
|
71
|
+
type="email"
|
|
72
|
+
aria-invalid={!!errors.email}
|
|
73
|
+
aria-describedby="email-help"
|
|
74
|
+
/>
|
|
75
|
+
<FormHelperText id="email-help">
|
|
76
|
+
{errors.email ?? "회사 도메인 이메일을 입력해 주세요"}
|
|
77
|
+
</FormHelperText>
|
|
78
|
+
</FormControl>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Don't
|
|
82
|
+
|
|
83
|
+
- Don't use raw `<p>` for helper text — `error` state won't auto-propagate.
|
|
84
|
+
- Don't conditionally hide the helper element when there's no error and there used to be — the layout shifts and screen readers lose the association.
|
|
85
|
+
- Don't pile multiple FormHelperText siblings — combine into one node.
|
|
86
|
+
|
|
87
|
+
## References
|
|
88
|
+
|
|
89
|
+
- MUI: [`FormHelperText`](../refs/mui/packages/mui-material/src/FormHelperText/)
|
|
90
|
+
|
|
91
|
+
## Cross-reference
|
|
92
|
+
|
|
93
|
+
- [`component-form-control.md`](component-form-control.md)
|
|
94
|
+
- [`component-form-label.md`](component-form-label.md)
|
|
95
|
+
- [`knowledge/patterns/form-design.md`](../knowledge/patterns/form-design.md)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# `FormLabel` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `FormLabel`. The label of a form input — handles required-asterisk, focused color, error color via parent `FormControl`. Use this OR `<label htmlFor>` directly; FormLabel adds the design-system styling.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Label for any `OutlinedInput` / `Select` / custom input inside `FormControl`.
|
|
8
|
+
- For `Checkbox` / `Radio` / `Switch`, prefer `FormControlLabel` (label-wraps-control pattern).
|
|
9
|
+
|
|
10
|
+
## API
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
<FormControl required error={!!emailError}>
|
|
14
|
+
<FormLabel htmlFor="email">이메일</FormLabel>
|
|
15
|
+
<OutlinedInput id="email" />
|
|
16
|
+
<FormHelperText>...</FormHelperText>
|
|
17
|
+
</FormControl>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Prop | Type | Default | Description |
|
|
21
|
+
| --- | --- | --- | --- |
|
|
22
|
+
| `htmlFor` | `string` | — | Match the input's `id` (REQUIRED for click-to-focus + screen-reader association) |
|
|
23
|
+
| `children` | `ReactNode` | — | Label text |
|
|
24
|
+
| `required` | `boolean` | inherited | Visual asterisk |
|
|
25
|
+
| `error` | `boolean` | inherited | Color as error |
|
|
26
|
+
| `focused` | `boolean` | inherited | Color when input focused |
|
|
27
|
+
| `disabled` | `boolean` | inherited | Mute when disabled |
|
|
28
|
+
| `component` | `ElementType` | `'label'` | Override (use `'legend'` inside `<fieldset>`) |
|
|
29
|
+
| `filled` | `boolean` | inherited | Match Filled variant spacing |
|
|
30
|
+
|
|
31
|
+
## States
|
|
32
|
+
|
|
33
|
+
| State | Color |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| Default | `fg-default` |
|
|
36
|
+
| Focused | `fg-primary` |
|
|
37
|
+
| Error | `fg-error` |
|
|
38
|
+
| Disabled | `fg-muted` |
|
|
39
|
+
| Required | Same color + `*` suffix |
|
|
40
|
+
|
|
41
|
+
## Tokens consumed
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
--font-size-body
|
|
45
|
+
--font-weight-medium
|
|
46
|
+
--color-fg-default
|
|
47
|
+
--color-fg-primary /* focused */
|
|
48
|
+
--color-fg-error
|
|
49
|
+
--color-fg-muted /* disabled */
|
|
50
|
+
--space-xs /* margin-bottom to input */
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Accessibility
|
|
54
|
+
|
|
55
|
+
- `htmlFor` MUST match the input's `id`. Without it, click-on-label-focuses-input doesn't work AND screen readers don't announce the label.
|
|
56
|
+
- For groups (RadioGroup, FormGroup), use `component="legend"` inside a `<fieldset>` (FormControl handles fieldset for you when you set `component="fieldset"`).
|
|
57
|
+
- Required asterisk: visual decoration; pair with `aria-required="true"` on the input for screen readers.
|
|
58
|
+
- Korean labels: keep short (1-3 words). Avoid "을/를" particles in label form ("이메일" not "이메일을").
|
|
59
|
+
|
|
60
|
+
## Edge cases
|
|
61
|
+
|
|
62
|
+
- **Optional indicator** — for forms where most fields are optional, label *required* fields visually rather than the inverse. Per [`knowledge/patterns/form-design.md`](../knowledge/patterns/form-design.md).
|
|
63
|
+
- **Long label** — wraps; check at narrow viewports.
|
|
64
|
+
- **Tooltip on label** — wrap label content in a Tooltip for hint-on-hover; ensure focus-visible on label still triggers the tooltip.
|
|
65
|
+
|
|
66
|
+
## Code example
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
<FormControl required error={!!errors.password} fullWidth>
|
|
70
|
+
<FormLabel htmlFor="password">비밀번호</FormLabel>
|
|
71
|
+
<OutlinedInput
|
|
72
|
+
id="password"
|
|
73
|
+
type="password"
|
|
74
|
+
aria-required="true"
|
|
75
|
+
aria-invalid={!!errors.password}
|
|
76
|
+
aria-describedby="password-help"
|
|
77
|
+
/>
|
|
78
|
+
<FormHelperText id="password-help">
|
|
79
|
+
{errors.password ?? "8자 이상, 영문 + 숫자 + 특수문자"}
|
|
80
|
+
</FormHelperText>
|
|
81
|
+
</FormControl>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Don't
|
|
85
|
+
|
|
86
|
+
- Don't omit `htmlFor` — biggest a11y miss in real codebases.
|
|
87
|
+
- Don't put placeholder text instead of a label — placeholders disappear on focus.
|
|
88
|
+
- Don't use multiple `FormLabel` per input.
|
|
89
|
+
|
|
90
|
+
## References
|
|
91
|
+
|
|
92
|
+
- MUI: [`FormLabel`](../refs/mui/packages/mui-material/src/FormLabel/)
|
|
93
|
+
|
|
94
|
+
## Cross-reference
|
|
95
|
+
|
|
96
|
+
- [`component-form-control.md`](component-form-control.md)
|
|
97
|
+
- [`component-form-helper-text.md`](component-form-helper-text.md)
|
|
98
|
+
- [`knowledge/patterns/form-design.md`](../knowledge/patterns/form-design.md)
|