@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,327 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
# `GameMenu` (custom — composable game menu shell with focus / input handling) — spec
|
|
3
|
+
|
|
4
|
+
> Composable shell for main menu / pause menu / settings / inventory / store. Handles focus management for keyboard / controller / touch, button-prompt swapping, modal stacking, and reduced-motion. Pairs with [`knowledge/game-ui/menu-systems.md`](../knowledge/game-ui/menu-systems.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Game menus need behaviors web menus don't:
|
|
9
|
+
1. **Controller / d-pad navigation** with auto-focus.
|
|
10
|
+
2. **Button prompt** rendering ([A] Confirm, [B] Back) per platform.
|
|
11
|
+
3. **Modal stacking** (pause → settings → audio sub-menu).
|
|
12
|
+
4. **Tab navigation** with shoulder buttons (LB/RB).
|
|
13
|
+
5. **Auto-pause game** when opened.
|
|
14
|
+
6. **Smooth transitions** between menus.
|
|
15
|
+
|
|
16
|
+
`GameMenu` provides these primitives so each game menu screen doesn't reinvent.
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌──────────────────────────────────────────┐
|
|
22
|
+
│ ← [Back] TITLE [LB]│[RB] │ ← header w/ tabs
|
|
23
|
+
├──────────────────────────────────────────┤
|
|
24
|
+
│ │
|
|
25
|
+
│ [Menu items list] │
|
|
26
|
+
│ ▶ Selected item │
|
|
27
|
+
│ Item 2 │
|
|
28
|
+
│ Item 3 │
|
|
29
|
+
│ │
|
|
30
|
+
│ [Detail panel] │
|
|
31
|
+
│ Description of selected item │
|
|
32
|
+
│ │
|
|
33
|
+
├──────────────────────────────────────────┤
|
|
34
|
+
│ [A] Confirm [B] Back [Y] Action │ ← input prompts footer
|
|
35
|
+
└──────────────────────────────────────────┘
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## API
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
<GameMenu
|
|
42
|
+
open={open}
|
|
43
|
+
onClose={() => setOpen(false)}
|
|
44
|
+
title="설정 / Settings"
|
|
45
|
+
inputType={inputType}
|
|
46
|
+
pauseGame
|
|
47
|
+
variant="overlay" // "fullscreen" | "overlay" | "modal"
|
|
48
|
+
tabs={[
|
|
49
|
+
{ id: "video", label: "Video" },
|
|
50
|
+
{ id: "audio", label: "Audio" },
|
|
51
|
+
{ id: "controls", label: "Controls" },
|
|
52
|
+
{ id: "a11y", label: "Accessibility" },
|
|
53
|
+
]}
|
|
54
|
+
activeTab={tab}
|
|
55
|
+
onTabChange={setTab}
|
|
56
|
+
prompts={[
|
|
57
|
+
{ button: "A", label: "Confirm", action: confirm },
|
|
58
|
+
{ button: "B", label: "Back", action: back },
|
|
59
|
+
{ button: "Y", label: "Reset", action: reset },
|
|
60
|
+
]}
|
|
61
|
+
>
|
|
62
|
+
<GameMenuList>
|
|
63
|
+
<GameMenuItem id="resolution" label="Resolution" value="1920x1080" />
|
|
64
|
+
<GameMenuItem id="fullscreen" label="Fullscreen" value={true} type="toggle" />
|
|
65
|
+
<GameMenuItem id="vsync" label="V-Sync" value="On" type="select" options={...} />
|
|
66
|
+
</GameMenuList>
|
|
67
|
+
</GameMenu>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
| Prop | Type | Default | Description |
|
|
71
|
+
| --- | --- | --- | --- |
|
|
72
|
+
| `open` | `boolean` | — | Visibility |
|
|
73
|
+
| `onClose` | `() => void` | — | Back button / Esc |
|
|
74
|
+
| `title` | `string` | — | Menu title |
|
|
75
|
+
| `inputType` | `"keyboard" \| "controller-xbox" \| "controller-ps" \| "touch"` | auto | Determines prompts |
|
|
76
|
+
| `pauseGame` | `boolean` | `true` | Pause game world while menu open (single-player) |
|
|
77
|
+
| `variant` | `"fullscreen" \| "overlay" \| "modal"` | `"overlay"` | Visual treatment |
|
|
78
|
+
| `tabs` | `Tab[]` | `[]` | Tab definitions |
|
|
79
|
+
| `activeTab` | `string` | — | Current tab |
|
|
80
|
+
| `onTabChange` | `(id) => void` | — | Tab switch handler |
|
|
81
|
+
| `prompts` | `Prompt[]` | `[]` | Input prompt definitions for footer |
|
|
82
|
+
| `transitionDuration` | `number` | `200` | Open/close ms |
|
|
83
|
+
| `children` | `ReactNode` | — | Menu content |
|
|
84
|
+
|
|
85
|
+
## Variants
|
|
86
|
+
|
|
87
|
+
### `fullscreen`
|
|
88
|
+
|
|
89
|
+
Full-screen replacement for game render. Used for main menu, settings, large inventories.
|
|
90
|
+
|
|
91
|
+
### `overlay`
|
|
92
|
+
|
|
93
|
+
Semi-opaque overlay with menu panel. Game world dimmed but visible. Used for pause, in-game inventory.
|
|
94
|
+
|
|
95
|
+
### `modal`
|
|
96
|
+
|
|
97
|
+
Centered modal with backdrop. Used for confirmation dialogs, item detail.
|
|
98
|
+
|
|
99
|
+
## Components inside
|
|
100
|
+
|
|
101
|
+
### GameMenuList
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<GameMenuList orientation="vertical" wrapNav={true}>
|
|
105
|
+
{items}
|
|
106
|
+
</GameMenuList>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Handles arrow key / d-pad navigation between children.
|
|
110
|
+
|
|
111
|
+
### GameMenuItem
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
<GameMenuItem
|
|
115
|
+
id="vsync"
|
|
116
|
+
label="V-Sync"
|
|
117
|
+
type="select" // "button" | "toggle" | "select" | "slider" | "remap"
|
|
118
|
+
value={value}
|
|
119
|
+
options={["Off", "On", "Adaptive"]}
|
|
120
|
+
onChange={(v) => setValue(v)}
|
|
121
|
+
description="Synchronizes display refresh; reduces tearing"
|
|
122
|
+
hotkey="V" // optional keyboard shortcut
|
|
123
|
+
/>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
| `type` | UI |
|
|
127
|
+
| --- | --- |
|
|
128
|
+
| `button` | Single action (Resume, Quit) |
|
|
129
|
+
| `toggle` | On / Off boolean |
|
|
130
|
+
| `select` | Dropdown / cycle options |
|
|
131
|
+
| `slider` | Range input |
|
|
132
|
+
| `remap` | Capture next button press |
|
|
133
|
+
|
|
134
|
+
### Tab strip
|
|
135
|
+
|
|
136
|
+
For tabbed menus:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
[< L1] Video Audio Controls Accessibility [R1 >]
|
|
140
|
+
───── ───────
|
|
141
|
+
active
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
L1 / R1 (or Q / E on PC) cycle tabs. Click / tap also works.
|
|
145
|
+
|
|
146
|
+
## Focus management
|
|
147
|
+
|
|
148
|
+
### Auto-focus on open
|
|
149
|
+
|
|
150
|
+
When menu opens, first interactive item auto-focused. Visible focus ring on controllers.
|
|
151
|
+
|
|
152
|
+
### Focus trap
|
|
153
|
+
|
|
154
|
+
Tab / arrow / d-pad cycles within menu. Doesn't escape to background game.
|
|
155
|
+
|
|
156
|
+
### Focus restoration on close
|
|
157
|
+
|
|
158
|
+
When menu closes, focus returns to whatever triggered it (or game window).
|
|
159
|
+
|
|
160
|
+
### Visible focus indicator
|
|
161
|
+
|
|
162
|
+
```css
|
|
163
|
+
.game-menu-item[data-focused="true"] {
|
|
164
|
+
outline: 2px solid var(--game-menu-focus-color);
|
|
165
|
+
background: var(--game-menu-focus-bg);
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
For controller users: focus indicator must be unmistakable. Bigger, brighter than typical web focus ring.
|
|
170
|
+
|
|
171
|
+
## Input handling
|
|
172
|
+
|
|
173
|
+
### Keyboard
|
|
174
|
+
|
|
175
|
+
- Arrow keys / WASD: navigate.
|
|
176
|
+
- Enter / Space: confirm.
|
|
177
|
+
- Esc: back.
|
|
178
|
+
- Tab / Shift+Tab: alternative navigation.
|
|
179
|
+
- Letter shortcuts (V for V-Sync) when defined.
|
|
180
|
+
|
|
181
|
+
### Controller (Xbox)
|
|
182
|
+
|
|
183
|
+
- D-pad / left stick: navigate.
|
|
184
|
+
- A: confirm.
|
|
185
|
+
- B: back.
|
|
186
|
+
- Y: secondary action (reset, more info).
|
|
187
|
+
- X: tertiary.
|
|
188
|
+
- LB / RB: tab cycle.
|
|
189
|
+
- Start / Menu button: close.
|
|
190
|
+
|
|
191
|
+
### Controller (PlayStation)
|
|
192
|
+
|
|
193
|
+
- D-pad / left stick: navigate.
|
|
194
|
+
- ✕ (X): confirm.
|
|
195
|
+
- ◯ (Circle): back.
|
|
196
|
+
- △ (Triangle): secondary.
|
|
197
|
+
- □ (Square): tertiary.
|
|
198
|
+
- L1 / R1: tab cycle.
|
|
199
|
+
- Options: close.
|
|
200
|
+
|
|
201
|
+
### Touch
|
|
202
|
+
|
|
203
|
+
- Tap: select / confirm.
|
|
204
|
+
- Tap "Back" button (top-left).
|
|
205
|
+
- Swipe between tabs.
|
|
206
|
+
- Long-press for context menu (optional).
|
|
207
|
+
|
|
208
|
+
## Button prompt rendering
|
|
209
|
+
|
|
210
|
+
```tsx
|
|
211
|
+
<InputPrompt button="A" inputType="controller-xbox" /> → [A]
|
|
212
|
+
<InputPrompt button="A" inputType="controller-ps" /> → [✕]
|
|
213
|
+
<InputPrompt button="A" inputType="keyboard" /> → [Enter]
|
|
214
|
+
<InputPrompt button="A" inputType="touch" /> → [Confirm] (text label)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Common abstract names: `confirm`, `cancel`, `secondary`, `tertiary`, `tab-prev`, `tab-next`, `menu`. Component maps to platform.
|
|
218
|
+
|
|
219
|
+
## States
|
|
220
|
+
|
|
221
|
+
| State | Visual |
|
|
222
|
+
| --- | --- |
|
|
223
|
+
| Closed | Hidden |
|
|
224
|
+
| Opening | Fade-in + scale 200ms |
|
|
225
|
+
| Open | Steady state |
|
|
226
|
+
| Tab transition | Cross-fade content 150ms |
|
|
227
|
+
| Closing | Fade-out 200ms |
|
|
228
|
+
| Reduced motion | Instant open / close |
|
|
229
|
+
|
|
230
|
+
## Tokens consumed
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
--game-menu-bg-overlay (semi-opaque backdrop)
|
|
234
|
+
--game-menu-bg-panel (menu panel bg)
|
|
235
|
+
--game-menu-fg-default (text)
|
|
236
|
+
--game-menu-fg-emphasis (selected / hover)
|
|
237
|
+
--game-menu-focus-color (focus ring)
|
|
238
|
+
--game-menu-focus-bg (focus bg)
|
|
239
|
+
--game-menu-divider (between sections)
|
|
240
|
+
--game-menu-prompts-bg (footer prompts bg)
|
|
241
|
+
--game-menu-anim-fade (200ms by default)
|
|
242
|
+
--game-menu-ease (ease-out)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Accessibility
|
|
246
|
+
|
|
247
|
+
- **Focus visible** at all times during keyboard / controller use.
|
|
248
|
+
- **Screen reader**: each menu item announced as it's focused.
|
|
249
|
+
- **High contrast** mode swaps tokens.
|
|
250
|
+
- **Reduced motion** disables transitions.
|
|
251
|
+
- **Localizable** all labels.
|
|
252
|
+
- **Subtitle for menu sounds** if SFX-driven menus (rare but exists).
|
|
253
|
+
- **Touch targets** ≥ 44pt on mobile.
|
|
254
|
+
|
|
255
|
+
## Implementation hints
|
|
256
|
+
|
|
257
|
+
```tsx
|
|
258
|
+
function GameMenu({ open, onClose, title, inputType, prompts, children, ... }: Props) {
|
|
259
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
260
|
+
|
|
261
|
+
// Focus trap
|
|
262
|
+
useFocusTrap(containerRef, { active: open, onEscape: onClose });
|
|
263
|
+
|
|
264
|
+
// Auto-focus first interactive on open
|
|
265
|
+
useEffect(() => {
|
|
266
|
+
if (open) {
|
|
267
|
+
const first = containerRef.current?.querySelector<HTMLElement>("[data-focusable='true']");
|
|
268
|
+
first?.focus();
|
|
269
|
+
}
|
|
270
|
+
}, [open]);
|
|
271
|
+
|
|
272
|
+
// Pause game when open (single-player only)
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
if (open) gameState.pause();
|
|
275
|
+
else gameState.resume();
|
|
276
|
+
}, [open]);
|
|
277
|
+
|
|
278
|
+
if (!open) return null;
|
|
279
|
+
|
|
280
|
+
return (
|
|
281
|
+
<div className="game-menu-backdrop" onClick={onClose} role="dialog" aria-label={title}>
|
|
282
|
+
<div ref={containerRef} className="game-menu-panel" onClick={e => e.stopPropagation()}>
|
|
283
|
+
<GameMenuHeader title={title} onBack={onClose} tabs={...} />
|
|
284
|
+
<GameMenuBody>{children}</GameMenuBody>
|
|
285
|
+
<GameMenuPrompts prompts={prompts} inputType={inputType} />
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Edge cases
|
|
293
|
+
|
|
294
|
+
- **Multiplayer game**: don't pause world; show menu over live game with semi-transparency.
|
|
295
|
+
- **Network disconnect mid-menu**: handle gracefully; usually return to title.
|
|
296
|
+
- **Multiple menus stacked** (settings → audio submenu): manage stack; `B` / Esc pops stack one level.
|
|
297
|
+
- **Controller disconnect**: fall back to keyboard prompts; alert player.
|
|
298
|
+
- **Cross-platform game**: detect controller type and swap prompts; some games allow manual override.
|
|
299
|
+
- **Save/load mid-menu**: confirm before allowing destructive actions.
|
|
300
|
+
- **Tab content lazy-load**: don't render all tabs at mount; load on activate.
|
|
301
|
+
|
|
302
|
+
## Korean game menu specifics
|
|
303
|
+
|
|
304
|
+
- 자막 toggle prominent (often top of accessibility).
|
|
305
|
+
- 본인인증 button visible on account / login menus.
|
|
306
|
+
- 확률 표시 (probability) link from gacha menus.
|
|
307
|
+
- VIP / 출석 banners commonly integrated into main menu.
|
|
308
|
+
|
|
309
|
+
## Don't
|
|
310
|
+
|
|
311
|
+
- Don't hard-code one input type. Detect and swap.
|
|
312
|
+
- Don't break the back button. Esc / B should always work.
|
|
313
|
+
- Don't lock the player out of menu (must be openable any time game is running).
|
|
314
|
+
- Don't delay critical menus (settings) behind cinematics.
|
|
315
|
+
- Don't omit input prompts. Players need to know which buttons work.
|
|
316
|
+
- Don't use small touch targets (< 44pt) on mobile.
|
|
317
|
+
- Don't auto-pause in multiplayer.
|
|
318
|
+
- Don't make settings unsearchable past 50 items.
|
|
319
|
+
|
|
320
|
+
## Cross-reference
|
|
321
|
+
|
|
322
|
+
- [`knowledge/game-ui/menu-systems.md`](../knowledge/game-ui/menu-systems.md) — menu types
|
|
323
|
+
- [`knowledge/game-ui/game-ui-fundamentals.md`](../knowledge/game-ui/game-ui-fundamentals.md) — input methods
|
|
324
|
+
- [`knowledge/game-ui/game-accessibility.md`](../knowledge/game-ui/game-accessibility.md) — a11y
|
|
325
|
+
- [`knowledge/game-ui/korean-gaming-conventions.md`](../knowledge/game-ui/korean-gaming-conventions.md) — KR
|
|
326
|
+
- [`examples/component-game-hud.md`](component-game-hud.md) — HUD primitive
|
|
327
|
+
- [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md) — focus management
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# `Grid` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from Ant Design `Grid` (Row + Col) and MUI `Grid` (v2). Two-dimensional layout primitive — rows + columns with gap. Use for responsive multi-column layouts.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Multi-column layouts (3-up feature grids, 2-col forms, dashboards).
|
|
8
|
+
- Responsive layouts that change column count by breakpoint.
|
|
9
|
+
- Anywhere CSS Grid is the right tool and you want a system primitive.
|
|
10
|
+
|
|
11
|
+
When NOT to use:
|
|
12
|
+
- Single direction (row OR column with consistent gap) — use `Flex` / `Stack`.
|
|
13
|
+
- Pinterest-style varying heights — use `Masonry`.
|
|
14
|
+
- Tabular data — use `Table`.
|
|
15
|
+
|
|
16
|
+
## API — Ant style (Row + Col)
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
<Row gutter={[16, 16]}>
|
|
20
|
+
<Col xs={24} sm={12} lg={8}>
|
|
21
|
+
<Card>Item 1</Card>
|
|
22
|
+
</Col>
|
|
23
|
+
<Col xs={24} sm={12} lg={8}>
|
|
24
|
+
<Card>Item 2</Card>
|
|
25
|
+
</Col>
|
|
26
|
+
<Col xs={24} sm={12} lg={8}>
|
|
27
|
+
<Card>Item 3</Card>
|
|
28
|
+
</Col>
|
|
29
|
+
</Row>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
24-column grid (Ant's default). Each `<Col>` specifies span per breakpoint.
|
|
33
|
+
|
|
34
|
+
## API — MUI v2 style
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<Grid container spacing={2}>
|
|
38
|
+
<Grid xs={12} sm={6} lg={4}>
|
|
39
|
+
<Card>Item 1</Card>
|
|
40
|
+
</Grid>
|
|
41
|
+
<Grid xs={12} sm={6} lg={4}>
|
|
42
|
+
<Card>Item 2</Card>
|
|
43
|
+
</Grid>
|
|
44
|
+
<Grid xs={12} sm={6} lg={4}>
|
|
45
|
+
<Card>Item 3</Card>
|
|
46
|
+
</Grid>
|
|
47
|
+
</Grid>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
12-column grid. Same idea.
|
|
51
|
+
|
|
52
|
+
## API — modern CSS Grid wrapper
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<Grid columns={{ mobile: 1, tablet: 2, desktop: 3 }} gap={4}>
|
|
56
|
+
<Card>Item 1</Card>
|
|
57
|
+
<Card>Item 2</Card>
|
|
58
|
+
<Card>Item 3</Card>
|
|
59
|
+
</Grid>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Simpler if your design system doesn't need fractional column spans (most don't).
|
|
63
|
+
|
|
64
|
+
## States
|
|
65
|
+
|
|
66
|
+
Stateless.
|
|
67
|
+
|
|
68
|
+
## Tokens consumed
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
--breakpoint-mobile / -tablet / -desktop / -wide
|
|
72
|
+
--space-{0..n} (gap)
|
|
73
|
+
--grid-columns (system grid count: 12 or 24)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Common layouts
|
|
77
|
+
|
|
78
|
+
### 3-up cards, responsive
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
<Grid columns={{ mobile: 1, tablet: 2, desktop: 3 }} gap={6}>
|
|
82
|
+
{features.map(f => <FeatureCard key={f.id} {...f} />)}
|
|
83
|
+
</Grid>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Sidebar + content (asymmetric)
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
<Grid columns="240px 1fr" gap={4}>
|
|
90
|
+
<aside>Sidebar</aside>
|
|
91
|
+
<main>Content</main>
|
|
92
|
+
</Grid>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
(Pass through to CSS `grid-template-columns` for non-system-grid cases.)
|
|
96
|
+
|
|
97
|
+
### Form (2-column)
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
<Grid columns={{ mobile: 1, tablet: 2 }} gap={4}>
|
|
101
|
+
<Field>
|
|
102
|
+
<Label>First name</Label>
|
|
103
|
+
<Input />
|
|
104
|
+
</Field>
|
|
105
|
+
<Field>
|
|
106
|
+
<Label>Last name</Label>
|
|
107
|
+
<Input />
|
|
108
|
+
</Field>
|
|
109
|
+
<Field span={2}> {/* full-width on tablet+ */}
|
|
110
|
+
<Label>Address</Label>
|
|
111
|
+
<Input />
|
|
112
|
+
</Field>
|
|
113
|
+
</Grid>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Accessibility
|
|
117
|
+
|
|
118
|
+
- Grid is presentational. Source order = reading order; ensure DOM matches the intended reading order.
|
|
119
|
+
- Don't use CSS Grid `grid-row` / `grid-column` to visually re-order if it breaks reading. Screen readers read DOM.
|
|
120
|
+
- For responsive collapses: ensure mobile single-column doesn't break content priority.
|
|
121
|
+
|
|
122
|
+
## Don't
|
|
123
|
+
|
|
124
|
+
- Don't use Grid for single-row toolbars. Use Flex.
|
|
125
|
+
- Don't reorder content via `order` / `grid-area` such that DOM != reading order.
|
|
126
|
+
- Don't nest Grids 4+ levels — refactor to a single grid or use components.
|
|
127
|
+
- Don't hard-code pixel widths in Grid spans. Use the column system OR fractions.
|
|
128
|
+
|
|
129
|
+
## References
|
|
130
|
+
|
|
131
|
+
- Ant: [`Grid`](../refs/ant-design/components/grid) (Row + Col, 24-col)
|
|
132
|
+
- MUI: [`Grid`](../refs/mui/packages/mui-material/src/Grid) (12-col)
|
|
133
|
+
- CSS Grid Level 1 / 2
|
|
134
|
+
|
|
135
|
+
## Cross-reference
|
|
136
|
+
|
|
137
|
+
- [`examples/component-flex.md`](component-flex.md) — single-direction
|
|
138
|
+
- [`examples/component-masonry.md`](component-masonry.md) — varied-height
|
|
139
|
+
- [`examples/component-feature-grid.md`](component-feature-grid.md) — opinionated 3-up wrapper
|
|
140
|
+
- [`knowledge/layout/spacing-and-grid.md`](../knowledge/layout/spacing-and-grid.md)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# `Grow` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `Grow`. Scale + fade transition — element grows from a transform origin point. Used for menus, popovers, tooltips that should appear "from" their anchor.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Menus / popovers anchored to a button.
|
|
8
|
+
- Tooltips with a discoverable origin.
|
|
9
|
+
- Cards that emerge from a "+" floating action button.
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<Grow in={open} style={{ transformOrigin: '0 0 0' }} timeout={200}>
|
|
15
|
+
<Paper>Menu items</Paper>
|
|
16
|
+
</Grow>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Description |
|
|
20
|
+
| --- | --- | --- | --- |
|
|
21
|
+
| `in` | `boolean` | required | Trigger enter/exit |
|
|
22
|
+
| `timeout` | `number \| 'auto' \| { enter, exit }` | `'auto'` | `'auto'` computes from element size |
|
|
23
|
+
| `easing` | `string \| { enter, exit }` | theme default | CSS easing |
|
|
24
|
+
| `mountOnEnter` | `boolean` | `false` | |
|
|
25
|
+
| `unmountOnExit` | `boolean` | `false` | |
|
|
26
|
+
| `style` | `CSSProperties` | — | Set `transformOrigin` to control where it grows from |
|
|
27
|
+
|
|
28
|
+
## Tokens consumed
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
--motion-duration-auto
|
|
32
|
+
--motion-easing-out
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Accessibility
|
|
36
|
+
|
|
37
|
+
- Same as `Fade`: respects `prefers-reduced-motion`.
|
|
38
|
+
- For menus, ensure focus moves into the menu after enter (auto via `MenuList autoFocusItem`).
|
|
39
|
+
|
|
40
|
+
## Edge cases
|
|
41
|
+
|
|
42
|
+
- **transformOrigin missing** — defaults to center. For menus anchored top-left, set `transformOrigin: '0 0 0'`. For floating-action menus, `'100% 100%'`.
|
|
43
|
+
- **`timeout='auto'`** — MUI computes duration from element height (longer for taller). Good default; override only for tight UI.
|
|
44
|
+
|
|
45
|
+
## Code example
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<Popper open={open} anchorEl={anchorEl} transition placement="bottom-start">
|
|
49
|
+
{({ TransitionProps }) => (
|
|
50
|
+
<Grow {...TransitionProps} style={{ transformOrigin: '0 0 0' }}>
|
|
51
|
+
<Paper>
|
|
52
|
+
<ClickAwayListener onClickAway={handleClose}>
|
|
53
|
+
<MenuList autoFocusItem>
|
|
54
|
+
<MenuItem>편집</MenuItem>
|
|
55
|
+
<MenuItem>삭제</MenuItem>
|
|
56
|
+
</MenuList>
|
|
57
|
+
</ClickAwayListener>
|
|
58
|
+
</Paper>
|
|
59
|
+
</Grow>
|
|
60
|
+
)}
|
|
61
|
+
</Popper>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Don't
|
|
65
|
+
|
|
66
|
+
- Don't grow from `center` for menus — feels detached from the anchor.
|
|
67
|
+
- Don't combine with `Slide` on the same element — pick one direction of motion.
|
|
68
|
+
|
|
69
|
+
## References
|
|
70
|
+
|
|
71
|
+
- MUI: [`Grow`](../refs/mui/packages/mui-material/src/Grow/)
|
|
72
|
+
|
|
73
|
+
## Cross-reference
|
|
74
|
+
|
|
75
|
+
- [`component-fade.md`](component-fade.md)
|
|
76
|
+
- [`component-slide.md`](component-slide.md)
|
|
77
|
+
- [`component-zoom.md`](component-zoom.md)
|
|
78
|
+
- [`component-popper.md`](component-popper.md)
|
|
79
|
+
- [`knowledge/motion/principles.md`](../knowledge/motion/principles.md)
|