@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,130 @@
|
|
|
1
|
+
# `Stack` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `Stack`. The flexbox-based linear layout primitive — children laid out in a row or column with consistent spacing. Most-used layout container after `Box`. The shadcn equivalent uses Tailwind utilities directly (`flex flex-col gap-4`) — Stack abstracts that for design-system enforcement.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Any group of elements that need consistent spacing (button rows, form rows, card stacks).
|
|
8
|
+
- Replacing `<div style={{ display: 'flex', gap: 16 }}>` boilerplate.
|
|
9
|
+
- For grid-style 2D layouts, use `Grid` instead.
|
|
10
|
+
|
|
11
|
+
## Anatomy
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Direction = "row":
|
|
15
|
+
┌──────┬──[gap]──┬──────┬──[gap]──┬──────┐
|
|
16
|
+
│ <1/> │ │ <2/> │ │ <3/> │
|
|
17
|
+
└──────┴─────────┴──────┴─────────┴──────┘
|
|
18
|
+
|
|
19
|
+
Direction = "column":
|
|
20
|
+
┌──────┐
|
|
21
|
+
│ <1/> │
|
|
22
|
+
├─[gap]┤
|
|
23
|
+
│ <2/> │
|
|
24
|
+
├─[gap]┤
|
|
25
|
+
│ <3/> │
|
|
26
|
+
└──────┘
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## API
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
<Stack direction="row" gap={2} alignItems="center" justifyContent="flex-end">
|
|
33
|
+
<Button onClick={onCancel}>취소</Button>
|
|
34
|
+
<Button onClick={onSave} variant="contained">저장</Button>
|
|
35
|
+
</Stack>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Prop | Type | Default | Description |
|
|
39
|
+
| --- | --- | --- | --- |
|
|
40
|
+
| `direction` | `'row' \| 'column' \| 'row-reverse' \| 'column-reverse'` | `'column'` | Flex axis |
|
|
41
|
+
| `spacing` / `gap` | `number \| string` | `0` | Gap between children (theme spacing units; `gap={2}` = 16px on 8-base) |
|
|
42
|
+
| `alignItems` | `'flex-start' \| 'center' \| 'flex-end' \| 'stretch' \| 'baseline'` | — | Cross-axis alignment |
|
|
43
|
+
| `justifyContent` | `'flex-start' \| 'center' \| 'flex-end' \| 'space-between' \| 'space-around'` | — | Main-axis alignment |
|
|
44
|
+
| `divider` | `ReactNode` | — | Element rendered between children (e.g., `<Divider />`) |
|
|
45
|
+
| `useFlexGap` | `boolean` | `true` (MUI v6+) | Use CSS `gap` instead of margins; safer with `divider` |
|
|
46
|
+
| `flexWrap` | `'nowrap' \| 'wrap'` | `'nowrap'` | Wrap children to next line |
|
|
47
|
+
| `sx` | `SxProps` | — | Style override (responsive values, custom CSS) |
|
|
48
|
+
|
|
49
|
+
### Responsive
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<Stack
|
|
53
|
+
direction={{ xs: 'column', md: 'row' }}
|
|
54
|
+
gap={{ xs: 1, md: 2 }}
|
|
55
|
+
>
|
|
56
|
+
...
|
|
57
|
+
</Stack>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## States
|
|
61
|
+
|
|
62
|
+
Layout primitive — no interactive states.
|
|
63
|
+
|
|
64
|
+
## Tokens consumed
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
--space-xs /* gap={0.5} */
|
|
68
|
+
--space-sm /* gap={1} */
|
|
69
|
+
--space-md /* gap={2} */
|
|
70
|
+
--space-lg /* gap={3} */
|
|
71
|
+
--space-xl /* gap={4} */
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Accessibility
|
|
75
|
+
|
|
76
|
+
- `Stack` is a `<div>` (default). For semantic groupings, override via `component`:
|
|
77
|
+
- List of nav items: `component="nav"` + ARIA label.
|
|
78
|
+
- Toolbar: `component="div" role="toolbar"`.
|
|
79
|
+
- For RTL languages, `direction="row"` automatically reverses if the document is `dir="rtl"`. For Korean (LTR), no special handling needed.
|
|
80
|
+
|
|
81
|
+
## Edge cases
|
|
82
|
+
|
|
83
|
+
- **Mixed-width children with `space-between`** — Stack distributes remaining space; long children may shrink. Use `flex={1}` on the spreading child if needed.
|
|
84
|
+
- **Korean text in row direction** — Korean labels run wider than Latin equivalents; test row layouts at 320px viewport. Switch to `direction={{ xs: 'column', md: 'row' }}` if cramped.
|
|
85
|
+
- **Nested Stacks** — common and fine. `Stack` doesn't add semantic meaning, just layout.
|
|
86
|
+
- **`divider` with `useFlexGap=false`** — older MUI versions used margin-based spacing which collides with dividers. Set `useFlexGap` explicitly.
|
|
87
|
+
|
|
88
|
+
## Code example
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
// Card footer with cancel + primary
|
|
92
|
+
<Card>
|
|
93
|
+
<CardContent>...</CardContent>
|
|
94
|
+
<Stack direction="row" gap={1} justifyContent="flex-end" sx={{ p: 2 }}>
|
|
95
|
+
<Button onClick={onCancel}>취소</Button>
|
|
96
|
+
<Button onClick={onSave} variant="contained">저장</Button>
|
|
97
|
+
</Stack>
|
|
98
|
+
</Card>
|
|
99
|
+
|
|
100
|
+
// Form row that stacks on mobile
|
|
101
|
+
<Stack direction={{ xs: 'column', sm: 'row' }} gap={2}>
|
|
102
|
+
<TextField label="이름" />
|
|
103
|
+
<TextField label="사번" />
|
|
104
|
+
<TextField label="부서" />
|
|
105
|
+
</Stack>
|
|
106
|
+
|
|
107
|
+
// Vertical list of cards with dividers
|
|
108
|
+
<Stack gap={2} divider={<Divider flexItem />}>
|
|
109
|
+
{items.map((it) => <Card key={it.id}>{it.title}</Card>)}
|
|
110
|
+
</Stack>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Don't
|
|
114
|
+
|
|
115
|
+
- Don't reach for `Stack` for 2D grids — use `Grid`.
|
|
116
|
+
- Don't nest 4+ Stacks deep — extract to a custom layout component.
|
|
117
|
+
- Don't use `Stack direction="row"` for content that should wrap to multiple lines without explicit `flexWrap`.
|
|
118
|
+
- Don't apply `Stack` to a single child — pure overhead.
|
|
119
|
+
|
|
120
|
+
## References
|
|
121
|
+
|
|
122
|
+
- MUI: [`Stack`](../refs/mui/packages/mui-material/src/Stack/)
|
|
123
|
+
|
|
124
|
+
## Cross-reference
|
|
125
|
+
|
|
126
|
+
- [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
|
|
127
|
+
- [`component-box.md`](component-box.md)
|
|
128
|
+
- [`component-grid.md`](component-grid.md)
|
|
129
|
+
- [`component-flex.md`](component-flex.md) — alternate flex primitive
|
|
130
|
+
- [`knowledge/layout/spacing-and-grid.md`](../knowledge/layout/spacing-and-grid.md)
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# `Statistic` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Statistic`, MUI (no direct equivalent — composition), shadcn-ui (composition)
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Displays a single number prominently — a KPI, count, balance, or metric. The "hero number" of a card or dashboard tile.
|
|
8
|
+
|
|
9
|
+
## When Statistic vs alternatives
|
|
10
|
+
|
|
11
|
+
| Pattern | Use |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| **Statistic** | Single value with label + optional delta/trend |
|
|
14
|
+
| **AmountInput display** (read-only) | Editable monetary value |
|
|
15
|
+
| **Progress** | Completion % with bar/ring |
|
|
16
|
+
| **Chart** | Time-series or comparison data |
|
|
17
|
+
| **Card with body text** | Number is part of a paragraph |
|
|
18
|
+
|
|
19
|
+
Use Statistic when the number is the message. The label, delta, and unit are supporting cast.
|
|
20
|
+
|
|
21
|
+
## Anatomy
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
┌──────────────────────────────┐
|
|
25
|
+
│ 이번 달 매출 │ ← label
|
|
26
|
+
│ │
|
|
27
|
+
│ ₩2,847,500 │ ← value (display tier, tabular numerals)
|
|
28
|
+
│ │
|
|
29
|
+
│ ↑ 12% vs 지난 달 │ ← delta (optional, color-coded)
|
|
30
|
+
└──────────────────────────────┘
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| Slot | Required | Notes |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| Label / title | yes | What this number is |
|
|
36
|
+
| Value | yes | The number itself, formatted |
|
|
37
|
+
| Prefix / suffix | optional | Currency symbol, unit |
|
|
38
|
+
| Delta indicator | optional | Trend arrow + comparison ("↑ 12%") |
|
|
39
|
+
| Tooltip / icon | optional | "i" icon for definition |
|
|
40
|
+
| Trend chart (sparkline) | optional | Tiny line chart inline |
|
|
41
|
+
|
|
42
|
+
## API
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<Statistic
|
|
46
|
+
label="이번 달 매출"
|
|
47
|
+
value={2847500}
|
|
48
|
+
prefix="₩"
|
|
49
|
+
precision={0}
|
|
50
|
+
delta={{ value: 0.12, period: "지난 달 대비" }}
|
|
51
|
+
/>
|
|
52
|
+
|
|
53
|
+
<Statistic
|
|
54
|
+
label="활성 사용자"
|
|
55
|
+
value={1247}
|
|
56
|
+
delta={{ value: -0.03, period: "지난 주" }}
|
|
57
|
+
variant="compact"
|
|
58
|
+
/>
|
|
59
|
+
|
|
60
|
+
<Statistic
|
|
61
|
+
label="응답 시간"
|
|
62
|
+
value={328}
|
|
63
|
+
suffix="ms"
|
|
64
|
+
delta={{ value: -0.15, period: "지난 시간", goalDirection: "down" }}
|
|
65
|
+
/>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
| Prop | Type | Default | Description |
|
|
69
|
+
| --- | --- | --- | --- |
|
|
70
|
+
| `label` | `string \| ReactNode` | — | Required. What the number is. |
|
|
71
|
+
| `value` | `number \| string` | — | Required. The number (or pre-formatted string). |
|
|
72
|
+
| `prefix` | `string \| ReactNode` | — | E.g., `₩`, `$`, icon |
|
|
73
|
+
| `suffix` | `string \| ReactNode` | — | E.g., `원`, `%`, `ms` |
|
|
74
|
+
| `precision` | `number` | `0` (KRW) / `2` (USD/EUR) | Decimal places |
|
|
75
|
+
| `groupSeparator` | `string` | `,` | Thousands separator |
|
|
76
|
+
| `decimalSeparator` | `string` | `.` | |
|
|
77
|
+
| `delta` | `Delta` | — | Comparison indicator |
|
|
78
|
+
| `variant` | `"default" \| "compact"` | `"default"` | |
|
|
79
|
+
| `size` | `"sm" \| "md" \| "lg" \| "xl"` | `"lg"` | Value font size |
|
|
80
|
+
| `loading` | `boolean` | `false` | Skeleton |
|
|
81
|
+
| `tooltip` | `string` | — | Hover definition (small `i` icon next to label) |
|
|
82
|
+
| `sparkline` | `number[]` | — | Optional inline mini chart |
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
type Delta = {
|
|
86
|
+
value: number; // 0.12 means +12%; -0.03 means -3%
|
|
87
|
+
period: string; // "지난 달 대비" / "vs last month"
|
|
88
|
+
goalDirection?: "up" | "down" | "neutral"; // up=positive trend
|
|
89
|
+
};
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Sizes
|
|
93
|
+
|
|
94
|
+
| Size | Value font | Label | Use |
|
|
95
|
+
| --- | --- | --- | --- |
|
|
96
|
+
| `sm` | 18px | 12px | Sidebar, dashboard tile inside a card |
|
|
97
|
+
| `md` | 24px | 13px | Standard KPI card |
|
|
98
|
+
| `lg` (default) | 32px | 14px | Hero KPI in a dashboard |
|
|
99
|
+
| `xl` | 48px | 16px | Single hero stat (account balance display) |
|
|
100
|
+
|
|
101
|
+
For account balance / hero amounts: `xl` with `tnum` font feature for tabular numerals.
|
|
102
|
+
|
|
103
|
+
## Delta — color and direction semantics
|
|
104
|
+
|
|
105
|
+
The delta value's color depends on whether the trend is "good":
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
const goodTrend = delta.goalDirection === "up" ? delta.value > 0 : delta.value < 0;
|
|
109
|
+
const color = goodTrend ? "money-positive" : "money-negative";
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
| Stat | `goalDirection` | Positive delta = | Color |
|
|
113
|
+
| --- | --- | --- | --- |
|
|
114
|
+
| Revenue | `up` | Good | `money-positive` (green or red KR-stocks) |
|
|
115
|
+
| Errors / latency | `down` | Bad | `money-negative` |
|
|
116
|
+
| Conversion rate | `up` | Good | `money-positive` |
|
|
117
|
+
| Bounce rate | `down` | Bad | `money-negative` |
|
|
118
|
+
| Active users | `up` | Good | `money-positive` |
|
|
119
|
+
|
|
120
|
+
Default: `up`. Most metrics are "more is better".
|
|
121
|
+
|
|
122
|
+
For Korean stock UIs: see [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — color convention is inverted (red=up).
|
|
123
|
+
|
|
124
|
+
### Delta visual
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
↑ 12% vs 지난 달 ← positive trend, good direction (green/red)
|
|
128
|
+
↓ 3% vs 지난 주 ← negative trend, color depends on goalDirection
|
|
129
|
+
─ vs 지난 달 ← no change (gray)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Delta arrows: `↑` `↓` are most common. Some apps use `▲` `▼` for stocks.
|
|
133
|
+
|
|
134
|
+
## Variants
|
|
135
|
+
|
|
136
|
+
### Default
|
|
137
|
+
|
|
138
|
+
Vertical stack: label top, value middle, delta bottom.
|
|
139
|
+
|
|
140
|
+
### Compact
|
|
141
|
+
|
|
142
|
+
Single line: `Label Value ±Delta`.
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
이번 달 매출 ₩2,847,500 ↑ 12%
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Use in dense table cells, sidebar lists.
|
|
149
|
+
|
|
150
|
+
### Hero
|
|
151
|
+
|
|
152
|
+
`xl` size, often with sparkline inline:
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
Account balance
|
|
156
|
+
₩2,847,500 ▁▂▃▅▆▇ ← sparkline
|
|
157
|
+
↑ 12% 이번 달
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Tokens consumed
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
--color-text-primary
|
|
164
|
+
--color-text-secondary (label)
|
|
165
|
+
--color-text-tertiary
|
|
166
|
+
--color-money-positive (good delta)
|
|
167
|
+
--color-money-negative (bad delta)
|
|
168
|
+
--color-money-neutral (no change)
|
|
169
|
+
--space-xs, --space-sm
|
|
170
|
+
--font-size-base, --font-size-xl, --font-size-2xl
|
|
171
|
+
--font-feature-amount: 'tnum' 1 (tabular numerals)
|
|
172
|
+
--font-weight-semibold (value)
|
|
173
|
+
--font-weight-regular (label)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Sparkline (inline mini chart)
|
|
177
|
+
|
|
178
|
+
When passed `sparkline`:
|
|
179
|
+
- Renders a small line chart inside the Statistic body.
|
|
180
|
+
- Width: ~60–80px, height: 16–24px.
|
|
181
|
+
- Single line, no axes, no labels — just shape.
|
|
182
|
+
- Color matches the delta direction (or stays neutral).
|
|
183
|
+
|
|
184
|
+
For libraries: `react-sparklines`, `recharts` mini variant, or hand-roll an SVG.
|
|
185
|
+
|
|
186
|
+
## States
|
|
187
|
+
|
|
188
|
+
| State | Visual |
|
|
189
|
+
| --- | --- |
|
|
190
|
+
| Default | Resting |
|
|
191
|
+
| Loading | Skeleton placeholders for label + value |
|
|
192
|
+
| No data / undefined | Show `—` or "—" instead of "0" — clarifies vs zero |
|
|
193
|
+
| Error | "—" + tooltip explaining failure |
|
|
194
|
+
|
|
195
|
+
## Accessibility
|
|
196
|
+
|
|
197
|
+
- Label is associated with value via DOM proximity (no special wiring needed for static stats).
|
|
198
|
+
- Numeric value: `aria-label="이번 달 매출 ₩2,847,500"` if the visual format is hard for screen readers.
|
|
199
|
+
- Delta: also include in aria-label — "12% increase vs last month".
|
|
200
|
+
- Don't rely on color alone for delta direction — the arrow does the work.
|
|
201
|
+
|
|
202
|
+
```html
|
|
203
|
+
<div class="statistic">
|
|
204
|
+
<div class="label">이번 달 매출</div>
|
|
205
|
+
<div class="value" aria-label="이번 달 매출 290만 원, 지난 달 대비 12% 증가">
|
|
206
|
+
₩2,847,500
|
|
207
|
+
</div>
|
|
208
|
+
<div class="delta delta--positive" aria-hidden="true">↑ 12%</div>
|
|
209
|
+
</div>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Code example
|
|
213
|
+
|
|
214
|
+
```tsx
|
|
215
|
+
// Hero balance
|
|
216
|
+
<Statistic
|
|
217
|
+
label="사용 가능 금액"
|
|
218
|
+
value={user.balance}
|
|
219
|
+
prefix="₩"
|
|
220
|
+
size="xl"
|
|
221
|
+
delta={{ value: 0.04, period: "이번 달", goalDirection: "up" }}
|
|
222
|
+
/>
|
|
223
|
+
|
|
224
|
+
// KPI grid
|
|
225
|
+
<div className="grid grid-cols-1 md:grid-cols-4 gap-4">
|
|
226
|
+
<Card><Statistic label="신규 가입" value={47} delta={{ value: 0.18, period: "지난 주" }} /></Card>
|
|
227
|
+
<Card><Statistic label="활성 사용자" value={1247} delta={{ value: -0.03, period: "지난 주" }} /></Card>
|
|
228
|
+
<Card><Statistic label="평균 응답 시간" value={328} suffix="ms" delta={{ value: -0.15, period: "지난 시간", goalDirection: "down" }} /></Card>
|
|
229
|
+
<Card><Statistic label="에러율" value={0.012} suffix="%" delta={{ value: 0.005, period: "지난 시간", goalDirection: "down" }} precision={3} /></Card>
|
|
230
|
+
</div>
|
|
231
|
+
|
|
232
|
+
// Compact in a sidebar
|
|
233
|
+
<aside>
|
|
234
|
+
<Statistic variant="compact" label="잔액" value={user.balance} prefix="₩" />
|
|
235
|
+
<Statistic variant="compact" label="활동 수" value={user.activityCount} />
|
|
236
|
+
</aside>
|
|
237
|
+
|
|
238
|
+
// Loading state
|
|
239
|
+
<Statistic loading label="이번 달 매출" />
|
|
240
|
+
|
|
241
|
+
// No data
|
|
242
|
+
<Statistic label="평균 응답 시간" value="—" />
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Edge cases
|
|
246
|
+
|
|
247
|
+
- **Zero value with no delta**: render as `0` with no trend indicator.
|
|
248
|
+
- **Negative value** (loss, debt): use `--color-money-negative` for the value, optionally show `−` prefix.
|
|
249
|
+
- **Very large numbers** (1조+): display normally with separators; for hero contexts, consider Korean compact form ("1.2조원" instead of "1,200,000,000,000원").
|
|
250
|
+
- **Currency symbol with locale**: `₩` for KRW, `$` for USD; respect the user's locale preference.
|
|
251
|
+
- **Sparkline with insufficient data** (< 2 points): hide sparkline.
|
|
252
|
+
- **Delta of exactly 0**: render `─ vs 지난 달` (no arrow).
|
|
253
|
+
- **Time-period without comparison data**: omit delta entirely.
|
|
254
|
+
- **Stat that's a fraction** ("12 of 50"): render as compound — `<Statistic value="12 / 50" />` rather than just 12.
|
|
255
|
+
|
|
256
|
+
## Don't
|
|
257
|
+
|
|
258
|
+
- Don't put 10+ Statistics in one row. 4–6 max for a KPI grid.
|
|
259
|
+
- Don't use Statistic for non-numeric "stats" like "Most popular: Coffee" — that's a Card with body text.
|
|
260
|
+
- Don't auto-update Statistic without a visual cue. Number-tick animations are OK; flashes are not.
|
|
261
|
+
- Don't use `--color-error` for negative-trend values. Use `--color-money-negative`.
|
|
262
|
+
- Don't show delta for static values that don't change (e.g., "Member since 2024-01-15").
|
|
263
|
+
- Don't omit the label. "₩2,847,500" alone is unintelligible.
|
|
264
|
+
- Don't use proportional numerals — use tabular for column alignment.
|
|
265
|
+
|
|
266
|
+
## References
|
|
267
|
+
|
|
268
|
+
- Ant Design: [`refs/ant-design/components/statistic/`](../refs/ant-design/components/statistic/) — `Statistic` + `Statistic.Countdown` (auto-counting). Solid baseline.
|
|
269
|
+
- MUI: no dedicated component — compose `<Card><CardContent><Typography variant="overline">label</Typography>...`.
|
|
270
|
+
- shadcn-ui: no built-in. Compose from `Card` + Tailwind.
|
|
271
|
+
|
|
272
|
+
API choices made:
|
|
273
|
+
- **`delta` as a structured prop** rather than rendered string: enables consistent color/arrow logic.
|
|
274
|
+
- **`goalDirection` opt-in**: most metrics are "up = good"; let consumer flip when needed.
|
|
275
|
+
- **Tabular numerals enforced** via `font-feature-settings`: KPI grids align cleanly.
|
|
276
|
+
|
|
277
|
+
## Cross-reference
|
|
278
|
+
|
|
279
|
+
- [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — money color semantics + tabular numerals
|
|
280
|
+
- [`knowledge/patterns/dashboard-composition.md`](../knowledge/patterns/dashboard-composition.md) — placing Statistics in a dashboard
|
|
281
|
+
- [`examples/component-card.md`](component-card.md) — wrapping Statistic in a Card
|
|
282
|
+
- [`examples/component-progress.md`](component-progress.md) — alternative for completion-style metrics
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# `StepButton` - spec
|
|
2
|
+
|
|
3
|
+
> Direct upstream component: MUI `StepButton`. Parent pattern references: Ant Design `Steps`, MUI `Stepper`, and composed shadcn-style primitives.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
`StepButton` makes a step indicator clickable in non-linear steppers. Use it when users may revisit completed steps, fix validation errors, or jump between sections in a wizard.
|
|
8
|
+
|
|
9
|
+
Do not use it when the flow must be strictly linear. Future steps should remain unavailable until prerequisites are satisfied.
|
|
10
|
+
|
|
11
|
+
## Anatomy
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
StepButton
|
|
15
|
+
├── Root button
|
|
16
|
+
│ ├── StepIcon optional override
|
|
17
|
+
│ ├── StepLabel text/content
|
|
18
|
+
│ └── Optional text optional helper, e.g. "선택"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
| Part | Required | Purpose |
|
|
22
|
+
| --- | --- | --- |
|
|
23
|
+
| Root button | yes | Receives focus and activates navigation to the step. |
|
|
24
|
+
| Icon | optional | Overrides the default number/check/error icon. |
|
|
25
|
+
| Label | yes | Names the step. |
|
|
26
|
+
| Optional node | optional | Marks optional/skipped status. |
|
|
27
|
+
|
|
28
|
+
## API
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
<Step completed={isCompleted}>
|
|
32
|
+
<StepButton onClick={() => goToStep(index)} optional={<Text size="sm">선택</Text>}>
|
|
33
|
+
결제 수단
|
|
34
|
+
</StepButton>
|
|
35
|
+
</Step>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Prop | Type | Default | Description |
|
|
39
|
+
| --- | --- | --- | --- |
|
|
40
|
+
| `children` | `ReactNode` | - | Usually `StepLabel` or label content passed into `StepLabel`. |
|
|
41
|
+
| `classes` | `Partial<StepButtonClasses>` | - | Style override hooks for MUI-style implementations. |
|
|
42
|
+
| `component` | `React.ElementType` | MUI `ButtonBase` default | Root override. Must preserve button semantics. |
|
|
43
|
+
| `icon` | `ReactNode` | Step index from parent | Icon displayed by the step label. |
|
|
44
|
+
| `optional` | `ReactNode` | - | Secondary optional/skipped content below or beside label. |
|
|
45
|
+
| `sx` | `SxProps<Theme>` | - | MUI system override. Prefer tokens for shared design-system code. |
|
|
46
|
+
|
|
47
|
+
Inherits button-like props from MUI `ButtonBase`. In MUI, `disabled` is controlled by step context rather than the `StepButton` prop surface.
|
|
48
|
+
|
|
49
|
+
## API choices made
|
|
50
|
+
|
|
51
|
+
- Keep `StepButton` as a child of `Step`. Status and disabled logic should come from the parent stepper.
|
|
52
|
+
- Expose `optional` because multi-step forms often need visible "선택" or "건너뜀" context.
|
|
53
|
+
- Do not add `status` here. Status belongs to `Step`, `StepLabel`, or the parent `Steps` model.
|
|
54
|
+
- Do not use anchors for wizard navigation unless the route actually changes.
|
|
55
|
+
|
|
56
|
+
## States
|
|
57
|
+
|
|
58
|
+
| State | Trigger | Visual rule |
|
|
59
|
+
| --- | --- | --- |
|
|
60
|
+
| Wait | Future or incomplete step | Muted label and neutral icon. |
|
|
61
|
+
| Process | Current active step | Primary icon/label; set current-step semantics. |
|
|
62
|
+
| Finish | Completed step | Check icon or completed marker; remains clickable if revisiting is allowed. |
|
|
63
|
+
| Error | Step has validation error | Error icon and text label; do not rely on color alone. |
|
|
64
|
+
| Hover | Pointer over enabled step | Subtle background or label emphasis. |
|
|
65
|
+
| Focus-visible | Keyboard focus | 2px focus ring around the whole button, not only the icon. |
|
|
66
|
+
| Active | Press | Pressed background; no layout shift. |
|
|
67
|
+
| Disabled | Future locked step | Muted, non-clickable, `aria-disabled` if not native disabled. |
|
|
68
|
+
| Loading | Step validation pending | Small spinner near label/icon; suppress repeated activation. |
|
|
69
|
+
|
|
70
|
+
## Tokens consumed
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
--color-primary-default
|
|
74
|
+
--color-error
|
|
75
|
+
--color-text-primary
|
|
76
|
+
--color-text-secondary
|
|
77
|
+
--color-text-disabled
|
|
78
|
+
--color-bg-subtle
|
|
79
|
+
--color-border-default
|
|
80
|
+
--color-focus-ring
|
|
81
|
+
--space-xs
|
|
82
|
+
--space-sm
|
|
83
|
+
--space-md
|
|
84
|
+
--radius-md
|
|
85
|
+
--motion-fast
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Accessibility
|
|
89
|
+
|
|
90
|
+
- Render a native `<button type="button">` when the step does not navigate to a new route.
|
|
91
|
+
- The active step must be announced as current. Use `aria-current="step"` on the current step item or button, consistently with the parent `Steps` implementation.
|
|
92
|
+
- Disabled future steps use native `disabled` where possible; custom roots need `aria-disabled="true"` and no activation.
|
|
93
|
+
- Error steps need text in the accessible name, such as "오류: 결제 수단".
|
|
94
|
+
- Touch target must be at least 44x44 on mobile.
|
|
95
|
+
- The connector line remains `aria-hidden`; the button owns only the step label/icon.
|
|
96
|
+
|
|
97
|
+
### Keyboard
|
|
98
|
+
|
|
99
|
+
| Key | Behavior |
|
|
100
|
+
| --- | --- |
|
|
101
|
+
| `Tab` | Moves through enabled clickable steps in order. |
|
|
102
|
+
| `Enter` / `Space` | Activates the focused step. |
|
|
103
|
+
| Arrow keys | Optional parent-level roving behavior when the stepper is implemented as a tablist. |
|
|
104
|
+
|
|
105
|
+
## Code example
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
<Steps current={currentStep} clickable onChange={setCurrentStep}>
|
|
109
|
+
{steps.map((step, index) => (
|
|
110
|
+
<Step
|
|
111
|
+
key={step.id}
|
|
112
|
+
completed={index < currentStep && !step.hasError}
|
|
113
|
+
disabled={index > highestReachableStep}
|
|
114
|
+
status={step.hasError ? "error" : undefined}
|
|
115
|
+
>
|
|
116
|
+
<StepButton
|
|
117
|
+
aria-current={index === currentStep ? "step" : undefined}
|
|
118
|
+
onClick={() => setCurrentStep(index)}
|
|
119
|
+
optional={step.optional ? <Text size="sm">선택</Text> : undefined}
|
|
120
|
+
>
|
|
121
|
+
{step.label}
|
|
122
|
+
</StepButton>
|
|
123
|
+
</Step>
|
|
124
|
+
))}
|
|
125
|
+
</Steps>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Edge cases
|
|
129
|
+
|
|
130
|
+
- **User jumps back and edits**: mark later dependent steps as needing review if their data becomes stale.
|
|
131
|
+
- **Future step disabled**: keep it visible so progress is understandable, but suppress focus/activation.
|
|
132
|
+
- **Validation error in completed step**: keep the step clickable and expose error text in the label.
|
|
133
|
+
- **Vertical stepper**: root button can fill width for easier scanning and larger touch target.
|
|
134
|
+
- **Custom component root**: must forward refs, keyboard events, disabled state, and focus-visible styles.
|
|
135
|
+
- **Long Korean labels**: allow two-line labels in vertical mode; truncate in compact horizontal mode with tooltip only if necessary.
|
|
136
|
+
- **Reduced motion**: remove animated icon transitions; state changes still occur.
|
|
137
|
+
|
|
138
|
+
## Don't
|
|
139
|
+
|
|
140
|
+
- Don't make future locked steps clickable.
|
|
141
|
+
- Don't use `StepButton` for a decorative progress indicator.
|
|
142
|
+
- Don't put form fields inside the button.
|
|
143
|
+
- Don't encode error/completed state only with icon color.
|
|
144
|
+
|
|
145
|
+
## References
|
|
146
|
+
|
|
147
|
+
- MUI direct source: [`refs/mui/packages/mui-material/src/StepButton/StepButton.d.ts`](../refs/mui/packages/mui-material/src/StepButton/StepButton.d.ts)
|
|
148
|
+
- MUI implementation: [`refs/mui/packages/mui-material/src/StepButton/StepButton.js`](../refs/mui/packages/mui-material/src/StepButton/StepButton.js)
|
|
149
|
+
- MUI stepper docs/examples: [`refs/mui/docs/data/material/components/steppers/`](../refs/mui/docs/data/material/components/steppers/)
|
|
150
|
+
- Ant Design parent pattern: [`refs/ant-design/components/steps/`](../refs/ant-design/components/steps/)
|
|
151
|
+
- Accessibility baseline: [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md)
|
|
152
|
+
|
|
153
|
+
## Cross-reference
|
|
154
|
+
|
|
155
|
+
- [examples/component-steps.md](component-steps.md)
|
|
156
|
+
- [examples/component-step-label.md](component-step-label.md)
|
|
157
|
+
- [examples/component-step-icon.md](component-step-icon.md)
|