@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,165 @@
|
|
|
1
|
+
# `Sonner` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `sonner` (the Sonner library, by emilkowalski). The modern toast-of-choice in shadcn-based projects. Stacks beautifully, supports rich actions, promise wrappers.
|
|
4
|
+
|
|
5
|
+
## Sonner vs Toast vs Snackbar
|
|
6
|
+
|
|
7
|
+
Sonner is shadcn's recommended toast library, distinct from older toast / snackbar patterns:
|
|
8
|
+
- **Stacking**: cards stack with depth, expand on hover.
|
|
9
|
+
- **Promise wrapper**: `toast.promise(promise, { loading, success, error })`.
|
|
10
|
+
- **Rich content**: titles, descriptions, action + cancel buttons.
|
|
11
|
+
- **Sound** (optional): subtle confirmation chime.
|
|
12
|
+
|
|
13
|
+
For shadcn-based projects: use Sonner instead of writing custom Toast.
|
|
14
|
+
|
|
15
|
+
## Anatomy
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
┌────────────────────────────┐
|
|
19
|
+
│ ✓ Saved successfully │
|
|
20
|
+
│ Your changes are live. │
|
|
21
|
+
│ [Undo] [Dismiss] │
|
|
22
|
+
└────────────────────────────┘
|
|
23
|
+
┌────────────────────────────┐
|
|
24
|
+
│ Earlier toast (background) │
|
|
25
|
+
└────────────────────────────┘
|
|
26
|
+
↑ stack expands on hover
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## API
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { Toaster, toast } from "sonner";
|
|
33
|
+
|
|
34
|
+
// Once at app root:
|
|
35
|
+
<Toaster position="bottom-right" richColors />
|
|
36
|
+
|
|
37
|
+
// Anywhere:
|
|
38
|
+
toast.success("저장됐어요", {
|
|
39
|
+
description: "변경 사항이 적용됐어요.",
|
|
40
|
+
action: { label: "실행 취소", onClick: undo },
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
toast.error("저장 실패");
|
|
44
|
+
toast.info("새 알림");
|
|
45
|
+
toast.warning("연결 불안정");
|
|
46
|
+
toast.loading("처리 중...");
|
|
47
|
+
toast.promise(savePromise, {
|
|
48
|
+
loading: "저장 중...",
|
|
49
|
+
success: "저장됐어요",
|
|
50
|
+
error: "저장 실패",
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Dismiss
|
|
54
|
+
const id = toast("Custom");
|
|
55
|
+
toast.dismiss(id);
|
|
56
|
+
toast.dismiss(); // all
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Toaster props
|
|
60
|
+
|
|
61
|
+
| Prop | Type | Default | Description |
|
|
62
|
+
| --- | --- | --- | --- |
|
|
63
|
+
| `position` | `"top-left" \| "top-center" \| "top-right" \| "bottom-left" \| "bottom-center" \| "bottom-right"` | `"bottom-right"` | Anchor |
|
|
64
|
+
| `richColors` | `boolean` | `false` | Use semantic colors (green success, red error) |
|
|
65
|
+
| `closeButton` | `boolean` | `false` | Show × on each toast |
|
|
66
|
+
| `expand` | `boolean` | `false` | Expand stack by default (instead of on hover) |
|
|
67
|
+
| `duration` | `number` | `4000` | Ms |
|
|
68
|
+
| `visibleToasts` | `number` | `3` | Max visible at once |
|
|
69
|
+
| `theme` | `"light" \| "dark" \| "system"` | `"system"` | Theme |
|
|
70
|
+
| `toastOptions` | `object` | — | Default options for all toasts |
|
|
71
|
+
|
|
72
|
+
## Per-toast options
|
|
73
|
+
|
|
74
|
+
| Field | Description |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `description` | Subtitle text |
|
|
77
|
+
| `action` | `{ label, onClick }` — primary action |
|
|
78
|
+
| `cancel` | `{ label, onClick }` — secondary cancel |
|
|
79
|
+
| `duration` | Override default |
|
|
80
|
+
| `id` | For deduping / programmatic dismiss |
|
|
81
|
+
| `important` | Don't auto-dismiss |
|
|
82
|
+
| `icon` | Custom icon |
|
|
83
|
+
|
|
84
|
+
## Promise wrapper
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
toast.promise(api.save(data), {
|
|
88
|
+
loading: "저장 중...",
|
|
89
|
+
success: (result) => `${result.title} 저장됨`,
|
|
90
|
+
error: (err) => `저장 실패: ${err.message}`,
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Single API replaces the manual `try { setLoading(true); ... } catch { ... }` flow. Sonner handles state transitions.
|
|
95
|
+
|
|
96
|
+
## States
|
|
97
|
+
|
|
98
|
+
| State | Visual |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| Pending (promise loading) | Spinner + loading text |
|
|
101
|
+
| Success | Green check + title + description |
|
|
102
|
+
| Error | Red X + title + description |
|
|
103
|
+
| Persistent (important) | No auto-dismiss |
|
|
104
|
+
| Stacked (idle) | Compressed visually |
|
|
105
|
+
| Stacked (hovered) | Expand to show all |
|
|
106
|
+
|
|
107
|
+
## Tokens consumed
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
--toast-bg (per severity)
|
|
111
|
+
--toast-fg
|
|
112
|
+
--toast-success / -error / -info / -warning (richColors)
|
|
113
|
+
--toast-action-fg (button)
|
|
114
|
+
--toast-shadow
|
|
115
|
+
--radius-md
|
|
116
|
+
--motion-medium (slide / expand)
|
|
117
|
+
--ease-out
|
|
118
|
+
--z-toast
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Accessibility
|
|
122
|
+
|
|
123
|
+
- Each toast: `role="status"` (success/info) or `role="alert"` (error).
|
|
124
|
+
- `aria-live` follows role.
|
|
125
|
+
- Keyboard: Tab can focus toast actions; Esc dismisses.
|
|
126
|
+
- Touch: swipe left/right to dismiss (mobile gesture).
|
|
127
|
+
|
|
128
|
+
## Code example — Korean fintech save flow
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
async function handleSave() {
|
|
132
|
+
toast.promise(
|
|
133
|
+
api.saveTransaction(data),
|
|
134
|
+
{
|
|
135
|
+
loading: "결제 처리 중...",
|
|
136
|
+
success: (result) => ({
|
|
137
|
+
title: "결제가 완료되었어요",
|
|
138
|
+
description: `${formatKRW(result.amount)} 결제 완료`,
|
|
139
|
+
action: {
|
|
140
|
+
label: "영수증 보기",
|
|
141
|
+
onClick: () => navigate(`/receipts/${result.id}`),
|
|
142
|
+
},
|
|
143
|
+
}),
|
|
144
|
+
error: (err) => `결제 실패: ${err.message}`,
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Don't
|
|
151
|
+
|
|
152
|
+
- Don't use Sonner for in-app errors that block user. Use AlertDialog.
|
|
153
|
+
- Don't queue 5+ toasts. Cap visible at 3.
|
|
154
|
+
- Don't autoHide < 3s for messages with actions. Users need time to act.
|
|
155
|
+
- Don't mix Sonner with another Toast library — pick one.
|
|
156
|
+
|
|
157
|
+
## References
|
|
158
|
+
|
|
159
|
+
- shadcn-ui: [`sonner`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/sonner.tsx)
|
|
160
|
+
- Sonner library by emilkowalski
|
|
161
|
+
|
|
162
|
+
## Cross-reference
|
|
163
|
+
|
|
164
|
+
- [`examples/component-toast.md`](component-toast.md)
|
|
165
|
+
- [`examples/component-snackbar.md`](component-snackbar.md)
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# `Space` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from Ant Design `Space`. A tiny utility that adds consistent gap between children. Sibling to `Stack` (MUI) and `Flex` (Ant) — `Space` is the simplest of the three.
|
|
4
|
+
|
|
5
|
+
## Space vs Flex vs Stack
|
|
6
|
+
|
|
7
|
+
| | Space | Flex | Stack |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| Default direction | horizontal | horizontal | vertical |
|
|
10
|
+
| Gap by default | yes | no (must specify) | yes |
|
|
11
|
+
| Wrap | optional | optional | rare |
|
|
12
|
+
| Use | Inline gap between elements | Full flex layout | Vertical stack |
|
|
13
|
+
|
|
14
|
+
For "I just want a gap between these inline things": `Space`.
|
|
15
|
+
For "I'm doing real flex layout": `Flex`.
|
|
16
|
+
For "vertical stack with consistent gap": `Stack`.
|
|
17
|
+
|
|
18
|
+
## API
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
<Space>
|
|
22
|
+
<Button>Save</Button>
|
|
23
|
+
<Button>Cancel</Button>
|
|
24
|
+
</Space>
|
|
25
|
+
|
|
26
|
+
<Space size="large">
|
|
27
|
+
<Tag>React</Tag>
|
|
28
|
+
<Tag>TypeScript</Tag>
|
|
29
|
+
<Tag>Vite</Tag>
|
|
30
|
+
</Space>
|
|
31
|
+
|
|
32
|
+
<Space direction="vertical" size="middle">
|
|
33
|
+
<Heading>Title</Heading>
|
|
34
|
+
<Text>Body</Text>
|
|
35
|
+
</Space>
|
|
36
|
+
|
|
37
|
+
<Space wrap>
|
|
38
|
+
{tags.map(t => <Tag key={t}>{t}</Tag>)}
|
|
39
|
+
</Space>
|
|
40
|
+
|
|
41
|
+
<Space split={<Divider type="vertical" />}>
|
|
42
|
+
<Link>Edit</Link>
|
|
43
|
+
<Link>Duplicate</Link>
|
|
44
|
+
<Link>Delete</Link>
|
|
45
|
+
</Space>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| Prop | Type | Default | Description |
|
|
49
|
+
| --- | --- | --- | --- |
|
|
50
|
+
| `direction` | `"horizontal" \| "vertical"` | `"horizontal"` | Layout direction |
|
|
51
|
+
| `size` | `"small" \| "middle" \| "large" \| number` | `"small"` | Gap |
|
|
52
|
+
| `align` | `"start" \| "end" \| "center" \| "baseline"` | depends | align-items |
|
|
53
|
+
| `wrap` | `boolean` | `false` | Allow wrapping |
|
|
54
|
+
| `split` | `ReactNode` | — | Element rendered between children (e.g., divider, dot) |
|
|
55
|
+
|
|
56
|
+
## Common patterns
|
|
57
|
+
|
|
58
|
+
### Inline action group
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
<Space>
|
|
62
|
+
<Button>Save</Button>
|
|
63
|
+
<Button variant="ghost">Cancel</Button>
|
|
64
|
+
</Space>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Tag list (wrapping)
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
<Space wrap size="small">
|
|
71
|
+
{tags.map(t => <Tag key={t}>{t}</Tag>)}
|
|
72
|
+
</Space>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Toolbar with dividers
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<Space split={<span>·</span>} size="small">
|
|
79
|
+
<Link>Edit</Link>
|
|
80
|
+
<Link>Duplicate</Link>
|
|
81
|
+
<Link>Delete</Link>
|
|
82
|
+
</Space>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Vertical stack (alternative to Stack)
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
<Space direction="vertical" size="large">
|
|
89
|
+
<Heading>...</Heading>
|
|
90
|
+
<Text>...</Text>
|
|
91
|
+
<Button>...</Button>
|
|
92
|
+
</Space>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Tokens consumed
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
--space-xs (small)
|
|
99
|
+
--space-sm (middle)
|
|
100
|
+
--space-md (large)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Implementation note
|
|
104
|
+
|
|
105
|
+
Modern CSS makes Space largely unnecessary — `display: flex; gap: var(--space-sm)` handles it. But Space is convenient when:
|
|
106
|
+
- You don't want to author flex CSS for one-offs.
|
|
107
|
+
- You want the `split` element-between-children behavior (CSS doesn't have this natively without complex rules).
|
|
108
|
+
- Your team standardizes on Space as the inline-gap primitive.
|
|
109
|
+
|
|
110
|
+
## Don't
|
|
111
|
+
|
|
112
|
+
- Don't use Space when CSS `gap` alone suffices.
|
|
113
|
+
- Don't nest Space deeply — that's a Flex / Grid / Stack situation.
|
|
114
|
+
- Don't use Space for full-width layouts. It's for inline element grouping.
|
|
115
|
+
|
|
116
|
+
## References
|
|
117
|
+
|
|
118
|
+
- Ant: [`Space`](../refs/ant-design/components/space)
|
|
119
|
+
- CSS Flex / Grid `gap` property
|
|
120
|
+
|
|
121
|
+
## Cross-reference
|
|
122
|
+
|
|
123
|
+
- [`examples/component-flex.md`](component-flex.md) — full flex layout
|
|
124
|
+
- [`examples/component-grid.md`](component-grid.md) — 2D layout
|
|
125
|
+
- [`knowledge/layout/spacing-and-grid.md`](../knowledge/layout/spacing-and-grid.md)
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
# `SpatialLocomotion` (custom — VR locomotion controller with comfort options) — spec
|
|
3
|
+
|
|
4
|
+
> Locomotion controller for VR / spatial games / experiences. Provides teleport, smooth, snap-turn, room-scale modes; comfort vignette; preferences saved per user. Pairs with [`knowledge/spatial/vr-patterns.md`](../knowledge/spatial/vr-patterns.md) and [`knowledge/spatial/comfort-and-accessibility.md`](../knowledge/spatial/comfort-and-accessibility.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Locomotion is the #1 cause of VR motion sickness. Every VR experience must:
|
|
9
|
+
1. Offer multiple locomotion options.
|
|
10
|
+
2. Default to comfortable (teleport + snap turn) for new users.
|
|
11
|
+
3. Provide opt-in to less comfortable but more immersive modes.
|
|
12
|
+
4. Apply comfort vignette dynamically.
|
|
13
|
+
5. Persist user preference per profile.
|
|
14
|
+
|
|
15
|
+
`SpatialLocomotion` is the primitive controller every VR game / experience embeds.
|
|
16
|
+
|
|
17
|
+
## Anatomy (in-game)
|
|
18
|
+
|
|
19
|
+
### Teleport mode
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
[user holds joystick forward]
|
|
23
|
+
↓
|
|
24
|
+
[arc trajectory shown from controller]
|
|
25
|
+
↓
|
|
26
|
+
[landing point indicator visible]
|
|
27
|
+
↓
|
|
28
|
+
[user releases]
|
|
29
|
+
↓
|
|
30
|
+
[brief fade or instant teleport to landing point]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Smooth locomotion mode
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
[user pushes joystick]
|
|
37
|
+
↓
|
|
38
|
+
[player moves at walking speed in joystick direction]
|
|
39
|
+
↓
|
|
40
|
+
[comfort vignette appears around peripheral vision]
|
|
41
|
+
↓
|
|
42
|
+
[user releases joystick]
|
|
43
|
+
↓
|
|
44
|
+
[player stops; vignette fades]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Snap turn
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
[user pushes joystick left/right]
|
|
51
|
+
↓
|
|
52
|
+
[brief fade]
|
|
53
|
+
↓
|
|
54
|
+
[player rotates 30° / 45° / 90°]
|
|
55
|
+
↓
|
|
56
|
+
[fade ends]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## API (Unity-flavored)
|
|
60
|
+
|
|
61
|
+
```csharp
|
|
62
|
+
public class SpatialLocomotion : MonoBehaviour
|
|
63
|
+
{
|
|
64
|
+
public LocomotionMode mode = LocomotionMode.Teleport;
|
|
65
|
+
public TurnMode turnMode = TurnMode.Snap;
|
|
66
|
+
public float snapTurnAngle = 30f;
|
|
67
|
+
public float smoothMoveSpeed = 1.5f; // m/s
|
|
68
|
+
public float smoothTurnSpeed = 90f; // deg/s
|
|
69
|
+
public ComfortVignette vignette;
|
|
70
|
+
public bool teleportArcVisible = true;
|
|
71
|
+
public float teleportFadeMs = 100f;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public enum LocomotionMode { Teleport, Smooth, Hybrid, RoomScaleOnly }
|
|
75
|
+
public enum TurnMode { Snap, Smooth, None /* room-scale only */ }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
For React XR / WebXR / Vision Pro: similar API patterns; specifics differ.
|
|
79
|
+
|
|
80
|
+
## Configuration UI
|
|
81
|
+
|
|
82
|
+
Settings menu the user accesses to change comfort:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
Locomotion
|
|
86
|
+
─────────
|
|
87
|
+
Move
|
|
88
|
+
◉ Teleport
|
|
89
|
+
○ Smooth
|
|
90
|
+
○ Hybrid
|
|
91
|
+
|
|
92
|
+
Turn
|
|
93
|
+
◉ Snap (30°)
|
|
94
|
+
○ Snap (45°)
|
|
95
|
+
○ Snap (90°)
|
|
96
|
+
○ Smooth (slow)
|
|
97
|
+
○ Smooth (medium)
|
|
98
|
+
○ Smooth (fast)
|
|
99
|
+
○ None (room-scale only)
|
|
100
|
+
|
|
101
|
+
Comfort
|
|
102
|
+
Comfort vignette ●○○ Strong → ○○● Off
|
|
103
|
+
Smooth move speed Slow → Fast
|
|
104
|
+
Teleport fade Off → Long
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Save preferences. Apply immediately.
|
|
108
|
+
|
|
109
|
+
## Comfort vignette
|
|
110
|
+
|
|
111
|
+
Implementation:
|
|
112
|
+
|
|
113
|
+
```glsl
|
|
114
|
+
// Pseudocode shader
|
|
115
|
+
void main() {
|
|
116
|
+
vec3 color = sceneColor;
|
|
117
|
+
float distFromCenter = length(uv - vec2(0.5));
|
|
118
|
+
float vignetteAlpha = smoothstep(comfortRadius, comfortRadius - 0.1, distFromCenter);
|
|
119
|
+
color = mix(black, color, vignetteAlpha);
|
|
120
|
+
fragColor = vec4(color, 1.0);
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The `comfortRadius` parameter:
|
|
125
|
+
- During motion: smaller (more vignette).
|
|
126
|
+
- Stationary: full FOV (no vignette).
|
|
127
|
+
- Acceleration: vignette tightens slightly.
|
|
128
|
+
|
|
129
|
+
User-configurable strength. For some users: off. For sensitive users: maximum.
|
|
130
|
+
|
|
131
|
+
## Teleport details
|
|
132
|
+
|
|
133
|
+
### Arc trajectory
|
|
134
|
+
|
|
135
|
+
Show a parabolic arc from controller to landing point:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
[controller ✕]
|
|
139
|
+
╲
|
|
140
|
+
╲___
|
|
141
|
+
╲___
|
|
142
|
+
● ← landing indicator
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Arc tunes:
|
|
146
|
+
- **Strength**: based on input deflection or fixed.
|
|
147
|
+
- **Color**: brand-aligned; visible against world.
|
|
148
|
+
- **Invalid endpoints** (cliffs, blocked): different color (red).
|
|
149
|
+
|
|
150
|
+
### Landing indicator
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
┌─────────┐
|
|
154
|
+
│ player │
|
|
155
|
+
│ outline │
|
|
156
|
+
└─────────┘
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Show:
|
|
160
|
+
- Direction the player will face after teleport (arrow).
|
|
161
|
+
- Footprint or circle on the ground.
|
|
162
|
+
- Distance estimate.
|
|
163
|
+
|
|
164
|
+
### Teleport restrictions
|
|
165
|
+
|
|
166
|
+
Don't allow teleport to:
|
|
167
|
+
- **Inaccessible areas** (gameplay-locked).
|
|
168
|
+
- **Inside objects**.
|
|
169
|
+
- **Off cliffs** (without intent).
|
|
170
|
+
- **Mid-air** (typically).
|
|
171
|
+
|
|
172
|
+
Some games allow climbing / mid-air teleport for traversal.
|
|
173
|
+
|
|
174
|
+
### Fade
|
|
175
|
+
|
|
176
|
+
Brief black fade during teleport (50-150ms) reduces nausea. Or instant ("blink") for power users.
|
|
177
|
+
|
|
178
|
+
## Smooth locomotion details
|
|
179
|
+
|
|
180
|
+
### Direction relative to head vs controller
|
|
181
|
+
|
|
182
|
+
| Mode | Direction |
|
|
183
|
+
| --- | --- |
|
|
184
|
+
| **Head-relative** (default) | Push joystick forward → move where you're looking |
|
|
185
|
+
| **Controller-relative** | Push joystick forward → move in controller's pointing direction |
|
|
186
|
+
| **Body-relative** (chest) | Some headsets support this |
|
|
187
|
+
|
|
188
|
+
Most users prefer head-relative for natural feel.
|
|
189
|
+
|
|
190
|
+
### Speed curve
|
|
191
|
+
|
|
192
|
+
Constant velocity is most comfortable. Acceleration causes more sickness. So:
|
|
193
|
+
- **Joystick on**: full speed (no ramp).
|
|
194
|
+
- **Joystick off**: stop quickly.
|
|
195
|
+
|
|
196
|
+
Some games allow ramp-up for "running" feel; usually less comfortable.
|
|
197
|
+
|
|
198
|
+
## Snap turn
|
|
199
|
+
|
|
200
|
+
### Default angles
|
|
201
|
+
|
|
202
|
+
- 30° — fine-grained; many small turns.
|
|
203
|
+
- 45° — common default; balance.
|
|
204
|
+
- 60° — bigger but rare.
|
|
205
|
+
- 90° — quick 4-way orientation.
|
|
206
|
+
|
|
207
|
+
User picks.
|
|
208
|
+
|
|
209
|
+
### Fade transition
|
|
210
|
+
|
|
211
|
+
Brief black flash (50-100ms) during snap turn reduces sickness. Some users prefer no fade.
|
|
212
|
+
|
|
213
|
+
## Smooth turn
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
[joystick left] → [view rotates left at smoothTurnSpeed]
|
|
217
|
+
[joystick released] → [stop]
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Comfort vignette stronger during smooth turn (most nauseating motion).
|
|
221
|
+
|
|
222
|
+
For new users: default to **snap turn**. Allow opt-in to smooth turn.
|
|
223
|
+
|
|
224
|
+
## Hybrid locomotion
|
|
225
|
+
|
|
226
|
+
Some experiences use hybrid:
|
|
227
|
+
- Joystick for short movements (smooth).
|
|
228
|
+
- Press button for long teleports.
|
|
229
|
+
|
|
230
|
+
Or contextual:
|
|
231
|
+
- Walking around a room: room-scale.
|
|
232
|
+
- Crossing a large space: teleport.
|
|
233
|
+
- Combat: smooth strafe.
|
|
234
|
+
|
|
235
|
+
Document which gesture does what; teach in tutorial.
|
|
236
|
+
|
|
237
|
+
## Room-scale walking
|
|
238
|
+
|
|
239
|
+
- User physically walks in their playspace.
|
|
240
|
+
- Most comfortable; no software-induced motion.
|
|
241
|
+
- Limited by room size.
|
|
242
|
+
|
|
243
|
+
For room-scale-primary games:
|
|
244
|
+
- **Guardian boundary** must be set up.
|
|
245
|
+
- **Re-center** option for tight spaces.
|
|
246
|
+
- **Standing OR seated** modes.
|
|
247
|
+
|
|
248
|
+
Vehicles / cockpits move the world relative to player; user's room-scale movement still works inside the cockpit.
|
|
249
|
+
|
|
250
|
+
## Implementation hints
|
|
251
|
+
|
|
252
|
+
```csharp
|
|
253
|
+
void Update()
|
|
254
|
+
{
|
|
255
|
+
Vector2 leftStick = Input.GetLeftStick();
|
|
256
|
+
Vector2 rightStick = Input.GetRightStick();
|
|
257
|
+
|
|
258
|
+
// Movement
|
|
259
|
+
if (mode == LocomotionMode.Teleport)
|
|
260
|
+
{
|
|
261
|
+
if (leftStick.magnitude > 0.5f) ShowTeleportArc(leftStick);
|
|
262
|
+
if (Input.LeftStickReleased && validTeleportTarget) PerformTeleport();
|
|
263
|
+
}
|
|
264
|
+
else if (mode == LocomotionMode.Smooth)
|
|
265
|
+
{
|
|
266
|
+
Vector3 moveDir = camera.forward * leftStick.y + camera.right * leftStick.x;
|
|
267
|
+
moveDir.y = 0;
|
|
268
|
+
transform.position += moveDir * smoothMoveSpeed * Time.deltaTime;
|
|
269
|
+
|
|
270
|
+
if (leftStick.magnitude > 0.1f) vignette.SetActive(true);
|
|
271
|
+
else vignette.SetActive(false);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Turn
|
|
275
|
+
if (turnMode == TurnMode.Snap)
|
|
276
|
+
{
|
|
277
|
+
if (rightStick.x > 0.7f && !snapping) StartSnapTurn(snapTurnAngle);
|
|
278
|
+
if (rightStick.x < -0.7f && !snapping) StartSnapTurn(-snapTurnAngle);
|
|
279
|
+
}
|
|
280
|
+
else if (turnMode == TurnMode.Smooth)
|
|
281
|
+
{
|
|
282
|
+
transform.Rotate(0, rightStick.x * smoothTurnSpeed * Time.deltaTime, 0);
|
|
283
|
+
if (Mathf.Abs(rightStick.x) > 0.1f) vignette.IncreaseStrength();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
IEnumerator StartSnapTurn(float angle)
|
|
288
|
+
{
|
|
289
|
+
snapping = true;
|
|
290
|
+
yield return FadeOut(50);
|
|
291
|
+
transform.Rotate(0, angle, 0);
|
|
292
|
+
yield return FadeIn(50);
|
|
293
|
+
snapping = false;
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Tokens consumed
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
--spatial-locomotion-arc-color (teleport arc default)
|
|
301
|
+
--spatial-locomotion-arc-invalid (red for invalid)
|
|
302
|
+
--spatial-locomotion-fade-color (typically black)
|
|
303
|
+
--spatial-locomotion-fade-duration (50-150ms)
|
|
304
|
+
--spatial-locomotion-vignette-color (typically black)
|
|
305
|
+
--spatial-locomotion-vignette-strength (0-1)
|
|
306
|
+
--spatial-locomotion-snap-default (45°)
|
|
307
|
+
--spatial-locomotion-smooth-speed (1.5 m/s)
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## States
|
|
311
|
+
|
|
312
|
+
| State | Visual |
|
|
313
|
+
| --- | --- |
|
|
314
|
+
| Idle | No motion; full FOV |
|
|
315
|
+
| Showing teleport arc | Arc + landing indicator visible |
|
|
316
|
+
| Teleporting | Brief fade; instant relocation; fade in |
|
|
317
|
+
| Smooth moving | Player moves; vignette applied |
|
|
318
|
+
| Snap turning | Brief fade; instant rotation; fade in |
|
|
319
|
+
| Smooth turning | View rotates; stronger vignette |
|
|
320
|
+
| Disabled (cinematic / cutscene) | All input ignored |
|
|
321
|
+
|
|
322
|
+
## Accessibility
|
|
323
|
+
|
|
324
|
+
- **Comfort defaults** for new users (teleport + snap turn + vignette on).
|
|
325
|
+
- **One-handed mode** — locomotion possible with single controller.
|
|
326
|
+
- **Auto-walk** option (forward without holding) for users with reduced grip strength.
|
|
327
|
+
- **Voice locomotion** — "teleport to [target]" for users who can't use joystick.
|
|
328
|
+
- **Reduce motion** — skip vignette animation; use static darken.
|
|
329
|
+
- **Adjust speeds** — slow option for sensitive users.
|
|
330
|
+
|
|
331
|
+
## Korean / cultural
|
|
332
|
+
|
|
333
|
+
Less specific to KR than other components. Default vignette + snap-turn defaults same globally.
|
|
334
|
+
|
|
335
|
+
For Korean Samsung Galaxy XR (upcoming): likely similar conventions. KR localization of settings menu in Korean.
|
|
336
|
+
|
|
337
|
+
## Common locomotion mistakes
|
|
338
|
+
|
|
339
|
+
- **Defaulting to smooth + smooth** for new users.
|
|
340
|
+
- **No vignette option** (some users need maximum, some none).
|
|
341
|
+
- **Ignoring guardian** during smooth locomotion.
|
|
342
|
+
- **Forgetting fade** in snap turn.
|
|
343
|
+
- **No "sit / stand" mode** option.
|
|
344
|
+
- **Teleport without arc trajectory** — disorienting.
|
|
345
|
+
- **Forced cinematic camera moves** — sickness.
|
|
346
|
+
|
|
347
|
+
## Don't
|
|
348
|
+
|
|
349
|
+
- Don't default to smooth + smooth turn for new users.
|
|
350
|
+
- Don't omit comfort vignette as an option.
|
|
351
|
+
- Don't lock out room-scale movement when user wants it.
|
|
352
|
+
- Don't ignore guardian boundaries.
|
|
353
|
+
- Don't make snap turn instant without fade — disorienting.
|
|
354
|
+
- Don't allow teleport into walls / objects.
|
|
355
|
+
- Don't change locomotion mode without saving preference.
|
|
356
|
+
- Don't ignore frame rate during smooth motion — drops cause severe sickness.
|
|
357
|
+
|
|
358
|
+
## References
|
|
359
|
+
|
|
360
|
+
Patterns drawn from:
|
|
361
|
+
- Half-Life: Alyx (gold standard for comfort options)
|
|
362
|
+
- Beat Saber (room-scale, no locomotion needed)
|
|
363
|
+
- Asgard's Wrath 2 (full comfort suite)
|
|
364
|
+
- Resident Evil 4 VR (hybrid)
|
|
365
|
+
- Half-Life: Alyx's "blink" teleport with arc + landing indicator
|
|
366
|
+
- Boneworks / BONELAB physics-based smooth (less comfort-friendly intentionally)
|
|
367
|
+
|
|
368
|
+
## Cross-reference
|
|
369
|
+
|
|
370
|
+
- [`knowledge/spatial/vr-patterns.md`](../knowledge/spatial/vr-patterns.md) — VR
|
|
371
|
+
- [`knowledge/spatial/spatial-design-fundamentals.md`](../knowledge/spatial/spatial-design-fundamentals.md) — fundamentals
|
|
372
|
+
- [`knowledge/spatial/comfort-and-accessibility.md`](../knowledge/spatial/comfort-and-accessibility.md) — comfort + a11y
|
|
373
|
+
- [`examples/component-spatial-panel.md`](component-spatial-panel.md) — UI panels
|