@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,320 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
# `ScrollReveal` (custom β viewport-triggered animation primitive) β spec
|
|
3
|
+
|
|
4
|
+
> Animates a child element into view when it enters the viewport. One-shot by default. Used heavily in marketing pages and feature grids; restraint required in product UI. Pairs with [`knowledge/motion/marketing-motion.md`](../knowledge/motion/marketing-motion.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
- Reveal sections / cards / images as user scrolls them into view.
|
|
9
|
+
- One-shot per element (no replaying on every scroll up/down).
|
|
10
|
+
- Reduced-motion safe (instantly visible).
|
|
11
|
+
- Compose with stagger for parent β children sequences.
|
|
12
|
+
|
|
13
|
+
Without this: every team hand-rolls IntersectionObserver wrappers and gets the threshold / once-only / reduced-motion logic subtly wrong.
|
|
14
|
+
|
|
15
|
+
## Anatomy
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
[viewport edge]
|
|
19
|
+
βββββββββββββββββββββββββββββββββ
|
|
20
|
+
β ScrollReveal child sits below fold
|
|
21
|
+
(opacity 0, translateY +16px)
|
|
22
|
+
|
|
23
|
+
β user scrolls; element crosses 80% threshold
|
|
24
|
+
|
|
25
|
+
[viewport edge]
|
|
26
|
+
βββββββββββββββββββββββββββββββββ
|
|
27
|
+
[ScrollReveal child] β animates into place
|
|
28
|
+
(200ms fade + translateY β 0)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## API
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
<ScrollReveal>
|
|
35
|
+
<FeatureCard title="..." />
|
|
36
|
+
</ScrollReveal>
|
|
37
|
+
|
|
38
|
+
// With stagger across siblings:
|
|
39
|
+
<ScrollReveal staggerChildren={60}>
|
|
40
|
+
<FeatureCard title="A" />
|
|
41
|
+
<FeatureCard title="B" />
|
|
42
|
+
<FeatureCard title="C" />
|
|
43
|
+
</ScrollReveal>
|
|
44
|
+
|
|
45
|
+
// Custom motion:
|
|
46
|
+
<ScrollReveal effect="fade-up" delay={100} duration={300}>
|
|
47
|
+
<Hero />
|
|
48
|
+
</ScrollReveal>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Prop | Type | Default | Description |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| `effect` | `"fade" \| "fade-up" \| "fade-in-blur" \| "scale-in"` | `"fade-up"` | Entrance style |
|
|
54
|
+
| `threshold` | `number` | `0.2` | IntersectionObserver threshold (0β1) |
|
|
55
|
+
| `rootMargin` | `string` | `"0px 0px -10% 0px"` | IO margin (negative bottom = trigger before bottom edge) |
|
|
56
|
+
| `once` | `boolean` | `true` | Trigger only on first intersection |
|
|
57
|
+
| `delay` | `number` | `0` | Ms before animation starts after threshold crossed |
|
|
58
|
+
| `duration` | `number` | `200` | Ms |
|
|
59
|
+
| `easing` | `string` | `"var(--ease-out)"` | CSS easing |
|
|
60
|
+
| `staggerChildren` | `number` | `0` | Ms between sibling reveals (only on direct children) |
|
|
61
|
+
| `disabled` | `boolean` | auto via `prefers-reduced-motion` | Skip animation; show instantly |
|
|
62
|
+
| `as` | `keyof JSX.IntrinsicElements` | `"div"` | Wrapper element |
|
|
63
|
+
| `onReveal` | `() => void` | β | Fires when reveal starts |
|
|
64
|
+
|
|
65
|
+
## Effects
|
|
66
|
+
|
|
67
|
+
### `fade-up` (default)
|
|
68
|
+
|
|
69
|
+
Most common. Element rises 16px and fades in.
|
|
70
|
+
|
|
71
|
+
```css
|
|
72
|
+
[data-reveal][data-state="hidden"] {
|
|
73
|
+
opacity: 0;
|
|
74
|
+
transform: translateY(16px);
|
|
75
|
+
}
|
|
76
|
+
[data-reveal][data-state="visible"] {
|
|
77
|
+
opacity: 1;
|
|
78
|
+
transform: translateY(0);
|
|
79
|
+
transition: opacity 200ms var(--ease-out), transform 200ms var(--ease-out);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `fade`
|
|
84
|
+
|
|
85
|
+
Pure opacity. Used when motion would compete with surrounding context (e.g., dense data tables).
|
|
86
|
+
|
|
87
|
+
### `fade-in-blur`
|
|
88
|
+
|
|
89
|
+
Adds `filter: blur(4px) β blur(0)`. Premium / brand feel; expensive on mobile (avoid on long lists).
|
|
90
|
+
|
|
91
|
+
### `scale-in`
|
|
92
|
+
|
|
93
|
+
`transform: scale(0.95) β scale(1)` + opacity. Used for hero illustrations, feature cards.
|
|
94
|
+
|
|
95
|
+
## States
|
|
96
|
+
|
|
97
|
+
| State | data-state | Visual |
|
|
98
|
+
| --- | --- | --- |
|
|
99
|
+
| Hidden (not yet intersected) | `hidden` | Pre-animation transform applied; opacity 0 |
|
|
100
|
+
| Revealing (intersected; transition in flight) | `revealing` | Animating to visible |
|
|
101
|
+
| Visible | `visible` | Final state; transitions removed |
|
|
102
|
+
| Reduced motion / disabled | `visible` | Instant final state, no transition |
|
|
103
|
+
|
|
104
|
+
## Tokens consumed
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
--motion-medium (200ms default)
|
|
108
|
+
--ease-out
|
|
109
|
+
--space-md (16px translate distance for fade-up)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Stagger behavior
|
|
113
|
+
|
|
114
|
+
When `staggerChildren` is set, ScrollReveal applies a CSS variable `--reveal-delay` to each direct child based on its index:
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
<ScrollReveal staggerChildren={60}>
|
|
118
|
+
{/* index 0: delay 0ms */}
|
|
119
|
+
{/* index 1: delay 60ms */}
|
|
120
|
+
{/* index 2: delay 120ms */}
|
|
121
|
+
</ScrollReveal>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Cap stagger at 5 children. Beyond that:
|
|
125
|
+
- Total delay > 300ms feels glacial.
|
|
126
|
+
- Use a single reveal for the whole group, or paginate the reveal.
|
|
127
|
+
|
|
128
|
+
## Reduced motion
|
|
129
|
+
|
|
130
|
+
```css
|
|
131
|
+
@media (prefers-reduced-motion: reduce) {
|
|
132
|
+
[data-reveal] {
|
|
133
|
+
opacity: 1 !important;
|
|
134
|
+
transform: none !important;
|
|
135
|
+
transition: none !important;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
The element is **always visible** in reduced-motion mode. Don't hide it β that breaks layout for users who never see the animation trigger.
|
|
141
|
+
|
|
142
|
+
## Implementation
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
import { useEffect, useRef, useState, Children, cloneElement } from "react";
|
|
146
|
+
|
|
147
|
+
function ScrollReveal({
|
|
148
|
+
children,
|
|
149
|
+
effect = "fade-up",
|
|
150
|
+
threshold = 0.2,
|
|
151
|
+
rootMargin = "0px 0px -10% 0px",
|
|
152
|
+
once = true,
|
|
153
|
+
delay = 0,
|
|
154
|
+
duration = 200,
|
|
155
|
+
staggerChildren = 0,
|
|
156
|
+
as: Tag = "div",
|
|
157
|
+
onReveal,
|
|
158
|
+
}: Props) {
|
|
159
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
160
|
+
const [revealed, setRevealed] = useState(false);
|
|
161
|
+
const reduced = usePrefersReducedMotion();
|
|
162
|
+
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
if (reduced || !ref.current) {
|
|
165
|
+
setRevealed(true);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const obs = new IntersectionObserver(
|
|
169
|
+
([entry]) => {
|
|
170
|
+
if (entry.isIntersecting) {
|
|
171
|
+
setRevealed(true);
|
|
172
|
+
onReveal?.();
|
|
173
|
+
if (once) obs.disconnect();
|
|
174
|
+
} else if (!once) {
|
|
175
|
+
setRevealed(false);
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
{ threshold, rootMargin }
|
|
179
|
+
);
|
|
180
|
+
obs.observe(ref.current);
|
|
181
|
+
return () => obs.disconnect();
|
|
182
|
+
}, [reduced, threshold, rootMargin, once, onReveal]);
|
|
183
|
+
|
|
184
|
+
const state = revealed ? "visible" : "hidden";
|
|
185
|
+
|
|
186
|
+
return (
|
|
187
|
+
<Tag
|
|
188
|
+
ref={ref}
|
|
189
|
+
data-reveal={effect}
|
|
190
|
+
data-state={state}
|
|
191
|
+
style={{
|
|
192
|
+
"--reveal-duration": `${duration}ms`,
|
|
193
|
+
"--reveal-delay": `${delay}ms`,
|
|
194
|
+
} as React.CSSProperties}
|
|
195
|
+
>
|
|
196
|
+
{staggerChildren > 0
|
|
197
|
+
? Children.map(children, (child, i) =>
|
|
198
|
+
cloneElement(child as React.ReactElement, {
|
|
199
|
+
style: {
|
|
200
|
+
...(child as any).props?.style,
|
|
201
|
+
"--reveal-delay": `${delay + i * staggerChildren}ms`,
|
|
202
|
+
transitionDelay: revealed ? `${delay + i * staggerChildren}ms` : "0ms",
|
|
203
|
+
},
|
|
204
|
+
})
|
|
205
|
+
)
|
|
206
|
+
: children}
|
|
207
|
+
</Tag>
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
CSS:
|
|
213
|
+
|
|
214
|
+
```css
|
|
215
|
+
[data-reveal] {
|
|
216
|
+
transition-property: opacity, transform, filter;
|
|
217
|
+
transition-duration: var(--reveal-duration, 200ms);
|
|
218
|
+
transition-timing-function: var(--ease-out);
|
|
219
|
+
transition-delay: var(--reveal-delay, 0ms);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
[data-reveal="fade-up"][data-state="hidden"] {
|
|
223
|
+
opacity: 0;
|
|
224
|
+
transform: translateY(16px);
|
|
225
|
+
}
|
|
226
|
+
[data-reveal="fade"][data-state="hidden"] { opacity: 0; }
|
|
227
|
+
[data-reveal="fade-in-blur"][data-state="hidden"] {
|
|
228
|
+
opacity: 0;
|
|
229
|
+
filter: blur(4px);
|
|
230
|
+
}
|
|
231
|
+
[data-reveal="scale-in"][data-state="hidden"] {
|
|
232
|
+
opacity: 0;
|
|
233
|
+
transform: scale(0.95);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
[data-reveal][data-state="visible"] {
|
|
237
|
+
opacity: 1;
|
|
238
|
+
transform: none;
|
|
239
|
+
filter: none;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
@media (prefers-reduced-motion: reduce) {
|
|
243
|
+
[data-reveal] {
|
|
244
|
+
opacity: 1 !important;
|
|
245
|
+
transform: none !important;
|
|
246
|
+
filter: none !important;
|
|
247
|
+
transition: none !important;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Where to use vs not
|
|
253
|
+
|
|
254
|
+
### Good fits
|
|
255
|
+
|
|
256
|
+
- Marketing landing-page sections (hero next, features, testimonials, CTA).
|
|
257
|
+
- Long-scroll storytelling / case-study pages.
|
|
258
|
+
- Pricing tier reveal as user scrolls.
|
|
259
|
+
- Feature grid / icon row entrances.
|
|
260
|
+
|
|
261
|
+
### Bad fits
|
|
262
|
+
|
|
263
|
+
- Data tables / dense product UIs (motion competes with reading).
|
|
264
|
+
- Above-the-fold content (no scroll happens; element flashes in).
|
|
265
|
+
- Lists with > 20 items (cumulative motion fatigue; use simple fade-in or none).
|
|
266
|
+
- Critical content (CTAs, errors, prices) β never gate on intersection.
|
|
267
|
+
|
|
268
|
+
## Korean market note
|
|
269
|
+
|
|
270
|
+
Korean B2C landing pages often skip ScrollReveal entirely and lean denser, faster-loading static content. Toss-style minimal sites use it sparingly. Naver-style dense pages don't use it. Use restraint β over-revealed sections read as foreign / over-designed in Korean context.
|
|
271
|
+
|
|
272
|
+
## Accessibility
|
|
273
|
+
|
|
274
|
+
- Element is in DOM and accessible to screen readers regardless of visual state. SR users see "hidden" only as a visual.
|
|
275
|
+
- Don't use `display: none` or `visibility: hidden` for hidden state β those remove from a11y tree.
|
|
276
|
+
- `prefers-reduced-motion`: enforced via the CSS media query. ScrollReveal becomes a no-op.
|
|
277
|
+
- For decorative reveals (purely visual), leave the wrapper without role.
|
|
278
|
+
- For meaningful content (e.g., a stat or testimonial): the wrapper should pass through ARIA from children.
|
|
279
|
+
|
|
280
|
+
## Edge cases
|
|
281
|
+
|
|
282
|
+
- **Element taller than viewport**: with default `threshold: 0.2`, element triggers when 20% visible. For very tall sections, lower to `0.05`.
|
|
283
|
+
- **Element starts inside viewport on page load**: IntersectionObserver fires immediately on observe; element reveals on first frame. Fine.
|
|
284
|
+
- **User opens page already scrolled (deep link to mid-page)**: IO fires on already-visible elements; reveals trigger correctly.
|
|
285
|
+
- **Element wrapped in conditional rendering**: ensure ref is stable; use `key` on parent if remounting.
|
|
286
|
+
- **Multiple ScrollReveal nested**: each operates independently. Avoid > 2 levels of nesting (motion fatigue).
|
|
287
|
+
- **`once: false` + rapid scroll up/down**: element re-animates each time. Annoying. Default to `once: true` always.
|
|
288
|
+
|
|
289
|
+
## Performance
|
|
290
|
+
|
|
291
|
+
- IntersectionObserver is cheap (passive). 100+ instances per page is fine.
|
|
292
|
+
- `transform` and `opacity` are GPU-composited. Don't extend to `width`/`height`.
|
|
293
|
+
- `filter: blur()` (fade-in-blur) is expensive on low-end mobile. Avoid on lists.
|
|
294
|
+
- Stagger across many children: prefer CSS-driven (set delay per child) over JS-driven setTimeout chains.
|
|
295
|
+
|
|
296
|
+
## Don't
|
|
297
|
+
|
|
298
|
+
- Don't trigger ScrollReveal on every scroll direction. Default `once: true` for sanity.
|
|
299
|
+
- Don't reveal critical content on scroll β error messages, prices, CTAs must be present immediately.
|
|
300
|
+
- Don't use heavy effects (blur, large translate) on > 5 items in a row.
|
|
301
|
+
- Don't nest ScrollReveal inside ScrollReveal β coordination breaks.
|
|
302
|
+
- Don't skip reduced-motion handling β vestibular triggers are real for some users.
|
|
303
|
+
- Don't use ScrollReveal in product UI just because marketing uses it β different motion language.
|
|
304
|
+
|
|
305
|
+
## References
|
|
306
|
+
|
|
307
|
+
Patterns drawn from:
|
|
308
|
+
- AOS (Animate On Scroll) library
|
|
309
|
+
- Framer Motion `whileInView` API
|
|
310
|
+
- View Timeline API (CSS scroll-driven animations, modern web)
|
|
311
|
+
|
|
312
|
+
For 2025+: explore CSS-only via `animation-timeline: view()` β ScrollReveal becomes purely CSS in Chrome / Edge. Keep JS implementation as fallback.
|
|
313
|
+
|
|
314
|
+
## Cross-reference
|
|
315
|
+
|
|
316
|
+
- [`knowledge/motion/marketing-motion.md`](../knowledge/motion/marketing-motion.md) β when scroll-triggered reveals fit
|
|
317
|
+
- [`knowledge/motion/choreography-depth.md`](../knowledge/motion/choreography-depth.md) β stagger formulas
|
|
318
|
+
- [`knowledge/motion/principles.md`](../knowledge/motion/principles.md) β duration / easing tokens
|
|
319
|
+
- [`examples/component-feature-grid.md`](component-feature-grid.md) β common ScrollReveal wrapper
|
|
320
|
+
- [`examples/component-page-transition.md`](component-page-transition.md) β route-level transitions (different concern)
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# `Segmented` (Toggle button group) β spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Segmented`, MUI `ToggleButtonGroup`, shadcn-ui `toggle-group`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A row of mutually exclusive options shown as connected buttons. Pick one. Used for: view mode (List / Grid), time range (μ€λ / 7μΌ / 30μΌ), filter sort, density toggle (Compact / Standard / Comfortable).
|
|
8
|
+
|
|
9
|
+
## When Segmented vs alternatives
|
|
10
|
+
|
|
11
|
+
| Pattern | Use |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| **Segmented** | 2β5 short options, mutually exclusive, frequently switched |
|
|
14
|
+
| **Tabs** | 3β6 sections of content (more weight, often span the page) |
|
|
15
|
+
| **Select** | 6+ options, less-frequent switching |
|
|
16
|
+
| **Radio group** | Form input β submit later |
|
|
17
|
+
| **Switch** | Binary on/off, immediate effect |
|
|
18
|
+
|
|
19
|
+
Segmented is the iOS-native pattern (also called "segmented control"). Compact, immediate, ideal for dashboard-style filters.
|
|
20
|
+
|
|
21
|
+
## Anatomy
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
βββββββββββββββββββββββββββββββββββββββ
|
|
25
|
+
β βββββββ ββββββ βββββ β
|
|
26
|
+
β βμ€λ β β μ£Ό β β μ β β β all three inside a container, active filled
|
|
27
|
+
β βββββββ ββββββ βββββ β
|
|
28
|
+
βββββββββββββββββββββββββββββββββββββββ
|
|
29
|
+
|
|
30
|
+
With icons:
|
|
31
|
+
βββββββββββββββββββββββββββββββββββββββ
|
|
32
|
+
β ββββββββ ββββββββ ββββββββ β
|
|
33
|
+
β β β° Listβ β β Gridβ β β° Cardβ β
|
|
34
|
+
β ββββββββ ββββββββ ββββββββ β
|
|
35
|
+
βββββββββββββββββββββββββββββββββββββββ
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## API
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
<Segmented
|
|
42
|
+
value={view}
|
|
43
|
+
onValueChange={setView}
|
|
44
|
+
options={[
|
|
45
|
+
{ value: "today", label: "μ€λ" },
|
|
46
|
+
{ value: "week", label: "μ΄λ² μ£Ό" },
|
|
47
|
+
{ value: "month", label: "μ΄λ² λ¬" },
|
|
48
|
+
]}
|
|
49
|
+
size="md"
|
|
50
|
+
/>
|
|
51
|
+
|
|
52
|
+
<Segmented
|
|
53
|
+
value={layout}
|
|
54
|
+
onValueChange={setLayout}
|
|
55
|
+
options={[
|
|
56
|
+
{ value: "list", label: "List", icon: <ListIcon /> },
|
|
57
|
+
{ value: "grid", label: "Grid", icon: <GridIcon /> },
|
|
58
|
+
]}
|
|
59
|
+
/>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
| Prop | Type | Default | Description |
|
|
63
|
+
| --- | --- | --- | --- |
|
|
64
|
+
| `value` | `string \| number` | β | Active option |
|
|
65
|
+
| `onValueChange` | `(value) => void` | β | |
|
|
66
|
+
| `options` | `Option[]` or `string[]` | β | List of choices |
|
|
67
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
|
|
68
|
+
| `disabled` | `boolean` | `false` | Disables all |
|
|
69
|
+
| `block` | `boolean` | `false` | Stretches to full width (each option equal-flex) |
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
type Option = {
|
|
73
|
+
value: string | number;
|
|
74
|
+
label: ReactNode;
|
|
75
|
+
icon?: ReactNode;
|
|
76
|
+
disabled?: boolean;
|
|
77
|
+
};
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Sizes
|
|
81
|
+
|
|
82
|
+
| Size | Height | Font | Padding-x |
|
|
83
|
+
| --- | --- | --- | --- |
|
|
84
|
+
| `sm` | 28px | 12px | 8px |
|
|
85
|
+
| `md` (default) | 32px | 14px | 12px |
|
|
86
|
+
| `lg` | 40px | 16px | 16px |
|
|
87
|
+
|
|
88
|
+
## States
|
|
89
|
+
|
|
90
|
+
| State | Visual |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| Default (inactive option) | Transparent bg, neutral text |
|
|
93
|
+
| Active option | Filled bg `--color-bg-default` (lighter than container), darker text |
|
|
94
|
+
| Hover (inactive) | Slight bg shift |
|
|
95
|
+
| Focus-visible | 2px ring on the active or focused option |
|
|
96
|
+
| Disabled | All options muted |
|
|
97
|
+
|
|
98
|
+
The container background is slightly darker than the page (`--color-bg-subtle`); the active option is lighter (`--color-bg-default`) β creating an "indented vs raised" visual distinction.
|
|
99
|
+
|
|
100
|
+
## Tokens consumed
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
--color-bg-subtle (container bg)
|
|
104
|
+
--color-bg-default (active option bg)
|
|
105
|
+
--color-text-primary (active option text)
|
|
106
|
+
--color-text-secondary (inactive option)
|
|
107
|
+
--color-focus-ring
|
|
108
|
+
--space-xs, --space-sm
|
|
109
|
+
--radius-md (container)
|
|
110
|
+
--radius-sm (option pills inside)
|
|
111
|
+
--motion-fast, --easing-out (active indicator slide)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Active indicator transition
|
|
115
|
+
|
|
116
|
+
When the user clicks a different option, the white "indicator" can slide to the new position (~150ms ease-out). This is iOS-native polish but requires layout-stable rendering.
|
|
117
|
+
|
|
118
|
+
```css
|
|
119
|
+
.segmented-item {
|
|
120
|
+
transition: background-color 150ms ease-out;
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
For more sophisticated animation: animate a positioned "indicator" element rather than each item's bg.
|
|
125
|
+
|
|
126
|
+
## Accessibility
|
|
127
|
+
|
|
128
|
+
- Container: `role="radiogroup"` (since options are mutually exclusive).
|
|
129
|
+
- Each option: `role="radio"`, `aria-checked={value === option.value}`.
|
|
130
|
+
- Container `aria-label` describes the group ("View mode" / "Time range").
|
|
131
|
+
|
|
132
|
+
### Keyboard
|
|
133
|
+
|
|
134
|
+
| Key | Behavior |
|
|
135
|
+
| --- | --- |
|
|
136
|
+
| `Tab` | Reach the active option (single tab stop) |
|
|
137
|
+
| `β` / `β` (or `β` / `β`) | Move focus + select next/previous |
|
|
138
|
+
| `Home` / `End` | First / last |
|
|
139
|
+
| `Space` | Activate focused option (if not auto-activate) |
|
|
140
|
+
|
|
141
|
+
By default: auto-activate (focus = select). For expensive operations: manual mode requires Space/Enter.
|
|
142
|
+
|
|
143
|
+
## Mobile patterns
|
|
144
|
+
|
|
145
|
+
Works fine on touch β each option is large enough. For very many options (5+), wraps to multiple rows or scrolls horizontally.
|
|
146
|
+
|
|
147
|
+
For Korean apps: short labels (1β4 syllables) work best.
|
|
148
|
+
|
|
149
|
+
## Common usage
|
|
150
|
+
|
|
151
|
+
| Where | Options |
|
|
152
|
+
| --- | --- |
|
|
153
|
+
| Time filter on dashboard | "μ€λ / 7μΌ / 30μΌ / μ¬μ©μ μ§μ " |
|
|
154
|
+
| View mode toggle | "List / Grid / Card" |
|
|
155
|
+
| Density | "Compact / Standard / Comfortable" |
|
|
156
|
+
| Theme | "Light / Dark / System" |
|
|
157
|
+
| Currency display (KR fintech) | "β© / μ / Korean number" |
|
|
158
|
+
| Stock convention | "Korean (red=up) / Western" |
|
|
159
|
+
|
|
160
|
+
## Don't
|
|
161
|
+
|
|
162
|
+
- Don't use Segmented for 6+ options. Use Select.
|
|
163
|
+
- Don't use for binary on/off. Use Switch.
|
|
164
|
+
- Don't use as in-page navigation between separate views. Use Tabs.
|
|
165
|
+
- Don't use long labels. Stay under ~10 chars per option.
|
|
166
|
+
- Don't disable the currently-active option. Disable the inactive ones if needed.
|
|
167
|
+
|
|
168
|
+
## References
|
|
169
|
+
|
|
170
|
+
- Ant Design: [`refs/ant-design/components/segmented/`](../refs/ant-design/components/segmented/) β `Segmented` with options, sizes, block mode, custom rendering. Modern Ant addition.
|
|
171
|
+
- MUI: [`refs/mui/packages/mui-material/src/ToggleButtonGroup/`](../refs/mui/packages/mui-material/src/ToggleButtonGroup/) β supports both single and multiple. Set `exclusive={true}` for segmented behavior.
|
|
172
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/) β `toggle-group.tsx`. Radix Toggle Group primitive.
|
|
173
|
+
|
|
174
|
+
## Cross-reference
|
|
175
|
+
|
|
176
|
+
- [`examples/component-tabs.md`](component-tabs.md) β when sections are heavier
|
|
177
|
+
- [`examples/component-form-controls.md`](component-form-controls.md) β radio group alternative for forms
|
|
178
|
+
- [`examples/component-button.md`](component-button.md) β single-button alternative
|