@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,330 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
# `SpatialPanel` (custom — floating UI panel for VR / AR / spatial computing) — spec
|
|
3
|
+
|
|
4
|
+
> Floating 2D-in-3D panel for spatial UIs (Vision Pro, Quest, HoloLens, mobile AR). Handles anchoring (world / wrist / hand / head), distance / scale / billboarding, comfort positioning, hand + gaze input, depth occlusion. Pairs with [`knowledge/spatial/spatial-ui-elements.md`](../knowledge/spatial/spatial-ui-elements.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Spatial apps are full of floating panels — settings, content, dialogs, productivity windows. Without a primitive, every team reinvents:
|
|
9
|
+
1. Anchoring (where in space?).
|
|
10
|
+
2. Distance / size (visual angle vs absolute meters?).
|
|
11
|
+
3. Billboarding (face user always or fixed?).
|
|
12
|
+
4. Input handling (hand pinch, controller raycast, gaze).
|
|
13
|
+
5. Comfort positioning (eye level, slight tilt, etc.).
|
|
14
|
+
6. Occlusion (in front of / behind real objects).
|
|
15
|
+
|
|
16
|
+
`SpatialPanel` provides these as a primitive. Subclass for specific surface types.
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
[shadow / occlusion]
|
|
22
|
+
┌──────────────────┐
|
|
23
|
+
│ [grab handle] ⊗ │ ← title bar with close
|
|
24
|
+
├──────────────────┤
|
|
25
|
+
│ │
|
|
26
|
+
│ [content] │
|
|
27
|
+
│ │
|
|
28
|
+
│ │
|
|
29
|
+
└──────────────────┘
|
|
30
|
+
[tail / pointer]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## API (conceptual; per-platform implementation differs)
|
|
34
|
+
|
|
35
|
+
### visionOS (SwiftUI / RealityKit)
|
|
36
|
+
|
|
37
|
+
```swift
|
|
38
|
+
SpatialPanel(
|
|
39
|
+
anchor: .world(position: .init(x: 0, y: 1.4, z: -1.5)),
|
|
40
|
+
size: .visualAngle(width: 30, height: 20), // degrees
|
|
41
|
+
billboard: .yAxisOnly,
|
|
42
|
+
closable: true,
|
|
43
|
+
resizable: true,
|
|
44
|
+
draggable: true
|
|
45
|
+
) {
|
|
46
|
+
YourContent()
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Unity (Quest, Vision Pro via Polyspatial)
|
|
51
|
+
|
|
52
|
+
```csharp
|
|
53
|
+
public class SpatialPanel : MonoBehaviour
|
|
54
|
+
{
|
|
55
|
+
public AnchorMode anchor; // World, Wrist, Hand, Head
|
|
56
|
+
public Vector3 worldPosition;
|
|
57
|
+
public float widthMeters = 1.0f;
|
|
58
|
+
public float heightMeters = 0.6f;
|
|
59
|
+
public BillboardMode billboard; // None, YAxis, Full
|
|
60
|
+
public float distanceMeters = 1.5f;
|
|
61
|
+
public bool grabbable = true;
|
|
62
|
+
public bool closable = true;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### React Three Fiber (WebXR)
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
<SpatialPanel
|
|
70
|
+
anchor="world"
|
|
71
|
+
position={[0, 1.4, -1.5]}
|
|
72
|
+
width={1.0}
|
|
73
|
+
height={0.6}
|
|
74
|
+
billboard="y-axis"
|
|
75
|
+
closable
|
|
76
|
+
draggable
|
|
77
|
+
>
|
|
78
|
+
<Html transform>
|
|
79
|
+
<YourContent />
|
|
80
|
+
</Html>
|
|
81
|
+
</SpatialPanel>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
| Prop / config | Type | Default | Description |
|
|
85
|
+
| --- | --- | --- | --- |
|
|
86
|
+
| `anchor` | `"world" \| "wrist" \| "hand" \| "head"` | `"world"` | Where panel exists |
|
|
87
|
+
| `position` | `Vector3` | depends on anchor | World position (m) |
|
|
88
|
+
| `width` | `number` (m or °) | per platform | Width in meters or visual angle |
|
|
89
|
+
| `height` | `number` | per platform | Height |
|
|
90
|
+
| `billboard` | `"none" \| "y-axis" \| "full"` | `"y-axis"` | Rotation behavior |
|
|
91
|
+
| `distance` | `number` | `1.5` | Default distance from user when first placed |
|
|
92
|
+
| `grabbable` | `boolean` | `true` | Can user grab + reposition? |
|
|
93
|
+
| `closable` | `boolean` | `true` | Show close button |
|
|
94
|
+
| `resizable` | `boolean` | `false` | Allow resize |
|
|
95
|
+
| `tilt` | `number` (degrees) | `5` | Slight tilt toward user |
|
|
96
|
+
| `occluded` | `boolean` | `true` | Real / virtual objects can occlude panel |
|
|
97
|
+
| `shadow` | `boolean` | `true` | Cast shadow on real surfaces (AR) |
|
|
98
|
+
| `glow` | `"none" \| "subtle" \| "active"` | `"subtle"` | Edge glow / highlight |
|
|
99
|
+
|
|
100
|
+
## Anchoring modes
|
|
101
|
+
|
|
102
|
+
### `world`
|
|
103
|
+
|
|
104
|
+
Panel fixed in world space. User moves around it. Default for content / productivity panels.
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
[user position changes; panel stays fixed]
|
|
108
|
+
[1m away looking left, panel appears as expected]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### `wrist`
|
|
112
|
+
|
|
113
|
+
Panel anchored to user's wrist. Moves with arm.
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
[user looks at wrist] → [panel becomes visible]
|
|
117
|
+
[user lowers arm] → [panel hides or persists faintly]
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Used for quick-access menus (Vision Pro Home, Quest watch).
|
|
121
|
+
|
|
122
|
+
### `hand`
|
|
123
|
+
|
|
124
|
+
Panel held in user's hand. Moves with hand fully.
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
[hand moves] → [panel moves]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Used for tools, palettes (drawing apps, color picker).
|
|
131
|
+
|
|
132
|
+
### `head`
|
|
133
|
+
|
|
134
|
+
Panel locked to user's head — always in front. **Use sparingly** — nauseating for long content.
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
[user looks anywhere] → [panel always at fixed position relative to view]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Used for: brief tooltips, reticles, system-level alerts.
|
|
141
|
+
|
|
142
|
+
## Sizing
|
|
143
|
+
|
|
144
|
+
### Visual angle vs absolute size
|
|
145
|
+
|
|
146
|
+
| Approach | Pro | Con |
|
|
147
|
+
| --- | --- | --- |
|
|
148
|
+
| **Absolute (meters)** | Predictable physical size | Visual angle changes with distance |
|
|
149
|
+
| **Visual angle (degrees)** | Consistent screen presence | Physical size changes with distance |
|
|
150
|
+
|
|
151
|
+
Default: visual angle for UI clarity (panels look the same size regardless of placement); absolute for content that should "be" a specific size (a virtual TV is a real-world TV size).
|
|
152
|
+
|
|
153
|
+
### Reference sizes
|
|
154
|
+
|
|
155
|
+
| Use | Visual angle (recommended at 1.5m distance) | Meters |
|
|
156
|
+
| --- | --- | --- |
|
|
157
|
+
| Tooltip / quick info | 5-10° | 13-26cm wide |
|
|
158
|
+
| Settings / dialog | 20-30° | 53-80cm |
|
|
159
|
+
| Productivity window | 40-50° | 1.0-1.4m |
|
|
160
|
+
| Movie screen | 60-90° | 1.7-3.0m |
|
|
161
|
+
|
|
162
|
+
## States
|
|
163
|
+
|
|
164
|
+
| State | Visual |
|
|
165
|
+
| --- | --- |
|
|
166
|
+
| Default | Panel rendered with subtle edge glow |
|
|
167
|
+
| Hover (gaze / pointer near) | Slightly brighter glow |
|
|
168
|
+
| Grabbing | Stronger glow + lift animation; user dragging |
|
|
169
|
+
| Pressed (button inside) | Inner content reacts; panel itself static |
|
|
170
|
+
| Closing | Fade out + scale down 200ms |
|
|
171
|
+
| Out-of-comfort (extreme angle) | Faint warning glow at edge |
|
|
172
|
+
|
|
173
|
+
## Comfort positioning
|
|
174
|
+
|
|
175
|
+
### Default placement
|
|
176
|
+
|
|
177
|
+
When panel first appears, place:
|
|
178
|
+
- **At gaze direction** for primary content.
|
|
179
|
+
- **At eye level OR slightly below** (-10° from horizontal).
|
|
180
|
+
- **1.2-1.5m distance** from user.
|
|
181
|
+
- **Slight tilt** (5-10°) toward user.
|
|
182
|
+
|
|
183
|
+
### Avoid
|
|
184
|
+
|
|
185
|
+
- **Too close** (< 50cm): vergence-accommodation strain.
|
|
186
|
+
- **Too far** (> 5m): hard to read text.
|
|
187
|
+
- **Above eye level for long content**: neck strain.
|
|
188
|
+
- **Behind user**: lost.
|
|
189
|
+
- **Inside real objects** (AR): collision.
|
|
190
|
+
|
|
191
|
+
### Reposition gracefully
|
|
192
|
+
|
|
193
|
+
If panel ends up uncomfortable (user moved):
|
|
194
|
+
- **Auto-reposition button**: "Bring panel to me".
|
|
195
|
+
- **Recall** gesture (look + pinch on a corner).
|
|
196
|
+
- **Gradual drift correction** (subtle move toward comfort zone).
|
|
197
|
+
|
|
198
|
+
## Input handling
|
|
199
|
+
|
|
200
|
+
### Gaze + pinch (Vision Pro)
|
|
201
|
+
|
|
202
|
+
- User looks at panel; panel highlights.
|
|
203
|
+
- User looks at button inside panel; button highlights.
|
|
204
|
+
- User pinches; button activates.
|
|
205
|
+
|
|
206
|
+
### Hand poke (Quest, Vision Pro hand tracking)
|
|
207
|
+
|
|
208
|
+
- User extends finger toward button.
|
|
209
|
+
- Visual feedback as finger approaches surface.
|
|
210
|
+
- Push through surface = press.
|
|
211
|
+
|
|
212
|
+
### Ray-cast (controller, far targeting)
|
|
213
|
+
|
|
214
|
+
- Controller emits ray.
|
|
215
|
+
- Ray intersects panel; cursor appears on panel.
|
|
216
|
+
- Trigger pulled = press at cursor.
|
|
217
|
+
|
|
218
|
+
### Direct touch (close range)
|
|
219
|
+
|
|
220
|
+
- Hand is within touch distance of panel.
|
|
221
|
+
- Finger taps surface like a touchscreen.
|
|
222
|
+
|
|
223
|
+
`SpatialPanel` should detect input mode and provide appropriate feedback. All four work transparently.
|
|
224
|
+
|
|
225
|
+
## Tokens consumed
|
|
226
|
+
|
|
227
|
+
Spatial-specific tokens:
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
--spatial-panel-bg (panel background, semi-opaque)
|
|
231
|
+
--spatial-panel-bg-blur (background blur amount, AR)
|
|
232
|
+
--spatial-panel-border (edge color)
|
|
233
|
+
--spatial-panel-glow (subtle edge glow)
|
|
234
|
+
--spatial-panel-shadow (shadow on real surfaces)
|
|
235
|
+
--spatial-panel-text (default text color)
|
|
236
|
+
--spatial-panel-text-emphasis
|
|
237
|
+
--spatial-panel-button-idle
|
|
238
|
+
--spatial-panel-button-hover
|
|
239
|
+
--spatial-panel-button-pressed
|
|
240
|
+
--spatial-panel-distance-default (1.5m)
|
|
241
|
+
--spatial-panel-tilt-default (5°)
|
|
242
|
+
--spatial-panel-anim-fade (200ms)
|
|
243
|
+
--spatial-panel-anim-easing (ease-out)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
For AR / passthrough: panels need higher contrast against variable real backgrounds. Apply `--spatial-panel-bg-blur` for legibility.
|
|
247
|
+
|
|
248
|
+
## Accessibility
|
|
249
|
+
|
|
250
|
+
- **Keyboard nav** (where input mode supports): Tab through panel children.
|
|
251
|
+
- **Screen reader / VoiceOver**: panel announced as a region; children announced as user navigates.
|
|
252
|
+
- **High contrast mode**: swap tokens.
|
|
253
|
+
- **Larger text option**: scale internal content text.
|
|
254
|
+
- **Reduced motion**: skip fade-in / animation.
|
|
255
|
+
- **Voice control**: "Open settings", "Close panel".
|
|
256
|
+
- **Hand alternative**: if hand tracking fails / disabled, controller / voice still works.
|
|
257
|
+
|
|
258
|
+
## Implementation hints (Unity-style pseudocode)
|
|
259
|
+
|
|
260
|
+
```csharp
|
|
261
|
+
public class SpatialPanel : MonoBehaviour
|
|
262
|
+
{
|
|
263
|
+
void Update()
|
|
264
|
+
{
|
|
265
|
+
switch (anchor)
|
|
266
|
+
{
|
|
267
|
+
case AnchorMode.World:
|
|
268
|
+
// Stay where placed; do nothing each frame
|
|
269
|
+
break;
|
|
270
|
+
case AnchorMode.Head:
|
|
271
|
+
transform.position = camera.position + camera.forward * distanceMeters;
|
|
272
|
+
transform.rotation = camera.rotation;
|
|
273
|
+
break;
|
|
274
|
+
case AnchorMode.Wrist:
|
|
275
|
+
transform.position = wristTransform.position;
|
|
276
|
+
transform.rotation = wristTransform.rotation;
|
|
277
|
+
break;
|
|
278
|
+
case AnchorMode.Hand:
|
|
279
|
+
transform.position = handTransform.position;
|
|
280
|
+
transform.rotation = handTransform.rotation;
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (billboard == BillboardMode.YAxis)
|
|
285
|
+
{
|
|
286
|
+
Vector3 toCamera = camera.position - transform.position;
|
|
287
|
+
toCamera.y = 0;
|
|
288
|
+
transform.rotation = Quaternion.LookRotation(-toCamera);
|
|
289
|
+
}
|
|
290
|
+
else if (billboard == BillboardMode.Full)
|
|
291
|
+
{
|
|
292
|
+
transform.LookAt(2 * transform.position - camera.position);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
For visionOS: SwiftUI auto-handles much of this; manual for advanced cases.
|
|
299
|
+
|
|
300
|
+
For React Three Fiber / WebXR: wrap with `<group>` and update transform per frame in `useFrame`.
|
|
301
|
+
|
|
302
|
+
## Edge cases
|
|
303
|
+
|
|
304
|
+
- **User walks behind the panel**: panel is double-sided OR rotates to face user.
|
|
305
|
+
- **AR — panel inside a real object**: collision detection; nudge panel forward.
|
|
306
|
+
- **AR — panel obscured by real object**: render with depth occlusion (real wall blocks panel).
|
|
307
|
+
- **VR — user moves play area**: panel stays in world, but might be unreachable; reposition button.
|
|
308
|
+
- **Input mode switches mid-interaction** (controller dropped, hand-tracking takes over): preserve current state.
|
|
309
|
+
- **Panel content overflows**: scroll inside panel.
|
|
310
|
+
- **Multi-panel layout**: snap to grid; persist arrangement.
|
|
311
|
+
- **Wrist panel with arm down**: hide; show only when wrist visible.
|
|
312
|
+
|
|
313
|
+
## Don't
|
|
314
|
+
|
|
315
|
+
- Don't head-lock long content.
|
|
316
|
+
- Don't make panels too small for comfortable reading (< 20° for dense content).
|
|
317
|
+
- Don't ignore comfort tilt — head-on panels feel stiff.
|
|
318
|
+
- Don't skip occlusion in AR — flat overlays look unreal.
|
|
319
|
+
- Don't forget input alternatives. Voice / controller / hand all work.
|
|
320
|
+
- Don't render text below 1° visual angle.
|
|
321
|
+
- Don't ignore Korean text size needs (~1.5× Latin equivalent for clarity at low PPD).
|
|
322
|
+
|
|
323
|
+
## Cross-reference
|
|
324
|
+
|
|
325
|
+
- [`knowledge/spatial/spatial-ui-elements.md`](../knowledge/spatial/spatial-ui-elements.md) — UI elements
|
|
326
|
+
- [`knowledge/spatial/spatial-design-fundamentals.md`](../knowledge/spatial/spatial-design-fundamentals.md) — fundamentals
|
|
327
|
+
- [`knowledge/spatial/vr-patterns.md`](../knowledge/spatial/vr-patterns.md) — VR
|
|
328
|
+
- [`knowledge/spatial/ar-patterns.md`](../knowledge/spatial/ar-patterns.md) — AR
|
|
329
|
+
- [`knowledge/spatial/comfort-and-accessibility.md`](../knowledge/spatial/comfort-and-accessibility.md) — comfort + a11y
|
|
330
|
+
- [`examples/component-spatial-locomotion.md`](component-spatial-locomotion.md) — VR locomotion
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# `SpeedDialAction` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `SpeedDialAction`. Single action item inside a [`SpeedDial`](component-speed-dial.md) — child component, surfaces an icon + tooltip when the parent is open.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<SpeedDial ariaLabel="새로 만들기" icon={<PlusIcon />}>
|
|
9
|
+
<SpeedDialAction
|
|
10
|
+
icon={<EditIcon />}
|
|
11
|
+
tooltipTitle="새 글"
|
|
12
|
+
onClick={() => navigate("/compose")}
|
|
13
|
+
/>
|
|
14
|
+
<SpeedDialAction
|
|
15
|
+
icon={<CameraIcon />}
|
|
16
|
+
tooltipTitle="사진"
|
|
17
|
+
onClick={openCamera}
|
|
18
|
+
/>
|
|
19
|
+
</SpeedDial>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| Prop | Type | Default | Description |
|
|
23
|
+
| --- | --- | --- | --- |
|
|
24
|
+
| `icon` | `ReactNode` | required | Action icon |
|
|
25
|
+
| `tooltipTitle` | `string` | required | Tooltip / aria label |
|
|
26
|
+
| `tooltipPlacement` | `"top" \| "bottom" \| "left" \| "right"` | per parent | Tooltip side |
|
|
27
|
+
| `tooltipOpen` | `boolean` | `false` | Always-visible label (instead of hover) |
|
|
28
|
+
| `onClick` | `() => void` | — | Action callback |
|
|
29
|
+
| `disabled` | `boolean` | `false` | Disabled |
|
|
30
|
+
|
|
31
|
+
## States
|
|
32
|
+
|
|
33
|
+
| State | Visual |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| Hidden (parent closed) | Not rendered |
|
|
36
|
+
| Visible (parent open) | Animated entrance with stagger |
|
|
37
|
+
| Hover | Bg shift + tooltip visible |
|
|
38
|
+
| Pressed | Active state |
|
|
39
|
+
| Disabled | Reduced opacity, no events |
|
|
40
|
+
|
|
41
|
+
## Animation
|
|
42
|
+
|
|
43
|
+
Entrance: scaled from 0 → 1 + fades in. Stagger 50ms between siblings (handled by parent SpeedDial).
|
|
44
|
+
|
|
45
|
+
## Tokens consumed
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
--speed-dial-action-bg
|
|
49
|
+
--speed-dial-action-fg
|
|
50
|
+
--speed-dial-action-size (typically 40-44px)
|
|
51
|
+
--speed-dial-action-shadow
|
|
52
|
+
--motion-fast
|
|
53
|
+
--ease-out
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Inherits from parent SpeedDial's tokens.
|
|
57
|
+
|
|
58
|
+
## Accessibility
|
|
59
|
+
|
|
60
|
+
- `<button aria-label={tooltipTitle}>`.
|
|
61
|
+
- Tooltip optional (parent shows them by default).
|
|
62
|
+
- Touch target ≥ 44pt.
|
|
63
|
+
- For tooltipOpen=true: tooltip becomes a persistent label, not a hover hint.
|
|
64
|
+
|
|
65
|
+
## Don't
|
|
66
|
+
|
|
67
|
+
- Don't ship SpeedDialAction outside a SpeedDial parent — orphan.
|
|
68
|
+
- Don't omit tooltipTitle. It's the accessible label.
|
|
69
|
+
- Don't make actions different sizes within one SpeedDial.
|
|
70
|
+
|
|
71
|
+
## References
|
|
72
|
+
|
|
73
|
+
- MUI: [`SpeedDialAction`](../refs/mui/packages/mui-material/src/SpeedDialAction)
|
|
74
|
+
|
|
75
|
+
## Cross-reference
|
|
76
|
+
|
|
77
|
+
- [`examples/component-speed-dial.md`](component-speed-dial.md) — parent
|
|
78
|
+
- [`examples/component-icon-button.md`](component-icon-button.md) — sibling pattern
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# `SpeedDial` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `SpeedDial`. A floating action button (FAB) that expands into a radial / vertical menu of secondary actions on hover or tap. Common in mobile apps for "create" / "compose" multi-action triggers.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Mobile app primary action with 2-5 sub-actions ("New post", "Camera", "Voice memo").
|
|
8
|
+
- Editor canvas tool palette.
|
|
9
|
+
- Quick-action menu in dashboards.
|
|
10
|
+
|
|
11
|
+
When NOT to use:
|
|
12
|
+
- One-off action (use plain FAB / `FloatButton`).
|
|
13
|
+
- 6+ sub-actions (becomes overwhelming; use full menu).
|
|
14
|
+
- Desktop primary nav (use Sidebar / NavigationMenu).
|
|
15
|
+
|
|
16
|
+
## Anatomy
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
[✏️] Compose
|
|
20
|
+
[📷] Camera
|
|
21
|
+
[🎤] Voice
|
|
22
|
+
[➕] ← FAB (collapsed)
|
|
23
|
+
|
|
24
|
+
Closed: just the FAB.
|
|
25
|
+
Open: actions fan up (or out radially) above the FAB.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## API
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
<SpeedDial
|
|
32
|
+
ariaLabel="Create"
|
|
33
|
+
icon={<PlusIcon />}
|
|
34
|
+
openIcon={<XIcon />}
|
|
35
|
+
>
|
|
36
|
+
<SpeedDial.Action
|
|
37
|
+
icon={<EditIcon />}
|
|
38
|
+
tooltipTitle="Compose"
|
|
39
|
+
onClick={compose}
|
|
40
|
+
/>
|
|
41
|
+
<SpeedDial.Action
|
|
42
|
+
icon={<CameraIcon />}
|
|
43
|
+
tooltipTitle="Camera"
|
|
44
|
+
onClick={openCamera}
|
|
45
|
+
/>
|
|
46
|
+
<SpeedDial.Action
|
|
47
|
+
icon={<MicIcon />}
|
|
48
|
+
tooltipTitle="Voice"
|
|
49
|
+
onClick={recordVoice}
|
|
50
|
+
/>
|
|
51
|
+
</SpeedDial>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| Prop | Type | Default | Description |
|
|
55
|
+
| --- | --- | --- | --- |
|
|
56
|
+
| `ariaLabel` | `string` | required | FAB accessible label |
|
|
57
|
+
| `icon` | `ReactNode` | — | Closed-state icon |
|
|
58
|
+
| `openIcon` | `ReactNode` | rotated `icon` | Open-state icon (often X) |
|
|
59
|
+
| `direction` | `"up" \| "down" \| "left" \| "right"` | `"up"` | Action expansion direction |
|
|
60
|
+
| `placement` | `"bottom-right" \| "bottom-left" \| "top-right" \| "top-left"` | `"bottom-right"` | FAB position on screen |
|
|
61
|
+
| `hidden` | `boolean` | `false` | Hide entire SpeedDial |
|
|
62
|
+
| `open` | `boolean` | controlled | Open state |
|
|
63
|
+
| `onOpen` / `onClose` | function | — | State callbacks |
|
|
64
|
+
|
|
65
|
+
## States
|
|
66
|
+
|
|
67
|
+
| State | Visual |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| Closed | FAB only |
|
|
70
|
+
| Hover (desktop) | Auto-opens (configurable) |
|
|
71
|
+
| Tap (mobile) | Opens with stagger animation |
|
|
72
|
+
| Open | Actions visible with tooltip labels |
|
|
73
|
+
| Action hover | Action highlights |
|
|
74
|
+
| Action click | Closes SpeedDial; fires action |
|
|
75
|
+
|
|
76
|
+
## Animation
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
Open: actions fan out one-by-one with 50ms stagger
|
|
80
|
+
Each scales from 0 to 1 + fades in
|
|
81
|
+
Total: ~250ms
|
|
82
|
+
|
|
83
|
+
Close: reverse, faster (~150ms)
|
|
84
|
+
|
|
85
|
+
Backdrop: optional dim of background while open
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Reduced motion: skip stagger; instant appear / disappear.
|
|
89
|
+
|
|
90
|
+
## Tokens consumed
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
--fab-bg (FAB color)
|
|
94
|
+
--fab-fg
|
|
95
|
+
--fab-shadow
|
|
96
|
+
--fab-size (typically 56px)
|
|
97
|
+
--speed-dial-action-bg (smaller secondary FABs)
|
|
98
|
+
--speed-dial-action-fg
|
|
99
|
+
--speed-dial-action-size (40-44px)
|
|
100
|
+
--speed-dial-tooltip-bg
|
|
101
|
+
--speed-dial-tooltip-fg
|
|
102
|
+
--space-md
|
|
103
|
+
--motion-medium
|
|
104
|
+
--ease-out
|
|
105
|
+
--z-fab
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Accessibility
|
|
109
|
+
|
|
110
|
+
- FAB: `<button aria-label="..." aria-haspopup="true" aria-expanded>`.
|
|
111
|
+
- Action: `<button aria-label="...">`.
|
|
112
|
+
- Each Action has visible (or aria-described) tooltip.
|
|
113
|
+
- Keyboard: focus FAB → Enter opens → arrow keys navigate actions → Enter activates.
|
|
114
|
+
- Esc closes.
|
|
115
|
+
- Focus trap optional (depending on whether actions are independent or sequential).
|
|
116
|
+
|
|
117
|
+
## Korean conventions
|
|
118
|
+
|
|
119
|
+
- 작성하기 / 새 글 / 새 글 쓰기 — common labels for "compose"
|
|
120
|
+
- 카메라 / 사진 / 동영상 — for media actions
|
|
121
|
+
- 음성 메모 — voice memo
|
|
122
|
+
- 안전영역 (safe area) on iOS — bottom inset 고려
|
|
123
|
+
|
|
124
|
+
## Code example
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
function MobileApp() {
|
|
128
|
+
return (
|
|
129
|
+
<>
|
|
130
|
+
<main>{/* main content */}</main>
|
|
131
|
+
|
|
132
|
+
<SpeedDial
|
|
133
|
+
ariaLabel="새로 만들기"
|
|
134
|
+
icon={<PlusIcon />}
|
|
135
|
+
placement="bottom-right"
|
|
136
|
+
direction="up"
|
|
137
|
+
sx={{ position: "fixed", bottom: 80, right: 16 }}
|
|
138
|
+
>
|
|
139
|
+
<SpeedDial.Action
|
|
140
|
+
icon={<EditIcon />}
|
|
141
|
+
tooltipTitle="새 글"
|
|
142
|
+
onClick={() => navigate("/compose")}
|
|
143
|
+
/>
|
|
144
|
+
<SpeedDial.Action
|
|
145
|
+
icon={<CameraIcon />}
|
|
146
|
+
tooltipTitle="사진"
|
|
147
|
+
onClick={openCamera}
|
|
148
|
+
/>
|
|
149
|
+
<SpeedDial.Action
|
|
150
|
+
icon={<MicIcon />}
|
|
151
|
+
tooltipTitle="음성"
|
|
152
|
+
onClick={recordVoice}
|
|
153
|
+
/>
|
|
154
|
+
</SpeedDial>
|
|
155
|
+
</>
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Don't
|
|
161
|
+
|
|
162
|
+
- Don't put 6+ actions. Becomes overwhelming.
|
|
163
|
+
- Don't open on hover for mobile-primary apps (no hover; users miss it). Tap-only on mobile.
|
|
164
|
+
- Don't omit safe-area inset on iOS — FAB covered by home indicator.
|
|
165
|
+
- Don't use SpeedDial when a single-purpose FAB suffices.
|
|
166
|
+
- Don't anchor at top — expectations are bottom corner.
|
|
167
|
+
|
|
168
|
+
## References
|
|
169
|
+
|
|
170
|
+
- MUI: [`SpeedDial`](../refs/mui/packages/mui-material/src/SpeedDial)
|
|
171
|
+
- Material Design: SpeedDial pattern
|
|
172
|
+
- Patterns: Twitter / Instagram compose FAB
|
|
173
|
+
|
|
174
|
+
## Cross-reference
|
|
175
|
+
|
|
176
|
+
- [`examples/component-float-button.md`](component-float-button.md) — single-action FAB
|
|
177
|
+
- [`examples/component-bottom-navigation.md`](component-bottom-navigation.md) — common companion
|