@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,178 @@
|
|
|
1
|
+
# `Skeleton` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Skeleton`, MUI `Skeleton`, shadcn-ui `skeleton`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A placeholder rendered while content loads. Shows the **shape** of what's coming — title bar, paragraph lines, image, etc. Reduces perceived load time and prevents layout shift when the real content arrives.
|
|
8
|
+
|
|
9
|
+
## When Skeleton vs Spinner
|
|
10
|
+
|
|
11
|
+
| Use Skeleton | Use Spinner |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| First load of a screen (we know the shape) | Async action with no shape (form submit, API call) |
|
|
14
|
+
| List of items where each item has a known structure | Indeterminate "thinking" state |
|
|
15
|
+
| Component with predictable layout | Inline loading on a button |
|
|
16
|
+
|
|
17
|
+
For pagination or refresh of an existing list: **don't replace items with skeletons**. Show a small inline spinner. Keep the loaded data.
|
|
18
|
+
|
|
19
|
+
## Anatomy — primitives
|
|
20
|
+
|
|
21
|
+
A Skeleton is composed from three primitive shapes:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
Text line: ▔▔▔▔▔▔▔▔▔▔▔▔▔
|
|
25
|
+
Block: ▢▢▢▢
|
|
26
|
+
Circle: ◯
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
<Skeleton variant="text" width="80%" />
|
|
31
|
+
<Skeleton variant="rect" width={120} height={120} />
|
|
32
|
+
<Skeleton variant="circle" size={48} />
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## API
|
|
36
|
+
|
|
37
|
+
| Prop | Type | Default | Description |
|
|
38
|
+
| --- | --- | --- | --- |
|
|
39
|
+
| `variant` | `"text" \| "rect" \| "circle"` | `"text"` | Shape |
|
|
40
|
+
| `width` | `string \| number` | `"100%"` (text) | Pixels or CSS unit |
|
|
41
|
+
| `height` | `string \| number` | scaled to text size | |
|
|
42
|
+
| `size` | `number` | — | Convenience for circle (W=H) |
|
|
43
|
+
| `lines` | `number` | `1` | For variant="text" — render N lines |
|
|
44
|
+
| `animation` | `"shimmer" \| "pulse" \| "none"` | `"shimmer"` | |
|
|
45
|
+
|
|
46
|
+
## Composition for higher-level shapes
|
|
47
|
+
|
|
48
|
+
Build screen-specific skeletons by composing primitives:
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
// Card skeleton
|
|
52
|
+
<Card>
|
|
53
|
+
<Skeleton variant="rect" height={160} /> {/* hero image */}
|
|
54
|
+
<Card.Body>
|
|
55
|
+
<Skeleton variant="text" width="60%" /> {/* title */}
|
|
56
|
+
<Skeleton variant="text" width="100%" /> {/* desc line 1 */}
|
|
57
|
+
<Skeleton variant="text" width="80%" /> {/* desc line 2 */}
|
|
58
|
+
</Card.Body>
|
|
59
|
+
</Card>
|
|
60
|
+
|
|
61
|
+
// List item skeleton
|
|
62
|
+
<div className="flex gap-3 py-3">
|
|
63
|
+
<Skeleton variant="circle" size={40} /> {/* avatar */}
|
|
64
|
+
<div className="flex-1">
|
|
65
|
+
<Skeleton variant="text" width="40%" /> {/* name */}
|
|
66
|
+
<Skeleton variant="text" width="80%" /> {/* preview */}
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
For frequent shapes, expose a higher-level skeleton: `<Skeleton.Card />`, `<Skeleton.ListItem />`.
|
|
72
|
+
|
|
73
|
+
## Animation
|
|
74
|
+
|
|
75
|
+
| Animation | Look | Use |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| `shimmer` (default) | Diagonal gradient sweeps left → right, 1500ms loop linear | Universal — most polished |
|
|
78
|
+
| `pulse` | Opacity 0.5 → 1 fade-pulse | Calmer, less attention-grabbing |
|
|
79
|
+
| `none` | Static | Reduced-motion mode, or when many skeletons are on screen |
|
|
80
|
+
|
|
81
|
+
Implement shimmer as:
|
|
82
|
+
```css
|
|
83
|
+
.skeleton {
|
|
84
|
+
background: linear-gradient(90deg, var(--color-bg-subtle), var(--color-bg-elevated), var(--color-bg-subtle));
|
|
85
|
+
background-size: 200% 100%;
|
|
86
|
+
animation: shimmer 1500ms linear infinite;
|
|
87
|
+
}
|
|
88
|
+
@keyframes shimmer {
|
|
89
|
+
0% { background-position: -200% 0; }
|
|
90
|
+
100% { background-position: 200% 0; }
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## States
|
|
95
|
+
|
|
96
|
+
The Skeleton itself doesn't have states — it's a placeholder. The transition is from skeleton → real content.
|
|
97
|
+
|
|
98
|
+
### Transition rules
|
|
99
|
+
|
|
100
|
+
- Show skeleton immediately on mount when waiting for data.
|
|
101
|
+
- If data arrives in < 200ms: never show skeleton. (Avoid flicker.)
|
|
102
|
+
- If data arrives in 200–600ms: showing skeleton helps perceived speed.
|
|
103
|
+
- If data arrives in > 600ms: skeleton is **essential**.
|
|
104
|
+
- On data arrive: skeleton unmounts, real content appears. Match heights to prevent layout shift.
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
{isLoading ? <Skeleton.Card /> : <ProductCard data={data} />}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Tokens consumed
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
--color-bg-subtle (skeleton base)
|
|
114
|
+
--color-bg-elevated (shimmer highlight)
|
|
115
|
+
--radius-sm (text shape)
|
|
116
|
+
--radius-md (rect shape)
|
|
117
|
+
--radius-full (circle shape)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Accessibility
|
|
121
|
+
|
|
122
|
+
- Wrap a group of skeletons in `aria-busy="true"` with `aria-label="Loading"`.
|
|
123
|
+
- The skeletons themselves can be `aria-hidden="true"` — they don't add information for screen readers.
|
|
124
|
+
- **Don't** announce "loading loading loading" for each skeleton. One container-level announcement.
|
|
125
|
+
- When data loads, remove `aria-busy` and announce result if helpful (`role="status"` with `"5 results loaded"`).
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
<div aria-busy={isLoading} aria-live="polite" aria-label={isLoading ? "Loading transactions" : undefined}>
|
|
129
|
+
{isLoading ? (
|
|
130
|
+
<>
|
|
131
|
+
<Skeleton.ListItem />
|
|
132
|
+
<Skeleton.ListItem />
|
|
133
|
+
<Skeleton.ListItem />
|
|
134
|
+
</>
|
|
135
|
+
) : (
|
|
136
|
+
<TransactionList items={data} />
|
|
137
|
+
)}
|
|
138
|
+
</div>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Reduced motion
|
|
142
|
+
|
|
143
|
+
Honor `prefers-reduced-motion`:
|
|
144
|
+
|
|
145
|
+
```css
|
|
146
|
+
@media (prefers-reduced-motion: reduce) {
|
|
147
|
+
.skeleton { animation: none; }
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
The skeleton still renders (showing layout); just no animation.
|
|
152
|
+
|
|
153
|
+
## Edge cases
|
|
154
|
+
|
|
155
|
+
- **Skeleton matched to wrong content shape**: real content arrives, layout shifts. Bug. Always preview the skeleton vs the real component.
|
|
156
|
+
- **Skeleton everywhere**: a page entirely of skeletons feels slow even at fast TTI. Try to render at least the page chrome (header, nav) immediately and skeleton only the data area.
|
|
157
|
+
- **Skeleton inside a Skeleton**: don't nest. Compose at the outer level.
|
|
158
|
+
- **Skeleton on a dark mode card**: token `--color-bg-subtle` is darker than `--color-bg-default` in dark mode — confirm visibility.
|
|
159
|
+
- **Variable-width text**: skeleton width should approximate the average. 60% / 80% / 100% mix reads natural.
|
|
160
|
+
|
|
161
|
+
## Don't
|
|
162
|
+
|
|
163
|
+
- Don't show a skeleton for < 200ms. The flicker is worse than briefly-empty.
|
|
164
|
+
- Don't show a skeleton on user actions (button clicks). Use a button loading state.
|
|
165
|
+
- Don't replace existing data with skeletons during refresh — keep stale data + show subtle progress.
|
|
166
|
+
- Don't ship without `prefers-reduced-motion` handling.
|
|
167
|
+
- Don't use skeletons as decorative loading bars. They're for content shape.
|
|
168
|
+
|
|
169
|
+
## References
|
|
170
|
+
|
|
171
|
+
- Ant Design: [`refs/ant-design/components/skeleton/`](../refs/ant-design/components/skeleton/) — most exhaustive: `Skeleton.Avatar`, `Skeleton.Button`, `Skeleton.Image`, `Skeleton.Input`, `Skeleton.Node`. Pre-composed shapes for common components.
|
|
172
|
+
- MUI: [`refs/mui/packages/mui-material/src/Skeleton/`](../refs/mui/packages/mui-material/src/Skeleton/) — primitive only. Composition is up to the consumer.
|
|
173
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/skeleton.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/skeleton.tsx) — minimal Tailwind-based primitive.
|
|
174
|
+
|
|
175
|
+
## Cross-reference
|
|
176
|
+
|
|
177
|
+
- [knowledge/patterns/list-and-feed.md](../knowledge/patterns/list-and-feed.md) — list-loading patterns
|
|
178
|
+
- [knowledge/patterns/ux-guidelines.md](../knowledge/patterns/ux-guidelines.md) — broader loading-state rules
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# `Slide` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `Slide`. Transition primitive that slides a child in / out from a specified direction. Sibling to `Fade`, `Zoom`, `Grow`, `Collapse`.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Drawer / Sheet entrance (slides from edge).
|
|
8
|
+
- Toast / Snackbar entrance (slides up from bottom).
|
|
9
|
+
- Sequential reveals on scroll-into-view.
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<Slide direction="up" in={open} mountOnEnter unmountOnExit>
|
|
15
|
+
<div className="card">
|
|
16
|
+
Content
|
|
17
|
+
</div>
|
|
18
|
+
</Slide>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
| Prop | Type | Default | Description |
|
|
22
|
+
| --- | --- | --- | --- |
|
|
23
|
+
| `in` | `boolean` | required | Show / hide |
|
|
24
|
+
| `direction` | `"up" \| "down" \| "left" \| "right"` | `"down"` | Slide-from direction |
|
|
25
|
+
| `timeout` | `number \| { enter, exit }` | `225` | Ms |
|
|
26
|
+
| `easing` | `string \| { enter, exit }` | per Material | CSS easing |
|
|
27
|
+
| `appear` | `boolean` | `false` | Animate on first mount |
|
|
28
|
+
| `mountOnEnter` / `unmountOnExit` | `boolean` | `false` | DOM mount control |
|
|
29
|
+
|
|
30
|
+
## CSS
|
|
31
|
+
|
|
32
|
+
```css
|
|
33
|
+
.slide-up-enter {
|
|
34
|
+
transform: translateY(100%);
|
|
35
|
+
}
|
|
36
|
+
.slide-up-enter-active {
|
|
37
|
+
transform: translateY(0);
|
|
38
|
+
transition: transform 250ms var(--ease-out);
|
|
39
|
+
}
|
|
40
|
+
.slide-up-exit-active {
|
|
41
|
+
transform: translateY(100%);
|
|
42
|
+
transition: transform 195ms var(--ease-out);
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Direction variants flip the translate axis.
|
|
47
|
+
|
|
48
|
+
## Reduced motion
|
|
49
|
+
|
|
50
|
+
```css
|
|
51
|
+
@media (prefers-reduced-motion: reduce) {
|
|
52
|
+
.slide-* { transition: none; }
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Tokens consumed
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
--motion-medium
|
|
60
|
+
--ease-out
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Code example — bottom sheet entrance
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
<Slide in={open} direction="up" mountOnEnter unmountOnExit>
|
|
67
|
+
<div className="bottom-sheet">
|
|
68
|
+
<SheetContent />
|
|
69
|
+
</div>
|
|
70
|
+
</Slide>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Don't
|
|
74
|
+
|
|
75
|
+
- Don't slide horizontally large amounts on narrow viewports — content invisible mid-transition.
|
|
76
|
+
- Don't ignore reduced motion.
|
|
77
|
+
- Don't combine Slide with Fade and Zoom together — pick one motion idiom.
|
|
78
|
+
|
|
79
|
+
## References
|
|
80
|
+
|
|
81
|
+
- MUI: [`Slide`](../refs/mui/packages/mui-material/src/Slide)
|
|
82
|
+
- Material Design motion
|
|
83
|
+
|
|
84
|
+
## Cross-reference
|
|
85
|
+
|
|
86
|
+
- [`examples/component-zoom.md`](component-zoom.md)
|
|
87
|
+
- [`examples/component-sheet.md`](component-sheet.md) — uses slide internally
|
|
88
|
+
- [`examples/component-drawer.md`](component-drawer.md) — uses slide internally
|
|
89
|
+
- [`knowledge/motion/principles.md`](../knowledge/motion/principles.md)
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# `Slider` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Slider`, MUI `Slider`, shadcn-ui `slider`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A control for selecting a numeric value (or a range) by dragging. Used for: volume, price filter, opacity, brightness, age range.
|
|
8
|
+
|
|
9
|
+
## When Slider vs Input
|
|
10
|
+
|
|
11
|
+
| Use Slider | Use Input (numeric) |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| Approximate value matters more than exact | Exact value matters |
|
|
14
|
+
| Continuous range with no obvious snap points | Discrete options or precise numbers |
|
|
15
|
+
| Visual feedback as the user adjusts | User knows the value (e.g., DOB year, transaction amount) |
|
|
16
|
+
|
|
17
|
+
For amounts (currency, distance), prefer Input. For preferences (volume, contrast adjustment), Slider.
|
|
18
|
+
|
|
19
|
+
## Anatomy
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Single value:
|
|
23
|
+
0 ──────●─────────── 100
|
|
24
|
+
45
|
|
25
|
+
|
|
26
|
+
Range:
|
|
27
|
+
0 ─────●━━━━━━━●─── 100
|
|
28
|
+
20 80
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Slot | Required | Notes |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| Track | yes | Background line |
|
|
34
|
+
| Range fill | yes | Filled portion (single: 0→thumb, range: thumb1→thumb2) |
|
|
35
|
+
| Thumb(s) | yes | Draggable circle(s) |
|
|
36
|
+
| Tick marks | optional | Small lines at intervals |
|
|
37
|
+
| Step labels | optional | Numbers at tick positions |
|
|
38
|
+
| Value display | optional | Tooltip at thumb OR fixed display nearby |
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
<Slider
|
|
44
|
+
value={volume}
|
|
45
|
+
onValueChange={setVolume}
|
|
46
|
+
min={0}
|
|
47
|
+
max={100}
|
|
48
|
+
step={1}
|
|
49
|
+
label="볼륨"
|
|
50
|
+
showValue
|
|
51
|
+
/>
|
|
52
|
+
|
|
53
|
+
<Slider
|
|
54
|
+
value={priceRange}
|
|
55
|
+
onValueChange={setPriceRange}
|
|
56
|
+
min={0}
|
|
57
|
+
max={1000000}
|
|
58
|
+
step={10000}
|
|
59
|
+
range
|
|
60
|
+
label="가격대"
|
|
61
|
+
formatValue={(v) => `₩${v.toLocaleString()}`}
|
|
62
|
+
/>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| Prop | Type | Default | Description |
|
|
66
|
+
| --- | --- | --- | --- |
|
|
67
|
+
| `value` / `defaultValue` | `number \| [number, number]` | — | Single or range. `[number, number]` triggers range mode |
|
|
68
|
+
| `onValueChange` | `(value) => void` | — | Fires while dragging (debounced) |
|
|
69
|
+
| `onValueCommit` | `(value) => void` | — | Fires only on drag-end (use for expensive updates) |
|
|
70
|
+
| `range` | `boolean` | inferred from value type | Force range mode |
|
|
71
|
+
| `min` / `max` | `number` | `0` / `100` | |
|
|
72
|
+
| `step` | `number` | `1` | Increment per arrow key / tick |
|
|
73
|
+
| `marks` | `{ value: number, label?: string }[]` | — | Custom marks |
|
|
74
|
+
| `disabled` | `boolean` | `false` | |
|
|
75
|
+
| `label` | `string` | — | Visible label (above slider) |
|
|
76
|
+
| `showValue` | `boolean` | `false` | Render value as tooltip on thumb |
|
|
77
|
+
| `formatValue` | `(value) => string` | `String(value)` | Custom format |
|
|
78
|
+
| `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | |
|
|
79
|
+
| `inverted` | `boolean` | `false` | Right-to-left direction |
|
|
80
|
+
|
|
81
|
+
## States
|
|
82
|
+
|
|
83
|
+
| State | Visual |
|
|
84
|
+
| --- | --- |
|
|
85
|
+
| Default | Track + thumb at value position |
|
|
86
|
+
| Hover (thumb) | Thumb slightly larger or shadow |
|
|
87
|
+
| Focus-visible | 2px ring around thumb |
|
|
88
|
+
| Dragging | Cursor: grabbing; thumb scaled up; tooltip visible |
|
|
89
|
+
| Disabled | Track + thumb muted, no events |
|
|
90
|
+
|
|
91
|
+
## Sizes
|
|
92
|
+
|
|
93
|
+
| Size | Track height | Thumb size |
|
|
94
|
+
| --- | --- | --- |
|
|
95
|
+
| `sm` | 2px | 14px |
|
|
96
|
+
| `md` (default) | 4px | 18px |
|
|
97
|
+
| `lg` | 6px | 22px |
|
|
98
|
+
|
|
99
|
+
For mobile touch: `md` minimum. The thumb's hit area extends beyond the visible thumb by ~12px each side to support thumb dragging.
|
|
100
|
+
|
|
101
|
+
## Tokens consumed
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
--color-bg-subtle (track)
|
|
105
|
+
--color-primary-default (range fill, thumb)
|
|
106
|
+
--color-bg-default (thumb center, ring)
|
|
107
|
+
--color-text-primary (value display)
|
|
108
|
+
--color-focus-ring
|
|
109
|
+
--space-xs, --space-sm
|
|
110
|
+
--radius-full (thumb)
|
|
111
|
+
--motion-fast, --easing-out
|
|
112
|
+
--shadow-card (thumb shadow)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Accessibility — WAI-ARIA Slider pattern
|
|
116
|
+
|
|
117
|
+
- Single thumb: `role="slider"`, `aria-valuenow`, `aria-valuemin`, `aria-valuemax`, `aria-orientation`, `aria-label` (or `aria-labelledby`).
|
|
118
|
+
- Range: two `role="slider"` thumbs, each with their own valuenow + label ("Minimum price" / "Maximum price").
|
|
119
|
+
- `aria-valuetext` if the displayed value isn't a plain number (e.g., "₩50,000" instead of "50000").
|
|
120
|
+
|
|
121
|
+
### Keyboard
|
|
122
|
+
|
|
123
|
+
| Key | Behavior |
|
|
124
|
+
| --- | --- |
|
|
125
|
+
| `Tab` | Reach slider (thumb 1; if range, then thumb 2) |
|
|
126
|
+
| `←` / `↓` | Decrement by `step` |
|
|
127
|
+
| `→` / `↑` | Increment by `step` |
|
|
128
|
+
| `Home` | min value |
|
|
129
|
+
| `End` | max value |
|
|
130
|
+
| `PageUp` / `PageDown` | Larger step (typically 10× step) |
|
|
131
|
+
|
|
132
|
+
For range slider with overlapping thumbs: each thumb maintains independent focus + keyboard control. Thumb that would cross the other "pushes" it (or stops at the other's position).
|
|
133
|
+
|
|
134
|
+
## Touch / drag behavior
|
|
135
|
+
|
|
136
|
+
- Hit area for thumb: 44×44 pt minimum (extend with invisible padding).
|
|
137
|
+
- Drag the track: should jump-to-value-and-start-drag from any track position.
|
|
138
|
+
- Snap to step: cleanly, no fractional positions.
|
|
139
|
+
- Vibration / haptic feedback (mobile): subtle haptic at each step crossing for some apps; off by default for sliders that are continuous-feeling.
|
|
140
|
+
|
|
141
|
+
## Edge cases
|
|
142
|
+
|
|
143
|
+
- **Range thumbs overlap**: when min and max meet, thumbs occupy the same space. Allow this (they're interchangeable). Visual: render z-index so the active one is on top.
|
|
144
|
+
- **`step` doesn't divide `max - min` evenly**: thumb snaps to nearest step; the max position might not be reachable. Prefer round-numbered max + step combinations.
|
|
145
|
+
- **Very large ranges with small step**: 0–1,000,000 with step=1 gives a million positions but only ~1000 px of track. Thumb position is still continuous; consider bumping step to 1000 or showing a numeric input next to the slider for precision.
|
|
146
|
+
- **Vertical orientation**: arrow keys reverse on `↑`/`↓` semantically (up = increase). Keep that.
|
|
147
|
+
- **RTL**: track flows right-to-left automatically with `dir="rtl"`. Use logical CSS.
|
|
148
|
+
- **Dragging while page scrolls**: prevent accidental page scroll on touch — use `touch-action: none` on the slider.
|
|
149
|
+
|
|
150
|
+
## Code example
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
// Volume control
|
|
154
|
+
<Slider
|
|
155
|
+
label="볼륨"
|
|
156
|
+
value={volume}
|
|
157
|
+
onValueChange={setVolume}
|
|
158
|
+
min={0}
|
|
159
|
+
max={100}
|
|
160
|
+
step={1}
|
|
161
|
+
showValue
|
|
162
|
+
formatValue={(v) => `${v}%`}
|
|
163
|
+
/>
|
|
164
|
+
|
|
165
|
+
// Price range filter
|
|
166
|
+
<Slider
|
|
167
|
+
label="가격대"
|
|
168
|
+
value={priceRange}
|
|
169
|
+
onValueChange={setPriceRange} // updates UI live
|
|
170
|
+
onValueCommit={fetchResults} // server-fetch only on release
|
|
171
|
+
min={0}
|
|
172
|
+
max={1000000}
|
|
173
|
+
step={10000}
|
|
174
|
+
range
|
|
175
|
+
marks={[
|
|
176
|
+
{ value: 0, label: "₩0" },
|
|
177
|
+
{ value: 250000, label: "₩25만" },
|
|
178
|
+
{ value: 500000, label: "₩50만" },
|
|
179
|
+
{ value: 750000, label: "₩75만" },
|
|
180
|
+
{ value: 1000000, label: "₩100만+" },
|
|
181
|
+
]}
|
|
182
|
+
formatValue={(v) => `₩${v.toLocaleString()}`}
|
|
183
|
+
/>
|
|
184
|
+
|
|
185
|
+
// Disabled state with explanation
|
|
186
|
+
<Slider value={50} disabled aria-label="요금제 한도 도달" />
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Don't
|
|
190
|
+
|
|
191
|
+
- Don't use Slider for exact numeric input where the exact value matters. Use a number input (or both — common in price filters: slider + two number inputs synced).
|
|
192
|
+
- Don't omit `aria-label` (or `label` prop). Sliders without an accessible name are unusable.
|
|
193
|
+
- Don't fire expensive operations on `onValueChange` (debounce 100ms minimum, or use `onValueCommit`).
|
|
194
|
+
- Don't disable the slider without explaining why (tooltip or inline help).
|
|
195
|
+
- Don't have `step` so small that arrow keys feel useless (1 over a 0–1,000,000 range — 1,000,000 keypresses).
|
|
196
|
+
- Don't show a slider for binary choices. Use a Switch.
|
|
197
|
+
- Don't layer two sliders on top of each other to fake range. Use proper range mode.
|
|
198
|
+
|
|
199
|
+
## References
|
|
200
|
+
|
|
201
|
+
- Ant Design: [`refs/ant-design/components/slider/`](../refs/ant-design/components/slider/) — `Slider` with `range`, `marks`, `step`, `included` (whether range fill shows). Solid impl.
|
|
202
|
+
- MUI: [`refs/mui/packages/mui-material/src/Slider/`](../refs/mui/packages/mui-material/src/Slider/) — `Slider` with rich `marks`, `valueLabelDisplay`, `track="normal" | "false" | "inverted"`. Most comprehensive.
|
|
203
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/slider.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/slider.tsx) — Radix Slider primitive. Simplest API.
|
|
204
|
+
|
|
205
|
+
## Cross-reference
|
|
206
|
+
|
|
207
|
+
- [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md) — keyboard contract for slider
|
|
208
|
+
- [`examples/component-input.md`](component-input.md) — when number input is the right choice instead
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# `SnackbarContent` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `SnackbarContent`. The default visual surface inside a `Snackbar` — message text + optional action button. Use for custom Snackbars beyond the simple message-string case.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Snackbars with rich content (icon + text + action button).
|
|
8
|
+
- Inline banners that look like Snackbars but live in-page (rare).
|
|
9
|
+
- For simple toasts, `Snackbar message="..."` auto-renders SnackbarContent — no direct use needed.
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<Snackbar open={open} onClose={handleClose}>
|
|
15
|
+
<SnackbarContent
|
|
16
|
+
message="저장됐어요"
|
|
17
|
+
action={
|
|
18
|
+
<Button color="inherit" size="small" onClick={handleUndo}>
|
|
19
|
+
실행 취소
|
|
20
|
+
</Button>
|
|
21
|
+
}
|
|
22
|
+
/>
|
|
23
|
+
</Snackbar>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
| Prop | Type | Default | Description |
|
|
27
|
+
| --- | --- | --- | --- |
|
|
28
|
+
| `message` | `ReactNode` | — | The message |
|
|
29
|
+
| `action` | `ReactNode` | — | Action button (right-aligned) |
|
|
30
|
+
| `role` | `string` | `'alert'` | ARIA role |
|
|
31
|
+
|
|
32
|
+
## Tokens consumed
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
--snackbar-bg /* dark surface (high-contrast for floating ephemeral UI) */
|
|
36
|
+
--snackbar-fg
|
|
37
|
+
--snackbar-padding
|
|
38
|
+
--snackbar-radius
|
|
39
|
+
--snackbar-shadow-md
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Accessibility
|
|
43
|
+
|
|
44
|
+
- Default `role="alert"` makes the message announce to screen readers immediately on appear.
|
|
45
|
+
- Use `role="status"` for less-urgent updates ("저장 중...").
|
|
46
|
+
- Action button's accessible name comes from its label — keep concise (1-2 words).
|
|
47
|
+
|
|
48
|
+
## Edge cases
|
|
49
|
+
|
|
50
|
+
- **Korean message brevity** — Snackbars auto-dismiss in ~5s; keep messages short ("저장됐어요" not "변경사항이 성공적으로 저장됐습니다").
|
|
51
|
+
- **Multiple actions** — limit to 1 action; if more needed, use a Dialog instead.
|
|
52
|
+
- **Long messages** — wrap to 2 lines max.
|
|
53
|
+
|
|
54
|
+
## Code example
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
<Snackbar
|
|
58
|
+
open={state.open}
|
|
59
|
+
autoHideDuration={5000}
|
|
60
|
+
onClose={handleClose}
|
|
61
|
+
anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}
|
|
62
|
+
>
|
|
63
|
+
<SnackbarContent
|
|
64
|
+
message={
|
|
65
|
+
<Stack direction="row" alignItems="center" gap={1}>
|
|
66
|
+
<CheckCircleIcon fontSize="small" aria-hidden />
|
|
67
|
+
<span>저장됐어요</span>
|
|
68
|
+
</Stack>
|
|
69
|
+
}
|
|
70
|
+
action={
|
|
71
|
+
<Button color="inherit" size="small" onClick={handleUndo}>
|
|
72
|
+
실행 취소
|
|
73
|
+
</Button>
|
|
74
|
+
}
|
|
75
|
+
/>
|
|
76
|
+
</Snackbar>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Don't
|
|
80
|
+
|
|
81
|
+
- Don't use for errors that block flow — those are Dialogs.
|
|
82
|
+
- Don't pile multiple Snackbars on screen — at most one at a time.
|
|
83
|
+
|
|
84
|
+
## References
|
|
85
|
+
|
|
86
|
+
- MUI: [`SnackbarContent`](../refs/mui/packages/mui-material/src/SnackbarContent/)
|
|
87
|
+
|
|
88
|
+
## Cross-reference
|
|
89
|
+
|
|
90
|
+
- [`component-snackbar.md`](component-snackbar.md)
|
|
91
|
+
- [`component-alert.md`](component-alert.md)
|
|
92
|
+
- [`component-toast.md`](component-toast.md)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# `Snackbar` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `Snackbar` and Material 3 snackbar pattern. Bottom-anchored brief notification with optional action — Material's specific name for the Toast pattern. See [`component-toast.md`](component-toast.md) for the broader Toast family.
|
|
4
|
+
|
|
5
|
+
## Snackbar vs Toast vs Message vs Notification
|
|
6
|
+
|
|
7
|
+
| Library | Position | Use |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Snackbar (Material) | Bottom-center / bottom-left | Brief result + optional Undo |
|
|
10
|
+
| Toast (Sonner / shadcn / Ant) | Bottom-right (configurable) | Same as Snackbar |
|
|
11
|
+
| Message (Ant) | Top-center | Brief inline confirmation |
|
|
12
|
+
| Notification (Ant) | Top-right corner card | Rich title + description |
|
|
13
|
+
|
|
14
|
+
In design-ai's canonical synthesis: **Snackbar = MUI's name for Toast**. Pick one terminology per project.
|
|
15
|
+
|
|
16
|
+
## Anatomy
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
┌────────────────────────┐
|
|
20
|
+
│ Marked as read [Undo] [×] │
|
|
21
|
+
└────────────────────────┘
|
|
22
|
+
↑ bottom-center (Material default)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## API
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
<Snackbar
|
|
29
|
+
open={open}
|
|
30
|
+
onClose={() => setOpen(false)}
|
|
31
|
+
message="읽음 처리됨"
|
|
32
|
+
action={
|
|
33
|
+
<Button size="sm" onClick={undo}>실행 취소</Button>
|
|
34
|
+
}
|
|
35
|
+
autoHideDuration={6000}
|
|
36
|
+
anchorOrigin={{ vertical: "bottom", horizontal: "center" }}
|
|
37
|
+
/>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| Prop | Type | Default | Description |
|
|
41
|
+
| --- | --- | --- | --- |
|
|
42
|
+
| `open` | `boolean` | controlled | Visibility |
|
|
43
|
+
| `onClose` | `(reason) => void` | — | Close callback (auto / manual / clickaway) |
|
|
44
|
+
| `message` | `string \| ReactNode` | — | Content |
|
|
45
|
+
| `action` | `ReactNode` | — | Trailing action button(s) |
|
|
46
|
+
| `autoHideDuration` | `number` | `6000` | Ms before auto-close; null = persistent |
|
|
47
|
+
| `anchorOrigin` | `{ vertical, horizontal }` | bottom-left | Position |
|
|
48
|
+
| `severity` | `"success" \| "info" \| "warning" \| "error"` | none | Color preset |
|
|
49
|
+
|
|
50
|
+
## States
|
|
51
|
+
|
|
52
|
+
| State | Visual |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| Closed | Hidden |
|
|
55
|
+
| Opening | Slide up + fade in (200ms) |
|
|
56
|
+
| Open | Visible; auto-hide timer ticks |
|
|
57
|
+
| Closing | Slide down + fade out |
|
|
58
|
+
|
|
59
|
+
## Tokens consumed
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
--snackbar-bg (default; near-black on light, near-white on dark)
|
|
63
|
+
--snackbar-fg
|
|
64
|
+
--snackbar-action (action button text)
|
|
65
|
+
--snackbar-shadow
|
|
66
|
+
--radius-md
|
|
67
|
+
--motion-medium
|
|
68
|
+
--ease-out
|
|
69
|
+
--z-snackbar (above content, below modals)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Accessibility
|
|
73
|
+
|
|
74
|
+
- `role="status"` (informational) or `role="alert"` (errors).
|
|
75
|
+
- `aria-live="polite"` (status) or `assertive` (alert) — be sparing.
|
|
76
|
+
- Auto-hide pauses on hover / focus (don't dismiss while user is reading or interacting).
|
|
77
|
+
- Esc closes if focusable.
|
|
78
|
+
|
|
79
|
+
## Code example — undo pattern
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
async function deleteItem(id: string) {
|
|
83
|
+
const item = items.find(i => i.id === id);
|
|
84
|
+
setItems(prev => prev.filter(i => i.id !== id));
|
|
85
|
+
|
|
86
|
+
toast.snackbar({
|
|
87
|
+
message: "삭제되었어요",
|
|
88
|
+
action: <Button onClick={() => setItems(prev => [...prev, item])}>실행 취소</Button>,
|
|
89
|
+
autoHideDuration: 5000,
|
|
90
|
+
onClose: (reason) => {
|
|
91
|
+
if (reason !== "clickaway") {
|
|
92
|
+
api.deleteItem(id); // commit deletion when snackbar closes
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Korean conventions
|
|
100
|
+
|
|
101
|
+
- 삭제됐어요 / 저장됐어요 / 복사됐어요 — typical 해요체 messages
|
|
102
|
+
- 실행 취소 (Undo) — standard label
|
|
103
|
+
- For network errors: "네트워크 오류 — 다시 시도하시겠어요?" + Retry button
|
|
104
|
+
|
|
105
|
+
## Don't
|
|
106
|
+
|
|
107
|
+
- Don't use Snackbar for blocking errors. Use Modal / AlertDialog.
|
|
108
|
+
- Don't show 3+ Snackbars stacked. Queue them.
|
|
109
|
+
- Don't auto-dismiss persistent errors (let user dismiss manually).
|
|
110
|
+
- Don't make autoHide < 4 seconds for messages with Undo. Users need time to act.
|
|
111
|
+
|
|
112
|
+
## References
|
|
113
|
+
|
|
114
|
+
- MUI: [`Snackbar`](../refs/mui/packages/mui-material/src/Snackbar)
|
|
115
|
+
- Material 3: Snackbar pattern
|
|
116
|
+
|
|
117
|
+
## Cross-reference
|
|
118
|
+
|
|
119
|
+
- [`examples/component-toast.md`](component-toast.md) — broader Toast family
|
|
120
|
+
- [`examples/component-message.md`](component-message.md) — top-positioned alternative
|
|
121
|
+
- [`examples/component-notification.md`](component-notification.md) — richer card variant
|