@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,118 @@
|
|
|
1
|
+
# `Label` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `label` and the HTML5 `<label>` element. The semantic + styled label primitive for form controls.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- **Every form control** (Input, Select, Checkbox, Radio, Switch, Combobox).
|
|
8
|
+
- Wherever you'd write `<label htmlFor="...">`.
|
|
9
|
+
|
|
10
|
+
`Label` is a thin styled wrapper around `<label>` — adds typography tokens + optional required/optional indicator.
|
|
11
|
+
|
|
12
|
+
## API
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
<Label htmlFor="email">이메일</Label>
|
|
16
|
+
<Input id="email" />
|
|
17
|
+
|
|
18
|
+
<Label htmlFor="age" required>만 14세 이상입니다</Label>
|
|
19
|
+
|
|
20
|
+
<Label htmlFor="bio" optional>자기소개 (선택)</Label>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Description |
|
|
24
|
+
| --- | --- | --- | --- |
|
|
25
|
+
| `htmlFor` | `string` | — | Linked input id (mandatory for accessibility) |
|
|
26
|
+
| `required` | `boolean` | `false` | Adds asterisk visual |
|
|
27
|
+
| `optional` | `boolean` | `false` | Adds "(선택)" / "(optional)" text |
|
|
28
|
+
| `children` | `ReactNode` | — | Label text |
|
|
29
|
+
| `className` | `string` | — | Style override |
|
|
30
|
+
|
|
31
|
+
## CSS
|
|
32
|
+
|
|
33
|
+
```css
|
|
34
|
+
.label {
|
|
35
|
+
font-size: var(--font-size-sm);
|
|
36
|
+
font-weight: 500;
|
|
37
|
+
color: var(--color-fg-default);
|
|
38
|
+
display: inline-flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
gap: var(--space-xxs);
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
user-select: none;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.label[data-required]::after {
|
|
46
|
+
content: "*";
|
|
47
|
+
color: var(--color-error-default);
|
|
48
|
+
margin-left: 2px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.label[data-disabled] {
|
|
52
|
+
opacity: 0.6;
|
|
53
|
+
cursor: not-allowed;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## States
|
|
58
|
+
|
|
59
|
+
| State | Visual |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| Default | Standard label color |
|
|
62
|
+
| Hover (when paired with input) | No change (the input handles hover) |
|
|
63
|
+
| Disabled (when input is disabled) | Reduced opacity |
|
|
64
|
+
|
|
65
|
+
Label is presentational; states inherit from the linked input.
|
|
66
|
+
|
|
67
|
+
## Accessibility
|
|
68
|
+
|
|
69
|
+
- Always use `htmlFor` matching the input's `id`.
|
|
70
|
+
- Click on label focuses / activates the linked input.
|
|
71
|
+
- For Checkbox / Radio: clicking the label also toggles the control (native browser behavior).
|
|
72
|
+
- For required field, prefer `aria-required="true"` on the input over visual asterisk alone — color-blind / screen reader users miss the star.
|
|
73
|
+
|
|
74
|
+
```html
|
|
75
|
+
<Label htmlFor="email" required>이메일</Label>
|
|
76
|
+
<Input id="email" type="email" required aria-required="true" />
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Korean conventions
|
|
80
|
+
|
|
81
|
+
- 필수 / 선택 marker patterns:
|
|
82
|
+
- 필수: asterisk `*` OR "(필수)" text after label
|
|
83
|
+
- 선택: "(선택)" text after label OR no marker (assume required by default)
|
|
84
|
+
- Common labels: 이메일 / 비밀번호 / 이름 / 휴대폰 번호 / 주소 / 회원가입 약관 동의
|
|
85
|
+
|
|
86
|
+
## Code example
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
<Field>
|
|
90
|
+
<Label htmlFor="email" required>이메일</Label>
|
|
91
|
+
<Input id="email" type="email" autoComplete="email" required />
|
|
92
|
+
<FieldDescription>로그인할 때 사용해요.</FieldDescription>
|
|
93
|
+
</Field>
|
|
94
|
+
|
|
95
|
+
<Field>
|
|
96
|
+
<Label htmlFor="bio" optional>자기소개</Label>
|
|
97
|
+
<Textarea id="bio" rows={3} />
|
|
98
|
+
</Field>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Don't
|
|
102
|
+
|
|
103
|
+
- Don't use Label without `htmlFor`. Just text without a link is decorative.
|
|
104
|
+
- Don't put long instructional text in Label. Use FieldDescription.
|
|
105
|
+
- Don't rely on color alone for required indicator — use asterisk OR `aria-required`.
|
|
106
|
+
- Don't wrap multiple inputs in one Label — confusing. Use separate Labels.
|
|
107
|
+
|
|
108
|
+
## References
|
|
109
|
+
|
|
110
|
+
- HTML5 `<label>` element
|
|
111
|
+
- shadcn-ui: [`label`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/label.tsx) (Radix)
|
|
112
|
+
- MUI: `FormLabel`
|
|
113
|
+
|
|
114
|
+
## Cross-reference
|
|
115
|
+
|
|
116
|
+
- [`examples/component-field.md`](component-field.md) — wraps Label + control
|
|
117
|
+
- [`examples/component-input.md`](component-input.md)
|
|
118
|
+
- [`examples/component-form-controls.md`](component-form-controls.md)
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# `Layout` (page chrome) — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Layout`, MUI (composition), shadcn-ui (composition)
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
The top-level page structure: header / sidebar / main / footer. Used as the root of any standard product page. Provides slot-based composition for consistent app chrome.
|
|
8
|
+
|
|
9
|
+
## When Layout vs CSS Grid
|
|
10
|
+
|
|
11
|
+
Layout component vs CSS Grid (`grid-template-areas`): both work. The Layout component:
|
|
12
|
+
- Pre-defines the slots (Header, Sidebar, Content, Footer)
|
|
13
|
+
- Applies sticky/fixed positioning consistently
|
|
14
|
+
- Handles responsive collapse (sidebar → drawer on mobile)
|
|
15
|
+
|
|
16
|
+
For dashboards with a fixed shape, Layout simplifies the wiring.
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌──────────────────────────────────────────────────┐
|
|
22
|
+
│ Layout.Header (sticky) │
|
|
23
|
+
├──────────┬───────────────────────────────────────┤
|
|
24
|
+
│ │ │
|
|
25
|
+
│ Layout. │ Layout.Content │
|
|
26
|
+
│ Sider │ │
|
|
27
|
+
│ │ │
|
|
28
|
+
│ │ │
|
|
29
|
+
├──────────┴───────────────────────────────────────┤
|
|
30
|
+
│ Layout.Footer (optional) │
|
|
31
|
+
└──────────────────────────────────────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
| Slot | Required | Notes |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| `Layout` | yes | Root container |
|
|
37
|
+
| `Layout.Header` | optional | Top app bar (typically with `AppBar` inside) |
|
|
38
|
+
| `Layout.Sider` | optional | Sidebar nav (collapsible) |
|
|
39
|
+
| `Layout.Content` | yes | Main page content |
|
|
40
|
+
| `Layout.Footer` | optional | Footer (rare on apps; common on marketing) |
|
|
41
|
+
|
|
42
|
+
## API
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<Layout>
|
|
46
|
+
<Layout.Header>
|
|
47
|
+
<AppBar leading={<Logo />} actions={[...]} />
|
|
48
|
+
</Layout.Header>
|
|
49
|
+
<Layout>
|
|
50
|
+
<Layout.Sider width={240} collapsible>
|
|
51
|
+
<SideNav />
|
|
52
|
+
</Layout.Sider>
|
|
53
|
+
<Layout.Content>
|
|
54
|
+
<PageContent />
|
|
55
|
+
</Layout.Content>
|
|
56
|
+
</Layout>
|
|
57
|
+
<Layout.Footer>
|
|
58
|
+
<SiteFooter />
|
|
59
|
+
</Layout.Footer>
|
|
60
|
+
</Layout>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Prop (Layout) | Type | Default | Description |
|
|
64
|
+
| --- | --- | --- | --- |
|
|
65
|
+
| `direction` | `"column" \| "row"` | `"column"` | Children stack vertically or horizontally |
|
|
66
|
+
|
|
67
|
+
| Prop (Sider) | Type | Default | Description |
|
|
68
|
+
| --- | --- | --- | --- |
|
|
69
|
+
| `width` | `number \| string` | `200` | Expanded width |
|
|
70
|
+
| `collapsedWidth` | `number` | `64` | Width when collapsed |
|
|
71
|
+
| `collapsible` | `boolean` | `false` | Show toggle |
|
|
72
|
+
| `collapsed` | `boolean` | — | Controlled |
|
|
73
|
+
| `defaultCollapsed` | `boolean` | `false` | |
|
|
74
|
+
| `breakpoint` | `string` | `"md"` | Auto-collapse below this width |
|
|
75
|
+
| `onCollapse` | `(collapsed) => void` | — | |
|
|
76
|
+
| `position` | `"left" \| "right"` | `"left"` | |
|
|
77
|
+
|
|
78
|
+
| Prop (Header / Footer) | Type | Default | Description |
|
|
79
|
+
| --- | --- | --- | --- |
|
|
80
|
+
| `position` | `"static" \| "sticky" \| "fixed"` | `"static"` | |
|
|
81
|
+
|
|
82
|
+
## Behavior
|
|
83
|
+
|
|
84
|
+
### Sider collapse
|
|
85
|
+
|
|
86
|
+
- Manual: user clicks toggle button.
|
|
87
|
+
- Auto-collapse: at viewport breakpoint, sider collapses to icon-only or hides entirely.
|
|
88
|
+
- Mobile: typically hide entirely; replace with hamburger that opens a Drawer.
|
|
89
|
+
|
|
90
|
+
### Layout nesting
|
|
91
|
+
|
|
92
|
+
You can nest `Layout` inside `Layout` to combine row + column flows:
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
<Layout> {/* column */}
|
|
96
|
+
<Layout.Header />
|
|
97
|
+
<Layout> {/* row */}
|
|
98
|
+
<Layout.Sider />
|
|
99
|
+
<Layout.Content />
|
|
100
|
+
</Layout>
|
|
101
|
+
</Layout>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
This is the canonical "header + sidebar + content" pattern.
|
|
105
|
+
|
|
106
|
+
## Responsive patterns
|
|
107
|
+
|
|
108
|
+
| Viewport | Recommended layout |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| < 768 (mobile) | Header + Content; Sider hidden, opens via drawer |
|
|
111
|
+
| 768–1024 (tablet) | Header + collapsed Sider (icon-only) + Content |
|
|
112
|
+
| > 1024 (desktop) | Header + expanded Sider + Content |
|
|
113
|
+
|
|
114
|
+
Use `breakpoint="md"` on Sider for auto-collapse.
|
|
115
|
+
|
|
116
|
+
## States
|
|
117
|
+
|
|
118
|
+
The Layout component doesn't have visual states. The Sider has expanded/collapsed.
|
|
119
|
+
|
|
120
|
+
## Tokens consumed
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
--color-bg-default (Content bg)
|
|
124
|
+
--color-bg-elevated (Header, Sider bg)
|
|
125
|
+
--color-bg-subtle (Footer bg)
|
|
126
|
+
--color-border-default (between regions)
|
|
127
|
+
--color-text-primary
|
|
128
|
+
--space-md, --space-base
|
|
129
|
+
--motion-default (Sider collapse animation)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Sizes
|
|
133
|
+
|
|
134
|
+
| Region | Default size |
|
|
135
|
+
| --- | --- |
|
|
136
|
+
| Header height | 56px (mobile) / 64px (desktop) |
|
|
137
|
+
| Sider width | 200–280px |
|
|
138
|
+
| Sider collapsed | 64px |
|
|
139
|
+
| Footer height | 64–96px |
|
|
140
|
+
|
|
141
|
+
Content fills remaining space.
|
|
142
|
+
|
|
143
|
+
## Accessibility
|
|
144
|
+
|
|
145
|
+
- `<Layout>` renders as `<div>` (or root structural element).
|
|
146
|
+
- `Layout.Header` → `<header>` with `role="banner"`.
|
|
147
|
+
- `Layout.Sider` → `<nav>` with `aria-label="Main navigation"`.
|
|
148
|
+
- `Layout.Content` → `<main>` with `id="main-content"`.
|
|
149
|
+
- `Layout.Footer` → `<footer>` with `role="contentinfo"`.
|
|
150
|
+
- Provide a "Skip to main content" link before the header — keyboard users skip nav.
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<a href="#main-content" class="sr-only-focusable">본문으로 건너뛰기</a>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Code example
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
function AppLayout({ children }: Props) {
|
|
160
|
+
const [sidebarCollapsed, setSidebarCollapsed] = useLocalStorage("sidebar-collapsed", false);
|
|
161
|
+
|
|
162
|
+
return (
|
|
163
|
+
<Layout>
|
|
164
|
+
<Layout.Header position="sticky">
|
|
165
|
+
<AppBar
|
|
166
|
+
leading={<Logo />}
|
|
167
|
+
title={<NavLinks />}
|
|
168
|
+
actions={[<Notifications />, <ProfileMenu />]}
|
|
169
|
+
/>
|
|
170
|
+
</Layout.Header>
|
|
171
|
+
|
|
172
|
+
<Layout direction="row">
|
|
173
|
+
<Layout.Sider
|
|
174
|
+
width={240}
|
|
175
|
+
collapsedWidth={64}
|
|
176
|
+
collapsible
|
|
177
|
+
collapsed={sidebarCollapsed}
|
|
178
|
+
onCollapse={setSidebarCollapsed}
|
|
179
|
+
breakpoint="md"
|
|
180
|
+
position="left"
|
|
181
|
+
>
|
|
182
|
+
<SideNav collapsed={sidebarCollapsed} />
|
|
183
|
+
</Layout.Sider>
|
|
184
|
+
|
|
185
|
+
<Layout.Content>
|
|
186
|
+
<a href="#main-content" className="sr-only-focusable">
|
|
187
|
+
본문으로 건너뛰기
|
|
188
|
+
</a>
|
|
189
|
+
<main id="main-content">
|
|
190
|
+
{children}
|
|
191
|
+
</main>
|
|
192
|
+
</Layout.Content>
|
|
193
|
+
</Layout>
|
|
194
|
+
</Layout>
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Don't
|
|
200
|
+
|
|
201
|
+
- Don't ship without a "Skip to main content" link.
|
|
202
|
+
- Don't put critical content in the Sider only — mobile users may not see it.
|
|
203
|
+
- Don't auto-collapse the sider on every page load — persist user preference.
|
|
204
|
+
- Don't omit `<main>` — accessibility requires it.
|
|
205
|
+
|
|
206
|
+
## References
|
|
207
|
+
|
|
208
|
+
- Ant Design: [`refs/ant-design/components/layout/`](../refs/ant-design/components/layout/) — `Layout`, `Layout.Header`, `Layout.Sider`, `Layout.Content`, `Layout.Footer`. Most exhaustive.
|
|
209
|
+
- MUI: no dedicated Layout — compose with `<Box>` + `<Drawer>` + `<AppBar>`.
|
|
210
|
+
- shadcn-ui: no built-in. Use `resizable` + custom layout.
|
|
211
|
+
|
|
212
|
+
## Cross-reference
|
|
213
|
+
|
|
214
|
+
- [`examples/component-app-bar.md`](component-app-bar.md) — fits inside Layout.Header
|
|
215
|
+
- [`examples/component-drawer.md`](component-drawer.md) — mobile alternative to Sider
|
|
216
|
+
- [`examples/component-splitter.md`](component-splitter.md) — when sider needs resize
|
|
217
|
+
- [`knowledge/layout/spacing-and-grid.md`](../knowledge/layout/spacing-and-grid.md) — broader layout system
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# `Link` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `Link`, Ant Design's link styles, and shadcn-ui's `<a>` patterns. The canonical text link primitive — distinct from `Button` and `Anchor` (TOC nav).
|
|
4
|
+
|
|
5
|
+
## Link vs Button
|
|
6
|
+
|
|
7
|
+
> **Links navigate. Buttons do.**
|
|
8
|
+
|
|
9
|
+
Use `Link` when the action is "go somewhere" (URL change). Use `Button` when the action is "do something" (state change, side effect).
|
|
10
|
+
|
|
11
|
+
| | Link | Button |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| Native element | `<a href>` | `<button>` |
|
|
14
|
+
| Default keyboard | Enter activates | Enter / Space activate |
|
|
15
|
+
| Default behavior | Navigate | Custom handler |
|
|
16
|
+
| Right-click context | Open in new tab | n/a |
|
|
17
|
+
| Drag | Drag URL | n/a |
|
|
18
|
+
| User expectation | New URL | Stay |
|
|
19
|
+
|
|
20
|
+
For ambiguous cases ("Sign out" — is that a state change or a navigation to /logout?): pick based on the destination. If `/logout` is a real route, use Link. If it's purely a state action, use Button.
|
|
21
|
+
|
|
22
|
+
## Anatomy
|
|
23
|
+
|
|
24
|
+
Inline link in flowing text:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
The system audits your design system across five layers. See the full
|
|
28
|
+
report.
|
|
29
|
+
↑ link
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Standalone link (CTA-style):
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
[ → 자세히 보기 ]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
External link with indicator:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Visit our docs ↗
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## API
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
<Link href="/docs">documentation</Link>
|
|
48
|
+
<Link href="https://example.com" external>External site ↗</Link>
|
|
49
|
+
<Link href="/profile" as={NextLink}>profile</Link>
|
|
50
|
+
<Link variant="standalone">Learn more →</Link>
|
|
51
|
+
<Link variant="muted" href="...">Privacy policy</Link>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| Prop | Type | Default | Description |
|
|
55
|
+
| --- | --- | --- | --- |
|
|
56
|
+
| `href` | `string` | required | Destination URL |
|
|
57
|
+
| `external` | `boolean` | auto-detected from URL | Add visual indicator + open-in-new-tab semantics |
|
|
58
|
+
| `variant` | `"default" \| "muted" \| "standalone" \| "destructive"` | `"default"` | Visual style |
|
|
59
|
+
| `underline` | `"hover" \| "always" \| "none"` | `"hover"` | When underline is visible |
|
|
60
|
+
| `as` | Component | `"a"` | Render as router-aware Link (NextLink, react-router Link) |
|
|
61
|
+
| `disabled` | `boolean` | `false` | Disabled (rare for links; usually means "not yet available") |
|
|
62
|
+
|
|
63
|
+
## Variants
|
|
64
|
+
|
|
65
|
+
### `default` (in-flow link)
|
|
66
|
+
|
|
67
|
+
Brand-colored, underline on hover (or always for accessibility-strict contexts). Used inline within paragraphs.
|
|
68
|
+
|
|
69
|
+
### `muted`
|
|
70
|
+
|
|
71
|
+
Gray, less prominent. For secondary links (legal, footer, "skip").
|
|
72
|
+
|
|
73
|
+
### `standalone`
|
|
74
|
+
|
|
75
|
+
CTA-style link, often with arrow indicator. Used as a section's primary navigation:
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<Link variant="standalone" href="/learn-more">
|
|
79
|
+
Learn more <ArrowRightIcon />
|
|
80
|
+
</Link>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Larger touch target; bolder weight.
|
|
84
|
+
|
|
85
|
+
### `destructive`
|
|
86
|
+
|
|
87
|
+
Red. For "Delete account", "Cancel subscription" — actions that remove data. Pair with confirmation flow if irreversible.
|
|
88
|
+
|
|
89
|
+
## Underline policies
|
|
90
|
+
|
|
91
|
+
| Setting | When |
|
|
92
|
+
| --- | --- |
|
|
93
|
+
| `hover` (default) | Body text in well-styled pages — link is brand-colored already |
|
|
94
|
+
| `always` | Long-form content, accessibility-strict, when link can't be color-distinguished |
|
|
95
|
+
| `none` | Standalone CTAs that have arrow indicator + clear context |
|
|
96
|
+
|
|
97
|
+
WCAG note: links must be distinguishable from surrounding text by **more than color alone**. If your design relies on color only: enable `underline="always"` to satisfy WCAG.
|
|
98
|
+
|
|
99
|
+
## States
|
|
100
|
+
|
|
101
|
+
| State | Visual |
|
|
102
|
+
| --- | --- |
|
|
103
|
+
| Default | Brand color (or muted), underline policy applies |
|
|
104
|
+
| Hover | Underline visible (if hover policy); subtle color shift |
|
|
105
|
+
| Visited | Optional muted color shift (rare in modern apps) |
|
|
106
|
+
| Active (during click) | Slightly deeper color |
|
|
107
|
+
| Focus-visible | 2px focus ring AROUND link (preserve underline) |
|
|
108
|
+
| Disabled | `aria-disabled="true"`, gray text, no events |
|
|
109
|
+
|
|
110
|
+
## External link
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
<Link external href="https://example.com">Docs ↗</Link>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Adds:
|
|
117
|
+
- `target="_blank"` (new tab)
|
|
118
|
+
- `rel="noopener noreferrer"` (security)
|
|
119
|
+
- Visual indicator (↗ arrow OR external icon)
|
|
120
|
+
- `aria-label` extension: "Docs (opens in new tab)" for screen readers
|
|
121
|
+
|
|
122
|
+
```html
|
|
123
|
+
<a href="https://example.com"
|
|
124
|
+
target="_blank"
|
|
125
|
+
rel="noopener noreferrer"
|
|
126
|
+
aria-label="Docs (opens in new tab)">
|
|
127
|
+
Docs <ExternalIcon aria-hidden="true" />
|
|
128
|
+
</a>
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Tokens consumed
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
--color-link-default (typically brand color)
|
|
135
|
+
--color-link-hover
|
|
136
|
+
--color-link-visited (optional)
|
|
137
|
+
--color-link-active
|
|
138
|
+
--color-link-muted
|
|
139
|
+
--color-link-destructive
|
|
140
|
+
--color-focus-ring
|
|
141
|
+
--text-decoration-thickness (1-2px underline)
|
|
142
|
+
--text-underline-offset (3-4px below text baseline)
|
|
143
|
+
--motion-fast (color transition)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Accessibility
|
|
147
|
+
|
|
148
|
+
- Always use `<a>` (or framework Link). Don't fake a link with `<div onClick>`.
|
|
149
|
+
- For non-text links (icon-only): `aria-label` required.
|
|
150
|
+
- Focus-visible ring must be visible against any background.
|
|
151
|
+
- Don't disable `pointer-events` to make a "disabled" link — use `aria-disabled="true"` and prevent navigation in the click handler.
|
|
152
|
+
- For links that look like buttons (CTA-style): users expect them to navigate; if they trigger a state action, use Button.
|
|
153
|
+
- Korean: identical accessibility rules apply. Hangul links should not be color-only either.
|
|
154
|
+
|
|
155
|
+
## Korean conventions
|
|
156
|
+
|
|
157
|
+
- 한국어 link 스타일은 일반적으로 영문보다 underline 사용이 약간 더 적극적 (Hangul 글자에서 underline 가독성이 좋음).
|
|
158
|
+
- 외부 링크 표시: ↗ 또는 ↪ 화살표 + "(새 창에서 열림)" sr-only 텍스트.
|
|
159
|
+
- "더보기 →" / "자세히 보기 →" / "전체 보기" — common standalone link copy.
|
|
160
|
+
- For B2C: 해요체 ("자세히 보기"); for B2B: 합쇼체 ("더 알아보기").
|
|
161
|
+
|
|
162
|
+
## Code example
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
function ArticleFooter() {
|
|
166
|
+
return (
|
|
167
|
+
<footer className="article-footer">
|
|
168
|
+
<p>
|
|
169
|
+
이 글은 <Link href="/authors/sungjin">박성진</Link>이 작성했어요.
|
|
170
|
+
<Link href="https://blog.example.com" external>블로그</Link>에서
|
|
171
|
+
더 많은 글을 확인할 수 있어요.
|
|
172
|
+
</p>
|
|
173
|
+
<Link variant="standalone" href="/articles">
|
|
174
|
+
모든 글 보기 <ArrowRightIcon />
|
|
175
|
+
</Link>
|
|
176
|
+
</footer>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## With Next.js / React Router
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
import NextLink from "next/link";
|
|
185
|
+
|
|
186
|
+
<Link as={NextLink} href="/docs">documentation</Link>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
The `as` prop swaps the underlying element from `<a>` to a router-aware Link. This preserves design-ai's styling but uses client-side routing.
|
|
190
|
+
|
|
191
|
+
## Edge cases
|
|
192
|
+
|
|
193
|
+
- **Disabled link**: rare; typically means "not yet available". Use `aria-disabled` + click handler that prevents nav. Don't use `pointer-events: none` (still focusable, confusing).
|
|
194
|
+
- **Link wrapping multiple lines**: ensure underline appears on each line, not just the first. Default browser behavior; verify in your CSS reset.
|
|
195
|
+
- **Email link**: `<Link href="mailto:hello@example.com">` works; consider `mailto:` link best practices.
|
|
196
|
+
- **Phone link** (mobile): `<Link href="tel:+8210...">`.
|
|
197
|
+
- **Anchor link** (`#section`): scroll behavior + browser history. Use smooth scroll if appropriate.
|
|
198
|
+
- **Protocol-relative**: avoid `//example.com` — fully qualify.
|
|
199
|
+
- **RTL**: arrow direction flips automatically if using `→` / `←` SVG. For text arrows, use logical names (`block-start`, `inline-start`).
|
|
200
|
+
- **Reduced motion**: skip color transition.
|
|
201
|
+
|
|
202
|
+
## Don't
|
|
203
|
+
|
|
204
|
+
- Don't use Link as a button (state action). Use Button.
|
|
205
|
+
- Don't omit `target="_blank"` external indicator. Users hate context-loss.
|
|
206
|
+
- Don't ship Link with `target="_blank"` without `rel="noopener"`. Security.
|
|
207
|
+
- Don't disable underline AND make link only differentiated by color. WCAG fail.
|
|
208
|
+
- Don't open EVERY link in a new tab. User-hostile.
|
|
209
|
+
- Don't put long descriptive text inside link — extract a short label, use the surrounding paragraph for context.
|
|
210
|
+
|
|
211
|
+
## References
|
|
212
|
+
|
|
213
|
+
- HTML5 `<a>` element
|
|
214
|
+
- MUI: [`Link`](../refs/mui/packages/mui-material/src/Link)
|
|
215
|
+
- Ant Design: link styling within `Typography`
|
|
216
|
+
- WCAG 2.1: SC 1.4.1 (Use of Color), SC 2.4.4 (Link Purpose)
|
|
217
|
+
|
|
218
|
+
## Cross-reference
|
|
219
|
+
|
|
220
|
+
- [`examples/component-button.md`](component-button.md) — when action is not navigation
|
|
221
|
+
- [`examples/component-anchor.md`](component-anchor.md) — table-of-contents nav (different use)
|
|
222
|
+
- [`examples/component-typography.md`](component-typography.md) — text primitives
|
|
223
|
+
- [`knowledge/a11y/contrast.md`](../knowledge/a11y/contrast.md)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# `ListItemAvatar` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `ListItemAvatar`. The leading-avatar slot — like `ListItemIcon` but sized for `Avatar` (40px default vs 24px). Used in user/contact lists, message lists, and any row identified by a person/entity image.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- User lists (team members, followers).
|
|
8
|
+
- Message threads (sender avatar).
|
|
9
|
+
- Brand/entity rows with logos.
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<ListItem secondaryAction={<IconButton><CloseIcon /></IconButton>}>
|
|
15
|
+
<ListItemAvatar>
|
|
16
|
+
<Avatar src={user.avatarUrl} alt={user.name} />
|
|
17
|
+
</ListItemAvatar>
|
|
18
|
+
<ListItemText primary={user.name} secondary={user.role} />
|
|
19
|
+
</ListItem>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| Prop | Type | Default | Description |
|
|
23
|
+
| --- | --- | --- | --- |
|
|
24
|
+
| `children` | `ReactNode` | — | An `Avatar` component |
|
|
25
|
+
|
|
26
|
+
## Tokens consumed
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
--avatar-size-md /* 40px default */
|
|
30
|
+
--list-avatar-min-width /* 56px reserved column */
|
|
31
|
+
--space-md /* gap to text */
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Accessibility
|
|
35
|
+
|
|
36
|
+
- `Avatar` should have meaningful `alt` (the person's name) — don't set `alt=""`.
|
|
37
|
+
- For image-failed states, MUI's Avatar falls back to initials or generic icon; ensure both are readable.
|
|
38
|
+
|
|
39
|
+
## Edge cases
|
|
40
|
+
|
|
41
|
+
- **Status badge** — wrap Avatar in `Badge` for online/unread indicators.
|
|
42
|
+
- **Initials fallback** — Korean names use 2-3 character initials (성+이름 first char). Latin: 1-2.
|
|
43
|
+
- **Compact lists** — set `Avatar size={32}` and override `ListItemAvatar` `minWidth`.
|
|
44
|
+
|
|
45
|
+
## Code example
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<Badge
|
|
49
|
+
overlap="circular"
|
|
50
|
+
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
|
|
51
|
+
badgeContent={user.online ? <OnlineDot /> : null}
|
|
52
|
+
>
|
|
53
|
+
<ListItemAvatar>
|
|
54
|
+
<Avatar src={user.avatarUrl}>{user.name[0]}</Avatar>
|
|
55
|
+
</ListItemAvatar>
|
|
56
|
+
</Badge>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Don't
|
|
60
|
+
|
|
61
|
+
- Don't use for plain icons — use `ListItemIcon` (smaller column).
|
|
62
|
+
- Don't omit `alt` on the inner Avatar — failed loads become anonymous gray circles.
|
|
63
|
+
|
|
64
|
+
## References
|
|
65
|
+
|
|
66
|
+
- MUI: [`ListItemAvatar`](../refs/mui/packages/mui-material/src/ListItemAvatar/)
|
|
67
|
+
|
|
68
|
+
## Cross-reference
|
|
69
|
+
|
|
70
|
+
- [`component-list-item.md`](component-list-item.md)
|
|
71
|
+
- [`component-avatar.md`](component-avatar.md)
|
|
72
|
+
- [`component-list-item-icon.md`](component-list-item-icon.md)
|