@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,139 @@
|
|
|
1
|
+
# `ListItemButton` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `ListItemButton`. The clickable variant of `ListItem`. Use this whenever a list row should respond to clicks (settings, nav, picker). Without it, `ListItem` is just a structural container.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Settings rows ("계정 정보", "알림 설정").
|
|
8
|
+
- Nav lists in drawers / sidebars.
|
|
9
|
+
- Picker / chooser rows where the row itself is the selection target.
|
|
10
|
+
- ANY list row with a primary click action.
|
|
11
|
+
|
|
12
|
+
## Anatomy
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
┌──────────────────────────────────────────────────┐
|
|
16
|
+
│ [icon] Primary text [trailing icon] │
|
|
17
|
+
│ Secondary text │
|
|
18
|
+
└──────────────────────────────────────────────────┘
|
|
19
|
+
─ entire row is the click target ─
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
For rows with a *separate* trailing action (button), wrap `ListItemButton` inside `ListItem` and put the action in `secondaryAction` (which sits outside the button's hit area).
|
|
23
|
+
|
|
24
|
+
## API
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
<List>
|
|
28
|
+
<ListItem disablePadding>
|
|
29
|
+
<ListItemButton selected={current === 'profile'} onClick={() => navigate('/profile')}>
|
|
30
|
+
<ListItemIcon><PersonIcon /></ListItemIcon>
|
|
31
|
+
<ListItemText primary="프로필" secondary="이름, 이메일, 사진" />
|
|
32
|
+
</ListItemButton>
|
|
33
|
+
</ListItem>
|
|
34
|
+
</List>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Prop | Type | Default | Description |
|
|
38
|
+
| --- | --- | --- | --- |
|
|
39
|
+
| `children` | `ReactNode` | — | Usually `ListItemIcon` + `ListItemText` + optional trailing icon |
|
|
40
|
+
| `selected` | `boolean` | `false` | Highlighted (current/active item in nav) |
|
|
41
|
+
| `disabled` | `boolean` | `false` | Non-interactive; greyed |
|
|
42
|
+
| `dense` | `boolean` | `false` | Reduce vertical padding |
|
|
43
|
+
| `divider` | `boolean` | `false` | Bottom divider line |
|
|
44
|
+
| `onClick` | `(e) => void` | — | Click handler |
|
|
45
|
+
| `href` | `string` | — | Renders as `<a>` (use for nav lists) |
|
|
46
|
+
| `component` | `ElementType` | `'div'` | Override element (e.g., `Link` from react-router) |
|
|
47
|
+
| `disableRipple` | `boolean` | `false` | Skip the click-ripple effect |
|
|
48
|
+
|
|
49
|
+
## States
|
|
50
|
+
|
|
51
|
+
| State | Visual |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| Default | transparent bg, fg-default |
|
|
54
|
+
| Hover | bg-subtle |
|
|
55
|
+
| Focus-visible | bg-subtle + 2px focus ring inset |
|
|
56
|
+
| Active | bg-pressed |
|
|
57
|
+
| Selected | bg-selected (~ brand-50/dark mode brand-900-30%), fg-on-selected |
|
|
58
|
+
| Selected + hover | bg-selected-hover (slight shift) |
|
|
59
|
+
| Disabled | reduced opacity, no hover effect |
|
|
60
|
+
|
|
61
|
+
## Tokens consumed
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
--list-item-min-height-44 /* default touch target */
|
|
65
|
+
--list-item-min-height-36 /* dense */
|
|
66
|
+
--color-bg-default
|
|
67
|
+
--color-bg-subtle /* hover */
|
|
68
|
+
--color-bg-pressed /* active */
|
|
69
|
+
--color-bg-selected /* selected */
|
|
70
|
+
--color-fg-default
|
|
71
|
+
--color-fg-on-selected
|
|
72
|
+
--space-md /* horizontal padding */
|
|
73
|
+
--motion-duration-100 /* hover/active transition */
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Accessibility
|
|
77
|
+
|
|
78
|
+
- Default semantic: `<div role="button">` with `tabIndex=0`. With `href`: renders `<a>` (preferred for nav).
|
|
79
|
+
- `selected={true}` → `aria-selected="true"`. For nav lists also add `aria-current="page"` when the row matches the current route.
|
|
80
|
+
- Keyboard: Enter / Space activates. Disabled rows skipped in tab order.
|
|
81
|
+
- Touch target: ≥ 44pt mobile (default 48px). Don't use `dense` on mobile primary nav.
|
|
82
|
+
- Cite [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md).
|
|
83
|
+
|
|
84
|
+
## Edge cases
|
|
85
|
+
|
|
86
|
+
- **Long primary text** — wraps to 2 lines, then ellipsis. For nav rows, prefer concise labels.
|
|
87
|
+
- **`href` + `onClick`** — `onClick` fires before navigation; useful for analytics.
|
|
88
|
+
- **Inside React Router** — pass `component={RouterLink}` + `to="/path"` for SPA-style nav (no full page reload).
|
|
89
|
+
- **Selected without persistence** — `selected` is for the *current* item. For multi-select (checkbox lists), use `Checkbox` inside the row instead of `selected`.
|
|
90
|
+
- **Korean labels** — slightly more vertical padding looks less cramped (Hangul reads taller). Default 48px row height works; resist `dense` for Korean nav.
|
|
91
|
+
|
|
92
|
+
## Code example
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
function SettingsNav({ section }: { section: string }) {
|
|
96
|
+
const items = [
|
|
97
|
+
{ id: 'profile', label: '프로필', icon: <PersonIcon /> },
|
|
98
|
+
{ id: 'notifications', label: '알림 설정', icon: <BellIcon /> },
|
|
99
|
+
{ id: 'privacy', label: '개인정보', icon: <LockIcon /> },
|
|
100
|
+
{ id: 'billing', label: '결제 정보', icon: <CardIcon /> },
|
|
101
|
+
];
|
|
102
|
+
|
|
103
|
+
return (
|
|
104
|
+
<List component="nav" aria-label="설정">
|
|
105
|
+
{items.map((it) => (
|
|
106
|
+
<ListItem key={it.id} disablePadding>
|
|
107
|
+
<ListItemButton
|
|
108
|
+
component={Link}
|
|
109
|
+
to={`/settings/${it.id}`}
|
|
110
|
+
selected={section === it.id}
|
|
111
|
+
>
|
|
112
|
+
<ListItemIcon>{it.icon}</ListItemIcon>
|
|
113
|
+
<ListItemText primary={it.label} />
|
|
114
|
+
</ListItemButton>
|
|
115
|
+
</ListItem>
|
|
116
|
+
))}
|
|
117
|
+
</List>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Don't
|
|
123
|
+
|
|
124
|
+
- Don't use `ListItemButton` outside a `ListItem` parent — semantics break.
|
|
125
|
+
- Don't make the entire `ListItem` clickable via `onClick` on `ListItem` — wrap the inner content in `ListItemButton` so secondary actions stay separately focusable.
|
|
126
|
+
- Don't combine `ListItemButton` with form controls (Checkbox, Switch) inside the same clickable area — a click on the form control conflicts with the row click.
|
|
127
|
+
- Don't override `selected` styling without keeping enough contrast (`color-bg-selected` should be ≥ 3:1 against `color-bg-default`).
|
|
128
|
+
|
|
129
|
+
## References
|
|
130
|
+
|
|
131
|
+
- MUI: [`ListItemButton`](../refs/mui/packages/mui-material/src/ListItemButton/)
|
|
132
|
+
|
|
133
|
+
## Cross-reference
|
|
134
|
+
|
|
135
|
+
- [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
|
|
136
|
+
- [`component-list-item.md`](component-list-item.md) — structural container
|
|
137
|
+
- [`component-list-item-text.md`](component-list-item-text.md)
|
|
138
|
+
- [`component-list-item-icon.md`](component-list-item-icon.md)
|
|
139
|
+
- [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md)
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# `ListItemIcon` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `ListItemIcon`. The leading-icon slot in a `ListItem` — handles consistent sizing, color, and spacing so icons align across rows.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Leading icons in nav lists (settings, drawer menu).
|
|
8
|
+
- Status icons in compact lists (success / warning indicators).
|
|
9
|
+
- For trailing icons (chevrons, badges), use `secondaryAction` on `ListItem` instead.
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<ListItem disablePadding>
|
|
15
|
+
<ListItemButton>
|
|
16
|
+
<ListItemIcon>
|
|
17
|
+
<PersonIcon />
|
|
18
|
+
</ListItemIcon>
|
|
19
|
+
<ListItemText primary="프로필" />
|
|
20
|
+
</ListItemButton>
|
|
21
|
+
</ListItem>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| `children` | `ReactNode` | — | The icon component |
|
|
27
|
+
|
|
28
|
+
The icon's color and size are controlled by the parent — don't apply explicit `sx={{ color, fontSize }}` unless intentionally diverging.
|
|
29
|
+
|
|
30
|
+
## States
|
|
31
|
+
|
|
32
|
+
Inherits from parent button: hover, focus, selected, disabled all cascade. Selected rows get brand-colored icons.
|
|
33
|
+
|
|
34
|
+
## Tokens consumed
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
--icon-size-md /* 24px default */
|
|
38
|
+
--color-fg-muted /* default icon color */
|
|
39
|
+
--color-fg-on-selected /* selected state */
|
|
40
|
+
--list-icon-min-width /* 40-56px reserved column */
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Decorative icons get `aria-hidden="true"` (default behavior of MUI icons).
|
|
46
|
+
- If the icon is the *only* indicator (no text label), wrap with `<span aria-label="..."/>`.
|
|
47
|
+
- Touch target lives on the parent `ListItemButton`, not the icon itself.
|
|
48
|
+
|
|
49
|
+
## Edge cases
|
|
50
|
+
|
|
51
|
+
- **Mixed: some rows have icons, some don't** — use `inset={true}` on `ListItemText` for icon-less rows so text columns align.
|
|
52
|
+
- **Custom icon size** — overriding via `sx={{ minWidth: ... }}` lets compact lists fit more rows; don't go below 32px on touch.
|
|
53
|
+
- **Status icons + text** — pair with `<Stack direction="row" gap={1}>` inside `ListItemText.primary` if both need to be at the text level.
|
|
54
|
+
|
|
55
|
+
## Code example
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
// Settings nav with status indicators
|
|
59
|
+
<List component="nav">
|
|
60
|
+
<ListItem disablePadding>
|
|
61
|
+
<ListItemButton>
|
|
62
|
+
<ListItemIcon><BellIcon color="primary" /></ListItemIcon>
|
|
63
|
+
<ListItemText primary="알림" secondary="3개 안 읽음" />
|
|
64
|
+
</ListItemButton>
|
|
65
|
+
</ListItem>
|
|
66
|
+
</List>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Don't
|
|
70
|
+
|
|
71
|
+
- Don't put text inside `ListItemIcon` — it's sized for icons only.
|
|
72
|
+
- Don't skip `ListItemIcon` and put icons in `ListItemText.primary` for icon-led rows — alignment breaks.
|
|
73
|
+
|
|
74
|
+
## References
|
|
75
|
+
|
|
76
|
+
- MUI: [`ListItemIcon`](../refs/mui/packages/mui-material/src/ListItemIcon/)
|
|
77
|
+
|
|
78
|
+
## Cross-reference
|
|
79
|
+
|
|
80
|
+
- [`component-list-item.md`](component-list-item.md)
|
|
81
|
+
- [`component-list-item-text.md`](component-list-item-text.md)
|
|
82
|
+
- [`knowledge/icons/curated-sets.md`](../knowledge/icons/curated-sets.md)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# `ListItemText` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `ListItemText`. The text block inside a `ListItem` — primary line plus optional secondary line. Handles typography, ellipsis, and screen-reader semantics so consumers don't reimplement.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Inside every `ListItem` that has text content (almost all of them).
|
|
8
|
+
- For text-only rows (no icon, no secondary action), `ListItemText` is the entire body.
|
|
9
|
+
|
|
10
|
+
## Anatomy
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
[Primary text — 14px medium / fg-default]
|
|
14
|
+
[Secondary text — 12px regular / fg-muted]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## API
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
<ListItemText
|
|
21
|
+
primary="홍길동"
|
|
22
|
+
secondary="개발팀 · 2026-05-01 입사"
|
|
23
|
+
/>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
| Prop | Type | Default | Description |
|
|
27
|
+
| --- | --- | --- | --- |
|
|
28
|
+
| `primary` | `ReactNode` | — | Primary line (label) |
|
|
29
|
+
| `secondary` | `ReactNode` | — | Secondary line (sub-label) |
|
|
30
|
+
| `inset` | `boolean` | `false` | Indent left to align with rows that have a leading icon |
|
|
31
|
+
| `disableTypography` | `boolean` | `false` | Skip wrapping in `<Typography>`; renders raw children |
|
|
32
|
+
| `primaryTypographyProps` | `TypographyProps` | — | Override primary line typography |
|
|
33
|
+
| `secondaryTypographyProps` | `TypographyProps` | — | Override secondary line typography |
|
|
34
|
+
|
|
35
|
+
## States
|
|
36
|
+
|
|
37
|
+
`ListItemText` is structural — no interactive states. Inherits color from parent (`ListItemButton`'s selected/disabled states cascade).
|
|
38
|
+
|
|
39
|
+
## Tokens consumed
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
--font-size-body /* primary */
|
|
43
|
+
--font-size-caption /* secondary */
|
|
44
|
+
--font-weight-medium /* primary */
|
|
45
|
+
--font-weight-regular /* secondary */
|
|
46
|
+
--color-fg-default /* primary */
|
|
47
|
+
--color-fg-muted /* secondary */
|
|
48
|
+
--line-height-body /* KR-bumped 1.65 */
|
|
49
|
+
--space-xs /* gap between primary and secondary */
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Accessibility
|
|
53
|
+
|
|
54
|
+
- Semantic: primary renders as `<span>` (or override). Secondary renders as `<p>`.
|
|
55
|
+
- For screen readers, both lines are announced together as "primary, secondary".
|
|
56
|
+
- For LONG primary text that wraps, ensure `aria-label` provides a short summary if needed.
|
|
57
|
+
- `inset={true}` keeps text alignment consistent with sibling rows that have icons — don't drop it.
|
|
58
|
+
|
|
59
|
+
## Edge cases
|
|
60
|
+
|
|
61
|
+
- **Long primary text** — wraps; if multi-line wrap is undesired, set `primaryTypographyProps={{ noWrap: true }}` for ellipsis.
|
|
62
|
+
- **Empty secondary** — omit the prop; don't pass empty string (creates extra spacing).
|
|
63
|
+
- **React node as primary** — primary can be a `<Stack>` for inline badges next to the label. `disableTypography` lets you control the wrapper.
|
|
64
|
+
- **Korean text density** — Hangul reads slightly taller; default line-height (1.65 KR-bumped) should not be reduced.
|
|
65
|
+
|
|
66
|
+
## Code example
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
// Settings row with switch
|
|
70
|
+
<ListItem
|
|
71
|
+
secondaryAction={<Switch onChange={toggle} checked={pushEnabled} />}
|
|
72
|
+
>
|
|
73
|
+
<ListItemText
|
|
74
|
+
primary="푸시 알림"
|
|
75
|
+
secondary="새 메시지가 오면 알림을 받아요"
|
|
76
|
+
/>
|
|
77
|
+
</ListItem>
|
|
78
|
+
|
|
79
|
+
// Inset variant — aligns with rows that have icons
|
|
80
|
+
<ListItemText inset primary="섹션 헤더 없음" secondary="아이콘 자리만큼 들여 써요" />
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Don't
|
|
84
|
+
|
|
85
|
+
- Don't pass JSX trees as `secondary` that reimplement Typography — use `secondaryTypographyProps` overrides.
|
|
86
|
+
- Don't omit `inset` selectively — once any sibling row uses `ListItemIcon`, all icon-less siblings should `inset` for visual rhythm.
|
|
87
|
+
- Don't rely on `secondary` for critical info screen reader users need quickly — they hear it as continuation of primary.
|
|
88
|
+
|
|
89
|
+
## References
|
|
90
|
+
|
|
91
|
+
- MUI: [`ListItemText`](../refs/mui/packages/mui-material/src/ListItemText/)
|
|
92
|
+
|
|
93
|
+
## Cross-reference
|
|
94
|
+
|
|
95
|
+
- [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
|
|
96
|
+
- [`component-list-item.md`](component-list-item.md)
|
|
97
|
+
- [`component-list-item-button.md`](component-list-item-button.md)
|
|
98
|
+
- [`knowledge/typography/type-scale-fundamentals.md`](../knowledge/typography/type-scale-fundamentals.md)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# `ListItem` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `ListItem`. The single-row primitive used inside `List`. For interactive rows that respond to clicks, use [`component-list-item-button.md`](component-list-item-button.md) — `ListItem` itself is the structural container.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- One row inside a `<List>`.
|
|
8
|
+
- Pure-display rows (text + secondary action button on the right).
|
|
9
|
+
- For *clickable rows* (the common case in settings / nav lists), use `ListItemButton` as the child.
|
|
10
|
+
|
|
11
|
+
## Anatomy
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
┌──────────────────────────────────────────────────┐
|
|
15
|
+
│ [icon/avatar] Primary text [secondary] │
|
|
16
|
+
│ Secondary text │
|
|
17
|
+
└──────────────────────────────────────────────────┘
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Slots: leading icon/avatar (optional), text block (`ListItemText`), trailing secondary action (`ListItemSecondaryAction`).
|
|
21
|
+
|
|
22
|
+
## API
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
<List>
|
|
26
|
+
<ListItem secondaryAction={<IconButton><DeleteIcon /></IconButton>}>
|
|
27
|
+
<ListItemAvatar><Avatar /></ListItemAvatar>
|
|
28
|
+
<ListItemText primary="이름" secondary="설명" />
|
|
29
|
+
</ListItem>
|
|
30
|
+
</List>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| Prop | Type | Default | Description |
|
|
34
|
+
| --- | --- | --- | --- |
|
|
35
|
+
| `children` | `ReactNode` | — | Primary content; usually `ListItemText` + optional avatar/icon |
|
|
36
|
+
| `disablePadding` | `boolean` | `false` | Remove default vertical padding (use when child is `ListItemButton`) |
|
|
37
|
+
| `secondaryAction` | `ReactNode` | — | Right-anchored action area; not part of the row's clickable surface |
|
|
38
|
+
| `disableGutters` | `boolean` | `false` | Remove horizontal padding |
|
|
39
|
+
| `dense` | `boolean` | `false` | Reduce vertical padding (settings / dense nav lists) |
|
|
40
|
+
| `divider` | `boolean` | `false` | Bottom divider line |
|
|
41
|
+
|
|
42
|
+
## States
|
|
43
|
+
|
|
44
|
+
`ListItem` itself is non-interactive. Interactivity comes from a `ListItemButton` child:
|
|
45
|
+
|
|
46
|
+
| State (on inner button) | Visual |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| Default | transparent bg, fg-default |
|
|
49
|
+
| Hover | bg-subtle |
|
|
50
|
+
| Focus-visible | 2px focus ring inset; cite [keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md) |
|
|
51
|
+
| Active | bg-pressed |
|
|
52
|
+
| Selected | bg-selected, fg-on-selected |
|
|
53
|
+
| Disabled | reduced opacity |
|
|
54
|
+
|
|
55
|
+
## Tokens consumed
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
--color-bg-default
|
|
59
|
+
--color-fg-default
|
|
60
|
+
--space-sm /* dense */
|
|
61
|
+
--space-md /* default */
|
|
62
|
+
--list-row-min-height-44
|
|
63
|
+
--color-divider
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Accessibility
|
|
67
|
+
|
|
68
|
+
- Semantic element: `<li>` (default).
|
|
69
|
+
- For navigable list with selection, use `role="list"` on the parent and `aria-current="page"` on the selected item.
|
|
70
|
+
- `secondaryAction` must be a separately-focusable control with its own accessible name (otherwise it merges into the row's tab stop and is unreachable).
|
|
71
|
+
- Touch target: ≥ 44pt for mobile lists.
|
|
72
|
+
|
|
73
|
+
## Edge cases
|
|
74
|
+
|
|
75
|
+
- **Long primary text** — wraps to 2 lines, then ellipsis.
|
|
76
|
+
- **`ListItemButton` child + `secondaryAction`** — the secondary action is OUTSIDE the button's hit area. Functionally critical for screen-reader nav.
|
|
77
|
+
- **Korean text density** — Hangul reads ~10% wider than Latin. Test with realistic Korean copy.
|
|
78
|
+
|
|
79
|
+
## Code example
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
<List>
|
|
83
|
+
{users.map((u) => (
|
|
84
|
+
<ListItem
|
|
85
|
+
key={u.id}
|
|
86
|
+
secondaryAction={
|
|
87
|
+
<IconButton edge="end" aria-label={`${u.name} 삭제`}>
|
|
88
|
+
<DeleteIcon />
|
|
89
|
+
</IconButton>
|
|
90
|
+
}
|
|
91
|
+
disablePadding
|
|
92
|
+
>
|
|
93
|
+
<ListItemButton onClick={() => select(u.id)}>
|
|
94
|
+
<ListItemAvatar><Avatar src={u.avatarUrl} /></ListItemAvatar>
|
|
95
|
+
<ListItemText primary={u.name} secondary={u.role} />
|
|
96
|
+
</ListItemButton>
|
|
97
|
+
</ListItem>
|
|
98
|
+
))}
|
|
99
|
+
</List>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Don't
|
|
103
|
+
|
|
104
|
+
- Don't make the entire `ListItem` clickable via `onClick`; wrap inner content in `ListItemButton` so secondary action stays separately focusable.
|
|
105
|
+
- Don't put 3+ controls inside `secondaryAction` — overflow into a menu.
|
|
106
|
+
|
|
107
|
+
## References
|
|
108
|
+
|
|
109
|
+
- MUI: [`ListItem.d.ts`](../refs/mui/packages/mui-material/src/ListItem/ListItem.d.ts)
|
|
110
|
+
|
|
111
|
+
## Cross-reference
|
|
112
|
+
|
|
113
|
+
- [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
|
|
114
|
+
- [`component-list-item-button.md`](component-list-item-button.md)
|
|
115
|
+
- [`component-list-item-text.md`](component-list-item-text.md)
|
|
116
|
+
- [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# `ListSubheader` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `ListSubheader`. A section header inside a `List`. Use for grouping related rows under a label ("최근", "즐겨찾기", "전체").
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Grouped lists (categories of settings, sections of nav).
|
|
8
|
+
- Date-grouped feeds ("오늘", "어제", "이번 주").
|
|
9
|
+
- Avoid for short lists (<5 rows) — header overhead isn't worth it.
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<List subheader={<ListSubheader>최근 검색</ListSubheader>}>
|
|
15
|
+
<ListItemButton>...</ListItemButton>
|
|
16
|
+
<ListItemButton>...</ListItemButton>
|
|
17
|
+
</List>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Prop | Type | Default | Description |
|
|
21
|
+
| --- | --- | --- | --- |
|
|
22
|
+
| `children` | `ReactNode` | — | Header text |
|
|
23
|
+
| `disableSticky` | `boolean` | `false` | Skip sticky-on-scroll behavior |
|
|
24
|
+
| `inset` | `boolean` | `false` | Indent to align with icon-led rows |
|
|
25
|
+
| `disableGutters` | `boolean` | `false` | Remove horizontal padding |
|
|
26
|
+
|
|
27
|
+
## Tokens consumed
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
--font-size-caption /* 12px */
|
|
31
|
+
--font-weight-semibold
|
|
32
|
+
--color-fg-muted /* default */
|
|
33
|
+
--space-md /* horizontal padding */
|
|
34
|
+
--list-subheader-height /* 32px */
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Accessibility
|
|
38
|
+
|
|
39
|
+
- Renders as `<li>` by default. For semantic headers, override `component="h3"` or wrap content with appropriate heading.
|
|
40
|
+
- Don't use as the *only* visual cue for grouping — pair with `Divider` or distinct background for low-vision users.
|
|
41
|
+
|
|
42
|
+
## Edge cases
|
|
43
|
+
|
|
44
|
+
- **Sticky on scroll** — default behavior keeps the subheader visible while its rows scroll past. Disable for short lists.
|
|
45
|
+
- **Korean labels** — short and noun-form ("최근", "즐겨찾기"). Avoid sentence-form labels here.
|
|
46
|
+
|
|
47
|
+
## Code example
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
<List>
|
|
51
|
+
<ListSubheader>최근</ListSubheader>
|
|
52
|
+
{recent.map((it) => <ListItemButton key={it.id}>{it.title}</ListItemButton>)}
|
|
53
|
+
<ListSubheader>즐겨찾기</ListSubheader>
|
|
54
|
+
{favs.map((it) => <ListItemButton key={it.id}>{it.title}</ListItemButton>)}
|
|
55
|
+
</List>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Don't
|
|
59
|
+
|
|
60
|
+
- Don't nest subheaders.
|
|
61
|
+
- Don't use for sublabels under a single row — that's `ListItemText.secondary`.
|
|
62
|
+
|
|
63
|
+
## References
|
|
64
|
+
|
|
65
|
+
- MUI: [`ListSubheader`](../refs/mui/packages/mui-material/src/ListSubheader/)
|
|
66
|
+
|
|
67
|
+
## Cross-reference
|
|
68
|
+
|
|
69
|
+
- [`component-list-item.md`](component-list-item.md)
|
|
70
|
+
- [`component-list-item-button.md`](component-list-item-button.md)
|