@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,291 @@
|
|
|
1
|
+
# `Form` — spec
|
|
2
|
+
|
|
3
|
+
> Status: example artifact. The Form is a *composition pattern*, not a single component — it specs how Input/Select/Checkbox/etc. compose into a coherent form.
|
|
4
|
+
> Generated by: `skills/component-spec-writer`, citing Ant Design `Form`, MUI form patterns, shadcn-ui `react-hook-form` integration
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
A Form coordinates multiple inputs into a single submission. It owns: layout, label/error wiring, validation orchestration, submission state, and progressive disclosure. Get this wrong and every individual input feels disconnected.
|
|
9
|
+
|
|
10
|
+
## When this is a Form vs. just inputs
|
|
11
|
+
|
|
12
|
+
| Use Form | Use loose inputs |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| Submission to a server with success/error | A single search input |
|
|
15
|
+
| Coordinated validation across fields (e.g., password match) | Independent settings toggles |
|
|
16
|
+
| Multi-step | Inline edit on a profile page |
|
|
17
|
+
| Required validation + "save changes" gate | Filter inputs that update results in real-time |
|
|
18
|
+
|
|
19
|
+
## Composition
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
<Form onSubmit={handleSubmit}>
|
|
23
|
+
<Form.Field name="email">
|
|
24
|
+
<Form.Label>Email</Form.Label>
|
|
25
|
+
<Form.Control>
|
|
26
|
+
<Input type="email" />
|
|
27
|
+
</Form.Control>
|
|
28
|
+
<Form.HelpText>We'll only use for password recovery.</Form.HelpText>
|
|
29
|
+
<Form.ErrorText />
|
|
30
|
+
</Form.Field>
|
|
31
|
+
|
|
32
|
+
<Form.Field name="password" required>
|
|
33
|
+
<Form.Label>Password</Form.Label>
|
|
34
|
+
<Form.Control>
|
|
35
|
+
<Input type="password" />
|
|
36
|
+
</Form.Control>
|
|
37
|
+
<Form.ErrorText />
|
|
38
|
+
</Form.Field>
|
|
39
|
+
|
|
40
|
+
<Form.Footer>
|
|
41
|
+
<Button type="submit" loading={form.formState.isSubmitting}>
|
|
42
|
+
Sign in
|
|
43
|
+
</Button>
|
|
44
|
+
</Form.Footer>
|
|
45
|
+
</Form>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| Slot | Required | Notes |
|
|
49
|
+
| --- | --- | --- |
|
|
50
|
+
| `Form` | yes | Owns the state, validation, submission |
|
|
51
|
+
| `Form.Field` | for each input | Wraps one logical field. Wires id/aria automatically. |
|
|
52
|
+
| `Form.Label` | yes | Visible label, `htmlFor` auto-set |
|
|
53
|
+
| `Form.Control` | yes | Slot for the actual input element |
|
|
54
|
+
| `Form.HelpText` | optional | Below-input hint |
|
|
55
|
+
| `Form.ErrorText` | yes | Below-input error (replaces help text on error) |
|
|
56
|
+
| `Form.Footer` | usual | Submit/cancel buttons |
|
|
57
|
+
| `Form.Section` | optional | Logical group of fields with a heading |
|
|
58
|
+
|
|
59
|
+
## API
|
|
60
|
+
|
|
61
|
+
### `<Form>` props
|
|
62
|
+
|
|
63
|
+
| Prop | Type | Default | Description |
|
|
64
|
+
| --- | --- | --- | --- |
|
|
65
|
+
| `onSubmit` | `(values: T, e: FormEvent) => void \| Promise<void>` | — | Called with validated values. If returns a Promise, form is in `submitting` state until it resolves. |
|
|
66
|
+
| `defaultValues` | `Partial<T>` | `{}` | Initial values for uncontrolled fields. |
|
|
67
|
+
| `validate` | `(values: T) => Errors \| Promise<Errors>` | — | Custom validator. Use Zod schema for the typical case. |
|
|
68
|
+
| `schema` | `ZodSchema<T>` | — | Zod schema. Auto-validates per field on blur and on submit. |
|
|
69
|
+
| `mode` | `"onSubmit" \| "onBlur" \| "onChange" \| "all"` | `"onBlur"` | When to validate. |
|
|
70
|
+
| `onError` | `(errors: Errors) => void` | — | Called when validation fails on submit. |
|
|
71
|
+
|
|
72
|
+
### `<Form.Field>` props
|
|
73
|
+
|
|
74
|
+
| Prop | Type | Default | Description |
|
|
75
|
+
| --- | --- | --- | --- |
|
|
76
|
+
| `name` | `string` | — | Required. The key in the form values object. Supports dotted paths (`address.city`). |
|
|
77
|
+
| `required` | `boolean` | `false` | Marks visually + sets `aria-required`. |
|
|
78
|
+
| `disabled` | `boolean` | `false` | Disables the input AND its label/help styling. |
|
|
79
|
+
|
|
80
|
+
## Layout
|
|
81
|
+
|
|
82
|
+
### Single-column rule
|
|
83
|
+
|
|
84
|
+
See [knowledge/patterns/form-design.md](../knowledge/patterns/form-design.md) — single-column over multi-column unless the fields are genuine pairs.
|
|
85
|
+
|
|
86
|
+
### Sections
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
<Form>
|
|
90
|
+
<Form.Section title="Contact">
|
|
91
|
+
<Form.Field name="email">...</Form.Field>
|
|
92
|
+
<Form.Field name="phone">...</Form.Field>
|
|
93
|
+
</Form.Section>
|
|
94
|
+
<Form.Section title="Shipping address">
|
|
95
|
+
<Form.Field name="address">...</Form.Field>
|
|
96
|
+
<Form.Field name="postalCode">...</Form.Field>
|
|
97
|
+
</Form.Section>
|
|
98
|
+
</Form>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
`Section` renders a `<fieldset>` with `<legend>` for accessibility. Visual: heading + thin divider above, no heavy box.
|
|
102
|
+
|
|
103
|
+
### Spacing
|
|
104
|
+
|
|
105
|
+
- Between fields: `--space-base` (16px)
|
|
106
|
+
- Between sections: `--space-2xl` (32px)
|
|
107
|
+
- Field internal vertical (label → input → help): `--space-xs` (4px)
|
|
108
|
+
|
|
109
|
+
## Validation orchestration
|
|
110
|
+
|
|
111
|
+
Use `react-hook-form` + `zod` (this is the modern de facto standard; both Ant and shadcn ecosystems converge here). MUI's `react-hook-form` adapter is well-maintained too.
|
|
112
|
+
|
|
113
|
+
### Schema pattern (recommended)
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
import { z } from "zod";
|
|
117
|
+
import { useForm } from "react-hook-form";
|
|
118
|
+
import { zodResolver } from "@hookform/resolvers/zod";
|
|
119
|
+
|
|
120
|
+
const schema = z.object({
|
|
121
|
+
email: z.string().email("올바른 이메일 형식이 아닙니다"),
|
|
122
|
+
password: z.string().min(8, "8자 이상 입력해 주세요"),
|
|
123
|
+
agreeToTerms: z.literal(true, { errorMap: () => ({ message: "약관 동의가 필요합니다" }) }),
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
type FormValues = z.infer<typeof schema>;
|
|
127
|
+
|
|
128
|
+
function SignupForm() {
|
|
129
|
+
const form = useForm<FormValues>({
|
|
130
|
+
resolver: zodResolver(schema),
|
|
131
|
+
mode: "onBlur",
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const onSubmit = async (values: FormValues) => {
|
|
135
|
+
await api.signup(values);
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
return <Form form={form} onSubmit={onSubmit}>...</Form>;
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Validation timing matrix
|
|
143
|
+
|
|
144
|
+
| Trigger | What |
|
|
145
|
+
| --- | --- |
|
|
146
|
+
| User typing | Format only, no errors |
|
|
147
|
+
| User leaves field (blur) | Validate that field. If error, show. |
|
|
148
|
+
| User returns to errored field, types | Validate on every keystroke (live correction) |
|
|
149
|
+
| User submits | Validate all fields. Set focus to first errored field. |
|
|
150
|
+
|
|
151
|
+
### Cross-field validation
|
|
152
|
+
|
|
153
|
+
Password confirmation, date range, conditional required:
|
|
154
|
+
|
|
155
|
+
```tsx
|
|
156
|
+
const schema = z.object({
|
|
157
|
+
password: z.string().min(8),
|
|
158
|
+
passwordConfirm: z.string(),
|
|
159
|
+
}).refine((data) => data.password === data.passwordConfirm, {
|
|
160
|
+
message: "비밀번호가 일치하지 않습니다",
|
|
161
|
+
path: ["passwordConfirm"],
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
But also: skip the password-confirm field entirely. See `knowledge/patterns/form-design.md` Don'ts.
|
|
166
|
+
|
|
167
|
+
## Submission states
|
|
168
|
+
|
|
169
|
+
| State | Trigger | UI |
|
|
170
|
+
| --- | --- | --- |
|
|
171
|
+
| Idle | resting | Submit enabled |
|
|
172
|
+
| Validating (async) | username availability check | Field-level spinner |
|
|
173
|
+
| Submitting | onSubmit runs (Promise pending) | Submit button: `loading=true, disabled=true`. All inputs disabled. |
|
|
174
|
+
| Success | Promise resolved | Toast "저장되었습니다", optionally navigate or close form |
|
|
175
|
+
| Error | Promise rejected | Toast or inline error at top of form. Inputs re-enabled. |
|
|
176
|
+
|
|
177
|
+
### Server-side errors mapping
|
|
178
|
+
|
|
179
|
+
```tsx
|
|
180
|
+
try {
|
|
181
|
+
await api.signup(values);
|
|
182
|
+
} catch (err) {
|
|
183
|
+
if (err.code === "EMAIL_ALREADY_EXISTS") {
|
|
184
|
+
form.setError("email", { message: "이미 가입된 이메일입니다" });
|
|
185
|
+
form.setFocus("email");
|
|
186
|
+
} else {
|
|
187
|
+
toast.error("저장에 실패했습니다", { description: err.message });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Map server errors to specific fields when possible. Generic toast only for non-field-specific failures.
|
|
193
|
+
|
|
194
|
+
## Multi-step forms
|
|
195
|
+
|
|
196
|
+
For 8+ fields with logical grouping:
|
|
197
|
+
|
|
198
|
+
```tsx
|
|
199
|
+
<Form schema={fullSchema} defaultValues={values}>
|
|
200
|
+
<Form.Steps>
|
|
201
|
+
<Form.Step title="Account">
|
|
202
|
+
<Form.Field name="email">...</Form.Field>
|
|
203
|
+
<Form.Field name="password">...</Form.Field>
|
|
204
|
+
</Form.Step>
|
|
205
|
+
<Form.Step title="Profile">
|
|
206
|
+
<Form.Field name="name">...</Form.Field>
|
|
207
|
+
<Form.Field name="phone">...</Form.Field>
|
|
208
|
+
</Form.Step>
|
|
209
|
+
<Form.Step title="Preferences">
|
|
210
|
+
<Form.Field name="locale">...</Form.Field>
|
|
211
|
+
</Form.Step>
|
|
212
|
+
</Form.Steps>
|
|
213
|
+
<Form.Footer>
|
|
214
|
+
<Form.PrevButton>Back</Form.PrevButton>
|
|
215
|
+
<Form.NextButton>Next</Form.NextButton>
|
|
216
|
+
<Form.SubmitButton>Sign up</Form.SubmitButton>
|
|
217
|
+
</Form.Footer>
|
|
218
|
+
</Form>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Required affordances:
|
|
222
|
+
- Progress indicator: dots, numbered steps, or progress bar at top
|
|
223
|
+
- Per-step validation: can't advance with errors
|
|
224
|
+
- Back button: always available except on first step
|
|
225
|
+
- Save progress: persist `defaultValues` to localStorage on every blur
|
|
226
|
+
- Don't reset on back navigation
|
|
227
|
+
|
|
228
|
+
## Accessibility
|
|
229
|
+
|
|
230
|
+
- `<form>` element wraps; `<button type="submit">` triggers
|
|
231
|
+
- Each `Form.Field` auto-wires:
|
|
232
|
+
- `id` on input
|
|
233
|
+
- `<label htmlFor>` on label
|
|
234
|
+
- `aria-describedby` to HelpText id
|
|
235
|
+
- `aria-invalid="true"` on error
|
|
236
|
+
- `aria-describedby` extends to ErrorText id when error
|
|
237
|
+
- `aria-required="true"` when `required`
|
|
238
|
+
- ErrorText in `role="alert"` for assertive announcement
|
|
239
|
+
- On submit-fail: focus moves to first errored field
|
|
240
|
+
- Form-level errors (e.g., "Network error") announced via `role="status"` or `aria-live="polite"` region
|
|
241
|
+
- For long forms: provide an in-form error summary at top with anchor links to each field
|
|
242
|
+
|
|
243
|
+
## Tokens consumed
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
--space-xs (label → input gap)
|
|
247
|
+
--space-base (between fields)
|
|
248
|
+
--space-2xl (between sections)
|
|
249
|
+
--color-error (error states)
|
|
250
|
+
--color-text-secondary (help text)
|
|
251
|
+
--color-text-tertiary (optional indicator)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
(Plus all tokens consumed by Input, Select, etc. via the `Form.Control` slot.)
|
|
255
|
+
|
|
256
|
+
## Edge cases
|
|
257
|
+
|
|
258
|
+
- **Browser autofill conflict with controlled state**: react-hook-form handles this via `register`, but Controller-based fields need `setValue` on autofill events. Test with 1Password.
|
|
259
|
+
- **Form inside Modal**: focus on first field on modal open (not close button). On submit-fail, ensure error focus stays inside modal.
|
|
260
|
+
- **iOS keyboard pushing submit button off-screen**: see [knowledge/platforms/react-native.md](../knowledge/platforms/react-native.md) keyboard handling. Web: scroll-into-view on focus + sticky footer.
|
|
261
|
+
- **Pasting whole "Name Address Phone" into one field**: not Form's job to split — but offer help text "이름, 주소, 연락처를 따로 입력해 주세요" if you anticipate this.
|
|
262
|
+
- **Korean IME composition**: don't validate during composition. Listen to `compositionstart`/`end`.
|
|
263
|
+
- **Optimistic update**: for "save profile name" with server save in background — update UI immediately, queue server call, surface error if server rejects (rare).
|
|
264
|
+
|
|
265
|
+
## Don't
|
|
266
|
+
|
|
267
|
+
- Don't disable submit until all fields valid. Show errors specifically — see [knowledge/patterns/form-design.md](../knowledge/patterns/form-design.md).
|
|
268
|
+
- Don't validate on every keystroke before user has tried. Wait for blur.
|
|
269
|
+
- Don't show server-side errors as global toast when they're field-specific.
|
|
270
|
+
- Don't lose progress when user navigates back from a step.
|
|
271
|
+
- Don't ship a confirm-email or confirm-password field. Use show/hide toggle and a verification email instead.
|
|
272
|
+
|
|
273
|
+
## References
|
|
274
|
+
|
|
275
|
+
- Ant Design: [`refs/ant-design/components/form/`](../refs/ant-design/components/form/) — exhaustive `Form`, `Form.Item`, `Form.List`, `Form.Provider`. Most complete API. Built-in validation rules. Ant's `Form.useForm` is the imperative escape hatch.
|
|
276
|
+
- MUI: composition with `<form>` + `react-hook-form` + `<TextField>`. No dedicated Form component — MUI explicitly defers form orchestration to RHF.
|
|
277
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/) — `form.tsx` wraps RHF `FormProvider` + `Controller` + auto-wires `aria-*`. Cleanest minimal version. Mandates Zod + RHF.
|
|
278
|
+
|
|
279
|
+
API choices made:
|
|
280
|
+
- **Composition (`Form.Field`/`Form.Label`/`Form.Control`)** over Ant's `Form.Item` prop-blob — slot-based scales to custom field types better.
|
|
281
|
+
- **`schema` prop accepting a Zod schema** as the default validator — modern teams converge here. Custom `validate` is the escape hatch.
|
|
282
|
+
- **`mode="onBlur"` default**, not `onChange`. Less anxiety-inducing during typing.
|
|
283
|
+
- **Auto-wires aria-***: matches shadcn's pattern, removes the most-skipped a11y wiring.
|
|
284
|
+
- **`Form.Steps` for multi-step** rather than a separate `<Wizard>` component — keeps validation/state co-located.
|
|
285
|
+
|
|
286
|
+
## Cross-reference
|
|
287
|
+
|
|
288
|
+
- [knowledge/patterns/form-design.md](../knowledge/patterns/form-design.md) — patterns this spec implements
|
|
289
|
+
- [examples/component-input.md](component-input.md) — what goes inside `Form.Control`
|
|
290
|
+
- [knowledge/i18n/korean-product-conventions.md](../knowledge/i18n/korean-product-conventions.md) — Korean form expectations (address, phone, marketing consent)
|
|
291
|
+
- [knowledge/a11y/keyboard-and-focus.md](../knowledge/a11y/keyboard-and-focus.md) — focus on submit-fail
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
# `GameHUD` (custom — composable in-game heads-up display) — spec
|
|
3
|
+
|
|
4
|
+
> Composable HUD shell with slots for health / resources / mini-map / cooldowns / notifications. Genre-agnostic; configure via slot composition. Pairs with [`knowledge/game-ui/hud-design.md`](../knowledge/game-ui/hud-design.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Game HUDs are typically hand-coded per game; cross-genre reuse rare. But within a single game's surfaces (story mode + multiplayer + practice), HUD elements should share a primitive layer.
|
|
9
|
+
|
|
10
|
+
`GameHUD` provides:
|
|
11
|
+
1. **Slot-based composition** — drop elements into anchored regions.
|
|
12
|
+
2. **Customization layer** — players reposition / hide.
|
|
13
|
+
3. **Reduced-motion respect**.
|
|
14
|
+
4. **Color-blind / contrast modes**.
|
|
15
|
+
5. **UI scale** option.
|
|
16
|
+
6. **Cross-platform input awareness** (PC keys / controller buttons).
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌──────────────────────────────────────────┐
|
|
22
|
+
│ [top-left] [top-right] │ ← anchored slots
|
|
23
|
+
│ │
|
|
24
|
+
│ │
|
|
25
|
+
│ │
|
|
26
|
+
│ [center-overlay] │ ← e.g., crosshair, prompts
|
|
27
|
+
│ │
|
|
28
|
+
│ │
|
|
29
|
+
│ │
|
|
30
|
+
│ [bottom-left] [bottom-right] │
|
|
31
|
+
│ [bottom-center] │
|
|
32
|
+
└──────────────────────────────────────────┘
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Nine anchored regions: 4 corners + 4 sides + 1 center. Each accepts ReactNode children.
|
|
36
|
+
|
|
37
|
+
## API
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
<GameHUD
|
|
41
|
+
scale={uiScale}
|
|
42
|
+
reduceMotion={a11y.reduceMotion}
|
|
43
|
+
colorBlindMode={a11y.colorBlindMode}
|
|
44
|
+
contrastMode={a11y.contrastMode}
|
|
45
|
+
inputType={inputType} // "keyboard" | "controller-xbox" | "controller-ps" | "touch"
|
|
46
|
+
>
|
|
47
|
+
<HUDSlot anchor="bottom-left">
|
|
48
|
+
<PlayerFrame />
|
|
49
|
+
<Buffs />
|
|
50
|
+
</HUDSlot>
|
|
51
|
+
|
|
52
|
+
<HUDSlot anchor="bottom-center">
|
|
53
|
+
<Hotbar slots={9} />
|
|
54
|
+
</HUDSlot>
|
|
55
|
+
|
|
56
|
+
<HUDSlot anchor="top-right">
|
|
57
|
+
<MiniMap />
|
|
58
|
+
<QuestTracker />
|
|
59
|
+
</HUDSlot>
|
|
60
|
+
|
|
61
|
+
<HUDSlot anchor="bottom-right">
|
|
62
|
+
<CombatLog />
|
|
63
|
+
</HUDSlot>
|
|
64
|
+
|
|
65
|
+
<HUDSlot anchor="center-overlay">
|
|
66
|
+
<Crosshair />
|
|
67
|
+
</HUDSlot>
|
|
68
|
+
</GameHUD>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
| Prop | Type | Default | Description |
|
|
72
|
+
| --- | --- | --- | --- |
|
|
73
|
+
| `scale` | `number` | `1.0` | UI scale (0.5-2.0) |
|
|
74
|
+
| `reduceMotion` | `boolean` | system pref | Disable HUD animations |
|
|
75
|
+
| `colorBlindMode` | `"none" \| "protanopia" \| "deuteranopia" \| "tritanopia"` | `"none"` | CSS filter applied |
|
|
76
|
+
| `contrastMode` | `"normal" \| "high"` | `"normal"` | High-contrast theme |
|
|
77
|
+
| `inputType` | `"keyboard" \| "controller-xbox" \| "controller-ps" \| "touch"` | auto-detect | Determines button prompts |
|
|
78
|
+
| `customizable` | `boolean` | `true` | Enable player drag-positioning |
|
|
79
|
+
| `editing` | `boolean` | `false` | Edit mode (drag handles visible) |
|
|
80
|
+
| `children` | `HUDSlot[]` | — | Composed slot content |
|
|
81
|
+
|
|
82
|
+
## HUDSlot
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
<HUDSlot
|
|
86
|
+
anchor="bottom-left"
|
|
87
|
+
offset={{ x: 16, y: 16 }}
|
|
88
|
+
hidden={false}
|
|
89
|
+
customId="player-frame-cluster" // for save/restore
|
|
90
|
+
>
|
|
91
|
+
{children}
|
|
92
|
+
</HUDSlot>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Element primitives (ship with HUD)
|
|
96
|
+
|
|
97
|
+
### HealthBar
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
<HealthBar
|
|
101
|
+
current={hp}
|
|
102
|
+
max={maxHp}
|
|
103
|
+
showNumbers
|
|
104
|
+
damageDelay={300} // ms before bar drops to new value
|
|
105
|
+
recentDamage // shows secondary bar for last hit
|
|
106
|
+
criticalThreshold={0.25} // <25% pulses
|
|
107
|
+
segmented={false} // Zelda-hearts style if true
|
|
108
|
+
/>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### ResourceCounter (ammo / mana / etc.)
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
<ResourceCounter
|
|
115
|
+
icon={<AmmoIcon />}
|
|
116
|
+
current={30}
|
|
117
|
+
reserve={120}
|
|
118
|
+
format="X / Y" // or "X" or "X•Y"
|
|
119
|
+
outOfState="reload" // changes display when 0
|
|
120
|
+
/>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Crosshair
|
|
124
|
+
|
|
125
|
+
```tsx
|
|
126
|
+
<Crosshair
|
|
127
|
+
shape="dot" // "dot" | "plus" | "T" | "custom"
|
|
128
|
+
color="#FFFF00"
|
|
129
|
+
size={4}
|
|
130
|
+
spread={recoilSpread} // dynamic spread
|
|
131
|
+
hitMarker={lastHit}
|
|
132
|
+
/>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### MiniMap
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
<MiniMap
|
|
139
|
+
rotation="follow-player" // or "fixed-north"
|
|
140
|
+
size={200}
|
|
141
|
+
zoom={zoomLevel}
|
|
142
|
+
markers={[
|
|
143
|
+
{ type: "ally", x, y },
|
|
144
|
+
{ type: "enemy", x, y, visible: true },
|
|
145
|
+
{ type: "objective", x, y },
|
|
146
|
+
]}
|
|
147
|
+
/>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Hotbar
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
<Hotbar
|
|
154
|
+
slots={9}
|
|
155
|
+
bindings={{ 1: skillId, 2: skillId, ... }}
|
|
156
|
+
inputType={inputType} // shows 1-9 keys or button icons
|
|
157
|
+
cooldowns={cooldownState}
|
|
158
|
+
/>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Buffs
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
<Buffs
|
|
165
|
+
active={[
|
|
166
|
+
{ id, icon, durationMs, stacks, type: "buff" | "debuff" },
|
|
167
|
+
...
|
|
168
|
+
]}
|
|
169
|
+
layout="horizontal"
|
|
170
|
+
showTimer
|
|
171
|
+
/>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### CombatNotification
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
<DamageNumber value={150} type="normal" />
|
|
178
|
+
<DamageNumber value={320} type="critical" />
|
|
179
|
+
<HealNumber value={84} />
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Float up + fade.
|
|
183
|
+
|
|
184
|
+
## States
|
|
185
|
+
|
|
186
|
+
| State | Visual |
|
|
187
|
+
| --- | --- |
|
|
188
|
+
| Default | All anchored slots visible |
|
|
189
|
+
| Editing | Drag handles + reset positions visible |
|
|
190
|
+
| Reduced motion | All slot animations frozen |
|
|
191
|
+
| High contrast | Adjusted colors / borders |
|
|
192
|
+
| Color-blind filter | CSS filter on whole HUD |
|
|
193
|
+
| Hidden by player | Element-by-element hide via settings |
|
|
194
|
+
|
|
195
|
+
## Tokens consumed
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
--game-hud-scale (multiplier on all sizes)
|
|
199
|
+
--game-hud-bg-overlay (semi-opaque slot bg)
|
|
200
|
+
--game-hud-fg-default (default text)
|
|
201
|
+
--game-hud-fg-emphasis (highlights)
|
|
202
|
+
--game-hud-color-hp-full (green)
|
|
203
|
+
--game-hud-color-hp-mid (yellow)
|
|
204
|
+
--game-hud-color-hp-low (red)
|
|
205
|
+
--game-hud-color-hp-critical (deep red, pulses)
|
|
206
|
+
--game-hud-color-mana (blue)
|
|
207
|
+
--game-hud-color-stamina (yellow)
|
|
208
|
+
--game-hud-color-shield (cyan)
|
|
209
|
+
--game-hud-color-buff (green tint)
|
|
210
|
+
--game-hud-color-debuff (red tint)
|
|
211
|
+
--game-hud-color-ally (blue)
|
|
212
|
+
--game-hud-color-enemy (red)
|
|
213
|
+
--game-hud-color-rare (blue)
|
|
214
|
+
--game-hud-color-epic (purple)
|
|
215
|
+
--game-hud-color-legendary (orange / gold)
|
|
216
|
+
--game-hud-font-numbers (tabular numerals; tnum)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Customization save/restore
|
|
220
|
+
|
|
221
|
+
Save customization state per profile:
|
|
222
|
+
|
|
223
|
+
```ts
|
|
224
|
+
type HUDProfile = {
|
|
225
|
+
scale: number;
|
|
226
|
+
slots: { [slotId: string]: { x: number; y: number; hidden: boolean; scale?: number } };
|
|
227
|
+
contrastMode: "normal" | "high";
|
|
228
|
+
colorBlindMode: ColorBlindMode;
|
|
229
|
+
reduceMotion: boolean;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
// Persist to local storage, sync to cloud save
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Default presets:
|
|
236
|
+
- **Minimal** — all hide except health + crosshair.
|
|
237
|
+
- **Standard** — default layout.
|
|
238
|
+
- **MMO** — dense layout with 3 hotbars.
|
|
239
|
+
- **High visibility** — large UI scale + high contrast.
|
|
240
|
+
|
|
241
|
+
## Accessibility
|
|
242
|
+
|
|
243
|
+
- **Subtitle channel** is in HUD overlay, but typically a separate component (`<SubtitleOverlay />`).
|
|
244
|
+
- **Visual sound indicators** can be added as a HUDSlot child.
|
|
245
|
+
- **Color-blind filter**: applied via CSS filter (`filter: contrast / saturate / hue-rotate`) — affects whole HUD.
|
|
246
|
+
- **High-contrast mode**: swaps color tokens to higher-contrast values.
|
|
247
|
+
- **UI scale 50-200%**: all sizes derive from `--game-hud-scale`.
|
|
248
|
+
- **Keyboard navigation** of HUD elements (tab between slots) for screen reader / motor accessibility.
|
|
249
|
+
|
|
250
|
+
## Implementation hints
|
|
251
|
+
|
|
252
|
+
```tsx
|
|
253
|
+
function GameHUD({
|
|
254
|
+
scale = 1,
|
|
255
|
+
reduceMotion,
|
|
256
|
+
colorBlindMode = "none",
|
|
257
|
+
contrastMode = "normal",
|
|
258
|
+
inputType = "auto",
|
|
259
|
+
customizable = true,
|
|
260
|
+
editing = false,
|
|
261
|
+
children,
|
|
262
|
+
}: Props) {
|
|
263
|
+
const detectedInput = useDetectedInputType();
|
|
264
|
+
const effectiveInput = inputType === "auto" ? detectedInput : inputType;
|
|
265
|
+
|
|
266
|
+
return (
|
|
267
|
+
<div
|
|
268
|
+
className="game-hud"
|
|
269
|
+
data-scale={scale}
|
|
270
|
+
data-reduce-motion={reduceMotion}
|
|
271
|
+
data-contrast={contrastMode}
|
|
272
|
+
data-color-blind={colorBlindMode}
|
|
273
|
+
data-input={effectiveInput}
|
|
274
|
+
data-editing={editing}
|
|
275
|
+
style={{ "--game-hud-scale": scale } as React.CSSProperties}
|
|
276
|
+
>
|
|
277
|
+
{children}
|
|
278
|
+
</div>
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function HUDSlot({ anchor, offset = { x: 0, y: 0 }, hidden, customId, children }: SlotProps) {
|
|
283
|
+
const customPos = useCustomPosition(customId);
|
|
284
|
+
if (hidden) return null;
|
|
285
|
+
|
|
286
|
+
return (
|
|
287
|
+
<div
|
|
288
|
+
className="game-hud__slot"
|
|
289
|
+
data-anchor={anchor}
|
|
290
|
+
style={{
|
|
291
|
+
...computeAnchor(anchor),
|
|
292
|
+
transform: customPos ? `translate(${customPos.x}px, ${customPos.y}px)` : `translate(${offset.x}px, ${offset.y}px)`,
|
|
293
|
+
}}
|
|
294
|
+
>
|
|
295
|
+
{children}
|
|
296
|
+
</div>
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## CSS
|
|
302
|
+
|
|
303
|
+
```css
|
|
304
|
+
.game-hud {
|
|
305
|
+
position: absolute;
|
|
306
|
+
inset: 0;
|
|
307
|
+
pointer-events: none;
|
|
308
|
+
font-feature-settings: 'tnum';
|
|
309
|
+
font-family: var(--game-hud-font, sans-serif);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.game-hud[data-color-blind="protanopia"] { filter: var(--cb-protanopia-filter); }
|
|
313
|
+
.game-hud[data-color-blind="deuteranopia"] { filter: var(--cb-deuteranopia-filter); }
|
|
314
|
+
.game-hud[data-color-blind="tritanopia"] { filter: var(--cb-tritanopia-filter); }
|
|
315
|
+
|
|
316
|
+
.game-hud[data-contrast="high"] { /* swap color tokens */ }
|
|
317
|
+
|
|
318
|
+
.game-hud__slot {
|
|
319
|
+
position: absolute;
|
|
320
|
+
pointer-events: auto;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.game-hud__slot[data-anchor="top-left"] { top: 0; left: 0; }
|
|
324
|
+
.game-hud__slot[data-anchor="top-right"] { top: 0; right: 0; }
|
|
325
|
+
.game-hud__slot[data-anchor="bottom-left"] { bottom: 0; left: 0; }
|
|
326
|
+
.game-hud__slot[data-anchor="bottom-right"] { bottom: 0; right: 0; }
|
|
327
|
+
.game-hud__slot[data-anchor="bottom-center"] { bottom: 0; left: 50%; transform: translateX(-50%); }
|
|
328
|
+
.game-hud__slot[data-anchor="center-overlay"] {
|
|
329
|
+
top: 50%; left: 50%; transform: translate(-50%, -50%);
|
|
330
|
+
pointer-events: none;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
@media (prefers-reduced-motion: reduce) {
|
|
334
|
+
.game-hud * { animation: none !important; transition: none !important; }
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Edge cases
|
|
339
|
+
|
|
340
|
+
- **Ultra-wide aspect ratios**: anchor to safe zones, not edge of screen.
|
|
341
|
+
- **Foldable devices**: re-anchor on display change.
|
|
342
|
+
- **Resolution scaling**: HUD scales independently of game render scale.
|
|
343
|
+
- **Modal overlays** (pause menu, inventory): HUD usually pauses or fades.
|
|
344
|
+
- **Cross-platform** (PC + console + mobile): same HUD; different input prompts.
|
|
345
|
+
|
|
346
|
+
## Don't
|
|
347
|
+
|
|
348
|
+
- Don't hard-code positions in pixels. Use anchors + scale.
|
|
349
|
+
- Don't override system reduced-motion.
|
|
350
|
+
- Don't lock customization. Let players move things.
|
|
351
|
+
- Don't ship without color-blind alternatives.
|
|
352
|
+
- Don't mix input prompts (Xbox + PS in same UI). Detect and swap.
|
|
353
|
+
- Don't render HUD inside game viewport — keep as overlay layer.
|
|
354
|
+
- Don't break HUD on resolution change. Test at 720p, 1080p, 1440p, 4K, ultra-wide.
|
|
355
|
+
|
|
356
|
+
## Cross-reference
|
|
357
|
+
|
|
358
|
+
- [`knowledge/game-ui/hud-design.md`](../knowledge/game-ui/hud-design.md) — HUD elements
|
|
359
|
+
- [`knowledge/game-ui/game-ui-fundamentals.md`](../knowledge/game-ui/game-ui-fundamentals.md) — categories
|
|
360
|
+
- [`knowledge/game-ui/game-accessibility.md`](../knowledge/game-ui/game-accessibility.md) — a11y
|
|
361
|
+
- [`knowledge/game-ui/korean-gaming-conventions.md`](../knowledge/game-ui/korean-gaming-conventions.md) — KR
|
|
362
|
+
- [`examples/component-game-menu.md`](component-game-menu.md) — pause / inventory menus
|