@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,277 @@
|
|
|
1
|
+
# `Sheet` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `sheet` (Radix Dialog with side anchoring) and Material 3 bottom sheet. A modal panel that slides in from a screen edge — distinct from `Drawer` (typically navigation) and `Modal` (centered).
|
|
4
|
+
|
|
5
|
+
## When to use Sheet vs Drawer vs Modal
|
|
6
|
+
|
|
7
|
+
| Component | Anchor | Primary use |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| **Modal** | Center | Confirmation, focused task |
|
|
10
|
+
| **Drawer** | Left/Right | Persistent or modal navigation menu |
|
|
11
|
+
| **Sheet** | Any side | Modal supplemental flow / detail view, mobile-first |
|
|
12
|
+
|
|
13
|
+
Sheet's distinguishing properties:
|
|
14
|
+
- **Side-anchored** like a drawer, but **always modal**.
|
|
15
|
+
- **Mobile-first** patterns (bottom sheet on phone; drawer on desktop).
|
|
16
|
+
- **Detents / snap points** common (peek vs full).
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌────────────────────────────────────┐
|
|
22
|
+
│ │
|
|
23
|
+
│ [backdrop scrim] │
|
|
24
|
+
│ │
|
|
25
|
+
│ │
|
|
26
|
+
├────────────────────────────────────┤
|
|
27
|
+
│ ━━━ (drag handle, optional) │
|
|
28
|
+
│ Sheet header [×]│
|
|
29
|
+
│ ─────────────── │
|
|
30
|
+
│ │
|
|
31
|
+
│ Sheet content │
|
|
32
|
+
│ │
|
|
33
|
+
│ ... │
|
|
34
|
+
│ │
|
|
35
|
+
└────────────────────────────────────┘
|
|
36
|
+
(Bottom-anchored sheet)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## API
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
<Sheet open={open} onOpenChange={setOpen}>
|
|
43
|
+
<Sheet.Trigger asChild>
|
|
44
|
+
<Button>Open settings</Button>
|
|
45
|
+
</Sheet.Trigger>
|
|
46
|
+
<Sheet.Content side="right">
|
|
47
|
+
<Sheet.Header>
|
|
48
|
+
<Sheet.Title>Settings</Sheet.Title>
|
|
49
|
+
<Sheet.Description>Configure your preferences.</Sheet.Description>
|
|
50
|
+
</Sheet.Header>
|
|
51
|
+
|
|
52
|
+
{/* form content */}
|
|
53
|
+
|
|
54
|
+
<Sheet.Footer>
|
|
55
|
+
<Sheet.Close asChild>
|
|
56
|
+
<Button variant="ghost">Cancel</Button>
|
|
57
|
+
</Sheet.Close>
|
|
58
|
+
<Button onClick={save}>Save</Button>
|
|
59
|
+
</Sheet.Footer>
|
|
60
|
+
</Sheet.Content>
|
|
61
|
+
</Sheet>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
| Prop | Type | Default | Description |
|
|
65
|
+
| --- | --- | --- | --- |
|
|
66
|
+
| `open` | `boolean` | controlled | Visibility |
|
|
67
|
+
| `onOpenChange` | `(open: boolean) => void` | — | Close handler |
|
|
68
|
+
| `modal` | `boolean` | `true` | Trap focus + lock scroll |
|
|
69
|
+
| `side` | `"top" \| "right" \| "bottom" \| "left"` | `"right"` | Anchor edge |
|
|
70
|
+
| `size` | `"sm" \| "md" \| "lg" \| "xl" \| "full"` | `"md"` | Width (top/bottom) or height (left/right) |
|
|
71
|
+
| `dismissible` | `boolean` | `true` | Click outside or Esc closes |
|
|
72
|
+
| `detents` | `number[]` | — | Optional snap points (mobile bottom sheet); e.g., `[0.4, 0.9]` |
|
|
73
|
+
|
|
74
|
+
## Composition
|
|
75
|
+
|
|
76
|
+
| Part | Purpose |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| `Trigger` | Element that opens the sheet |
|
|
79
|
+
| `Content` | The sheet panel |
|
|
80
|
+
| `Header` | Title + description region |
|
|
81
|
+
| `Title` | Heading (announced to screen readers) |
|
|
82
|
+
| `Description` | Helper text |
|
|
83
|
+
| `Footer` | Actions row |
|
|
84
|
+
| `Close` | Button that closes the sheet |
|
|
85
|
+
| `Overlay` | Backdrop scrim |
|
|
86
|
+
|
|
87
|
+
## Side variants
|
|
88
|
+
|
|
89
|
+
### Right (default — desktop settings, detail panels)
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
┌──────────────┐
|
|
93
|
+
[main content] │ Sheet panel │
|
|
94
|
+
│ │
|
|
95
|
+
│ │
|
|
96
|
+
└──────────────┘
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Left (alternative navigation)
|
|
100
|
+
|
|
101
|
+
Less common; use Drawer for nav.
|
|
102
|
+
|
|
103
|
+
### Bottom (mobile-first)
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
[main content]
|
|
107
|
+
┌───────────────┐
|
|
108
|
+
│ Sheet │ ← slides up
|
|
109
|
+
│ │
|
|
110
|
+
└───────────────┘
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Mobile: bottom sheet is the canonical action / detail pattern. iOS / Android native.
|
|
114
|
+
|
|
115
|
+
### Top (notification center, full-page filter)
|
|
116
|
+
|
|
117
|
+
Less common. Use for app-wide announcements or full-page-spanning filter overlays.
|
|
118
|
+
|
|
119
|
+
## Size variants
|
|
120
|
+
|
|
121
|
+
| Size | Width (left/right) | Height (top/bottom) |
|
|
122
|
+
| --- | --- | --- |
|
|
123
|
+
| `sm` | 320px | 30vh |
|
|
124
|
+
| `md` (default) | 480px | 50vh |
|
|
125
|
+
| `lg` | 640px | 70vh |
|
|
126
|
+
| `xl` | 800px | 90vh |
|
|
127
|
+
| `full` | 100% | 100% |
|
|
128
|
+
|
|
129
|
+
For mobile (< 640px viewport): all sizes default to ~90% of viewport.
|
|
130
|
+
|
|
131
|
+
## Detents (mobile bottom sheet)
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
detents: [0.4, 0.9]
|
|
135
|
+
↑ ↑
|
|
136
|
+
peek full
|
|
137
|
+
|
|
138
|
+
User can drag to switch between detents:
|
|
139
|
+
- Drag up from peek → snap to full
|
|
140
|
+
- Drag down from full → snap to peek (or close if dragged to 0)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
iOS-style sheet behavior. Common for map apps (peek shows summary, drag up for full).
|
|
144
|
+
|
|
145
|
+
## States
|
|
146
|
+
|
|
147
|
+
| State | Visual |
|
|
148
|
+
| --- | --- |
|
|
149
|
+
| Closed | Hidden |
|
|
150
|
+
| Opening | Slide-in from side (200-300ms) + backdrop fade |
|
|
151
|
+
| Open | Visible, focus trapped |
|
|
152
|
+
| Dragging (mobile, with detents) | Following finger; backdrop opacity proportional |
|
|
153
|
+
| Snapping | Animate to nearest detent |
|
|
154
|
+
| Closing | Reverse |
|
|
155
|
+
|
|
156
|
+
## Animation
|
|
157
|
+
|
|
158
|
+
```css
|
|
159
|
+
[data-side="right"] {
|
|
160
|
+
--slide: translateX(100%);
|
|
161
|
+
}
|
|
162
|
+
[data-side="left"] {
|
|
163
|
+
--slide: translateX(-100%);
|
|
164
|
+
}
|
|
165
|
+
[data-side="bottom"] {
|
|
166
|
+
--slide: translateY(100%);
|
|
167
|
+
}
|
|
168
|
+
[data-side="top"] {
|
|
169
|
+
--slide: translateY(-100%);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.sheet[data-state="closed"] {
|
|
173
|
+
transform: var(--slide);
|
|
174
|
+
}
|
|
175
|
+
.sheet[data-state="open"] {
|
|
176
|
+
transform: translate(0);
|
|
177
|
+
}
|
|
178
|
+
.sheet {
|
|
179
|
+
transition: transform 250ms var(--ease-out);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
@media (prefers-reduced-motion: reduce) {
|
|
183
|
+
.sheet { transition: none; }
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Tokens consumed
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
--color-bg-overlay-scrim (backdrop, ~50% opacity)
|
|
191
|
+
--color-bg-default (sheet bg)
|
|
192
|
+
--color-fg-default
|
|
193
|
+
--color-border-default (header / footer divider)
|
|
194
|
+
--shadow-overlay
|
|
195
|
+
--radius-lg (mobile bottom sheet has rounded top corners)
|
|
196
|
+
--space-md, --space-lg
|
|
197
|
+
--motion-medium (slide-in)
|
|
198
|
+
--ease-out
|
|
199
|
+
--z-overlay
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Accessibility
|
|
203
|
+
|
|
204
|
+
- `Content`: `role="dialog"` (or `alertdialog` if it interrupts), `aria-modal="true"`.
|
|
205
|
+
- `aria-labelledby` references `Title`.
|
|
206
|
+
- `aria-describedby` references `Description`.
|
|
207
|
+
- Focus trap on open; first focusable in Content gets focus.
|
|
208
|
+
- `Esc` closes; `Tab` cycles within Content.
|
|
209
|
+
- `Close` button is inside Content; users find it via Tab.
|
|
210
|
+
- Click outside (on overlay) closes — but not for forms with unsaved changes (confirm first).
|
|
211
|
+
- Backdrop is non-interactive (just visual scrim) — clicks bubble to close handler.
|
|
212
|
+
- Touch-drag (mobile detents) uses `aria-valuenow` for screen reader; announce position changes.
|
|
213
|
+
- Reduced motion: no slide; instant appearance.
|
|
214
|
+
|
|
215
|
+
## Mobile-specific
|
|
216
|
+
|
|
217
|
+
- Bottom sheet rounded-top corners (`--radius-lg` on top-left + top-right only).
|
|
218
|
+
- Drag handle (small bar at top): visual + accessible (`role="button" aria-label="Drag to resize"`).
|
|
219
|
+
- Safe-area inset: respect device safe-area for iPhone home indicator (`padding-bottom: env(safe-area-inset-bottom)`).
|
|
220
|
+
- Dynamic height for keyboard: when virtual keyboard opens, shrink sheet so input visible.
|
|
221
|
+
|
|
222
|
+
## Code example
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
function FilterSheet({ filters, onChange, onApply }: Props) {
|
|
226
|
+
return (
|
|
227
|
+
<Sheet>
|
|
228
|
+
<Sheet.Trigger asChild>
|
|
229
|
+
<Button variant="outline">필터</Button>
|
|
230
|
+
</Sheet.Trigger>
|
|
231
|
+
<Sheet.Content side="bottom" size="lg" detents={[0.5, 0.95]}>
|
|
232
|
+
<Sheet.Header>
|
|
233
|
+
<Sheet.Title>필터 설정</Sheet.Title>
|
|
234
|
+
</Sheet.Header>
|
|
235
|
+
<FilterControls value={filters} onChange={onChange} />
|
|
236
|
+
<Sheet.Footer>
|
|
237
|
+
<Button variant="ghost" onClick={() => onChange({})}>초기화</Button>
|
|
238
|
+
<Button onClick={onApply}>적용하기</Button>
|
|
239
|
+
</Sheet.Footer>
|
|
240
|
+
</Sheet.Content>
|
|
241
|
+
</Sheet>
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Edge cases
|
|
247
|
+
|
|
248
|
+
- **Form with unsaved changes + click outside**: confirm before close ("Discard changes?").
|
|
249
|
+
- **Sheet inside a Sheet**: stack, but close inner first; ensure focus returns correctly.
|
|
250
|
+
- **Very long content**: scroll inside Content (header / footer stay pinned).
|
|
251
|
+
- **Mobile keyboard opens while sheet open**: shrink sheet to fit; ensure focused input visible.
|
|
252
|
+
- **Detents + content scroll** conflict: drag from header drags sheet; drag from content scrolls content. Detect target.
|
|
253
|
+
- **RTL**: `right` and `left` swap automatically.
|
|
254
|
+
- **Multi-step flow inside Sheet**: each step within same Sheet; or stack sheets (max 2).
|
|
255
|
+
|
|
256
|
+
## Don't
|
|
257
|
+
|
|
258
|
+
- Don't use Sheet for full-page navigation (use Drawer).
|
|
259
|
+
- Don't use Sheet for centered confirm dialogs (use Modal).
|
|
260
|
+
- Don't put 3+ stacked Sheets — too deep, users lose context.
|
|
261
|
+
- Don't omit close button. Users need an obvious dismiss path.
|
|
262
|
+
- Don't forget the click-outside guard for forms with unsaved data.
|
|
263
|
+
- Don't auto-close after task completion without confirmation animation; user feedback matters.
|
|
264
|
+
- Don't ignore safe-area insets on iOS.
|
|
265
|
+
|
|
266
|
+
## References
|
|
267
|
+
|
|
268
|
+
- shadcn-ui: [`sheet`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/sheet.tsx) (Radix Dialog primitive)
|
|
269
|
+
- Material 3: bottom sheet pattern
|
|
270
|
+
- iOS: UISheetPresentationController detents
|
|
271
|
+
|
|
272
|
+
## Cross-reference
|
|
273
|
+
|
|
274
|
+
- [`examples/component-modal.md`](component-modal.md) — centered dialog
|
|
275
|
+
- [`examples/component-drawer.md`](component-drawer.md) — persistent navigation
|
|
276
|
+
- [`knowledge/motion/principles.md`](../knowledge/motion/principles.md) — slide-in timing
|
|
277
|
+
- [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md) — focus trap
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# `Sidebar` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `sidebar` (the flagship Radix-based primitive). A persistent navigation panel — collapsible, themed, often the primary nav surface in dashboards / docs sites / IDE-style apps.
|
|
4
|
+
|
|
5
|
+
## When to use Sidebar vs Drawer
|
|
6
|
+
|
|
7
|
+
| | Sidebar | Drawer |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Persistence | Always visible (collapsible) | Modal or persistent; usually toggled |
|
|
10
|
+
| Use | Primary navigation in apps | Secondary nav, mobile-only nav |
|
|
11
|
+
| Desktop | Standard | Sometimes overkill |
|
|
12
|
+
| Mobile | Becomes a sheet | Full-screen takeover |
|
|
13
|
+
|
|
14
|
+
## Anatomy
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌────────────┬───────────────────────────┐
|
|
18
|
+
│ [logo] │ │
|
|
19
|
+
│ ────── │ │
|
|
20
|
+
│ Header │ │
|
|
21
|
+
│ │ │
|
|
22
|
+
│ Workspace │ │
|
|
23
|
+
│ ▶ Project │ Main content │
|
|
24
|
+
│ Inbox │ │
|
|
25
|
+
│ Tasks │ │
|
|
26
|
+
│ │ │
|
|
27
|
+
│ Settings │ │
|
|
28
|
+
│ ────── │ │
|
|
29
|
+
│ [user] │ │
|
|
30
|
+
└────────────┴───────────────────────────┘
|
|
31
|
+
↑
|
|
32
|
+
Sidebar
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## API
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
<Sidebar>
|
|
39
|
+
<Sidebar.Header>
|
|
40
|
+
<Logo />
|
|
41
|
+
<WorkspaceSwitcher />
|
|
42
|
+
</Sidebar.Header>
|
|
43
|
+
|
|
44
|
+
<Sidebar.Content>
|
|
45
|
+
<Sidebar.Group>
|
|
46
|
+
<Sidebar.GroupLabel>Workspace</Sidebar.GroupLabel>
|
|
47
|
+
<Sidebar.Menu>
|
|
48
|
+
<Sidebar.MenuItem>
|
|
49
|
+
<Sidebar.MenuButton href="/projects" active>
|
|
50
|
+
<FolderIcon /> Projects
|
|
51
|
+
</Sidebar.MenuButton>
|
|
52
|
+
<Sidebar.MenuSub>
|
|
53
|
+
<Sidebar.MenuSubItem href="/projects/active">Active</Sidebar.MenuSubItem>
|
|
54
|
+
<Sidebar.MenuSubItem href="/projects/archive">Archive</Sidebar.MenuSubItem>
|
|
55
|
+
</Sidebar.MenuSub>
|
|
56
|
+
</Sidebar.MenuItem>
|
|
57
|
+
<Sidebar.MenuItem>
|
|
58
|
+
<Sidebar.MenuButton href="/inbox">
|
|
59
|
+
<InboxIcon /> Inbox
|
|
60
|
+
<Sidebar.MenuBadge>12</Sidebar.MenuBadge>
|
|
61
|
+
</Sidebar.MenuButton>
|
|
62
|
+
</Sidebar.MenuItem>
|
|
63
|
+
</Sidebar.Menu>
|
|
64
|
+
</Sidebar.Group>
|
|
65
|
+
</Sidebar.Content>
|
|
66
|
+
|
|
67
|
+
<Sidebar.Footer>
|
|
68
|
+
<UserMenu />
|
|
69
|
+
</Sidebar.Footer>
|
|
70
|
+
</Sidebar>
|
|
71
|
+
|
|
72
|
+
<SidebarTrigger /> {/* in main content header — toggles sidebar */}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Composition
|
|
76
|
+
|
|
77
|
+
| Part | Purpose |
|
|
78
|
+
| --- | --- |
|
|
79
|
+
| `Sidebar` | Wrapper |
|
|
80
|
+
| `Header` | Top section (logo, workspace switcher) |
|
|
81
|
+
| `Content` | Scrollable middle (groups + menus) |
|
|
82
|
+
| `Footer` | Bottom section (user menu, settings) |
|
|
83
|
+
| `Group` | Logical section |
|
|
84
|
+
| `GroupLabel` | Section heading |
|
|
85
|
+
| `Menu` | List of items |
|
|
86
|
+
| `MenuItem` | Single item wrapper |
|
|
87
|
+
| `MenuButton` | Clickable item |
|
|
88
|
+
| `MenuSub` | Nested sub-menu (collapsible) |
|
|
89
|
+
| `MenuSubItem` | Sub-menu item |
|
|
90
|
+
| `MenuBadge` | Count / indicator on menu item |
|
|
91
|
+
| `MenuAction` | Right-aligned secondary action (e.g., "More" menu) |
|
|
92
|
+
| `Separator` | Visual divider |
|
|
93
|
+
| `Trigger` | Renders elsewhere; toggles sidebar |
|
|
94
|
+
|
|
95
|
+
## States
|
|
96
|
+
|
|
97
|
+
| State | Visual |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| Expanded (default desktop) | Full width with labels |
|
|
100
|
+
| Collapsed (icon-only) | ~64px width; only icons visible |
|
|
101
|
+
| Mobile (offcanvas) | Off-screen by default; opens as Sheet on trigger |
|
|
102
|
+
| Item active | Highlighted bg + brand-color indicator |
|
|
103
|
+
| Item hover | Subtle bg shift |
|
|
104
|
+
| Sub-menu collapsed | Hidden, parent item shows chevron |
|
|
105
|
+
| Sub-menu expanded | Items revealed, parent chevron rotated |
|
|
106
|
+
|
|
107
|
+
## Variants
|
|
108
|
+
|
|
109
|
+
### Width modes
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
<Sidebar variant="sidebar" /> // standard fixed
|
|
113
|
+
<Sidebar variant="floating" /> // detached, with shadow
|
|
114
|
+
<Sidebar variant="inset" /> // inset within rounded shell
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Collapsibility
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
<Sidebar collapsible="offcanvas" /> // mobile-style: slides off-canvas
|
|
121
|
+
<Sidebar collapsible="icon" /> // collapses to icon-only
|
|
122
|
+
<Sidebar collapsible="none" /> // always full width
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Side
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
<Sidebar side="left" /> // default
|
|
129
|
+
<Sidebar side="right" /> // for tools / settings panels
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Responsive behavior
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
Desktop (≥ 1024px):
|
|
136
|
+
Expanded → user can collapse to icon mode
|
|
137
|
+
|
|
138
|
+
Tablet (768-1023px):
|
|
139
|
+
Default to icon mode → user can expand
|
|
140
|
+
|
|
141
|
+
Mobile (< 768px):
|
|
142
|
+
Offcanvas → invisible until trigger; opens as Sheet
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
State persists in localStorage so collapse preference survives sessions.
|
|
147
|
+
|
|
148
|
+
## Tokens consumed
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
--sidebar-width (default 16rem / 256px)
|
|
152
|
+
--sidebar-width-icon (collapsed; default 4rem / 64px)
|
|
153
|
+
--sidebar-bg (sidebar background, slightly different from main)
|
|
154
|
+
--sidebar-fg (text)
|
|
155
|
+
--sidebar-fg-muted (group labels)
|
|
156
|
+
--sidebar-item-hover-bg
|
|
157
|
+
--sidebar-item-active-bg
|
|
158
|
+
--sidebar-item-active-fg
|
|
159
|
+
--sidebar-border (right border)
|
|
160
|
+
--space-xs, --space-sm, --space-md
|
|
161
|
+
--motion-medium (collapse animation)
|
|
162
|
+
--ease-out
|
|
163
|
+
--z-fixed (when fixed-position)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
shadcn names them `--sidebar-*` so they don't conflict with main app theme.
|
|
167
|
+
|
|
168
|
+
## Accessibility
|
|
169
|
+
|
|
170
|
+
- Sidebar: `<aside aria-label="Main navigation">`.
|
|
171
|
+
- Active item: `aria-current="page"` (not just visual).
|
|
172
|
+
- Menu: `<ul>` semantically; items as `<li>`.
|
|
173
|
+
- MenuButton: real `<a>` for nav links, `<button>` for actions.
|
|
174
|
+
- Sub-menus: `aria-expanded` on parent toggle, `aria-controls` referencing sub-menu id.
|
|
175
|
+
- Collapsed icon-only mode: each icon button needs `aria-label` (e.g., `<button aria-label="Inbox">`).
|
|
176
|
+
- Mobile offcanvas: opens as Sheet with focus trap.
|
|
177
|
+
- Keyboard: Tab navigates items; arrow keys can navigate within menu (optional, depends on design).
|
|
178
|
+
|
|
179
|
+
## Code example
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
function AppShell({ children }: Props) {
|
|
183
|
+
return (
|
|
184
|
+
<SidebarProvider>
|
|
185
|
+
<Sidebar collapsible="icon">
|
|
186
|
+
<Sidebar.Header>
|
|
187
|
+
<Logo />
|
|
188
|
+
</Sidebar.Header>
|
|
189
|
+
<Sidebar.Content>
|
|
190
|
+
<Sidebar.Group>
|
|
191
|
+
<Sidebar.GroupLabel>Workspace</Sidebar.GroupLabel>
|
|
192
|
+
<Sidebar.Menu>
|
|
193
|
+
{workspaceItems.map(item => (
|
|
194
|
+
<Sidebar.MenuItem key={item.path}>
|
|
195
|
+
<Sidebar.MenuButton href={item.path} active={pathname === item.path}>
|
|
196
|
+
<item.icon />
|
|
197
|
+
<span>{item.label}</span>
|
|
198
|
+
{item.count && <Sidebar.MenuBadge>{item.count}</Sidebar.MenuBadge>}
|
|
199
|
+
</Sidebar.MenuButton>
|
|
200
|
+
</Sidebar.MenuItem>
|
|
201
|
+
))}
|
|
202
|
+
</Sidebar.Menu>
|
|
203
|
+
</Sidebar.Group>
|
|
204
|
+
</Sidebar.Content>
|
|
205
|
+
<Sidebar.Footer>
|
|
206
|
+
<UserMenu />
|
|
207
|
+
</Sidebar.Footer>
|
|
208
|
+
</Sidebar>
|
|
209
|
+
|
|
210
|
+
<main>
|
|
211
|
+
<header>
|
|
212
|
+
<SidebarTrigger />
|
|
213
|
+
<h1>{pageTitle}</h1>
|
|
214
|
+
</header>
|
|
215
|
+
{children}
|
|
216
|
+
</main>
|
|
217
|
+
</SidebarProvider>
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Korean apps
|
|
223
|
+
|
|
224
|
+
- Sidebar 너비: 한글 메뉴는 영문보다 약간 더 넓은 너비가 필요 (typically 18rem instead of 16rem).
|
|
225
|
+
- Group label: 한글 ("워크스페이스", "관리") works well; keep concise.
|
|
226
|
+
- Active item indicator: 좌측 색상 막대 + 배경 강조; classic KR enterprise pattern.
|
|
227
|
+
|
|
228
|
+
## Edge cases
|
|
229
|
+
|
|
230
|
+
- **Long item labels**: truncate with ellipsis; show full text in tooltip on hover.
|
|
231
|
+
- **Many items (50+)**: scroll inside Content; pin Header + Footer.
|
|
232
|
+
- **Nested too deep**: 3+ levels = navigation pain. Cap at 2 levels.
|
|
233
|
+
- **Sidebar in nested layouts**: only one Sidebar per layout root; nested sidebars indicate over-decomposition.
|
|
234
|
+
- **Cross-tab sync**: collapse state via localStorage works across tabs after refresh.
|
|
235
|
+
- **Reduced motion**: skip collapse animation; instant width change.
|
|
236
|
+
- **Right-to-left**: `side="right"` becomes `left`; borders swap.
|
|
237
|
+
|
|
238
|
+
## Don't
|
|
239
|
+
|
|
240
|
+
- Don't omit collapse on icon mode for desktop — power users need it.
|
|
241
|
+
- Don't put non-navigation items (status, ads) in Sidebar — that's main content territory.
|
|
242
|
+
- Don't lock to one width; respect collapse preference.
|
|
243
|
+
- Don't omit `aria-current="page"` on active items.
|
|
244
|
+
- Don't put 30 ungrouped items — use Group + GroupLabel.
|
|
245
|
+
- Don't overload icon-only mode with no tooltip — users see only icons.
|
|
246
|
+
|
|
247
|
+
## References
|
|
248
|
+
|
|
249
|
+
- shadcn-ui: [`sidebar`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/sidebar.tsx) — flagship primitive
|
|
250
|
+
- Patterns: VS Code, Linear, Notion sidebars
|
|
251
|
+
|
|
252
|
+
## Cross-reference
|
|
253
|
+
|
|
254
|
+
- [`examples/component-drawer.md`](component-drawer.md) — modal nav alternative
|
|
255
|
+
- [`examples/component-sheet.md`](component-sheet.md) — mobile offcanvas variant
|
|
256
|
+
- [`examples/component-navigation-menu.md`](component-navigation-menu.md) — top nav alternative
|
|
257
|
+
- [`knowledge/patterns/mobile-navigation.md`](../knowledge/patterns/mobile-navigation.md)
|