@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,72 @@
|
|
|
1
|
+
# `TableFooter` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `TableFooter`. The container for footer rows in a `Table` — totals, summaries, or pagination. Renders `<tfoot>`.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Tables with totals/subtotals row (sum of an amount column).
|
|
8
|
+
- Tables with `TablePagination` rendered inside the table (rather than below).
|
|
9
|
+
|
|
10
|
+
## API
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
<Table>
|
|
14
|
+
<TableHead>...</TableHead>
|
|
15
|
+
<TableBody>...</TableBody>
|
|
16
|
+
<TableFooter>
|
|
17
|
+
<TableRow>
|
|
18
|
+
<TableCell colSpan={2}>합계</TableCell>
|
|
19
|
+
<TableCell align="right">{total.toLocaleString('ko-KR')}원</TableCell>
|
|
20
|
+
</TableRow>
|
|
21
|
+
</TableFooter>
|
|
22
|
+
</Table>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
| Prop | Type | Default | Description |
|
|
26
|
+
| --- | --- | --- | --- |
|
|
27
|
+
| `children` | `ReactNode` | — | `TableRow` (typically one) |
|
|
28
|
+
| `component` | `ElementType` | `'tfoot'` | Override |
|
|
29
|
+
|
|
30
|
+
## Accessibility
|
|
31
|
+
|
|
32
|
+
- `<tfoot>` semantics communicate "summary row" to screen readers.
|
|
33
|
+
- For totals: the row label cell uses `scope="row"` so the total cell is properly associated.
|
|
34
|
+
|
|
35
|
+
## Edge cases
|
|
36
|
+
|
|
37
|
+
- **Multiple footer rows** — fine; common for layered summaries (subtotal, tax, total).
|
|
38
|
+
- **Korean total labels** — "합계", "총액", "소계 / 부가세 / 합계" — keep in 합쇼체 or noun-form.
|
|
39
|
+
|
|
40
|
+
## Code example
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
<TableFooter>
|
|
44
|
+
<TableRow>
|
|
45
|
+
<TableCell colSpan={2} scope="row">소계</TableCell>
|
|
46
|
+
<TableCell align="right" sx={{ fontVariantNumeric: 'tabular-nums' }}>
|
|
47
|
+
{subtotal.toLocaleString('ko-KR')}원
|
|
48
|
+
</TableCell>
|
|
49
|
+
</TableRow>
|
|
50
|
+
<TableRow>
|
|
51
|
+
<TableCell colSpan={2} scope="row">부가세 (10%)</TableCell>
|
|
52
|
+
<TableCell align="right">{tax.toLocaleString('ko-KR')}원</TableCell>
|
|
53
|
+
</TableRow>
|
|
54
|
+
<TableRow sx={{ '& td': { fontWeight: 600 } }}>
|
|
55
|
+
<TableCell colSpan={2} scope="row">합계</TableCell>
|
|
56
|
+
<TableCell align="right">{total.toLocaleString('ko-KR')}원</TableCell>
|
|
57
|
+
</TableRow>
|
|
58
|
+
</TableFooter>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Don't
|
|
62
|
+
|
|
63
|
+
- Don't use as a wrapper for non-summary rows (filters, etc.) — that's a sibling component, not the footer.
|
|
64
|
+
|
|
65
|
+
## References
|
|
66
|
+
|
|
67
|
+
- MUI: [`TableFooter`](../refs/mui/packages/mui-material/src/TableFooter/)
|
|
68
|
+
|
|
69
|
+
## Cross-reference
|
|
70
|
+
|
|
71
|
+
- [`component-table.md`](component-table.md)
|
|
72
|
+
- [`component-table-row.md`](component-table-row.md)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# `TableHead` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `TableHead`. The container for header rows in a `Table`. Renders `<thead>` with semibold cell text and `<th>` semantics on inner `TableCell`s.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Every `Table` with column labels (almost all of them).
|
|
8
|
+
- For tables with sortable columns, header cells contain `TableSortLabel`.
|
|
9
|
+
|
|
10
|
+
## API
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
<Table>
|
|
14
|
+
<TableHead>
|
|
15
|
+
<TableRow>
|
|
16
|
+
<TableCell scope="col">이름</TableCell>
|
|
17
|
+
<TableCell scope="col" align="right">금액</TableCell>
|
|
18
|
+
</TableRow>
|
|
19
|
+
</TableHead>
|
|
20
|
+
<TableBody>...</TableBody>
|
|
21
|
+
</Table>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| `children` | `ReactNode` | — | `TableRow` (typically one) |
|
|
27
|
+
| `component` | `ElementType` | `'thead'` | Override |
|
|
28
|
+
|
|
29
|
+
## Accessibility
|
|
30
|
+
|
|
31
|
+
- `TableCell` children inside `TableHead` automatically render as `<th>`.
|
|
32
|
+
- Add `scope="col"` to each header cell — required for screen readers to associate columns with body cells.
|
|
33
|
+
- For multi-row headers, use `<TableRow>` siblings inside `TableHead` and `colspan` / `rowspan` on cells.
|
|
34
|
+
|
|
35
|
+
## Edge cases
|
|
36
|
+
|
|
37
|
+
- **Sticky header** — set `<TableContainer sx={{ maxHeight: 400 }}>` + `<Table stickyHeader>` to keep headers visible during scroll.
|
|
38
|
+
- **Mobile narrow viewport** — Tables don't scale well; switch to card-list layout. Cite [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md).
|
|
39
|
+
- **Korean column labels** — keep short (1-3 words). Long labels wrap or truncate; truncated headers are confusing.
|
|
40
|
+
|
|
41
|
+
## Code example
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
<TableContainer component={Paper} sx={{ maxHeight: 480 }}>
|
|
45
|
+
<Table stickyHeader>
|
|
46
|
+
<TableHead>
|
|
47
|
+
<TableRow>
|
|
48
|
+
<TableCell scope="col">이름</TableCell>
|
|
49
|
+
<TableCell scope="col">부서</TableCell>
|
|
50
|
+
<TableCell scope="col" align="right">
|
|
51
|
+
<TableSortLabel active direction="asc" onClick={onSort}>
|
|
52
|
+
입사일
|
|
53
|
+
</TableSortLabel>
|
|
54
|
+
</TableCell>
|
|
55
|
+
</TableRow>
|
|
56
|
+
</TableHead>
|
|
57
|
+
<TableBody>
|
|
58
|
+
{employees.map((emp) => <EmployeeRow key={emp.id} {...emp} />)}
|
|
59
|
+
</TableBody>
|
|
60
|
+
</Table>
|
|
61
|
+
</TableContainer>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Don't
|
|
65
|
+
|
|
66
|
+
- Don't omit `scope="col"` — accessibility miss.
|
|
67
|
+
- Don't put body rows inside `TableHead`.
|
|
68
|
+
- Don't style header cells with body-cell typography — keep semibold semantic distinction.
|
|
69
|
+
|
|
70
|
+
## References
|
|
71
|
+
|
|
72
|
+
- MUI: [`TableHead`](../refs/mui/packages/mui-material/src/TableHead/)
|
|
73
|
+
|
|
74
|
+
## Cross-reference
|
|
75
|
+
|
|
76
|
+
- [`component-table.md`](component-table.md)
|
|
77
|
+
- [`component-table-cell.md`](component-table-cell.md)
|
|
78
|
+
- [`component-table-sort-label.md`](component-table-sort-label.md)
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# `TablePagination` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `TablePagination`. The pagination controls for a `Table` — page size selector + page navigation + total count display. Sits in `TableFooter` or below the table container.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Tables with > 25 rows where users need to navigate pages.
|
|
8
|
+
- For client-side pagination of small datasets, prefer `Pagination` component (decoupled from Table).
|
|
9
|
+
|
|
10
|
+
## When NOT to use
|
|
11
|
+
|
|
12
|
+
- Infinite-scroll feeds → use `Load More` button or auto-load on scroll. Cite [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md).
|
|
13
|
+
- Single-page tables → no pagination control.
|
|
14
|
+
|
|
15
|
+
## Anatomy
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
┌────────────────────────────────────────────────────────┐
|
|
19
|
+
│ Rows per page: [10 ▼] 1-10 of 234 [<] [>] [>>] │
|
|
20
|
+
└────────────────────────────────────────────────────────┘
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## API
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
<TablePagination
|
|
27
|
+
component="div"
|
|
28
|
+
count={total}
|
|
29
|
+
page={page}
|
|
30
|
+
onPageChange={(_, newPage) => setPage(newPage)}
|
|
31
|
+
rowsPerPage={pageSize}
|
|
32
|
+
onRowsPerPageChange={(e) => {
|
|
33
|
+
setPageSize(parseInt(e.target.value, 10));
|
|
34
|
+
setPage(0);
|
|
35
|
+
}}
|
|
36
|
+
rowsPerPageOptions={[10, 25, 50, 100]}
|
|
37
|
+
labelRowsPerPage="페이지당 행"
|
|
38
|
+
labelDisplayedRows={({ from, to, count }) => `${from}-${to} / 전체 ${count}`}
|
|
39
|
+
/>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
| Prop | Type | Default | Description |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| `count` | `number` | required | Total row count |
|
|
45
|
+
| `page` | `number` | required | Current page (0-indexed) |
|
|
46
|
+
| `onPageChange` | `(e, page) => void` | required | Page change handler |
|
|
47
|
+
| `rowsPerPage` | `number` | required | Current page size |
|
|
48
|
+
| `onRowsPerPageChange` | `(e) => void` | — | Page-size change handler |
|
|
49
|
+
| `rowsPerPageOptions` | `number[]` | `[10, 25, 50, 100]` | Page-size options (or `[]` to hide selector) |
|
|
50
|
+
| `labelRowsPerPage` | `ReactNode` | `'Rows per page:'` | Selector label |
|
|
51
|
+
| `labelDisplayedRows` | `({ from, to, count }) => ReactNode` | — | Range label formatter |
|
|
52
|
+
| `showFirstButton` / `showLastButton` | `boolean` | `false` | Show first/last page jumps |
|
|
53
|
+
| `component` | `ElementType` | `'td'` | Override (use `'div'` outside Table footer) |
|
|
54
|
+
| `SelectProps` | `SelectProps` | — | Customize the page-size Select |
|
|
55
|
+
| `getItemAriaLabel` | `(type) => string` | — | Customize button aria-labels |
|
|
56
|
+
|
|
57
|
+
## States
|
|
58
|
+
|
|
59
|
+
| State | Visual |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| First page | Previous button disabled |
|
|
62
|
+
| Last page | Next button disabled |
|
|
63
|
+
| All pages fit on one | Pagination collapses; only count shows |
|
|
64
|
+
|
|
65
|
+
## Tokens consumed
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
--table-pagination-min-height-52
|
|
69
|
+
--font-size-body
|
|
70
|
+
--space-md
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Accessibility
|
|
74
|
+
|
|
75
|
+
- Buttons have `aria-label` (Previous/Next/First/Last). Localize via `getItemAriaLabel`.
|
|
76
|
+
- The page-size Select needs an associated label — `labelRowsPerPage` provides it.
|
|
77
|
+
- Korean: provide `labelDisplayedRows` formatter that uses Korean range syntax: `1-10 / 전체 234`.
|
|
78
|
+
- Announce page changes via `aria-live="polite"` if context requires (e.g., screen reader users navigating large tables).
|
|
79
|
+
|
|
80
|
+
## Edge cases
|
|
81
|
+
|
|
82
|
+
- **`count={-1}` (unknown total)** — pagination shows "1-10 of more than 10" (with `labelDisplayedRows` returning that string). Useful for cursor-based APIs.
|
|
83
|
+
- **Korean pluralization** — there's none in Korean; "1 결과" and "234 결과" both fine. Don't try to pluralize.
|
|
84
|
+
- **Mobile narrow** — buttons + Select can wrap awkwardly. Consider hiding `rowsPerPageOptions` on mobile (`rowsPerPageOptions={[]}`).
|
|
85
|
+
|
|
86
|
+
## Code example
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
function EmployeesTable() {
|
|
90
|
+
const [page, setPage] = useState(0);
|
|
91
|
+
const [pageSize, setPageSize] = useState(25);
|
|
92
|
+
const { data, total } = useEmployees({ page, pageSize });
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<Paper>
|
|
96
|
+
<TableContainer>
|
|
97
|
+
<Table>
|
|
98
|
+
<TableHead>...</TableHead>
|
|
99
|
+
<TableBody>
|
|
100
|
+
{data.map((emp) => <EmployeeRow key={emp.id} {...emp} />)}
|
|
101
|
+
</TableBody>
|
|
102
|
+
</Table>
|
|
103
|
+
</TableContainer>
|
|
104
|
+
<TablePagination
|
|
105
|
+
component="div"
|
|
106
|
+
count={total}
|
|
107
|
+
page={page}
|
|
108
|
+
onPageChange={(_, p) => setPage(p)}
|
|
109
|
+
rowsPerPage={pageSize}
|
|
110
|
+
onRowsPerPageChange={(e) => {
|
|
111
|
+
setPageSize(parseInt(e.target.value, 10));
|
|
112
|
+
setPage(0);
|
|
113
|
+
}}
|
|
114
|
+
rowsPerPageOptions={[10, 25, 50, 100]}
|
|
115
|
+
labelRowsPerPage="페이지당 행"
|
|
116
|
+
labelDisplayedRows={({ from, to, count }) => `${from}-${to} / 전체 ${count}`}
|
|
117
|
+
/>
|
|
118
|
+
</Paper>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Don't
|
|
124
|
+
|
|
125
|
+
- Don't reset `page` to 0 implicitly when filters change without surfacing the reset to the user (sudden page jumps confuse).
|
|
126
|
+
- Don't put 1000+ rows on one page — slow render + bad UX.
|
|
127
|
+
- Don't use English labels in a Korean UI.
|
|
128
|
+
|
|
129
|
+
## References
|
|
130
|
+
|
|
131
|
+
- MUI: [`TablePagination`](../refs/mui/packages/mui-material/src/TablePagination/)
|
|
132
|
+
|
|
133
|
+
## Cross-reference
|
|
134
|
+
|
|
135
|
+
- [`component-table.md`](component-table.md)
|
|
136
|
+
- [`component-pagination.md`](component-pagination.md)
|
|
137
|
+
- [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# `TableRow` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `TableRow`. A row inside a `Table`. Handles selection state, hover styling, zebra striping. Used for both `<tbody>` rows and `<thead>` header rows.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Inside any `Table` body or head.
|
|
8
|
+
- For non-tabular data (cards, lists), don't use TableRow.
|
|
9
|
+
|
|
10
|
+
## API
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
<TableRow hover selected={isSelected} onClick={() => onSelect(row.id)}>
|
|
14
|
+
<TableCell padding="checkbox">
|
|
15
|
+
<Checkbox checked={isSelected} />
|
|
16
|
+
</TableCell>
|
|
17
|
+
<TableCell>{row.name}</TableCell>
|
|
18
|
+
<TableCell align="right">{row.amount.toLocaleString('ko-KR')}원</TableCell>
|
|
19
|
+
</TableRow>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| Prop | Type | Default | Description |
|
|
23
|
+
| --- | --- | --- | --- |
|
|
24
|
+
| `children` | `ReactNode` | — | TableCell children |
|
|
25
|
+
| `hover` | `boolean` | `false` | Enable hover bg |
|
|
26
|
+
| `selected` | `boolean` | `false` | Selected styling (bg-selected) |
|
|
27
|
+
| `onClick` | `(e) => void` | — | Row click handler |
|
|
28
|
+
|
|
29
|
+
## States
|
|
30
|
+
|
|
31
|
+
| State | Visual |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| Default | transparent / zebra |
|
|
34
|
+
| Hover (with `hover`) | bg-subtle |
|
|
35
|
+
| Selected | bg-selected (brand-tinted) |
|
|
36
|
+
| Focus-visible | 2px ring inset |
|
|
37
|
+
|
|
38
|
+
## Tokens consumed
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
--table-row-bg
|
|
42
|
+
--table-row-bg-zebra
|
|
43
|
+
--table-row-bg-hover
|
|
44
|
+
--table-row-bg-selected
|
|
45
|
+
--table-row-min-height-48
|
|
46
|
+
--color-divider
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Accessibility
|
|
50
|
+
|
|
51
|
+
- Renders as `<tr>`. Native semantics handle row/column relationships.
|
|
52
|
+
- For selectable rows with `onClick`, also support keyboard (Enter/Space). MUI doesn't add this automatically — wrap in `tabIndex={0}` + onKeyDown handler.
|
|
53
|
+
- For selected rows, screen readers announce based on the inner Checkbox state, not `selected` prop.
|
|
54
|
+
- Cite [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md).
|
|
55
|
+
|
|
56
|
+
## Edge cases
|
|
57
|
+
|
|
58
|
+
- **Whole-row click** — convenient but can conflict with cell-level clicks (link inside, button). Use `e.stopPropagation()` on inner interactives.
|
|
59
|
+
- **Korean amount alignment** — `align="right"` on numeric cells; use `font-variant-numeric: tabular-nums` for clean column alignment.
|
|
60
|
+
- **Long cell content** — wraps by default; use `noWrap` on Typography or `overflow: hidden` for ellipsis.
|
|
61
|
+
|
|
62
|
+
## Code example
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
<TableContainer>
|
|
66
|
+
<Table>
|
|
67
|
+
<TableHead>
|
|
68
|
+
<TableRow>
|
|
69
|
+
<TableCell padding="checkbox">
|
|
70
|
+
<Checkbox checked={allSelected} onChange={toggleAll} />
|
|
71
|
+
</TableCell>
|
|
72
|
+
<TableCell>이름</TableCell>
|
|
73
|
+
<TableCell>부서</TableCell>
|
|
74
|
+
<TableCell align="right">입사일</TableCell>
|
|
75
|
+
</TableRow>
|
|
76
|
+
</TableHead>
|
|
77
|
+
<TableBody>
|
|
78
|
+
{employees.map((emp) => (
|
|
79
|
+
<TableRow
|
|
80
|
+
key={emp.id}
|
|
81
|
+
hover
|
|
82
|
+
selected={selected.has(emp.id)}
|
|
83
|
+
onClick={() => toggleSelect(emp.id)}
|
|
84
|
+
>
|
|
85
|
+
<TableCell padding="checkbox">
|
|
86
|
+
<Checkbox checked={selected.has(emp.id)} />
|
|
87
|
+
</TableCell>
|
|
88
|
+
<TableCell>{emp.name}</TableCell>
|
|
89
|
+
<TableCell>{emp.department}</TableCell>
|
|
90
|
+
<TableCell align="right">{formatDate(emp.hireDate)}</TableCell>
|
|
91
|
+
</TableRow>
|
|
92
|
+
))}
|
|
93
|
+
</TableBody>
|
|
94
|
+
</Table>
|
|
95
|
+
</TableContainer>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Don't
|
|
99
|
+
|
|
100
|
+
- Don't put TableRow outside a Table — semantics break.
|
|
101
|
+
- Don't use TableRow for card layouts — use Stack / Grid.
|
|
102
|
+
- Don't omit a key when mapping.
|
|
103
|
+
|
|
104
|
+
## References
|
|
105
|
+
|
|
106
|
+
- MUI: [`TableRow`](../refs/mui/packages/mui-material/src/TableRow/)
|
|
107
|
+
|
|
108
|
+
## Cross-reference
|
|
109
|
+
|
|
110
|
+
- [`component-table.md`](component-table.md)
|
|
111
|
+
- [`component-table-cell.md`](component-table-cell.md)
|
|
112
|
+
- [`component-table-body.md`](component-table-body.md)
|
|
113
|
+
- [`component-table-head.md`](component-table-head.md)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# `TableSortLabel` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `TableSortLabel`. The clickable sort indicator inside a header `TableCell`. Shows the current sort direction (ascending / descending) + click handler to toggle.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Inside header `TableCell`s of sortable columns.
|
|
8
|
+
- For non-sortable columns, render plain text in the TableCell.
|
|
9
|
+
|
|
10
|
+
## API
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
<TableCell sortDirection={orderBy === 'name' ? order : false}>
|
|
14
|
+
<TableSortLabel
|
|
15
|
+
active={orderBy === 'name'}
|
|
16
|
+
direction={orderBy === 'name' ? order : 'asc'}
|
|
17
|
+
onClick={() => handleSort('name')}
|
|
18
|
+
>
|
|
19
|
+
이름
|
|
20
|
+
</TableSortLabel>
|
|
21
|
+
</TableCell>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| `active` | `boolean` | `false` | This column is currently sorted |
|
|
27
|
+
| `direction` | `'asc' \| 'desc'` | `'asc'` | Sort direction (ignored when not active) |
|
|
28
|
+
| `hideSortIcon` | `boolean` | `false` | Hide arrow when not active (cleaner default; arrow appears on hover) |
|
|
29
|
+
| `IconComponent` | `ElementType` | `ArrowDownwardIcon` | Custom sort icon |
|
|
30
|
+
| `onClick` | `(e) => void` | — | Toggle handler |
|
|
31
|
+
|
|
32
|
+
## States
|
|
33
|
+
|
|
34
|
+
| State | Visual |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| Default (not active) | Label only; no arrow (or arrow on hover if `hideSortIcon=false`) |
|
|
37
|
+
| Active asc | Label + up arrow |
|
|
38
|
+
| Active desc | Label + down arrow |
|
|
39
|
+
| Hover (any) | Subtle bg + arrow visible |
|
|
40
|
+
| Focus-visible | 2px focus ring |
|
|
41
|
+
|
|
42
|
+
## Tokens consumed
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
--icon-size-sm /* sort arrow */
|
|
46
|
+
--color-fg-default
|
|
47
|
+
--color-fg-muted /* inactive arrow */
|
|
48
|
+
--motion-duration-100 /* arrow rotation */
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Accessibility
|
|
52
|
+
|
|
53
|
+
- Renders as `<button>` — keyboard activates with Enter/Space.
|
|
54
|
+
- Pair with `TableCell sortDirection={...}` to set `aria-sort` correctly. MUI handles the cell side automatically.
|
|
55
|
+
- Korean: arrow direction is universal; the label localizes naturally.
|
|
56
|
+
|
|
57
|
+
## Edge cases
|
|
58
|
+
|
|
59
|
+
- **Tri-state sort** (asc → desc → unsorted → asc...) — implement in your `onClick`. MUI doesn't enforce tri-state by default; common is asc ↔ desc.
|
|
60
|
+
- **Multi-column sort** — possible but UX-confusing for most adopters. Stick to single-column unless data work warrants it.
|
|
61
|
+
- **Default sort** — set initial `orderBy` + `order` state on mount; first render shows the active arrow.
|
|
62
|
+
|
|
63
|
+
## Code example
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
function SortableHeader({ orderBy, order, onSort }) {
|
|
67
|
+
const cell = (key, label, align = 'left') => (
|
|
68
|
+
<TableCell
|
|
69
|
+
align={align}
|
|
70
|
+
sortDirection={orderBy === key ? order : false}
|
|
71
|
+
scope="col"
|
|
72
|
+
>
|
|
73
|
+
<TableSortLabel
|
|
74
|
+
active={orderBy === key}
|
|
75
|
+
direction={orderBy === key ? order : 'asc'}
|
|
76
|
+
onClick={() => onSort(key)}
|
|
77
|
+
>
|
|
78
|
+
{label}
|
|
79
|
+
</TableSortLabel>
|
|
80
|
+
</TableCell>
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<TableHead>
|
|
85
|
+
<TableRow>
|
|
86
|
+
{cell('name', '이름')}
|
|
87
|
+
{cell('department', '부서')}
|
|
88
|
+
{cell('hireDate', '입사일', 'right')}
|
|
89
|
+
{cell('salary', '급여', 'right')}
|
|
90
|
+
</TableRow>
|
|
91
|
+
</TableHead>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Don't
|
|
97
|
+
|
|
98
|
+
- Don't put `TableSortLabel` outside a `TableCell` — `aria-sort` won't propagate.
|
|
99
|
+
- Don't use for non-sortable columns — confuses users when clicking does nothing.
|
|
100
|
+
- Don't omit `aria-label` if the column header is icon-only (pair with `aria-label="정렬: 이름"` or similar).
|
|
101
|
+
|
|
102
|
+
## References
|
|
103
|
+
|
|
104
|
+
- MUI: [`TableSortLabel`](../refs/mui/packages/mui-material/src/TableSortLabel/)
|
|
105
|
+
|
|
106
|
+
## Cross-reference
|
|
107
|
+
|
|
108
|
+
- [`component-table-cell.md`](component-table-cell.md)
|
|
109
|
+
- [`component-table-head.md`](component-table-head.md)
|