@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,215 @@
|
|
|
1
|
+
# `Typography` (text primitive) — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Typography`, MUI `Typography`, shadcn-ui (composition with utility classes)
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A semantic + style primitive for text. Wraps `<h1>`–`<h6>`, `<p>`, `<span>` with consistent variant-driven styling per the design system's type scale.
|
|
8
|
+
|
|
9
|
+
For most teams: **don't use a Typography component**. Apply utility classes (`text-xl font-semibold`) or use semantic HTML directly. Only reach for Typography when:
|
|
10
|
+
- You're consuming a design system that ships one (Ant, MUI).
|
|
11
|
+
- You need centralized type-variant changes propagating across the app.
|
|
12
|
+
|
|
13
|
+
## Anatomy
|
|
14
|
+
|
|
15
|
+
A Typography element is a single text node with:
|
|
16
|
+
- HTML semantic (h1, h2, p, span)
|
|
17
|
+
- Type scale variant (display, heading-lg, body, caption)
|
|
18
|
+
- Optional color, weight, alignment overrides
|
|
19
|
+
- Optional truncation, ellipsis, copyable
|
|
20
|
+
|
|
21
|
+
## API
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
<Typography variant="display">우리 가계부</Typography>
|
|
25
|
+
<Typography variant="heading-md">최근 거래</Typography>
|
|
26
|
+
<Typography variant="body">설명 텍스트입니다.</Typography>
|
|
27
|
+
<Typography variant="body-sm" color="secondary">부가 정보</Typography>
|
|
28
|
+
<Typography variant="caption">2026.05.07</Typography>
|
|
29
|
+
|
|
30
|
+
// As different element
|
|
31
|
+
<Typography variant="heading-lg" as="h2">섹션 제목</Typography>
|
|
32
|
+
|
|
33
|
+
// Truncation
|
|
34
|
+
<Typography variant="body" truncate maxLines={2}>
|
|
35
|
+
매우 긴 텍스트가 두 줄로 잘립니다 매우 긴 텍스트가 두 줄로 잘립니다 ...
|
|
36
|
+
</Typography>
|
|
37
|
+
|
|
38
|
+
// Copy
|
|
39
|
+
<Typography variant="body" copyable>
|
|
40
|
+
abc123-def456
|
|
41
|
+
</Typography>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
| Prop | Type | Default | Description |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| `variant` | `"display" \| "heading-lg" \| "heading-md" \| "heading-sm" \| "body-lg" \| "body" \| "body-sm" \| "caption" \| "amount"` | `"body"` | Type scale variant |
|
|
47
|
+
| `as` | `"h1" \| ... \| "p" \| "span" \| "div"` | inferred from variant | Override HTML element |
|
|
48
|
+
| `color` | `"primary" \| "secondary" \| "tertiary" \| "disabled" \| "success" \| "warning" \| "error"` | `"primary"` | Semantic color |
|
|
49
|
+
| `weight` | `400 \| 500 \| 600 \| 700` | from variant | Override weight |
|
|
50
|
+
| `align` | `"left" \| "center" \| "right"` | `"left"` | |
|
|
51
|
+
| `truncate` | `boolean` | `false` | Single-line ellipsis |
|
|
52
|
+
| `maxLines` | `number` | — | Multi-line clamp |
|
|
53
|
+
| `copyable` | `boolean` | `false` | Render copy button next to text |
|
|
54
|
+
|
|
55
|
+
## Variants → defaults
|
|
56
|
+
|
|
57
|
+
Per [`knowledge/typography/type-scale-fundamentals.md`](../knowledge/typography/type-scale-fundamentals.md), with Korean +10% line-height adjustment:
|
|
58
|
+
|
|
59
|
+
| Variant | Tag | Size | Weight | Line-height |
|
|
60
|
+
| --- | --- | --- | --- | --- |
|
|
61
|
+
| `display` | h1 | 38px | 700 | 1.2 |
|
|
62
|
+
| `heading-lg` | h2 | 24px | 700 | 1.4 |
|
|
63
|
+
| `heading-md` | h3 | 20px | 600 | 1.4 |
|
|
64
|
+
| `heading-sm` | h4 | 17px | 600 | 1.4 |
|
|
65
|
+
| `body-lg` | p | 17px | 400 | 1.6 |
|
|
66
|
+
| `body` (default) | p | 15px | 400 | 1.6 |
|
|
67
|
+
| `body-sm` | p | 13px | 400 | 1.6 |
|
|
68
|
+
| `caption` | span | 12px | 400 | 1.5 |
|
|
69
|
+
| `amount` | span | varies | 600 | 1.2, tabular numerals |
|
|
70
|
+
|
|
71
|
+
## Color
|
|
72
|
+
|
|
73
|
+
| Color | Use |
|
|
74
|
+
| --- | --- |
|
|
75
|
+
| `primary` (default) | Body text, headings |
|
|
76
|
+
| `secondary` | Help text, captions |
|
|
77
|
+
| `tertiary` | Less-emphasized labels |
|
|
78
|
+
| `disabled` | Disabled state text |
|
|
79
|
+
| `success` / `warning` / `error` | Status text |
|
|
80
|
+
|
|
81
|
+
For **money colors** (`money-positive` / `money-negative`): use `<Amount>` component or specific class. Don't blur into Typography's color axis.
|
|
82
|
+
|
|
83
|
+
## Why semantic mapping by variant
|
|
84
|
+
|
|
85
|
+
`heading-lg` defaults to `<h2>`, not `<h1>` — most apps have one `<h1>` per page (page title). `heading-lg` is used for sub-section headings.
|
|
86
|
+
|
|
87
|
+
If you need different semantic: override with `as`. The visual stays consistent; the tag changes.
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
{/* Page hero — h1 */}
|
|
91
|
+
<Typography variant="display" as="h1">대시보드</Typography>
|
|
92
|
+
|
|
93
|
+
{/* Section header inside page — h2 */}
|
|
94
|
+
<Typography variant="heading-lg">최근 거래</Typography>
|
|
95
|
+
|
|
96
|
+
{/* Card title inside section — h3 */}
|
|
97
|
+
<Typography variant="heading-md">5월 7일 (목)</Typography>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Truncation
|
|
101
|
+
|
|
102
|
+
Single-line truncation is straightforward:
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
.truncate {
|
|
106
|
+
overflow: hidden;
|
|
107
|
+
text-overflow: ellipsis;
|
|
108
|
+
white-space: nowrap;
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Multi-line (clamp):
|
|
113
|
+
|
|
114
|
+
```css
|
|
115
|
+
.line-clamp-2 {
|
|
116
|
+
display: -webkit-box;
|
|
117
|
+
-webkit-line-clamp: 2;
|
|
118
|
+
-webkit-box-orient: vertical;
|
|
119
|
+
overflow: hidden;
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
For Korean: line-clamp works cleanly with Hangul. `word-break: keep-all` ensures syllables don't break mid-word.
|
|
124
|
+
|
|
125
|
+
## Copyable
|
|
126
|
+
|
|
127
|
+
Adds a small copy icon next to the text. Useful for IDs, codes, addresses:
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
<Typography variant="body" copyable>
|
|
131
|
+
주문번호: ORD-2026-001234
|
|
132
|
+
</Typography>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Click → copies to clipboard, shows brief "복사됨!" toast.
|
|
136
|
+
|
|
137
|
+
## Accessibility
|
|
138
|
+
|
|
139
|
+
- HTML semantic preserved (h1, h2, p) — assistive tech navigates by heading hierarchy.
|
|
140
|
+
- Color is supplementary; don't encode meaning by color alone.
|
|
141
|
+
- Truncated text: `title` attribute provides full text on hover (and screen readers).
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<p title="Full long text...">Full long text that gets truncated...</p>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
For copyable: the copy button has `aria-label="복사"`.
|
|
148
|
+
|
|
149
|
+
## Korean considerations
|
|
150
|
+
|
|
151
|
+
- Apply `word-break: keep-all` to body text — prevents Hangul mid-syllable breaks.
|
|
152
|
+
- Apply `font-feature-settings: 'tnum' 1` to amount variant.
|
|
153
|
+
- See [`knowledge/i18n/korean-typography.md`](../knowledge/i18n/korean-typography.md) for full Korean adjustments.
|
|
154
|
+
|
|
155
|
+
## Code example
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
function TransactionDetail({ tx }: Props) {
|
|
159
|
+
return (
|
|
160
|
+
<article>
|
|
161
|
+
<Typography variant="display" as="h1">
|
|
162
|
+
₩{formatKRW(tx.amount)}
|
|
163
|
+
</Typography>
|
|
164
|
+
<Typography variant="caption" color="secondary">
|
|
165
|
+
{formatDate(tx.date)}
|
|
166
|
+
</Typography>
|
|
167
|
+
|
|
168
|
+
<Typography variant="heading-md" className="mt-6">
|
|
169
|
+
상세
|
|
170
|
+
</Typography>
|
|
171
|
+
|
|
172
|
+
<dl className="mt-4">
|
|
173
|
+
<dt><Typography variant="body-sm" color="secondary">상점</Typography></dt>
|
|
174
|
+
<dd><Typography variant="body">{tx.merchant}</Typography></dd>
|
|
175
|
+
|
|
176
|
+
<dt><Typography variant="body-sm" color="secondary">주문번호</Typography></dt>
|
|
177
|
+
<dd>
|
|
178
|
+
<Typography variant="body" copyable>
|
|
179
|
+
{tx.orderId}
|
|
180
|
+
</Typography>
|
|
181
|
+
</dd>
|
|
182
|
+
</dl>
|
|
183
|
+
</article>
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## When NOT to use Typography component
|
|
189
|
+
|
|
190
|
+
For projects using **Tailwind**: utility classes (`text-xl font-semibold leading-relaxed`) are usually clearer than `<Typography variant="heading-md">`. The Typography component is a convention from CSS-in-JS / styled-components systems.
|
|
191
|
+
|
|
192
|
+
For **shadcn-ui projects**: skip Typography. Define type-scale classes in your global CSS / Tailwind config and use semantic HTML directly.
|
|
193
|
+
|
|
194
|
+
For **Ant Design / MUI projects**: Typography is canonical; use it.
|
|
195
|
+
|
|
196
|
+
## Don't
|
|
197
|
+
|
|
198
|
+
- Don't use Typography for layout (margin, padding). It's a text primitive.
|
|
199
|
+
- Don't override the default semantic (`as`) without reason — h1 is meaningful.
|
|
200
|
+
- Don't apply different variants to the same logical text role across the app — that's drift.
|
|
201
|
+
- Don't omit `aria-label` on copyable copy buttons.
|
|
202
|
+
|
|
203
|
+
## References
|
|
204
|
+
|
|
205
|
+
- Ant Design: [`refs/ant-design/components/typography/`](../refs/ant-design/components/typography/) — `Typography`, `Typography.Title`, `Typography.Text`, `Typography.Paragraph`. Most exhaustive: copyable, ellipsis with tooltip, editable.
|
|
206
|
+
- MUI: [`refs/mui/packages/mui-material/src/Typography/`](../refs/mui/packages/mui-material/src/Typography/) — `Typography` with variants matching Material 3 (display, headline, title, body, label).
|
|
207
|
+
- shadcn-ui: no Typography component. Apply utility classes directly.
|
|
208
|
+
|
|
209
|
+
## Cross-reference
|
|
210
|
+
|
|
211
|
+
- [`knowledge/typography/type-scale-fundamentals.md`](../knowledge/typography/type-scale-fundamentals.md) — type scale rules
|
|
212
|
+
- [`knowledge/typography/mui-type-scale.md`](../knowledge/typography/mui-type-scale.md) — MUI variants
|
|
213
|
+
- [`knowledge/i18n/korean-typography.md`](../knowledge/i18n/korean-typography.md) — Korean adjustments
|
|
214
|
+
- [`examples/component-amount-input.md`](component-amount-input.md) — amount-specific text variant
|
|
215
|
+
- [`examples/component-code.md`](component-code.md) — code-specific text
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
# `Upload` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Upload`, MUI (composition with file input), shadcn-ui (composition)
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Lets users select files from disk to upload (or stage for upload) — profile photo, attachments, document import.
|
|
8
|
+
|
|
9
|
+
## Three patterns
|
|
10
|
+
|
|
11
|
+
| Pattern | Use |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| **Drop zone** (large dashed area) | File-centric uploads — bulk import, document upload |
|
|
14
|
+
| **Button trigger** (small button + native picker) | Single-file uploads — profile photo, attach |
|
|
15
|
+
| **Inline avatar** (click photo to replace) | Profile photo, contained image |
|
|
16
|
+
|
|
17
|
+
Most products need 1–2 of these. Drop zone is most flexible.
|
|
18
|
+
|
|
19
|
+
## Anatomy — drop zone
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
┌──────────────────────────────────────────────────┐
|
|
23
|
+
│ │
|
|
24
|
+
│ 📤 │
|
|
25
|
+
│ │
|
|
26
|
+
│ 파일을 드래그하거나 클릭하여 선택 │
|
|
27
|
+
│ JPG, PNG, PDF · 최대 10 MB │
|
|
28
|
+
│ │
|
|
29
|
+
└──────────────────────────────────────────────────┘
|
|
30
|
+
(after select)
|
|
31
|
+
┌──────────────────────────────────────────────────┐
|
|
32
|
+
│ 📄 design-spec.pdf ━━━━━━━━━━ 85% ✕ │
|
|
33
|
+
│ 🖼 hero-image.jpg ━━━━━━━━━━ 100% │
|
|
34
|
+
└──────────────────────────────────────────────────┘
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Slot | Required | Notes |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| Drop zone | yes | Large dashed area with icon + helper text |
|
|
40
|
+
| File list | yes (after select) | Each file with progress bar and remove |
|
|
41
|
+
| Helper text | yes | Allowed types, max size |
|
|
42
|
+
| Upload progress | yes (during upload) | Per-file bar + total |
|
|
43
|
+
| Error state | when applicable | Per-file or top-level error |
|
|
44
|
+
|
|
45
|
+
## API
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<Upload
|
|
49
|
+
accept={["image/jpeg", "image/png", "application/pdf"]}
|
|
50
|
+
multiple
|
|
51
|
+
maxFiles={5}
|
|
52
|
+
maxSize={10 * 1024 * 1024} // 10 MB
|
|
53
|
+
onFilesChange={setFiles}
|
|
54
|
+
onUpload={uploadHandler}
|
|
55
|
+
uploadOnSelect={true}
|
|
56
|
+
pattern="drop-zone"
|
|
57
|
+
/>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
| Prop | Type | Default | Description |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| `accept` | `string[]` | — | MIME types or extensions (`["image/*", ".pdf"]`) |
|
|
63
|
+
| `multiple` | `boolean` | `false` | Allow multiple files |
|
|
64
|
+
| `maxFiles` | `number` | — | Cap on count |
|
|
65
|
+
| `maxSize` | `number` | — | Bytes per file |
|
|
66
|
+
| `value` | `UploadedFile[]` | — | Controlled list |
|
|
67
|
+
| `onFilesChange` | `(files) => void` | — | Fires when list changes |
|
|
68
|
+
| `onUpload` | `(file) => Promise<UploadResult>` | — | Per-file upload handler. Returns when upload completes. |
|
|
69
|
+
| `uploadOnSelect` | `boolean` | `true` | Auto-upload on select; false = stage and upload separately |
|
|
70
|
+
| `pattern` | `"drop-zone" \| "button" \| "avatar"` | `"drop-zone"` | UI pattern |
|
|
71
|
+
| `disabled` | `boolean` | `false` | |
|
|
72
|
+
| `directory` | `boolean` | `false` | Allow folder selection (browser support varies) |
|
|
73
|
+
| `paste` | `boolean` | `true` | Allow paste-to-upload (Cmd+V on focused zone) |
|
|
74
|
+
| `errorText` | `string` | — | Top-level error |
|
|
75
|
+
| `helpText` | `string` | derived from accept + maxSize | E.g., "JPG, PNG · max 10MB" |
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
type UploadedFile = {
|
|
79
|
+
id: string;
|
|
80
|
+
file: File; // browser File object
|
|
81
|
+
status: "pending" | "uploading" | "success" | "error";
|
|
82
|
+
progress: number; // 0–100
|
|
83
|
+
url?: string; // server-returned after success
|
|
84
|
+
error?: string;
|
|
85
|
+
};
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Behavior
|
|
89
|
+
|
|
90
|
+
### Selection paths
|
|
91
|
+
|
|
92
|
+
1. **Click drop zone**: opens native file picker.
|
|
93
|
+
2. **Drag-and-drop**: drop file onto the zone.
|
|
94
|
+
3. **Paste** (when `paste: true` and zone focused): Cmd+V pastes a copied image.
|
|
95
|
+
|
|
96
|
+
### Upload flow
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
[file selected] → validate (size, type) → if pass: add to list, status="pending"
|
|
100
|
+
→ if uploadOnSelect: status="uploading", call onUpload, track progress
|
|
101
|
+
→ on success: status="success", store url
|
|
102
|
+
→ on error: status="error", show retry
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Validation
|
|
106
|
+
|
|
107
|
+
Per file:
|
|
108
|
+
- Type matches `accept`. If not, reject with "지원하지 않는 형식입니다."
|
|
109
|
+
- Size <= `maxSize`. If not, reject with "파일이 너무 큽니다."
|
|
110
|
+
|
|
111
|
+
Per batch:
|
|
112
|
+
- Total count <= `maxFiles`. If exceeds, reject the excess.
|
|
113
|
+
|
|
114
|
+
Show validation errors inline (per-file) or as a top banner if multiple files share the same issue.
|
|
115
|
+
|
|
116
|
+
### Progress tracking
|
|
117
|
+
|
|
118
|
+
Per file: 0–100% bar. The `onUpload` handler should report progress:
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
const upload = async (file) => {
|
|
122
|
+
const xhr = new XMLHttpRequest();
|
|
123
|
+
xhr.upload.onprogress = (e) => {
|
|
124
|
+
setProgress(file.id, (e.loaded / e.total) * 100);
|
|
125
|
+
};
|
|
126
|
+
xhr.open("POST", "/api/upload");
|
|
127
|
+
xhr.send(file);
|
|
128
|
+
};
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Or use `fetch` with a `ReadableStream` for progress (modern, more complex).
|
|
132
|
+
|
|
133
|
+
### Cancel mid-upload
|
|
134
|
+
|
|
135
|
+
Provide a ✕ on each uploading file. Aborts the request:
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
const controller = new AbortController();
|
|
139
|
+
fetch("/api/upload", { body: file, signal: controller.signal });
|
|
140
|
+
// On cancel:
|
|
141
|
+
controller.abort();
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Retry on error
|
|
145
|
+
|
|
146
|
+
Show "다시 시도" button next to errored files.
|
|
147
|
+
|
|
148
|
+
## Patterns
|
|
149
|
+
|
|
150
|
+
### Drop zone
|
|
151
|
+
|
|
152
|
+
Default pattern. Clicking opens picker; dragging files works.
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
┌──────────────────────────────────────────────────┐
|
|
156
|
+
│ 📤 파일을 드래그하거나 클릭하여 선택 │
|
|
157
|
+
│ JPG, PNG, PDF · 최대 10 MB │
|
|
158
|
+
└──────────────────────────────────────────────────┘
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Button
|
|
162
|
+
|
|
163
|
+
Small button that triggers native picker. Renders selected files inline below or as tags.
|
|
164
|
+
|
|
165
|
+
```tsx
|
|
166
|
+
<Upload pattern="button" multiple>
|
|
167
|
+
<Button variant="outline" iconStart={<UploadIcon />}>
|
|
168
|
+
파일 선택
|
|
169
|
+
</Button>
|
|
170
|
+
</Upload>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Avatar (single image)
|
|
174
|
+
|
|
175
|
+
Profile photo replacement. Click opens picker; uploaded file replaces avatar.
|
|
176
|
+
|
|
177
|
+
```tsx
|
|
178
|
+
<Upload pattern="avatar" accept="image/*" maxSize={5 * 1024 * 1024}>
|
|
179
|
+
<Avatar src={user.photoUrl} alt={user.name} size="xl" />
|
|
180
|
+
<span className="overlay">변경</span>
|
|
181
|
+
</Upload>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## States
|
|
185
|
+
|
|
186
|
+
| State | Visual |
|
|
187
|
+
| --- | --- |
|
|
188
|
+
| Default | Resting drop zone or button |
|
|
189
|
+
| Drag-over | Border emphasizes (`--color-primary-default` border, `--color-primary-subtle-bg` bg) |
|
|
190
|
+
| Disabled | Muted, no events |
|
|
191
|
+
| Has files | File list rendered below (or replaces zone) |
|
|
192
|
+
| Uploading | Progress bars on each file; spinner on zone if uploading more |
|
|
193
|
+
| Error (per-file) | Red border on file row + retry button |
|
|
194
|
+
| Error (top-level) | Banner above zone with message |
|
|
195
|
+
|
|
196
|
+
## Tokens consumed
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
--color-bg-default
|
|
200
|
+
--color-bg-subtle
|
|
201
|
+
--color-primary-default (drag-over border, progress bar)
|
|
202
|
+
--color-primary-subtle-bg (drag-over bg)
|
|
203
|
+
--color-text-primary
|
|
204
|
+
--color-text-secondary (helper text)
|
|
205
|
+
--color-text-tertiary (file metadata)
|
|
206
|
+
--color-error (validation errors)
|
|
207
|
+
--color-success (upload success)
|
|
208
|
+
--color-border-default
|
|
209
|
+
--color-border-default-dashed (drop zone border style)
|
|
210
|
+
--color-focus-ring
|
|
211
|
+
--space-md, --space-base, --space-lg
|
|
212
|
+
--radius-md
|
|
213
|
+
--font-size-sm, --font-size-base
|
|
214
|
+
--motion-fast
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Sizes
|
|
218
|
+
|
|
219
|
+
| Size | Drop zone height | Padding |
|
|
220
|
+
| --- | --- | --- |
|
|
221
|
+
| `sm` | 80px | 16px |
|
|
222
|
+
| `md` (default) | 120px | 24px |
|
|
223
|
+
| `lg` | 200px | 32px |
|
|
224
|
+
|
|
225
|
+
## Accessibility
|
|
226
|
+
|
|
227
|
+
- The drop zone is a `<button>` (or has `role="button"`) that opens the file picker.
|
|
228
|
+
- `<input type="file">` is hidden but real — keyboard activates it.
|
|
229
|
+
- File list: `<ul>` with each file as `<li>` containing description + status announcements.
|
|
230
|
+
- Progress: `aria-valuenow` on the per-file progress bar.
|
|
231
|
+
- Errors: `role="alert"` on per-file error.
|
|
232
|
+
- Drag-and-drop is supplementary — keyboard users go through the file picker.
|
|
233
|
+
- For drag enter/leave: announce via `aria-live="polite"` ("Drop file to upload" appears).
|
|
234
|
+
|
|
235
|
+
### Keyboard
|
|
236
|
+
|
|
237
|
+
| Key | Behavior |
|
|
238
|
+
| --- | --- |
|
|
239
|
+
| `Tab` | Reach drop zone |
|
|
240
|
+
| `Enter` / `Space` | Open file picker |
|
|
241
|
+
| `Tab` (inside file list) | Move to retry / remove buttons |
|
|
242
|
+
|
|
243
|
+
## Korean considerations
|
|
244
|
+
|
|
245
|
+
| English | Korean |
|
|
246
|
+
| --- | --- |
|
|
247
|
+
| Drop file or click | 파일을 드래그하거나 클릭 |
|
|
248
|
+
| Click to upload | 클릭하여 업로드 |
|
|
249
|
+
| File too large | 파일이 너무 큽니다 |
|
|
250
|
+
| Unsupported format | 지원하지 않는 형식입니다 |
|
|
251
|
+
| Uploading | 업로드 중 |
|
|
252
|
+
| Failed | 실패 |
|
|
253
|
+
| Try again | 다시 시도 |
|
|
254
|
+
| Remove | 제거 |
|
|
255
|
+
| Max N files | 최대 N개 |
|
|
256
|
+
|
|
257
|
+
## Edge cases
|
|
258
|
+
|
|
259
|
+
- **User selects huge file (>maxSize)**: reject before starting upload. Don't begin upload of a 1GB file just to cancel at 99%.
|
|
260
|
+
- **User selects 50 files when max is 5**: accept first 5; reject the rest with a banner.
|
|
261
|
+
- **Network drops mid-upload**: file row goes to error state with retry button.
|
|
262
|
+
- **Same file uploaded twice**: detect by name + size (not 100% reliable). Optional warning, not block.
|
|
263
|
+
- **Drag from another browser tab**: works; the dragged item is a URL/text. Some browsers fire `dataTransfer.files` differently.
|
|
264
|
+
- **Mobile**: native picker handles camera/gallery selection. Drag-and-drop not applicable. Use button pattern.
|
|
265
|
+
- **Folder upload**: browser support is limited (`webkitdirectory`). Document the constraint.
|
|
266
|
+
- **Paste image**: most browsers support pasting an image (e.g., screenshot). If `paste: true`, focus zone first.
|
|
267
|
+
|
|
268
|
+
## Don't
|
|
269
|
+
|
|
270
|
+
- Don't upload silently in the background without progress — user has no feedback.
|
|
271
|
+
- Don't accept all file types unless truly meant. Restrict via `accept`.
|
|
272
|
+
- Don't fail silently on unsupported types. Show why.
|
|
273
|
+
- Don't lose files in a list when one fails. Failed files stay until removed.
|
|
274
|
+
- Don't render a 1MB file's progress bar but skip it for a 10KB file. Consistency.
|
|
275
|
+
- Don't make the drop zone a click target without keyboard alternative.
|
|
276
|
+
- Don't accept user uploads to your server without server-side validation. Client validation is UX only.
|
|
277
|
+
- Don't show "Uploaded successfully" toast for every successful file. Use the inline checkmark.
|
|
278
|
+
|
|
279
|
+
## References
|
|
280
|
+
|
|
281
|
+
- Ant Design: [`refs/ant-design/components/upload/`](../refs/ant-design/components/upload/) — `Upload` with `Upload.Dragger` (drop zone), file list, multiple modes. Most exhaustive.
|
|
282
|
+
- MUI: no dedicated component. Compose `<input type="file">` with custom button.
|
|
283
|
+
- shadcn-ui: no built-in. Compose with file input + drop-zone library (e.g., `react-dropzone`).
|
|
284
|
+
|
|
285
|
+
API choices made:
|
|
286
|
+
- **`pattern` prop** (drop-zone / button / avatar) collapses three sibling components into one with mode.
|
|
287
|
+
- **`uploadOnSelect` opt-in vs explicit upload**: matches the two real-world flows (auto-upload vs review-then-upload).
|
|
288
|
+
- **`onUpload` returns Promise**: enables progress tracking + retry uniformly.
|
|
289
|
+
|
|
290
|
+
## Cross-reference
|
|
291
|
+
|
|
292
|
+
- [`knowledge/patterns/form-design.md`](../knowledge/patterns/form-design.md) — file inputs in forms
|
|
293
|
+
- [`examples/component-progress.md`](component-progress.md) — per-file upload progress
|
|
294
|
+
- [`examples/component-avatar.md`](component-avatar.md) — avatar pattern for image uploads
|
|
295
|
+
- [`knowledge/i18n/korean-publishing.md`](../knowledge/i18n/korean-publishing.md) — image upload size constraints for app store
|