@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,129 @@
|
|
|
1
|
+
# `Popper` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `Popper`. Low-level positioning primitive that handles floating element placement with collision detection. Used internally by Tooltip / Popover / Menu / Autocomplete / Combobox.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- As a primitive for custom floating UI when Tooltip / Popover / Menu don't fit.
|
|
8
|
+
- Building custom dropdowns / pickers / overlays.
|
|
9
|
+
|
|
10
|
+
When NOT to use:
|
|
11
|
+
- Standard menus (use `DropdownMenu`).
|
|
12
|
+
- Tooltips (use `Tooltip`).
|
|
13
|
+
- Click-triggered floating content (use `Popover`).
|
|
14
|
+
- For shadcn-based projects: use Radix Popover under the hood (which uses `@floating-ui/react`).
|
|
15
|
+
|
|
16
|
+
## API
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
<Popper
|
|
20
|
+
open={open}
|
|
21
|
+
anchorEl={anchorEl}
|
|
22
|
+
placement="bottom-start"
|
|
23
|
+
modifiers={[
|
|
24
|
+
{ name: "offset", options: { offset: [0, 8] } },
|
|
25
|
+
{ name: "preventOverflow", options: { padding: 8 } },
|
|
26
|
+
]}
|
|
27
|
+
>
|
|
28
|
+
<div className="custom-floating-content">
|
|
29
|
+
{/* whatever */}
|
|
30
|
+
</div>
|
|
31
|
+
</Popper>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
| Prop | Type | Default | Description |
|
|
35
|
+
| --- | --- | --- | --- |
|
|
36
|
+
| `open` | `boolean` | controlled | Visibility |
|
|
37
|
+
| `anchorEl` | `HTMLElement \| null` | — | Element to anchor to |
|
|
38
|
+
| `placement` | `"top" \| "bottom" \| "left" \| "right"` (+ -start / -end) | `"bottom"` | Preferred placement |
|
|
39
|
+
| `modifiers` | `Modifier[]` | — | Popper.js modifiers (offset, flip, preventOverflow, etc.) |
|
|
40
|
+
| `transition` | `boolean` | `false` | Enable animation hooks |
|
|
41
|
+
| `disablePortal` | `boolean` | `false` | Render in-place vs Portal to body |
|
|
42
|
+
| `keepMounted` | `boolean` | `false` | Keep DOM when closed (for CSS transitions) |
|
|
43
|
+
|
|
44
|
+
## Behaviors
|
|
45
|
+
|
|
46
|
+
| Capability | How |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| **Collision detection** | `flip` modifier flips placement when off-screen |
|
|
49
|
+
| **Boundary clamping** | `preventOverflow` clamps to viewport |
|
|
50
|
+
| **Offset** | Distance from anchor (8-12px typical) |
|
|
51
|
+
| **Arrow** | Optional `arrow` modifier shows caret pointing at anchor |
|
|
52
|
+
| **Portal** | Render in document body to escape parent overflow / z-index issues |
|
|
53
|
+
|
|
54
|
+
## Modifier examples
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
[
|
|
58
|
+
{ name: "offset", options: { offset: [0, 8] } }, // 8px gap
|
|
59
|
+
{ name: "flip", options: { fallbackPlacements: ["top", "right"] } },
|
|
60
|
+
{ name: "preventOverflow", options: { padding: 8 } },
|
|
61
|
+
{ name: "arrow", options: { element: arrowEl } },
|
|
62
|
+
]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
For modern projects: use [`@floating-ui/react`](https://floating-ui.com/) directly. Popper.js is largely superseded; MUI v6+ uses floating-ui internally.
|
|
66
|
+
|
|
67
|
+
## States
|
|
68
|
+
|
|
69
|
+
Stateless from Popper's POV — visibility is controlled via `open`. Animations / transitions are layered separately.
|
|
70
|
+
|
|
71
|
+
## Tokens consumed
|
|
72
|
+
|
|
73
|
+
Popper itself doesn't theme. Tokens go on the children content.
|
|
74
|
+
|
|
75
|
+
## Accessibility
|
|
76
|
+
|
|
77
|
+
- Popper is positioning only. Accessibility comes from the wrapping component:
|
|
78
|
+
- Tooltip uses `role="tooltip"`.
|
|
79
|
+
- Menu uses `role="menu"`.
|
|
80
|
+
- Popover uses `role="dialog"`.
|
|
81
|
+
- Focus management is up to the consumer.
|
|
82
|
+
|
|
83
|
+
## Code example — custom date hover preview
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
function DateHoverPreview({ date }: Props) {
|
|
87
|
+
const [anchor, setAnchor] = useState<HTMLElement | null>(null);
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<>
|
|
91
|
+
<span
|
|
92
|
+
onMouseEnter={(e) => setAnchor(e.currentTarget)}
|
|
93
|
+
onMouseLeave={() => setAnchor(null)}
|
|
94
|
+
>
|
|
95
|
+
{date.toLocaleDateString()}
|
|
96
|
+
</span>
|
|
97
|
+
<Popper
|
|
98
|
+
open={!!anchor}
|
|
99
|
+
anchorEl={anchor}
|
|
100
|
+
placement="top"
|
|
101
|
+
modifiers={[{ name: "offset", options: { offset: [0, 8] } }]}
|
|
102
|
+
>
|
|
103
|
+
<div className="date-preview">
|
|
104
|
+
{date.toLocaleString("ko-KR", { dateStyle: "full", timeStyle: "short" })}
|
|
105
|
+
</div>
|
|
106
|
+
</Popper>
|
|
107
|
+
</>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Don't
|
|
113
|
+
|
|
114
|
+
- Don't use Popper when a higher-level primitive fits (Tooltip / Popover / DropdownMenu).
|
|
115
|
+
- Don't anchor to a transient element (mutates / unmounts) without cleanup.
|
|
116
|
+
- Don't rely on Popper for accessibility — wrap with proper roles + focus management.
|
|
117
|
+
- Don't skip `disablePortal` consideration — default Portal behavior may break z-index in some layouts.
|
|
118
|
+
|
|
119
|
+
## References
|
|
120
|
+
|
|
121
|
+
- MUI: [`Popper`](../refs/mui/packages/mui-material/src/Popper)
|
|
122
|
+
- Popper.js (deprecated; use @floating-ui)
|
|
123
|
+
- @floating-ui/react — modern replacement
|
|
124
|
+
|
|
125
|
+
## Cross-reference
|
|
126
|
+
|
|
127
|
+
- [`examples/component-tooltip.md`](component-tooltip.md) — uses Popper internally
|
|
128
|
+
- [`examples/component-popover.md`](component-popover.md) — uses Popper internally
|
|
129
|
+
- [`examples/component-dropdown.md`](component-dropdown.md) — uses Popper internally
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# `PricingCards` — spec
|
|
2
|
+
|
|
3
|
+
> Marketing primitive. Renders 2–4 pricing tiers in a comparison grid. The single most-iterated section of any SaaS landing page after the hero.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Communicate pricing tiers + features per tier + CTA per tier. Used on `/pricing`, in landing pages, and in upgrade modals.
|
|
8
|
+
|
|
9
|
+
## When PricingCards vs PricingTable
|
|
10
|
+
|
|
11
|
+
| Pattern | Use |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| **PricingCards** | 2–4 tiers; mobile-friendly; consumer-coded |
|
|
14
|
+
| **PricingTable** (full feature matrix) | 4+ tiers OR detailed feature comparison; desktop-first; B2B-coded |
|
|
15
|
+
|
|
16
|
+
Most SaaS: cards on landing, full table on dedicated `/pricing` page.
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
22
|
+
│ ┌──────────┐ ┌──────────────┐ ┌──────────┐ │
|
|
23
|
+
│ │ Free │ │ ⭐ Pro │ │ Business │ │
|
|
24
|
+
│ │ │ │ ‹ 추천 › │ │ │ │
|
|
25
|
+
│ │ ₩0 │ │ ₩9,900/월 │ │ ₩29,000 │ │
|
|
26
|
+
│ │ /월 │ │ │ │ /월 │ │
|
|
27
|
+
│ │ │ │ │ │ │ │
|
|
28
|
+
│ │ ✓ 기능1 │ │ ✓ 기능1 │ │ ✓ 기능1 │ │
|
|
29
|
+
│ │ ✓ 기능2 │ │ ✓ 기능2 │ │ ✓ 기능2 │ │
|
|
30
|
+
│ │ 기능3 ✕ │ │ ✓ 기능3 │ │ ✓ 기능3 │ │
|
|
31
|
+
│ │ 기능4 ✕ │ │ 기능4 ✕ │ │ ✓ 기능4 │ │
|
|
32
|
+
│ │ │ │ │ │ │ │
|
|
33
|
+
│ │ [무료 시작]│ │ [Pro 시작] │ │ [상담 요청]│ │
|
|
34
|
+
│ └──────────┘ └──────────────┘ └──────────┘ │
|
|
35
|
+
└──────────────────────────────────────────────────────────────┘
|
|
36
|
+
|
|
37
|
+
Highlighted "추천" tier: visual emphasis (border, scale-up, accent background).
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
<PricingCards
|
|
44
|
+
tiers={[
|
|
45
|
+
{
|
|
46
|
+
id: "free",
|
|
47
|
+
name: "Free",
|
|
48
|
+
price: { amount: 0, period: "month", currency: "KRW" },
|
|
49
|
+
description: "개인 사용자용",
|
|
50
|
+
features: [
|
|
51
|
+
{ included: true, label: "거래내역 저장 (90일)" },
|
|
52
|
+
{ included: true, label: "기본 카테고리" },
|
|
53
|
+
{ included: false, label: "AI 자동 분류" },
|
|
54
|
+
{ included: false, label: "은행 자동 연동" },
|
|
55
|
+
],
|
|
56
|
+
cta: { label: "무료 시작", onClick: signupFree },
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "pro",
|
|
60
|
+
name: "Pro",
|
|
61
|
+
price: { amount: 9900, period: "month", currency: "KRW" },
|
|
62
|
+
description: "개인 사용자용",
|
|
63
|
+
features: [
|
|
64
|
+
{ included: true, label: "거래내역 저장 (무제한)" },
|
|
65
|
+
{ included: true, label: "사용자 정의 카테고리" },
|
|
66
|
+
{ included: true, label: "AI 자동 분류" },
|
|
67
|
+
{ included: false, label: "팀 공유" },
|
|
68
|
+
],
|
|
69
|
+
cta: { label: "Pro 시작", onClick: signupPro, intent: "primary" },
|
|
70
|
+
highlighted: true,
|
|
71
|
+
badge: "추천",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "business",
|
|
75
|
+
name: "Business",
|
|
76
|
+
price: { amount: 29000, period: "month", currency: "KRW" },
|
|
77
|
+
description: "팀 / 사업자용",
|
|
78
|
+
features: [
|
|
79
|
+
{ included: true, label: "Pro 모든 기능" },
|
|
80
|
+
{ included: true, label: "팀 공유 (최대 10명)" },
|
|
81
|
+
{ included: true, label: "사업자 영수증 처리" },
|
|
82
|
+
{ included: true, label: "전담 고객센터" },
|
|
83
|
+
],
|
|
84
|
+
cta: { label: "상담 요청", onClick: contact },
|
|
85
|
+
},
|
|
86
|
+
]}
|
|
87
|
+
billingPeriod="monthly"
|
|
88
|
+
onBillingPeriodChange={setBillingPeriod}
|
|
89
|
+
/>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
| Prop | Type | Default | Description |
|
|
93
|
+
| --- | --- | --- | --- |
|
|
94
|
+
| `tiers` | `Tier[]` | — | Pricing tiers (2–4 typical) |
|
|
95
|
+
| `billingPeriod` | `"monthly" \| "yearly"` | `"monthly"` | |
|
|
96
|
+
| `onBillingPeriodChange` | `(period) => void` | — | Toggle handler |
|
|
97
|
+
| `yearlyDiscount` | `number` | — | "월 결제 대비 N% 할인" badge |
|
|
98
|
+
| `currency` | `"KRW" \| ...` | `"KRW"` | Display currency |
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
type Tier = {
|
|
102
|
+
id: string;
|
|
103
|
+
name: string; // "Free" / "Pro" / "Business"
|
|
104
|
+
price: { amount: number, period: "month" | "year", currency: string };
|
|
105
|
+
description?: string;
|
|
106
|
+
features: Feature[];
|
|
107
|
+
cta: { label: string, onClick: () => void, intent?: "primary" | "secondary" };
|
|
108
|
+
highlighted?: boolean; // visual emphasis
|
|
109
|
+
badge?: string; // "추천" / "인기"
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
type Feature = {
|
|
113
|
+
included: boolean;
|
|
114
|
+
label: string;
|
|
115
|
+
hint?: string; // tooltip detail
|
|
116
|
+
};
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Tier visual
|
|
120
|
+
|
|
121
|
+
### Default tier (non-highlighted)
|
|
122
|
+
|
|
123
|
+
- Card with neutral border
|
|
124
|
+
- Standard padding
|
|
125
|
+
- Outline button CTA
|
|
126
|
+
|
|
127
|
+
### Highlighted tier ("recommended")
|
|
128
|
+
|
|
129
|
+
- Border in `--color-primary-default`
|
|
130
|
+
- Slightly bigger scale (`transform: scale(1.05)` desktop)
|
|
131
|
+
- Solid primary CTA
|
|
132
|
+
- "추천" badge above the card
|
|
133
|
+
|
|
134
|
+
The highlighted tier is the **default conversion target**. Be explicit about which tier you want users to pick.
|
|
135
|
+
|
|
136
|
+
## Feature display
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
✓ 기능 (included)
|
|
140
|
+
○ 기능 (not included) — gray, muted
|
|
141
|
+
✓ 기능1 ⓘ — with tooltip
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
| Approach | Use |
|
|
145
|
+
| --- | --- |
|
|
146
|
+
| Show all features in every tier (with ✓/○) | Full transparency, easy comparison |
|
|
147
|
+
| Show only included features per tier | Cleaner but harder comparison |
|
|
148
|
+
| Differentials only ("Everything in Free, plus...") | Hierarchical pricing — hides scope |
|
|
149
|
+
|
|
150
|
+
For most consumer fintech: show all features with ✓/○ per tier. Tooltip for explanation.
|
|
151
|
+
|
|
152
|
+
## Billing period toggle
|
|
153
|
+
|
|
154
|
+
Common: monthly vs yearly toggle above the tiers, with "save 20%" badge:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
[월간] [연간 -20%]
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Yearly discount must be **honest**:
|
|
161
|
+
- Monthly tier × 12 vs yearly: show the actual savings.
|
|
162
|
+
- "20% 할인" only if math checks out.
|
|
163
|
+
|
|
164
|
+
## Korean conventions
|
|
165
|
+
|
|
166
|
+
- **Currency**: ₩9,900 / 월 (prefix) or 9,900원/월 (suffix). Pick one. Most Korean SaaS uses 원/월.
|
|
167
|
+
- **Free tier name**: "무료" or "Free" — both work. KakaoBank-style products use "무료".
|
|
168
|
+
- **Recommended tier badge**: "추천" / "가장 인기" / "베스트셀러".
|
|
169
|
+
- **CTA verbs**: "시작" / "가입" / "결제" — short, action-led.
|
|
170
|
+
- **Yearly discount label**: "연간 결제 시 20% 할인" or "월 N원 (연 결제)".
|
|
171
|
+
|
|
172
|
+
## Tokens consumed
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
--color-bg-default
|
|
176
|
+
--color-bg-elevated (highlighted tier)
|
|
177
|
+
--color-bg-subtle (alternating rows in features list)
|
|
178
|
+
--color-primary-default (highlighted border, primary CTA)
|
|
179
|
+
--color-primary-subtle-bg (highlighted bg tint)
|
|
180
|
+
--color-text-primary
|
|
181
|
+
--color-text-secondary
|
|
182
|
+
--color-text-tertiary (un-included features)
|
|
183
|
+
--color-success (included checkmarks)
|
|
184
|
+
--color-border-default
|
|
185
|
+
--space-md, --space-lg, --space-xl
|
|
186
|
+
--radius-lg
|
|
187
|
+
--shadow-card (highlighted tier elevation)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Accessibility
|
|
191
|
+
|
|
192
|
+
- Render as `<section>` with `<h2>` for "Pricing".
|
|
193
|
+
- Each tier: `<article>` with `<h3>` for tier name.
|
|
194
|
+
- Price: prominent, with `aria-label="9,900원 매월"`.
|
|
195
|
+
- Feature list: `<ul>` with `<li>`. ✓/○ as `aria-hidden="true"`; "포함" / "미포함" prefix on each `<li>`'s screen-reader text.
|
|
196
|
+
- Highlighted tier: `aria-label="추천 요금제"`.
|
|
197
|
+
- Billing toggle: `<fieldset>` with radio buttons.
|
|
198
|
+
|
|
199
|
+
## Korean / English label mapping
|
|
200
|
+
|
|
201
|
+
| English | Korean |
|
|
202
|
+
| --- | --- |
|
|
203
|
+
| Free | 무료 |
|
|
204
|
+
| Pro | Pro |
|
|
205
|
+
| Business / Enterprise | Business / 비즈니스 / 엔터프라이즈 |
|
|
206
|
+
| Recommended | 추천 |
|
|
207
|
+
| Most popular | 가장 인기 |
|
|
208
|
+
| Best seller | 베스트셀러 |
|
|
209
|
+
| Get started | 시작하기 |
|
|
210
|
+
| Contact sales | 상담 요청 |
|
|
211
|
+
| Save N% | N% 할인 |
|
|
212
|
+
| / month | / 월 |
|
|
213
|
+
| / year | / 연 |
|
|
214
|
+
|
|
215
|
+
## Code example
|
|
216
|
+
|
|
217
|
+
(See API example above — fully fleshed out.)
|
|
218
|
+
|
|
219
|
+
## Edge cases
|
|
220
|
+
|
|
221
|
+
- **Custom pricing tier** ("Enterprise — Contact us"): no number, just "상담 후 결정". CTA opens contact form.
|
|
222
|
+
- **Free trial** for paid tier: indicate prominently — "14일 무료 체험" near price.
|
|
223
|
+
- **Annual-only / monthly-only**: hide the toggle if not applicable.
|
|
224
|
+
- **Multiple currencies**: detect locale, show appropriate. Fallback USD.
|
|
225
|
+
- **Per-seat pricing**: "₩9,900 / 사용자 / 월". Make explicit.
|
|
226
|
+
|
|
227
|
+
## Don't
|
|
228
|
+
|
|
229
|
+
- Don't have 5+ tiers — analysis paralysis.
|
|
230
|
+
- Don't hide the "free" tier if it exists.
|
|
231
|
+
- Don't auto-select a tier; let users click.
|
|
232
|
+
- Don't show "원래는 비싼" pricing without honest discount math.
|
|
233
|
+
- Don't make the highlighted tier look identical to others — defeats purpose.
|
|
234
|
+
- Don't use "Most popular" for a tier with no actual popularity data.
|
|
235
|
+
- Don't omit "월" / "연" suffix on prices — confusion follows.
|
|
236
|
+
|
|
237
|
+
## References
|
|
238
|
+
|
|
239
|
+
No upstream component matches exactly. Each marketing-builder (Webflow, Framer) has variants. Stripe's pricing page is canonical Western reference. Toss / KakaoBank are canonical Korean.
|
|
240
|
+
|
|
241
|
+
## Cross-reference
|
|
242
|
+
|
|
243
|
+
- [`knowledge/patterns/pricing-page-design.md`](../knowledge/patterns/pricing-page-design.md) — pricing strategy + design
|
|
244
|
+
- [`examples/component-card.md`](component-card.md) — base card primitive
|
|
245
|
+
- [`examples/component-button.md`](component-button.md) — CTA primitive
|
|
246
|
+
- [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — currency display
|
|
247
|
+
- [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — pricing in KR market
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# `Progress` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Progress`, MUI `LinearProgress`/`CircularProgress`, shadcn-ui `progress`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Visualizes the completion of a task. Two variants:
|
|
8
|
+
|
|
9
|
+
| Variant | Use |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| **Linear** (bar) | Long, sequential operations: file upload, multi-step form, page-load progress |
|
|
12
|
+
| **Circular** (ring) | Compact: button loading, profile completion percentage, score display |
|
|
13
|
+
|
|
14
|
+
## Determinate vs Indeterminate
|
|
15
|
+
|
|
16
|
+
| Mode | Use |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| **Determinate** (knows %) | Upload of known file size, multi-step wizard (3/5), survey progress |
|
|
19
|
+
| **Indeterminate** (doesn't know %) | API call with unknown duration, "thinking" states |
|
|
20
|
+
|
|
21
|
+
For indeterminate operations < 2 seconds, prefer a Spinner (not a Progress component). Progress implies multi-step.
|
|
22
|
+
|
|
23
|
+
## Anatomy — Linear
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Determinate: ▰▰▰▰▰▰▰▱▱▱ 60%
|
|
27
|
+
Indeterminate: ▱▱▰▰▰▰▱▱▱▱ (animated sweep)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
<Progress value={60} /> {/* determinate */}
|
|
32
|
+
<Progress /> {/* indeterminate (no value) */}
|
|
33
|
+
<Progress value={60} max={100} /> {/* explicit max */}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Anatomy — Circular
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
⌒⌒
|
|
40
|
+
⟨ 60% ⟩ ← ring with arc filled to 60%, label centered
|
|
41
|
+
⌣⌣
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<Progress variant="circular" value={60} size={48} showLabel />
|
|
46
|
+
<Progress variant="circular" /> {/* indeterminate spinner */}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## API
|
|
50
|
+
|
|
51
|
+
| Prop | Type | Default | Description |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| `value` | `number` | — | 0–100 (or 0–`max`). Omit for indeterminate. |
|
|
54
|
+
| `max` | `number` | `100` | Upper bound |
|
|
55
|
+
| `variant` | `"linear" \| "circular"` | `"linear"` | |
|
|
56
|
+
| `intent` | `"primary" \| "success" \| "warning" \| "error"` | `"primary"` | Bar color |
|
|
57
|
+
| `size` | `"sm" \| "md" \| "lg"` (linear) / `number` (circular, px) | `"md"` / `40` | |
|
|
58
|
+
| `thickness` | `number` | derived | Bar height (linear) or ring stroke (circular) |
|
|
59
|
+
| `showLabel` | `boolean` | `false` | Render the % value |
|
|
60
|
+
| `label` | `ReactNode` | `${value}%` | Custom label |
|
|
61
|
+
| `striped` | `boolean` | `false` | Animated diagonal stripes (linear, indicates active progress) |
|
|
62
|
+
|
|
63
|
+
## Linear sizes
|
|
64
|
+
|
|
65
|
+
| Size | Height | Use |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| `sm` | 4px | Subtle, beneath nav bars |
|
|
68
|
+
| `md` (default) | 8px | Standard upload/download |
|
|
69
|
+
| `lg` | 12px | Hero / dashboard prominence |
|
|
70
|
+
|
|
71
|
+
## Circular sizes
|
|
72
|
+
|
|
73
|
+
| Size | Diameter | Stroke | Use |
|
|
74
|
+
| --- | --- | --- | --- |
|
|
75
|
+
| `sm` (16) | 16px | 2px | Inside a button (loading) |
|
|
76
|
+
| `md` (24) | 24px | 3px | Inline loading indicator |
|
|
77
|
+
| `lg` (40, default) | 40px | 4px | Page/section loader |
|
|
78
|
+
| `xl` (64+) | 64px | 5px | Hero / score display |
|
|
79
|
+
|
|
80
|
+
## States
|
|
81
|
+
|
|
82
|
+
| State | Linear | Circular |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| Determinate, value > 0 | Bar fills `value`% | Ring arc to `value`° |
|
|
85
|
+
| Determinate, value = 100 | Full bar, optional success color shift | Full ring |
|
|
86
|
+
| Indeterminate | Animated sweep (1500ms loop, ease-in-out) | Spinning arc (1000ms loop, linear) |
|
|
87
|
+
| Striped (linear active) | Bar fills + diagonal stripes animate | N/A |
|
|
88
|
+
|
|
89
|
+
## Tokens consumed
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
--color-bg-subtle (track)
|
|
93
|
+
--color-primary-default (bar fill, default intent)
|
|
94
|
+
--color-success
|
|
95
|
+
--color-warning
|
|
96
|
+
--color-error
|
|
97
|
+
--color-text-secondary (label)
|
|
98
|
+
--space-xs, --space-sm
|
|
99
|
+
--radius-full (rounded bar/ring ends)
|
|
100
|
+
--motion-default (transitions on value change)
|
|
101
|
+
--easing-out
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
For dark mode, ensure track is visible against bg — typically `--color-bg-subtle` works in both modes.
|
|
105
|
+
|
|
106
|
+
## Behavior
|
|
107
|
+
|
|
108
|
+
### Determinate value transitions
|
|
109
|
+
|
|
110
|
+
- Animate value changes over 200–400ms with `ease-out`.
|
|
111
|
+
- For very small changes (< 5%), instant transition is fine.
|
|
112
|
+
- Don't animate every frame on continuous progress (e.g., upload at 47.3% → 47.4%) — let the visual update lag for smoother perception.
|
|
113
|
+
|
|
114
|
+
### Indeterminate animation
|
|
115
|
+
|
|
116
|
+
Linear: 0% → 100% sweep, 1500ms loop. The "wave" travels left to right.
|
|
117
|
+
|
|
118
|
+
Circular: full rotation, 1000ms loop, linear easing. The arc itself can also pulse in length (10–80% arc) for the Material-style "growing/shrinking" spinner.
|
|
119
|
+
|
|
120
|
+
## Accessibility
|
|
121
|
+
|
|
122
|
+
- **Determinate**: `role="progressbar"`, `aria-valuenow`, `aria-valuemin`, `aria-valuemax`, `aria-label` (or `aria-labelledby`).
|
|
123
|
+
```html
|
|
124
|
+
<div role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" aria-label="Upload progress">
|
|
125
|
+
```
|
|
126
|
+
- **Indeterminate**: `role="progressbar"` with no `aria-valuenow` (omit, don't set to 0).
|
|
127
|
+
- **Don't update aria-valuenow on every frame** — debounce to ~5–10% steps, or update on percentage milestones.
|
|
128
|
+
- **Reduced motion**: indeterminate animation should be replaced with a static "loading" indicator. Determinate value transitions should be instant (no 300ms animation).
|
|
129
|
+
|
|
130
|
+
```css
|
|
131
|
+
@media (prefers-reduced-motion: reduce) {
|
|
132
|
+
.progress { transition: none; }
|
|
133
|
+
.progress-indeterminate { animation: none; }
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Code example
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
// File upload progress
|
|
141
|
+
<div>
|
|
142
|
+
<p>uploading.pdf — {bytesFormatted}</p>
|
|
143
|
+
<Progress value={uploadPct} aria-label="Upload progress" />
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
// Multi-step form
|
|
147
|
+
<Progress value={(currentStep / totalSteps) * 100} aria-label={`Step ${currentStep} of ${totalSteps}`} showLabel />
|
|
148
|
+
|
|
149
|
+
// Indeterminate while waiting
|
|
150
|
+
<Progress aria-label="Loading account data" />
|
|
151
|
+
|
|
152
|
+
// Profile completion (circular hero)
|
|
153
|
+
<Progress
|
|
154
|
+
variant="circular"
|
|
155
|
+
value={profileCompletion}
|
|
156
|
+
size={120}
|
|
157
|
+
showLabel
|
|
158
|
+
label={`${profileCompletion}% 완료`}
|
|
159
|
+
/>
|
|
160
|
+
|
|
161
|
+
// Inside a Button (replaces button's children with circular)
|
|
162
|
+
<Button loading><Progress variant="circular" size={16} /></Button>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Edge cases
|
|
166
|
+
|
|
167
|
+
- **Value > max**: clamp to max. Don't render at 110%.
|
|
168
|
+
- **Negative value**: clamp to 0.
|
|
169
|
+
- **Value transitions backwards** (e.g., 80% → 30%, retrying upload): animate, but communicate the rollback in copy ("재시도 중…").
|
|
170
|
+
- **Stuck progress** (no movement for 30s+): show a "still working…" indicator alongside, or escalate to error.
|
|
171
|
+
- **0% determinate**: show empty track. Don't fall back to indeterminate animation.
|
|
172
|
+
- **100% determinate**: optionally shift to success color + checkmark when done. Otherwise, unmount the progress.
|
|
173
|
+
- **Multiple concurrent**: stack vertically, each labeled. Don't sum into one combined progress.
|
|
174
|
+
- **Reduced motion + indeterminate**: still need to communicate "in progress" — show a text label, e.g., "처리 중…".
|
|
175
|
+
|
|
176
|
+
## Don't
|
|
177
|
+
|
|
178
|
+
- Don't use indeterminate for operations under 1 second. Just don't show a progress component.
|
|
179
|
+
- Don't fake progress (e.g., always show 0 → 100% over 3s while actual completion time is unknown). Fails when reality differs.
|
|
180
|
+
- Don't combine multiple unrelated tasks into one progress bar.
|
|
181
|
+
- Don't show progress for irreversible / consequential actions without a way to cancel.
|
|
182
|
+
- Don't omit aria-label.
|
|
183
|
+
- Don't use a Progress for a Skeleton's job — Skeleton is for content shape, Progress is for completion %.
|
|
184
|
+
|
|
185
|
+
## References
|
|
186
|
+
|
|
187
|
+
- Ant Design: [`refs/ant-design/components/progress/`](../refs/ant-design/components/progress/) — `Progress` with `type="line" | "circle" | "dashboard"` (3/4 ring), `steps` (segmented), `success` (overlay).
|
|
188
|
+
- MUI: separate `LinearProgress` and `CircularProgress` components. `variant="determinate" | "indeterminate" | "buffer" | "query"`. Buffer mode for media playback.
|
|
189
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/progress.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/progress.tsx) — Radix primitive. Linear only. Circular requires a different primitive.
|
|
190
|
+
|
|
191
|
+
## Cross-reference
|
|
192
|
+
|
|
193
|
+
- [examples/component-skeleton.md](component-skeleton.md) — for "loading shape", not "progress %"
|
|
194
|
+
- [examples/component-button.md](component-button.md) — uses circular Progress for `loading` state
|
|
195
|
+
- [knowledge/motion/principles.md](../knowledge/motion/principles.md) — animation timing
|