@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,252 @@
|
|
|
1
|
+
# `HeroBlock` (landing hero) — spec
|
|
2
|
+
|
|
3
|
+
> Marketing-page primitive. The first thing visitors see. Cite [`knowledge/patterns/landing-hero-design.md`](../knowledge/patterns/landing-hero-design.md) for variants and rationale.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
The top of a landing page. Headline, supporting text, primary CTA, and supporting visual. The single most-iterated element on any product website.
|
|
8
|
+
|
|
9
|
+
## Anatomy
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Pattern A (text-led, image right):
|
|
13
|
+
┌────────────────────────────────────────────────────────────┐
|
|
14
|
+
│ │
|
|
15
|
+
│ Headline — what you do (40-60pt) │
|
|
16
|
+
│ │
|
|
17
|
+
│ Sub-headline / problem-solution (16-20pt, ~25 words) │
|
|
18
|
+
│ │
|
|
19
|
+
│ [Primary CTA] [Secondary CTA] │
|
|
20
|
+
│ │
|
|
21
|
+
│ Trust signal (logos / "1,000+ 사용자") │
|
|
22
|
+
│ │
|
|
23
|
+
└────────────────────────────────────────────────────────────┘
|
|
24
|
+
┌──────────────────────────────────┐
|
|
25
|
+
│ │
|
|
26
|
+
│ [Hero visual] │
|
|
27
|
+
│ (product screenshot, photo, │
|
|
28
|
+
│ illustration) │
|
|
29
|
+
│ │
|
|
30
|
+
└──────────────────────────────────┘
|
|
31
|
+
|
|
32
|
+
Pattern B (centered, image below):
|
|
33
|
+
Headline
|
|
34
|
+
Sub-headline
|
|
35
|
+
[Primary] [Secondary]
|
|
36
|
+
Trust signal
|
|
37
|
+
┌────────────────┐
|
|
38
|
+
│ Hero visual │
|
|
39
|
+
└────────────────┘
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
| Slot | Required | Notes |
|
|
43
|
+
| --- | --- | --- |
|
|
44
|
+
| Headline | yes | The thing you do, in user words |
|
|
45
|
+
| Sub-headline | yes | One sentence that explains the headline |
|
|
46
|
+
| Primary CTA | yes | One clear action |
|
|
47
|
+
| Secondary CTA | optional | "Learn more" / "View demo" / "Login" |
|
|
48
|
+
| Trust signal | optional | Customer logos, user count, awards |
|
|
49
|
+
| Visual | optional | Image, video, illustration |
|
|
50
|
+
|
|
51
|
+
## API
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
<HeroBlock
|
|
55
|
+
headline="가계부, 자동으로 채워줘요"
|
|
56
|
+
subheadline="은행 30곳 자동 연동. 첫 달 무료. 카드 등록 불필요."
|
|
57
|
+
primaryCta={{ label: "무료 시작하기", onClick: signup }}
|
|
58
|
+
secondaryCta={{ label: "데모 보기", onClick: demo }}
|
|
59
|
+
trustSignal={{ type: "userCount", count: 1247000 }}
|
|
60
|
+
visual={<ProductScreenshot />}
|
|
61
|
+
layout="text-left"
|
|
62
|
+
/>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| Prop | Type | Default | Description |
|
|
66
|
+
| --- | --- | --- | --- |
|
|
67
|
+
| `headline` | `string \| ReactNode` | — | Required. ≤ 12 words ideal. |
|
|
68
|
+
| `subheadline` | `string \| ReactNode` | — | One sentence (~25 words). |
|
|
69
|
+
| `primaryCta` | `CTA` | — | Required. |
|
|
70
|
+
| `secondaryCta` | `CTA` | — | Optional. |
|
|
71
|
+
| `trustSignal` | `TrustSignal` | — | Below CTAs |
|
|
72
|
+
| `visual` | `ReactNode` | — | Image / video / illustration |
|
|
73
|
+
| `layout` | `"text-left" \| "text-right" \| "centered" \| "split"` | `"text-left"` | |
|
|
74
|
+
| `background` | `"default" \| "tinted" \| "image" \| "video"` | `"default"` | |
|
|
75
|
+
| `backgroundImage` | `string` | — | When `background="image"` |
|
|
76
|
+
| `videoSrc` | `string` | — | When `background="video"` |
|
|
77
|
+
|
|
78
|
+
## Layout variants
|
|
79
|
+
|
|
80
|
+
| Layout | Use |
|
|
81
|
+
| --- | --- |
|
|
82
|
+
| `text-left` (most common) | Reading order LTR; image-led visual on right |
|
|
83
|
+
| `text-right` | RTL languages; or to vary template across landing pages |
|
|
84
|
+
| `centered` | Highest-conversion for B2C consumer; minimal layout |
|
|
85
|
+
| `split` | 50-50 image and text; demos product prominently |
|
|
86
|
+
|
|
87
|
+
## Headline rules
|
|
88
|
+
|
|
89
|
+
| Bad | Good |
|
|
90
|
+
| --- | --- |
|
|
91
|
+
| "Welcome to [Company Name]" | "가계부, 자동으로 채워줘요" |
|
|
92
|
+
| "Revolutionary platform" | "은행 30곳 자동 연동" |
|
|
93
|
+
| "Your finance, simplified" | "[concrete what]: [concrete how]" |
|
|
94
|
+
|
|
95
|
+
The headline answers "what does this do?" in user words.
|
|
96
|
+
|
|
97
|
+
For Korean: short, declarative. Verb-led when possible. ~합니다 too formal for marketing — use ~해요 OR colloquial-imperative.
|
|
98
|
+
|
|
99
|
+
## Sub-headline rules
|
|
100
|
+
|
|
101
|
+
| Pattern | Example |
|
|
102
|
+
| --- | --- |
|
|
103
|
+
| Problem + solution | "은행 앱을 30번씩 보지 않아도 가계부가 자동으로 채워집니다." |
|
|
104
|
+
| Differentiation | "수동 입력 없이, 첫 달 무료로 시작." |
|
|
105
|
+
| Social proof + result | "100만 명이 매달 평균 12만 원을 절약했어요." |
|
|
106
|
+
|
|
107
|
+
## CTA rules
|
|
108
|
+
|
|
109
|
+
- **Primary**: action-specific verb. "무료 시작" beats "시작하기". "지금 가입" beats "Sign up".
|
|
110
|
+
- **Secondary**: lower-commitment. "데모 보기" / "기능 살펴보기" / "로그인".
|
|
111
|
+
- **One primary**. Two competing primaries dilute.
|
|
112
|
+
- **Contrast**: primary CTA must have brand color + ≥ 7:1 contrast.
|
|
113
|
+
|
|
114
|
+
## Trust signals
|
|
115
|
+
|
|
116
|
+
5 patterns:
|
|
117
|
+
|
|
118
|
+
| Type | Example | When |
|
|
119
|
+
| --- | --- | --- |
|
|
120
|
+
| Customer logos | "Used by 토스, KakaoBank, ..." | B2B; logos must be permission-cleared |
|
|
121
|
+
| User count | "100만 명이 사용 중" | Consumer; needs to be honest |
|
|
122
|
+
| Awards | "App Store '오늘의 앱' 선정" | When awarded by reputable source |
|
|
123
|
+
| Reviews | "★★★★★ 평점 4.8" | Consumer; show star count |
|
|
124
|
+
| Press mentions | "TechCrunch에 소개됨" | Press mentions matter (rare to have) |
|
|
125
|
+
|
|
126
|
+
Below the CTA, small (smaller than sub-headline). Don't lead with trust signal — lead with the value proposition.
|
|
127
|
+
|
|
128
|
+
## Visual choices
|
|
129
|
+
|
|
130
|
+
| Visual | Use |
|
|
131
|
+
| --- | --- |
|
|
132
|
+
| Product screenshot | Most B2C / B2B; shows what the product looks like |
|
|
133
|
+
| Phone mockup | Mobile-first products |
|
|
134
|
+
| Illustration | When product is abstract or service-based |
|
|
135
|
+
| Photo (people using product) | Lifestyle products; risks looking generic |
|
|
136
|
+
| Animated GIF / video loop | Demonstrates interaction |
|
|
137
|
+
| Live interactive demo | Sophisticated; rare |
|
|
138
|
+
|
|
139
|
+
For Korean fintech landing pages: phone mockup with product screenshot is dominant pattern (Toss / KakaoBank style).
|
|
140
|
+
|
|
141
|
+
## Sizes / typography
|
|
142
|
+
|
|
143
|
+
| Element | Desktop | Mobile |
|
|
144
|
+
| --- | --- | --- |
|
|
145
|
+
| Headline font | 48–60px | 32–40px |
|
|
146
|
+
| Sub-headline | 18–22px | 16–18px |
|
|
147
|
+
| CTA button height | 56px | 48px |
|
|
148
|
+
| Hero visual width | ~50% column | full-width below |
|
|
149
|
+
| Total hero height | 70–90% viewport | scrollable |
|
|
150
|
+
|
|
151
|
+
## Background variants
|
|
152
|
+
|
|
153
|
+
### `default`
|
|
154
|
+
|
|
155
|
+
Solid `--color-bg-default` (white or near-white). Cleanest, fastest perceived load.
|
|
156
|
+
|
|
157
|
+
### `tinted`
|
|
158
|
+
|
|
159
|
+
Subtle brand-color background (`--color-primary-subtle-bg`). Adds brand personality without overwhelming.
|
|
160
|
+
|
|
161
|
+
### `image`
|
|
162
|
+
|
|
163
|
+
Full-bleed image with overlay scrim for text legibility (`linear-gradient(to right, rgba(0,0,0,0.6), transparent)` typical).
|
|
164
|
+
|
|
165
|
+
### `video`
|
|
166
|
+
|
|
167
|
+
Hero video (autoplay muted loop). Heavy bandwidth — use sparingly.
|
|
168
|
+
- `prefers-reduced-motion`: still poster image instead.
|
|
169
|
+
- File optimization: H.264 < 5MB, fallback poster always.
|
|
170
|
+
|
|
171
|
+
## Tokens consumed
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
--color-bg-default
|
|
175
|
+
--color-bg-tinted (when tinted)
|
|
176
|
+
--color-text-primary (headline)
|
|
177
|
+
--color-text-secondary (sub-headline)
|
|
178
|
+
--color-primary-default (primary CTA)
|
|
179
|
+
--color-on-primary
|
|
180
|
+
--space-lg, --space-xl, --space-2xl, --space-3xl
|
|
181
|
+
--font-size-3xl, --font-size-4xl, --font-size-5xl (headline)
|
|
182
|
+
--font-size-lg, --font-size-xl (sub-headline)
|
|
183
|
+
--font-weight-bold, --font-weight-medium
|
|
184
|
+
--motion-default
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Accessibility
|
|
188
|
+
|
|
189
|
+
- Render as `<section role="banner">` or `<header>` for the page.
|
|
190
|
+
- Headline is `<h1>`.
|
|
191
|
+
- Sub-headline is `<p>` (not `<h2>` — that's the next section).
|
|
192
|
+
- Primary CTA is `<button>` or `<a href>` per action type.
|
|
193
|
+
- Background video: `<video>` with `aria-hidden="true"` (decorative).
|
|
194
|
+
- Alt text on hero image describes meaning, not "hero image".
|
|
195
|
+
|
|
196
|
+
## Korean considerations
|
|
197
|
+
|
|
198
|
+
- **Voice**: ~해요 (friendly, consumer) or ~합니다 (formal, B2B). Pick one.
|
|
199
|
+
- **Headline style**: declarative or colloquial-imperative. "가계부, 자동으로!" / "30초 만에 가입".
|
|
200
|
+
- **CTAs**: short. "무료 시작" / "지금 가입" / "체험하기" / "데모 보기".
|
|
201
|
+
- **Trust signals**: Korean star pattern (`★★★★★`) + count. "1,247,000명이 사용 중".
|
|
202
|
+
|
|
203
|
+
## Code example
|
|
204
|
+
|
|
205
|
+
```tsx
|
|
206
|
+
function LandingPage() {
|
|
207
|
+
return (
|
|
208
|
+
<main>
|
|
209
|
+
<HeroBlock
|
|
210
|
+
headline="가계부, 자동으로 채워줘요"
|
|
211
|
+
subheadline="은행 30곳 자동 연동. 첫 달 무료. 카드 등록 불필요."
|
|
212
|
+
primaryCta={{ label: "무료 시작", onClick: () => navigate("/signup") }}
|
|
213
|
+
secondaryCta={{ label: "데모 보기", onClick: () => navigate("/demo") }}
|
|
214
|
+
trustSignal={{
|
|
215
|
+
type: "userCount",
|
|
216
|
+
count: 1247000,
|
|
217
|
+
label: "명이 매달 평균 12만 원 절약 중",
|
|
218
|
+
}}
|
|
219
|
+
visual={<PhoneMockup screen="dashboard" />}
|
|
220
|
+
layout="text-left"
|
|
221
|
+
background="tinted"
|
|
222
|
+
/>
|
|
223
|
+
|
|
224
|
+
<FeatureGrid />
|
|
225
|
+
<TestimonialCarousel />
|
|
226
|
+
<PricingCards />
|
|
227
|
+
</main>
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Don't
|
|
233
|
+
|
|
234
|
+
- Don't use marketing prose ("revolutionary", "synergy") in the headline.
|
|
235
|
+
- Don't show 4+ buttons in the hero — clarity dies.
|
|
236
|
+
- Don't autoplay videos with sound.
|
|
237
|
+
- Don't ship a hero without `prefers-reduced-motion` handling for video / animations.
|
|
238
|
+
- Don't put critical info only in the hero image.
|
|
239
|
+
- Don't truncate the headline to fit the design — re-write the headline shorter.
|
|
240
|
+
- Don't make the primary CTA visually weaker than the secondary.
|
|
241
|
+
|
|
242
|
+
## References
|
|
243
|
+
|
|
244
|
+
- No upstream component is exactly this. Each landing-page builder (Webflow, Framer, Astro Themes) ships their own variant.
|
|
245
|
+
- Cite [`knowledge/patterns/landing-page-patterns.md`](../knowledge/patterns/landing-page-patterns.md) and [`knowledge/patterns/landing-hero-design.md`](../knowledge/patterns/landing-hero-design.md).
|
|
246
|
+
|
|
247
|
+
## Cross-reference
|
|
248
|
+
|
|
249
|
+
- [`knowledge/patterns/landing-hero-design.md`](../knowledge/patterns/landing-hero-design.md) — hero variants
|
|
250
|
+
- [`knowledge/patterns/landing-page-patterns.md`](../knowledge/patterns/landing-page-patterns.md) — full landing structure
|
|
251
|
+
- [`examples/component-button.md`](component-button.md) — CTA primitive
|
|
252
|
+
- [`knowledge/patterns/brand-identity.md`](../knowledge/patterns/brand-identity.md) — voice in marketing
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# `HoverCard` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `hover-card` (Radix). Hover-triggered floating card showing rich preview content. Distinct from Tooltip (text only) and Popover (click-triggered).
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- **User profile preview** on @-mention hover.
|
|
8
|
+
- **Link preview** before navigation.
|
|
9
|
+
- **Glossary** — hover term, see definition.
|
|
10
|
+
- **Card-style metadata** — hover an entity, see image + summary + actions.
|
|
11
|
+
|
|
12
|
+
When NOT to use:
|
|
13
|
+
- Mobile-primary contexts — hover doesn't exist on touch (long-press feels heavy).
|
|
14
|
+
- Critical info — hover is supplemental; user must be able to access without it.
|
|
15
|
+
- Quick text only — use Tooltip (lighter, faster).
|
|
16
|
+
- User-initiated content — use Popover (click-triggered).
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
[hover trigger]
|
|
22
|
+
↓
|
|
23
|
+
┌──────────────────────┐
|
|
24
|
+
│ [avatar] │
|
|
25
|
+
│ User Name │
|
|
26
|
+
│ @username │
|
|
27
|
+
│ │
|
|
28
|
+
│ Joined 2024 │
|
|
29
|
+
│ Following 234 │
|
|
30
|
+
│ │
|
|
31
|
+
│ [Follow] [Message] │
|
|
32
|
+
└──────────────────────┘
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## API
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
<HoverCard openDelay={400} closeDelay={300}>
|
|
39
|
+
<HoverCard.Trigger asChild>
|
|
40
|
+
<a href={`/users/${user.id}`}>@{user.username}</a>
|
|
41
|
+
</HoverCard.Trigger>
|
|
42
|
+
<HoverCard.Content>
|
|
43
|
+
<div className="hover-card-content">
|
|
44
|
+
<Avatar src={user.avatar} />
|
|
45
|
+
<h4>{user.name}</h4>
|
|
46
|
+
<p>@{user.username}</p>
|
|
47
|
+
<p>{user.bio}</p>
|
|
48
|
+
<div className="actions">
|
|
49
|
+
<button>Follow</button>
|
|
50
|
+
<button>Message</button>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</HoverCard.Content>
|
|
54
|
+
</HoverCard>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
| Prop | Type | Default | Description |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
| `openDelay` | `number` | `700` | Ms hover before opening (don't trigger on glancing-pass) |
|
|
60
|
+
| `closeDelay` | `number` | `300` | Ms after leave before closing (allows mouse to enter card) |
|
|
61
|
+
| `defaultOpen` | `boolean` | `false` | Open initially (rare) |
|
|
62
|
+
| `open` | `boolean` | controlled | Controlled state |
|
|
63
|
+
| `onOpenChange` | `(open: boolean) => void` | — | State callback |
|
|
64
|
+
|
|
65
|
+
## Composition
|
|
66
|
+
|
|
67
|
+
| Part | Purpose |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| `Trigger` | Hover target |
|
|
70
|
+
| `Content` | The floating card |
|
|
71
|
+
| `Arrow` (optional) | Caret pointing at trigger |
|
|
72
|
+
| `Portal` | Render outside parent (default behavior) |
|
|
73
|
+
|
|
74
|
+
Free-form children inside Content — no enforced sub-parts (unlike DropdownMenu).
|
|
75
|
+
|
|
76
|
+
## Open / close behavior
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
User hovers trigger
|
|
80
|
+
↓ wait openDelay (700ms default)
|
|
81
|
+
Card opens with fade + scale (200ms)
|
|
82
|
+
User mouses out of trigger
|
|
83
|
+
↓ wait closeDelay (300ms)
|
|
84
|
+
↓ during delay, if mouse enters Card, cancel close
|
|
85
|
+
Card closes if mouse hasn't entered Card
|
|
86
|
+
User mouses out of Card
|
|
87
|
+
↓ wait closeDelay
|
|
88
|
+
Card closes
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The closeDelay + Card-as-hover-target pattern is critical. Without it, users can't reach the card content.
|
|
92
|
+
|
|
93
|
+
## Positioning
|
|
94
|
+
|
|
95
|
+
Same as DropdownMenu:
|
|
96
|
+
- Default: `bottom-start`.
|
|
97
|
+
- `align`, `side` configurable.
|
|
98
|
+
- Auto-flip on collision.
|
|
99
|
+
- 8px collision padding.
|
|
100
|
+
|
|
101
|
+
For inline triggers (within paragraphs of text): consider `align="start"` to anchor to the trigger's left edge.
|
|
102
|
+
|
|
103
|
+
## States
|
|
104
|
+
|
|
105
|
+
| State | Visual |
|
|
106
|
+
| --- | --- |
|
|
107
|
+
| Closed | Trigger visible; card hidden |
|
|
108
|
+
| Hover (within openDelay) | Trigger styled (e.g., underline) but card still hidden |
|
|
109
|
+
| Opening | Card fades + scales in (200ms) |
|
|
110
|
+
| Open | Card visible |
|
|
111
|
+
| Closing | Reverse (150ms) |
|
|
112
|
+
|
|
113
|
+
No focus management — HoverCard is hover-only. For keyboard / focus equivalent, use Tooltip OR pair with a Popover triggered by focus.
|
|
114
|
+
|
|
115
|
+
## Tokens consumed
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
--color-bg-overlay
|
|
119
|
+
--color-fg-on-overlay
|
|
120
|
+
--color-border-overlay
|
|
121
|
+
--radius-md
|
|
122
|
+
--shadow-overlay
|
|
123
|
+
--space-md, --space-lg
|
|
124
|
+
--font-size-sm, --font-size-base
|
|
125
|
+
--motion-medium (200ms open/close)
|
|
126
|
+
--ease-out
|
|
127
|
+
--z-overlay
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Accessibility
|
|
131
|
+
|
|
132
|
+
- HoverCard is **decorative / supplemental**. The same content must be reachable elsewhere (linked profile page, accessible label, etc.).
|
|
133
|
+
- Trigger remains a normal interactive element (link, button) — its activation must work without hover.
|
|
134
|
+
- Don't put critical actions ONLY in the HoverCard. Buttons inside should also exist on the destination page.
|
|
135
|
+
- For keyboard users: hovering doesn't fire on `focus` by default. If you need focus-equivalent, use `Popover` or add a dedicated keyboard shortcut.
|
|
136
|
+
- For touch: hover doesn't exist; HoverCard is silently no-op on mobile. Don't ship critical info inside.
|
|
137
|
+
- `aria-label` on Trigger should describe the destination, not "show preview" (hover is internal mechanic).
|
|
138
|
+
|
|
139
|
+
## Mobile behavior
|
|
140
|
+
|
|
141
|
+
By default, HoverCard does nothing on touch devices. Options:
|
|
142
|
+
- **Tap once = preview, tap again = navigate** (pattern used by some social apps; confusing).
|
|
143
|
+
- **Long-press = preview** (similar to ContextMenu; non-obvious).
|
|
144
|
+
- **Don't show on mobile** — fall back to direct navigation.
|
|
145
|
+
|
|
146
|
+
Default and recommended: **don't show on mobile**. Style the trigger so users see it's tappable, navigate them to a full page on tap.
|
|
147
|
+
|
|
148
|
+
## Code example
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
function MentionLink({ user }: { user: User }) {
|
|
152
|
+
return (
|
|
153
|
+
<HoverCard openDelay={500} closeDelay={300}>
|
|
154
|
+
<HoverCard.Trigger asChild>
|
|
155
|
+
<a href={`/users/${user.id}`} className="mention">
|
|
156
|
+
@{user.username}
|
|
157
|
+
</a>
|
|
158
|
+
</HoverCard.Trigger>
|
|
159
|
+
<HoverCard.Content className="mention-preview">
|
|
160
|
+
<div className="header">
|
|
161
|
+
<Avatar src={user.avatar} size="lg" />
|
|
162
|
+
<div>
|
|
163
|
+
<h4>{user.name}</h4>
|
|
164
|
+
<p className="username">@{user.username}</p>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
<p className="bio">{user.bio}</p>
|
|
168
|
+
<dl className="stats">
|
|
169
|
+
<dt>Following</dt><dd>{user.following}</dd>
|
|
170
|
+
<dt>Followers</dt><dd>{user.followers}</dd>
|
|
171
|
+
</dl>
|
|
172
|
+
<div className="actions">
|
|
173
|
+
<FollowButton userId={user.id} />
|
|
174
|
+
</div>
|
|
175
|
+
</HoverCard.Content>
|
|
176
|
+
</HoverCard>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Edge cases
|
|
182
|
+
|
|
183
|
+
- **Trigger inside scrollable container**: card may scroll out of view; `Portal` keeps it visible.
|
|
184
|
+
- **Async content** (fetch user data on hover): show skeleton inside card while loading.
|
|
185
|
+
- **Trigger removed during open**: card auto-closes.
|
|
186
|
+
- **Multiple hover-cards in close proximity**: respect `openDelay` so glancing through doesn't open a chain.
|
|
187
|
+
- **Card content larger than viewport**: cap height; scroll inside card OR truncate.
|
|
188
|
+
- **Right-to-left**: positioning flips automatically.
|
|
189
|
+
- **Reduced motion**: skip fade + scale; instant show / hide.
|
|
190
|
+
|
|
191
|
+
## Don't
|
|
192
|
+
|
|
193
|
+
- Don't put critical info or actions only inside HoverCard.
|
|
194
|
+
- Don't trigger on click — that's Popover.
|
|
195
|
+
- Don't trigger on focus — use Tooltip for that, or pair with Popover.
|
|
196
|
+
- Don't make HoverCard the only way to view a profile — link the trigger to the full page.
|
|
197
|
+
- Don't ship without `openDelay` — mouse-passing through triggers an avalanche of cards.
|
|
198
|
+
- Don't disable on mobile silently without a fallback path.
|
|
199
|
+
- Don't autofocus inside HoverCard — content is non-interactive aside from links.
|
|
200
|
+
|
|
201
|
+
## References
|
|
202
|
+
|
|
203
|
+
- shadcn-ui: [`hover-card`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/hover-card.tsx) (Radix)
|
|
204
|
+
- Patterns: Twitter / X profile previews on @mention hover
|
|
205
|
+
- Patterns: GitHub PR review preview on commit hash hover
|
|
206
|
+
|
|
207
|
+
## Cross-reference
|
|
208
|
+
|
|
209
|
+
- [`examples/component-tooltip.md`](component-tooltip.md) — text-only hover hint
|
|
210
|
+
- [`examples/component-popover.md`](component-popover.md) — click-triggered floating content
|
|
211
|
+
- [`examples/component-dropdown.md`](component-dropdown.md) — menu-style overlay
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# `IconButton` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `IconButton` and Material 3 icon button patterns. A button that contains only an icon. Distinct from `Button` (text+icon) and `Toggle` (persistent state).
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Toolbar actions where space is tight (search, settings, more).
|
|
8
|
+
- Card / item trailing actions.
|
|
9
|
+
- Mobile primary action affordances.
|
|
10
|
+
|
|
11
|
+
When NOT to use:
|
|
12
|
+
- The icon's meaning isn't universally recognized — use text Button.
|
|
13
|
+
- The action is the primary CTA — use Button with text.
|
|
14
|
+
|
|
15
|
+
## Anatomy
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
[ ⚙ ] [ × ] [ ⋮ ]
|
|
19
|
+
settings close more
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
A circular or rounded-square button with one icon centered. ≥ 44pt touch target on mobile (44x44 min); ≥ 32x32 desktop.
|
|
23
|
+
|
|
24
|
+
## API
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
<IconButton aria-label="설정" onClick={openSettings}>
|
|
28
|
+
<SettingsIcon />
|
|
29
|
+
</IconButton>
|
|
30
|
+
|
|
31
|
+
<IconButton variant="outline" size="sm" aria-label="닫기">
|
|
32
|
+
<CloseIcon />
|
|
33
|
+
</IconButton>
|
|
34
|
+
|
|
35
|
+
<IconButton variant="filled" color="destructive" aria-label="삭제">
|
|
36
|
+
<TrashIcon />
|
|
37
|
+
</IconButton>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| Prop | Type | Default | Description |
|
|
41
|
+
| --- | --- | --- | --- |
|
|
42
|
+
| `aria-label` | `string` | required | Accessible label (icon-only buttons MUST have this) |
|
|
43
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | Touch target size |
|
|
44
|
+
| `variant` | `"ghost" \| "outline" \| "filled" \| "tonal"` | `"ghost"` | Visual treatment |
|
|
45
|
+
| `color` | `"default" \| "brand" \| "destructive"` | `"default"` | Color token |
|
|
46
|
+
| `disabled` | `boolean` | `false` | — |
|
|
47
|
+
| `loading` | `boolean` | `false` | Replaces icon with spinner |
|
|
48
|
+
|
|
49
|
+
## Variants
|
|
50
|
+
|
|
51
|
+
| Variant | Look |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| `ghost` (default) | No bg until hover; subtle |
|
|
54
|
+
| `outline` | Border, no fill |
|
|
55
|
+
| `filled` | Solid bg (brand or destructive) |
|
|
56
|
+
| `tonal` | Soft tinted bg (Material 3 style) |
|
|
57
|
+
|
|
58
|
+
## Sizes
|
|
59
|
+
|
|
60
|
+
| Size | Touch target | Icon size |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| `sm` | 32x32 | 16-18px |
|
|
63
|
+
| `md` (default) | 40x40 | 20-24px |
|
|
64
|
+
| `lg` | 48x48 | 24-28px |
|
|
65
|
+
|
|
66
|
+
For mobile primary: ≥ 44pt minimum. Desktop secondary: 32px ok.
|
|
67
|
+
|
|
68
|
+
## States
|
|
69
|
+
|
|
70
|
+
| State | Visual |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| Default | Per variant |
|
|
73
|
+
| Hover | Subtle bg shift (ghost) or darker fill (filled) |
|
|
74
|
+
| Focus-visible | Visible 2px ring around the button |
|
|
75
|
+
| Active (press) | Deeper bg |
|
|
76
|
+
| Disabled | Reduced opacity, no events, `aria-disabled` |
|
|
77
|
+
| Loading | Spinner replaces icon; `aria-busy="true"` |
|
|
78
|
+
|
|
79
|
+
## Tokens consumed
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
--icon-button-size-sm / -md / -lg
|
|
83
|
+
--icon-button-bg-default
|
|
84
|
+
--icon-button-bg-hover
|
|
85
|
+
--icon-button-bg-pressed
|
|
86
|
+
--icon-button-bg-filled (filled variant)
|
|
87
|
+
--icon-button-bg-destructive
|
|
88
|
+
--icon-button-fg-default
|
|
89
|
+
--icon-button-fg-on-filled
|
|
90
|
+
--icon-button-border (outline variant)
|
|
91
|
+
--radius-md (rounded-square) or --radius-full (circular)
|
|
92
|
+
--motion-fast
|
|
93
|
+
--ease-out
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Accessibility
|
|
97
|
+
|
|
98
|
+
- **`aria-label` mandatory**. Icon-only buttons without label fail accessibility.
|
|
99
|
+
- Focus-visible ring required.
|
|
100
|
+
- Touch target ≥ 44pt mobile primary.
|
|
101
|
+
- For Korean: `aria-label` in Korean ("설정", "닫기", "삭제") for KR audiences.
|
|
102
|
+
|
|
103
|
+
## Code example
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
function ToolbarActions() {
|
|
107
|
+
return (
|
|
108
|
+
<div className="toolbar">
|
|
109
|
+
<IconButton aria-label="이전">
|
|
110
|
+
<ChevronLeftIcon />
|
|
111
|
+
</IconButton>
|
|
112
|
+
<IconButton aria-label="다음">
|
|
113
|
+
<ChevronRightIcon />
|
|
114
|
+
</IconButton>
|
|
115
|
+
<IconButton aria-label="새로고침" loading={refreshing}>
|
|
116
|
+
<RefreshIcon />
|
|
117
|
+
</IconButton>
|
|
118
|
+
<IconButton aria-label="더보기">
|
|
119
|
+
<MoreIcon />
|
|
120
|
+
</IconButton>
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Don't
|
|
127
|
+
|
|
128
|
+
- Don't omit `aria-label`.
|
|
129
|
+
- Don't make IconButton smaller than 32x32 on desktop, 44pt on mobile.
|
|
130
|
+
- Don't use IconButton for primary CTAs. Use text Button.
|
|
131
|
+
- Don't pair IconButton with Tooltip text on mobile (no hover) — `aria-label` is the spoken label.
|
|
132
|
+
|
|
133
|
+
## References
|
|
134
|
+
|
|
135
|
+
- MUI: [`IconButton`](../refs/mui/packages/mui-material/src/IconButton)
|
|
136
|
+
- Material 3: Icon button variants
|
|
137
|
+
|
|
138
|
+
## Cross-reference
|
|
139
|
+
|
|
140
|
+
- [`examples/component-button.md`](component-button.md) — text+icon variant
|
|
141
|
+
- [`examples/component-icon.md`](component-icon.md)
|
|
142
|
+
- [`examples/component-tooltip.md`](component-tooltip.md) — pairs with IconButton on desktop
|