@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,226 @@
|
|
|
1
|
+
# `BottomNavigation` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `BottomNavigation` and the iOS / Android tab bar pattern. Persistent tab bar at the bottom of mobile / responsive apps. The canonical mobile primary navigation.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- **Mobile primary navigation** with 3-5 top-level destinations.
|
|
8
|
+
- **Touch-thumb-friendly** placement (bottom = thumb-zone).
|
|
9
|
+
- **Tab-style switching** between same-level views (Home / Search / Profile).
|
|
10
|
+
|
|
11
|
+
When NOT to use:
|
|
12
|
+
- Desktop primary navigation (use Sidebar or NavigationMenu).
|
|
13
|
+
- Hierarchical navigation (BottomNav is flat — for hierarchy use Sidebar).
|
|
14
|
+
- More than 5 destinations (overcrowds; group via "More" tab).
|
|
15
|
+
|
|
16
|
+
## Anatomy
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
┌─────────────────────────────────────┐
|
|
20
|
+
│ │
|
|
21
|
+
│ [content area] │
|
|
22
|
+
│ │
|
|
23
|
+
│ │
|
|
24
|
+
│ │
|
|
25
|
+
│ │
|
|
26
|
+
├─────────────────────────────────────┤
|
|
27
|
+
│ [🏠] [🔍] [➕] [🔔3] [👤] │ ← BottomNavigation
|
|
28
|
+
│ Home Search Add Inbox Profile │ (5 tabs max)
|
|
29
|
+
└─────────────────────────────────────┘
|
|
30
|
+
↑
|
|
31
|
+
active tab indicated
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## API
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<BottomNavigation value={tab} onValueChange={setTab}>
|
|
38
|
+
<BottomNavigation.Item value="home">
|
|
39
|
+
<HomeIcon />
|
|
40
|
+
<span>Home</span>
|
|
41
|
+
</BottomNavigation.Item>
|
|
42
|
+
<BottomNavigation.Item value="search">
|
|
43
|
+
<SearchIcon />
|
|
44
|
+
<span>Search</span>
|
|
45
|
+
</BottomNavigation.Item>
|
|
46
|
+
<BottomNavigation.Item value="add" elevated>
|
|
47
|
+
<PlusIcon />
|
|
48
|
+
</BottomNavigation.Item>
|
|
49
|
+
<BottomNavigation.Item value="inbox" badgeCount={3}>
|
|
50
|
+
<InboxIcon />
|
|
51
|
+
<span>Inbox</span>
|
|
52
|
+
</BottomNavigation.Item>
|
|
53
|
+
<BottomNavigation.Item value="profile">
|
|
54
|
+
<UserIcon />
|
|
55
|
+
<span>Profile</span>
|
|
56
|
+
</BottomNavigation.Item>
|
|
57
|
+
</BottomNavigation>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
| Prop | Type | Default | Description |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| `value` | `string` | controlled | Active tab value |
|
|
63
|
+
| `onValueChange` | `(value: string) => void` | — | Tab switch callback |
|
|
64
|
+
| `showLabels` | `"always" \| "selected" \| "never"` | `"always"` | When labels are visible |
|
|
65
|
+
| `safeArea` | `boolean` | `true` | Add iOS home-indicator padding |
|
|
66
|
+
| `elevation` | `0 \| 1 \| 2` | `1` | Shadow above the bar |
|
|
67
|
+
|
|
68
|
+
## Item
|
|
69
|
+
|
|
70
|
+
| Prop | Type | Default | Description |
|
|
71
|
+
| --- | --- | --- | --- |
|
|
72
|
+
| `value` | `string` | required | Identifies the tab |
|
|
73
|
+
| `icon` | `ReactNode` | from children | Icon |
|
|
74
|
+
| `label` | `string` | from children | Label text |
|
|
75
|
+
| `badgeCount` | `number` | — | Notification count overlay |
|
|
76
|
+
| `badge` | `ReactNode` | — | Custom badge override |
|
|
77
|
+
| `disabled` | `boolean` | `false` | Disabled |
|
|
78
|
+
| `elevated` | `boolean` | `false` | Center "elevated" style (FAB-like, common for primary CTA) |
|
|
79
|
+
|
|
80
|
+
## Variants
|
|
81
|
+
|
|
82
|
+
### `showLabels="always"` (default)
|
|
83
|
+
|
|
84
|
+
All labels visible always.
|
|
85
|
+
|
|
86
|
+
### `showLabels="selected"`
|
|
87
|
+
|
|
88
|
+
Only the active tab shows its label; others icon-only. iOS-classic style. Common in Apple's apps.
|
|
89
|
+
|
|
90
|
+
### `showLabels="never"`
|
|
91
|
+
|
|
92
|
+
Icon-only across the bar. Used in dense interfaces or when labels are obvious.
|
|
93
|
+
|
|
94
|
+
## States
|
|
95
|
+
|
|
96
|
+
| State | Visual |
|
|
97
|
+
| --- | --- |
|
|
98
|
+
| Default | Icon + label, muted color |
|
|
99
|
+
| Active (selected) | Icon + label, brand color, slightly larger or bold |
|
|
100
|
+
| Hover (web) | Subtle bg shift |
|
|
101
|
+
| Active press (touch) | Slight scale + bg shift |
|
|
102
|
+
| Disabled | Reduced opacity, no events |
|
|
103
|
+
| Badge | Dot or count overlay on icon |
|
|
104
|
+
|
|
105
|
+
## Tokens consumed
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
--bottom-nav-bg (bar bg, often slightly elevated from page)
|
|
109
|
+
--bottom-nav-fg-default (inactive icon + label)
|
|
110
|
+
--bottom-nav-fg-active (active = brand color)
|
|
111
|
+
--bottom-nav-divider (top border separating from content)
|
|
112
|
+
--bottom-nav-shadow (subtle upward shadow)
|
|
113
|
+
--bottom-nav-height (typically 56-64px + safe area)
|
|
114
|
+
--bottom-nav-icon-size (24-28px)
|
|
115
|
+
--bottom-nav-label-size (10-12px)
|
|
116
|
+
--space-xs, --space-sm
|
|
117
|
+
--motion-fast (active state transition)
|
|
118
|
+
--ease-out
|
|
119
|
+
--z-fixed (above content, below modals)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Accessibility
|
|
123
|
+
|
|
124
|
+
- Wrapper: `<nav aria-label="Primary navigation">` (or contextual label).
|
|
125
|
+
- Items: `<button>` if state-only, `<a>` if URL-routed.
|
|
126
|
+
- Active: `aria-current="page"`.
|
|
127
|
+
- Icon-only items: `aria-label` required.
|
|
128
|
+
- Touch target: ≥ 44×44pt per item (mobile primary).
|
|
129
|
+
- Focus visible on keyboard nav.
|
|
130
|
+
- Respect safe-area: `padding-bottom: env(safe-area-inset-bottom)` for iPhone home indicator.
|
|
131
|
+
|
|
132
|
+
## iOS / Android conventions
|
|
133
|
+
|
|
134
|
+
| Aspect | iOS | Android |
|
|
135
|
+
| --- | --- | --- |
|
|
136
|
+
| Position | Bottom | Bottom |
|
|
137
|
+
| Height | 49pt + safe area | 56dp |
|
|
138
|
+
| Icon style | Outline (inactive) / filled (active) | Filled or outlined (Material 3) |
|
|
139
|
+
| Label | Below icon | Below icon (M2) or hidden if active-only (M3) |
|
|
140
|
+
| Active indicator | Color shift | Color shift + pill behind icon (M3) |
|
|
141
|
+
| Center FAB | Common for primary action | "Floating" elevated button common |
|
|
142
|
+
|
|
143
|
+
For native-feel design: respect platform expectations (iOS = sharper; Android M3 = soft pill behind active icon).
|
|
144
|
+
|
|
145
|
+
## Korean app conventions
|
|
146
|
+
|
|
147
|
+
Korean B2C apps (Toss, KakaoBank, Coupang, Baemin):
|
|
148
|
+
- 4-5 tabs typical.
|
|
149
|
+
- 한글 labels short (2-4 chars: 홈 / 검색 / 알림 / 마이페이지).
|
|
150
|
+
- Center "Add" or primary action elevated (FAB-style) common in some apps.
|
|
151
|
+
- Badge count for messages / orders prominent.
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
[🏠 홈] [🔍 검색] [➕] [🔔 알림] [👤 MY]
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
For 토스-style fintech: simple, brand-color active, no decorative effects.
|
|
158
|
+
For 카카오-style consumer: warmer, mascot-friendly, often with subtle animations on tap.
|
|
159
|
+
|
|
160
|
+
## Code example
|
|
161
|
+
|
|
162
|
+
```tsx
|
|
163
|
+
function MobileAppShell() {
|
|
164
|
+
const [tab, setTab] = useState("home");
|
|
165
|
+
const [unreadCount, setUnreadCount] = useState(0);
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<div className="app">
|
|
169
|
+
<main>{renderTab(tab)}</main>
|
|
170
|
+
<BottomNavigation value={tab} onValueChange={setTab}>
|
|
171
|
+
<BottomNavigation.Item value="home">
|
|
172
|
+
<HomeIcon />
|
|
173
|
+
<span>홈</span>
|
|
174
|
+
</BottomNavigation.Item>
|
|
175
|
+
<BottomNavigation.Item value="search">
|
|
176
|
+
<SearchIcon />
|
|
177
|
+
<span>검색</span>
|
|
178
|
+
</BottomNavigation.Item>
|
|
179
|
+
<BottomNavigation.Item value="inbox" badgeCount={unreadCount}>
|
|
180
|
+
<InboxIcon />
|
|
181
|
+
<span>알림</span>
|
|
182
|
+
</BottomNavigation.Item>
|
|
183
|
+
<BottomNavigation.Item value="profile">
|
|
184
|
+
<UserIcon />
|
|
185
|
+
<span>MY</span>
|
|
186
|
+
</BottomNavigation.Item>
|
|
187
|
+
</BottomNavigation>
|
|
188
|
+
</div>
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Edge cases
|
|
194
|
+
|
|
195
|
+
- **Page-aware bottom nav**: hide on certain screens (camera, full-screen video). Use `display: none` OR an in-shell variant.
|
|
196
|
+
- **Keyboard open** (mobile virtual keyboard): bottom nav should hide so keyboard doesn't obscure it AND doesn't push the input field below the keyboard.
|
|
197
|
+
- **Long Korean label** (보관함, 즐겨찾기): truncate with ellipsis OR drop label at small viewport.
|
|
198
|
+
- **5+ tabs needed**: don't expand bar; group into "More" with a Sheet menu.
|
|
199
|
+
- **Tab switches modify URL**: yes, always use real URLs so back-button works.
|
|
200
|
+
- **Initial route mismatch**: parse current URL → set initial `value`.
|
|
201
|
+
- **Reduced motion**: skip active-state animation.
|
|
202
|
+
- **Landscape orientation on phone**: hide bottom nav (rare orientation; prioritize content).
|
|
203
|
+
|
|
204
|
+
## Don't
|
|
205
|
+
|
|
206
|
+
- Don't use BottomNav for hierarchy navigation. Tabs at the same conceptual level.
|
|
207
|
+
- Don't put 6+ tabs. 3-5 max; group rest into More.
|
|
208
|
+
- Don't omit `aria-label` on icon-only items.
|
|
209
|
+
- Don't make BottomNav float (transparent bg over content) — bad for legibility.
|
|
210
|
+
- Don't ignore safe-area on iOS — content cuts off behind home indicator.
|
|
211
|
+
- Don't auto-hide on scroll without user research; users hunt for the bar.
|
|
212
|
+
- Don't omit active state visual — users need orientation.
|
|
213
|
+
|
|
214
|
+
## References
|
|
215
|
+
|
|
216
|
+
- MUI: [`BottomNavigation`](../refs/mui/packages/mui-material/src/BottomNavigation)
|
|
217
|
+
- iOS: UITabBar; Apple HIG → "Tab Bars"
|
|
218
|
+
- Material 3: NavigationBar component
|
|
219
|
+
- Patterns: Toss, KakaoBank, Instagram, Twitter
|
|
220
|
+
|
|
221
|
+
## Cross-reference
|
|
222
|
+
|
|
223
|
+
- [`examples/component-tabs.md`](component-tabs.md) — non-mobile-first tab variant
|
|
224
|
+
- [`examples/component-app-bar.md`](component-app-bar.md) — top-of-screen counterpart
|
|
225
|
+
- [`examples/component-sidebar.md`](component-sidebar.md) — desktop nav
|
|
226
|
+
- [`knowledge/patterns/mobile-navigation.md`](../knowledge/patterns/mobile-navigation.md)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# `Box` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `Box`. The most generic layout primitive — a styled `<div>` with theme-prop access. Lower-level than `Card`, `Paper`, or `Stack`.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- As a generic styled container with token access.
|
|
8
|
+
- For one-off custom layouts that don't fit other primitives.
|
|
9
|
+
- As a system-prop sandbox (padding, margin, color, display) when you don't want to author CSS.
|
|
10
|
+
|
|
11
|
+
When NOT to use:
|
|
12
|
+
- For semantic containers (use `<section>`, `<article>`, `<aside>`).
|
|
13
|
+
- For interactive surfaces (use `Button`, `Card`).
|
|
14
|
+
- When a more specific primitive exists (`Stack`, `Grid`, `Paper`).
|
|
15
|
+
|
|
16
|
+
## API
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
<Box p={4} bg="surface" rounded="md">
|
|
20
|
+
Content
|
|
21
|
+
</Box>
|
|
22
|
+
|
|
23
|
+
<Box as="section" display="flex" gap={2}>
|
|
24
|
+
<Box>A</Box>
|
|
25
|
+
<Box>B</Box>
|
|
26
|
+
</Box>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
| Prop | Type | Default | Description |
|
|
30
|
+
| --- | --- | --- | --- |
|
|
31
|
+
| `as` | `keyof JSX.IntrinsicElements` | `"div"` | Render element |
|
|
32
|
+
| `p` / `px` / `py` / `pt` / `pr` / `pb` / `pl` | spacing-token | — | Padding shorthand |
|
|
33
|
+
| `m` / `mx` / `my` / `mt` / `mr` / `mb` / `ml` | spacing-token | — | Margin shorthand |
|
|
34
|
+
| `bg` | color-token | — | Background color |
|
|
35
|
+
| `color` | color-token | — | Text color |
|
|
36
|
+
| `display` | CSS display | — | Display mode |
|
|
37
|
+
| `gap` | spacing-token | — | Gap (when display=flex/grid) |
|
|
38
|
+
| `rounded` | radius-token | — | Border radius |
|
|
39
|
+
| `border` | `boolean \| number` | — | Border |
|
|
40
|
+
| `shadow` | shadow-token | — | Box shadow |
|
|
41
|
+
| `width` / `height` / `minWidth` / `maxWidth` | CSS length | — | Sizing |
|
|
42
|
+
|
|
43
|
+
## States
|
|
44
|
+
|
|
45
|
+
Stateless. Box is a layout primitive.
|
|
46
|
+
|
|
47
|
+
## Tokens consumed
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
--space-{0..n} (p, m, gap)
|
|
51
|
+
--color-{semantic} (bg, color)
|
|
52
|
+
--radius-{sm,md,lg} (rounded)
|
|
53
|
+
--shadow-{sm,md,lg} (shadow)
|
|
54
|
+
--border-default (border)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Variants vs other primitives
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Box → most generic; just a styled <div>
|
|
61
|
+
Stack → flex wrapper with auto direction + gap
|
|
62
|
+
Grid → grid wrapper
|
|
63
|
+
Flex → flex wrapper
|
|
64
|
+
Paper → elevated surface
|
|
65
|
+
Card → composition slots (Header / Body / Footer)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Use Box when none of the above fit. If you find yourself using Box with `display="flex" direction="column" gap={2}`, you actually want `Stack`.
|
|
69
|
+
|
|
70
|
+
## Accessibility
|
|
71
|
+
|
|
72
|
+
- Box is presentational by default. Use `as` to render semantic elements when appropriate.
|
|
73
|
+
- For accessible regions: `as="section" aria-label="..."`.
|
|
74
|
+
- For decorative dividers: prefer `Separator` over Box with `borderTop`.
|
|
75
|
+
|
|
76
|
+
## Code example
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
{/* Decorative brand-color callout */}
|
|
80
|
+
<Box bg="brand-50" p={4} rounded="md" border>
|
|
81
|
+
<Text fontWeight={600}>이벤트 진행 중</Text>
|
|
82
|
+
<Text>가입 시 30% 할인.</Text>
|
|
83
|
+
</Box>
|
|
84
|
+
|
|
85
|
+
{/* Custom flex layout */}
|
|
86
|
+
<Box display="flex" gap={2} alignItems="center">
|
|
87
|
+
<Avatar />
|
|
88
|
+
<Box flex={1}>
|
|
89
|
+
<Text>이름</Text>
|
|
90
|
+
<Text fontSize="sm" color="muted">설명</Text>
|
|
91
|
+
</Box>
|
|
92
|
+
</Box>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Don't
|
|
96
|
+
|
|
97
|
+
- Don't use Box where a semantic element is appropriate. Use `as` or pick a different primitive.
|
|
98
|
+
- Don't use Box for interactive surfaces. Use Button / Link.
|
|
99
|
+
- Don't recreate layouts that other primitives handle. `<Box display="flex" direction="column">` = `<Stack>`.
|
|
100
|
+
- Don't use raw hex / px values via the system props. Use tokens.
|
|
101
|
+
|
|
102
|
+
## References
|
|
103
|
+
|
|
104
|
+
- MUI: [`Box`](../refs/mui/packages/mui-material/src/Box) — system-prop pioneer
|
|
105
|
+
- Chakra UI Box (very similar API)
|
|
106
|
+
- shadcn-ui: doesn't ship Box; uses Tailwind classes directly
|
|
107
|
+
|
|
108
|
+
## Cross-reference
|
|
109
|
+
|
|
110
|
+
- [`examples/component-card.md`](component-card.md) — when Box gets too generic
|
|
111
|
+
- [`examples/component-paper.md`](component-paper.md) — elevated surface variant
|
|
112
|
+
- [`knowledge/layout/spacing-and-grid.md`](../knowledge/layout/spacing-and-grid.md)
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# `Breadcrumb` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Breadcrumb`, MUI `Breadcrumbs`, shadcn-ui `breadcrumb`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Shows the user's location in a hierarchy. Each segment is a navigable ancestor, except the last (current page).
|
|
8
|
+
|
|
9
|
+
## When NOT to use
|
|
10
|
+
|
|
11
|
+
- Single-level apps (no hierarchy to show).
|
|
12
|
+
- Mobile-first apps where the back button is the primary nav metaphor (Korean consumer apps especially — breadcrumb is rare on KR mobile).
|
|
13
|
+
- Linear flows (use a stepper / progress, not breadcrumbs).
|
|
14
|
+
|
|
15
|
+
Breadcrumbs are a **desktop / web-app** pattern. Use sparingly on mobile.
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Home / Projects / Aurora / Settings
|
|
21
|
+
↑ ↑ ↑ ↑
|
|
22
|
+
link link link current (not a link, bold)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or with more visual breathing room:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
🏠 Home › 📁 Projects › Aurora › Settings
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Slot | Required | Notes |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| Crumb (link) | yes (≥ 1) | Each ancestor — clickable |
|
|
34
|
+
| Separator | yes | `/`, `›`, `→`, or chevron icon |
|
|
35
|
+
| Current crumb | yes | Last item — not a link, marked with `aria-current="page"` |
|
|
36
|
+
| Icon (per crumb) | optional | Home icon, folder icon for context |
|
|
37
|
+
| Truncation indicator | optional | `…` when path is long |
|
|
38
|
+
|
|
39
|
+
## API
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
<Breadcrumb>
|
|
43
|
+
<Breadcrumb.Item href="/">Home</Breadcrumb.Item>
|
|
44
|
+
<Breadcrumb.Item href="/projects">Projects</Breadcrumb.Item>
|
|
45
|
+
<Breadcrumb.Item href="/projects/aurora">Aurora</Breadcrumb.Item>
|
|
46
|
+
<Breadcrumb.Item current>Settings</Breadcrumb.Item>
|
|
47
|
+
</Breadcrumb>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Or imperative:
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<Breadcrumb
|
|
54
|
+
items={[
|
|
55
|
+
{ label: "Home", href: "/" },
|
|
56
|
+
{ label: "Projects", href: "/projects" },
|
|
57
|
+
{ label: "Aurora", href: "/projects/aurora" },
|
|
58
|
+
{ label: "Settings", current: true },
|
|
59
|
+
]}
|
|
60
|
+
separator="/"
|
|
61
|
+
maxItems={6}
|
|
62
|
+
/>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| Prop | Type | Default | Description |
|
|
66
|
+
| --- | --- | --- | --- |
|
|
67
|
+
| `items` | `BreadcrumbItem[]` | — | (Imperative API) |
|
|
68
|
+
| `separator` | `string \| ReactNode` | `"/"` | Between items |
|
|
69
|
+
| `maxItems` | `number` | `8` | When exceeded, collapse middle items into `…` |
|
|
70
|
+
| `itemsBeforeCollapse` | `number` | `1` | How many items to show at the start when collapsed |
|
|
71
|
+
| `itemsAfterCollapse` | `number` | `1` | How many at the end |
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
type BreadcrumbItem = {
|
|
75
|
+
label: string | ReactNode;
|
|
76
|
+
href?: string;
|
|
77
|
+
icon?: ReactNode;
|
|
78
|
+
onClick?: () => void;
|
|
79
|
+
current?: boolean;
|
|
80
|
+
};
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Truncation behavior
|
|
84
|
+
|
|
85
|
+
When `items.length > maxItems`:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
Home / ... / Aurora / Settings
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Click on `…` to expand (popover with the hidden items) or just hover to peek.
|
|
92
|
+
|
|
93
|
+
For very long path with smaller `maxItems`:
|
|
94
|
+
- Show first 1, ellipsis, last 2 by default.
|
|
95
|
+
- `itemsBeforeCollapse=1, itemsAfterCollapse=2` for typical web app.
|
|
96
|
+
|
|
97
|
+
## Sizes
|
|
98
|
+
|
|
99
|
+
| Size | Font | Spacing between |
|
|
100
|
+
| --- | --- | --- |
|
|
101
|
+
| `sm` | 12px | 4px |
|
|
102
|
+
| `md` (default) | 13–14px | 8px |
|
|
103
|
+
| `lg` | 16px | 12px |
|
|
104
|
+
|
|
105
|
+
Default to `md` for desktop, `sm` for dense admin tools.
|
|
106
|
+
|
|
107
|
+
## States
|
|
108
|
+
|
|
109
|
+
| State | Visual |
|
|
110
|
+
| --- | --- |
|
|
111
|
+
| Default link | `--color-text-secondary`, no underline |
|
|
112
|
+
| Hover | `--color-text-primary`, underline |
|
|
113
|
+
| Focus-visible | 2px ring around the link |
|
|
114
|
+
| Current (last item) | `--color-text-primary`, **bold** weight |
|
|
115
|
+
| Disabled | Grayed out, no events (rare) |
|
|
116
|
+
|
|
117
|
+
The current item is **never** a link. It's where the user is.
|
|
118
|
+
|
|
119
|
+
## Tokens consumed
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
--color-text-primary
|
|
123
|
+
--color-text-secondary
|
|
124
|
+
--color-text-tertiary (separator)
|
|
125
|
+
--space-xs, --space-sm
|
|
126
|
+
--font-size-sm, --font-size-base
|
|
127
|
+
--font-weight-medium (current item bold)
|
|
128
|
+
--color-focus-ring
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Accessibility
|
|
132
|
+
|
|
133
|
+
- Wrap in `<nav aria-label="Breadcrumb">`.
|
|
134
|
+
- Render as `<ol>` (ordered list — semantically correct because the order matters).
|
|
135
|
+
- Each item is `<li>`.
|
|
136
|
+
- Each link is `<a>` (or router-Link). The current item is just text — **not a disabled link**.
|
|
137
|
+
- Current item: `aria-current="page"`.
|
|
138
|
+
- Don't put separators in the same `<a>` as the link text — separators should be `aria-hidden="true"` on the parent `<li>` or on a separate visual element.
|
|
139
|
+
|
|
140
|
+
```html
|
|
141
|
+
<nav aria-label="Breadcrumb">
|
|
142
|
+
<ol>
|
|
143
|
+
<li><a href="/">Home</a></li>
|
|
144
|
+
<li aria-hidden="true">/</li>
|
|
145
|
+
<li><a href="/projects">Projects</a></li>
|
|
146
|
+
<li aria-hidden="true">/</li>
|
|
147
|
+
<li aria-current="page">Settings</li>
|
|
148
|
+
</ol>
|
|
149
|
+
</nav>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Keyboard
|
|
153
|
+
|
|
154
|
+
- `Tab` reaches each link in order.
|
|
155
|
+
- `Enter` activates link.
|
|
156
|
+
- Separators are not focusable.
|
|
157
|
+
|
|
158
|
+
## Code example
|
|
159
|
+
|
|
160
|
+
```tsx
|
|
161
|
+
// Basic
|
|
162
|
+
<Breadcrumb>
|
|
163
|
+
<Breadcrumb.Item href="/">Home</Breadcrumb.Item>
|
|
164
|
+
<Breadcrumb.Item href="/products">Products</Breadcrumb.Item>
|
|
165
|
+
<Breadcrumb.Item current>Wireless Mouse</Breadcrumb.Item>
|
|
166
|
+
</Breadcrumb>
|
|
167
|
+
|
|
168
|
+
// With router (Next.js / React Router)
|
|
169
|
+
<Breadcrumb>
|
|
170
|
+
<Breadcrumb.Item asChild><Link href="/">Home</Link></Breadcrumb.Item>
|
|
171
|
+
<Breadcrumb.Item asChild><Link href="/products">Products</Link></Breadcrumb.Item>
|
|
172
|
+
<Breadcrumb.Item current>Wireless Mouse</Breadcrumb.Item>
|
|
173
|
+
</Breadcrumb>
|
|
174
|
+
|
|
175
|
+
// With icons
|
|
176
|
+
<Breadcrumb>
|
|
177
|
+
<Breadcrumb.Item href="/" icon={<HomeIcon />}>Home</Breadcrumb.Item>
|
|
178
|
+
<Breadcrumb.Item href="/projects" icon={<FolderIcon />}>Projects</Breadcrumb.Item>
|
|
179
|
+
<Breadcrumb.Item current>Aurora</Breadcrumb.Item>
|
|
180
|
+
</Breadcrumb>
|
|
181
|
+
|
|
182
|
+
// Truncation
|
|
183
|
+
<Breadcrumb maxItems={4} itemsBeforeCollapse={1} itemsAfterCollapse={2}>
|
|
184
|
+
<Breadcrumb.Item href="/">Home</Breadcrumb.Item>
|
|
185
|
+
<Breadcrumb.Item href="/level1">Level 1</Breadcrumb.Item>
|
|
186
|
+
<Breadcrumb.Item href="/level1/level2">Level 2</Breadcrumb.Item>
|
|
187
|
+
<Breadcrumb.Item href="/level1/level2/level3">Level 3</Breadcrumb.Item>
|
|
188
|
+
<Breadcrumb.Item href="/level1/level2/level3/level4">Level 4</Breadcrumb.Item>
|
|
189
|
+
<Breadcrumb.Item current>Current</Breadcrumb.Item>
|
|
190
|
+
</Breadcrumb>
|
|
191
|
+
{/* Renders: Home / ... / Level 4 / Current */}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Edge cases
|
|
195
|
+
|
|
196
|
+
- **Long path that wraps to two lines**: don't wrap by default; truncate via `maxItems`. If wrapping is needed, it's a sign the hierarchy is too deep.
|
|
197
|
+
- **Crumb labels longer than 30 chars**: truncate individual labels with `…`, full text in `title`.
|
|
198
|
+
- **Dynamically loaded labels** (URL has IDs, real names load async): show ID or "Loading..." in the meantime; replace with real name. Don't shift width drastically.
|
|
199
|
+
- **Mobile**: can collapse to "← Back" link on narrow screens, or hide entirely.
|
|
200
|
+
- **RTL**: separator direction flips (`›` becomes `‹`). Use a directional character or two icons.
|
|
201
|
+
- **Korean labels**: Korean breadcrumbs work cleanly. Common: "홈 / 프로젝트 / Aurora / 설정".
|
|
202
|
+
- **No URL** (current page is not addressable): only the last item shows; previous crumbs may or may not be present.
|
|
203
|
+
|
|
204
|
+
## Don't
|
|
205
|
+
|
|
206
|
+
- Don't make the current page a link to itself. It's a no-op + bad a11y.
|
|
207
|
+
- Don't use breadcrumbs as the only navigation. They supplement, not replace, sidebars/menus.
|
|
208
|
+
- Don't show breadcrumbs on top-level pages (no hierarchy).
|
|
209
|
+
- Don't include "more menus" in breadcrumb dropdowns. Keep them flat — collapsed-items popover is the only complex pattern.
|
|
210
|
+
- Don't put filters or actions in breadcrumbs.
|
|
211
|
+
- Don't use breadcrumbs for chronological steps (signup step 2 of 4) — that's a stepper.
|
|
212
|
+
|
|
213
|
+
## References
|
|
214
|
+
|
|
215
|
+
- Ant Design: [`refs/ant-design/components/breadcrumb/`](../refs/ant-design/components/breadcrumb/) — `Breadcrumb` + `Breadcrumb.Item` + `Breadcrumb.Separator`. `itemRender` for custom rendering.
|
|
216
|
+
- MUI: [`refs/mui/packages/mui-material/src/Breadcrumbs/`](../refs/mui/packages/mui-material/src/Breadcrumbs/) — `Breadcrumbs` (note plural) with `separator`, `maxItems`, `itemsBeforeCollapse`, `itemsAfterCollapse`. Built-in collapse logic.
|
|
217
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/breadcrumb.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/breadcrumb.tsx) — primitive: `Breadcrumb`, `BreadcrumbList`, `BreadcrumbItem`, `BreadcrumbLink`, `BreadcrumbPage`, `BreadcrumbSeparator`, `BreadcrumbEllipsis`. Most flexible.
|
|
218
|
+
|
|
219
|
+
## Cross-reference
|
|
220
|
+
|
|
221
|
+
- [knowledge/patterns/mobile-navigation.md](../knowledge/patterns/mobile-navigation.md) — mobile prefers back button over breadcrumb
|
|
222
|
+
- [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md)
|