@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,249 @@
|
|
|
1
|
+
# `DatePicker` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `DatePicker`, MUI `DatePicker` (X package), shadcn-ui `calendar` + `date-picker` (react-day-picker)
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A DatePicker lets users pick a date or date range. Two distinct use cases drive different optimal UI:
|
|
8
|
+
|
|
9
|
+
| Use case | Recommended UI |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Pick a date the user **knows** (DOB, expiry, settled appointment) | Text input with format hint, OR three dropdowns (Y/M/D) |
|
|
12
|
+
| Pick a date the user is **choosing** (booking, scheduling, filtering) | Calendar grid (popover or sheet) |
|
|
13
|
+
|
|
14
|
+
Implementing the wrong UI for the use case is the most common bug. Don't make users navigate a calendar to enter their birthday.
|
|
15
|
+
|
|
16
|
+
## Variants
|
|
17
|
+
|
|
18
|
+
### `single` — pick one date
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌──────────────────────┐
|
|
22
|
+
│ 📅 2026.05.07 │ ← compact input (month+day visible)
|
|
23
|
+
└──────────────────────┘
|
|
24
|
+
│
|
|
25
|
+
▼ (on click, opens popover)
|
|
26
|
+
┌────────────────────────────────────┐
|
|
27
|
+
│ ◀ May 2026 ▶ │
|
|
28
|
+
│ Su Mo Tu We Th Fr Sa │
|
|
29
|
+
│ 1 2 │
|
|
30
|
+
│ 3 4 5 6 7 8 9 │
|
|
31
|
+
│ 10 11 12 13 14 15 16 │
|
|
32
|
+
│ ... │
|
|
33
|
+
└────────────────────────────────────┘
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### `range` — pick a start + end
|
|
37
|
+
|
|
38
|
+
Same UI; calendar shows both selections highlighted with the days between styled as range fill.
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
┌──────────────────────────────────┐
|
|
42
|
+
│ 📅 2026.05.07 — 2026.05.14 │
|
|
43
|
+
└──────────────────────────────────┘
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### `dateTime` — date + time
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
┌──────────────────────────────────────────┐
|
|
50
|
+
│ 📅 2026.05.07 14:30 │
|
|
51
|
+
└──────────────────────────────────────────┘
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Calendar above, time picker below. Time as separate scrollable wheels (mobile native), dropdowns (desktop), or two number inputs.
|
|
55
|
+
|
|
56
|
+
### `quickRange` — preset range pills
|
|
57
|
+
|
|
58
|
+
For dashboards / analytics:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
[오늘] [7일] [30일] [이번 달] [지난 달] [사용자 지정 ▾]
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Clicking "사용자 지정" opens the full range picker. Pre-defined ranges cover ~80% of analytics use cases.
|
|
65
|
+
|
|
66
|
+
## API
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
<DatePicker
|
|
70
|
+
value={date}
|
|
71
|
+
onValueChange={setDate}
|
|
72
|
+
mode="single" // "single" | "range" | "dateTime" | "quickRange"
|
|
73
|
+
format="yyyy.MM.dd" // display format
|
|
74
|
+
placeholder="날짜 선택"
|
|
75
|
+
minDate={new Date()}
|
|
76
|
+
maxDate={addYears(new Date(), 1)}
|
|
77
|
+
disabledDates={(d) => isWeekend(d)}
|
|
78
|
+
locale="ko-KR"
|
|
79
|
+
showTime={false}
|
|
80
|
+
weekStartsOn={0} // 0=Sun, 1=Mon
|
|
81
|
+
presets={[
|
|
82
|
+
{ label: "오늘", value: today() },
|
|
83
|
+
{ label: "이번 주", value: thisWeek() },
|
|
84
|
+
]}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
| Prop | Type | Default | Description |
|
|
89
|
+
| --- | --- | --- | --- |
|
|
90
|
+
| `value` | `Date \| { from: Date, to: Date } \| null` | — | Controlled value |
|
|
91
|
+
| `defaultValue` | same | — | Uncontrolled default |
|
|
92
|
+
| `onValueChange` | `(value) => void` | — | Fires on selection |
|
|
93
|
+
| `mode` | `"single" \| "range" \| "dateTime" \| "quickRange"` | `"single"` | |
|
|
94
|
+
| `format` | `string` | locale default | Display format (date-fns or dayjs syntax) |
|
|
95
|
+
| `placeholder` | `string` | locale default | When no value |
|
|
96
|
+
| `minDate` / `maxDate` | `Date` | — | Bounds |
|
|
97
|
+
| `disabledDates` | `(date) => boolean` | — | Disable specific dates (weekends, holidays) |
|
|
98
|
+
| `locale` | `string` | `"ko-KR"` (KR builds) | |
|
|
99
|
+
| `weekStartsOn` | `0..6` | `0` (Sunday) for KR/US | Korean and US start on Sun; EU on Mon |
|
|
100
|
+
| `presets` | `{ label, value }[]` | — | Quick-pick buttons in popover |
|
|
101
|
+
| `disabled` / `readOnly` | `boolean` | `false` | |
|
|
102
|
+
| `error` / `errorText` | — | — | Validation state |
|
|
103
|
+
|
|
104
|
+
## Korean format conventions
|
|
105
|
+
|
|
106
|
+
Per [knowledge/i18n/korean-typography.md](../knowledge/i18n/korean-typography.md):
|
|
107
|
+
|
|
108
|
+
| Format | Example | Use |
|
|
109
|
+
| --- | --- | --- |
|
|
110
|
+
| `yyyy.MM.dd` | `2026.05.07` | Compact — default for most product UIs |
|
|
111
|
+
| `yyyy년 M월 d일` | `2026년 5월 7일` | Formal — invoices, legal docs |
|
|
112
|
+
| `yyyy-MM-dd` | `2026-05-07` | Technical / ISO — admin tools |
|
|
113
|
+
| `M월 d일 (E)` | `5월 7일 (목)` | Casual — "이번 주", "오늘" relative contexts |
|
|
114
|
+
|
|
115
|
+
Korean weekday short forms: 일 월 화 수 목 금 토 (single character).
|
|
116
|
+
|
|
117
|
+
Do **not** use US format `MM/dd/yyyy` in Korean apps.
|
|
118
|
+
|
|
119
|
+
## States
|
|
120
|
+
|
|
121
|
+
| State | Visual |
|
|
122
|
+
| --- | --- |
|
|
123
|
+
| Empty (no value) | Placeholder text, calendar icon |
|
|
124
|
+
| Filled | Selected date in input format |
|
|
125
|
+
| Hover (input) | Border emphasis |
|
|
126
|
+
| Focus-visible | 2px ring (matches Input spec) |
|
|
127
|
+
| Open (popover visible) | Border emphasis, panel positioned below or above per viewport |
|
|
128
|
+
| Disabled date in calendar | Muted text, no events, `aria-disabled` |
|
|
129
|
+
| Today | Subtle highlight (border or bold) |
|
|
130
|
+
| Selected date | Filled bg `--color-primary-default`, white text |
|
|
131
|
+
| In-range dates | Subtle bg `--color-primary-subtle-bg` |
|
|
132
|
+
| Range start/end | Filled bg, rounded only on the appropriate side |
|
|
133
|
+
|
|
134
|
+
## Calendar grid
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
┌────────────────────────────────────────────┐
|
|
138
|
+
│ ◀ 2026년 5월 ▶ [오늘로] │
|
|
139
|
+
├────────────────────────────────────────────┤
|
|
140
|
+
│ 일 월 화 수 목 금 토 │
|
|
141
|
+
├────────────────────────────────────────────┤
|
|
142
|
+
│ 1 2 │ ← month-prev days muted
|
|
143
|
+
│ 3 4 5 6 ●7 8 9 │ ● = today
|
|
144
|
+
│ 10 11 12 13 14 15 16 │
|
|
145
|
+
│ ... │
|
|
146
|
+
└────────────────────────────────────────────┘
|
|
147
|
+
[ ✕ Cancel ✓ Confirm ] ← (mobile only, on sheet variant)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
| Cell size | Use |
|
|
151
|
+
| --- | --- |
|
|
152
|
+
| 32×32 | Compact desktop |
|
|
153
|
+
| 40×40 | Default desktop |
|
|
154
|
+
| 48×48 | Mobile (touch target) |
|
|
155
|
+
|
|
156
|
+
## Mobile presentation
|
|
157
|
+
|
|
158
|
+
| Width | Presentation |
|
|
159
|
+
| --- | --- |
|
|
160
|
+
| Desktop (> md) | Popover anchored to input |
|
|
161
|
+
| Tablet | Popover, larger cells |
|
|
162
|
+
| Mobile (< md) | **Bottom sheet** with confirm/cancel buttons |
|
|
163
|
+
|
|
164
|
+
On mobile, **don't try to fit a popover under the input** — use a bottom sheet that takes ~70% of viewport height. Cells are 48×48 minimum.
|
|
165
|
+
|
|
166
|
+
The native `<input type="date">` on mobile uses the OS-native picker (iOS scrolling wheels, Android calendar). For Korean apps with custom branding, prefer a custom picker over native — but accept that custom picker has more bugs than native.
|
|
167
|
+
|
|
168
|
+
## Accessibility
|
|
169
|
+
|
|
170
|
+
- **Combobox pattern**: input has `role="combobox"`, `aria-expanded`, `aria-controls` pointing at the calendar's id.
|
|
171
|
+
- **Calendar grid**: `role="grid"`, each cell `role="gridcell"`. Day-of-week headers `role="columnheader"`.
|
|
172
|
+
- **Selected cell**: `aria-selected="true"`.
|
|
173
|
+
- **Disabled cell**: `aria-disabled="true"`.
|
|
174
|
+
- **Today**: `aria-current="date"`.
|
|
175
|
+
|
|
176
|
+
### Keyboard
|
|
177
|
+
|
|
178
|
+
| Key | Behavior |
|
|
179
|
+
| --- | --- |
|
|
180
|
+
| `Tab` | Reaches input. Pressing again leaves the picker. |
|
|
181
|
+
| `↓` (on input) | Opens calendar, focus moves to today (or selected date). |
|
|
182
|
+
| `Esc` | Closes calendar. |
|
|
183
|
+
| `←` `→` | Move 1 day |
|
|
184
|
+
| `↑` `↓` | Move 1 week |
|
|
185
|
+
| `PageUp` / `PageDown` | Move 1 month |
|
|
186
|
+
| `Shift+PageUp` / `Shift+PageDown` | Move 1 year |
|
|
187
|
+
| `Home` / `End` | First / last day of week |
|
|
188
|
+
| `Enter` / `Space` | Select focused date |
|
|
189
|
+
|
|
190
|
+
This is the WAI-ARIA APG date picker pattern. Required for AAA compliance.
|
|
191
|
+
|
|
192
|
+
### Screen reader
|
|
193
|
+
|
|
194
|
+
Announce on date selection: "May 7, 2026 selected" (or KR "2026년 5월 7일 선택됨").
|
|
195
|
+
|
|
196
|
+
## Tokens consumed
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
--color-bg-default (calendar bg)
|
|
200
|
+
--color-bg-subtle (current month days hover)
|
|
201
|
+
--color-text-primary
|
|
202
|
+
--color-text-secondary (other-month days)
|
|
203
|
+
--color-text-tertiary (weekday headers)
|
|
204
|
+
--color-primary-default (selected day)
|
|
205
|
+
--color-primary-subtle-bg (in-range days)
|
|
206
|
+
--color-on-primary (selected day text)
|
|
207
|
+
--color-border-default
|
|
208
|
+
--space-sm, --space-md
|
|
209
|
+
--radius-md (calendar cells)
|
|
210
|
+
--motion-fast, --easing-out
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Edge cases
|
|
214
|
+
|
|
215
|
+
- **Range start before end after re-pick**: if user picks a date before current `from`, swap automatically (it becomes the new `from`).
|
|
216
|
+
- **Time zone**: store dates as ISO 8601 with TZ. KST is UTC+9, no DST. For multi-region apps, display in user's local TZ; store in UTC.
|
|
217
|
+
- **Korean lunar calendar (음력)**: rare in product UIs but present in tradition/festival apps. Don't try to support both in one component — make it a separate `LunarDatePicker` if needed.
|
|
218
|
+
- **Disabled dates that include the current value**: when min/max changes and current value falls outside, clear the value or clamp to the new bound. Surface to user.
|
|
219
|
+
- **Far-past dates** (DOB year picker): scrolling 80 years in monthly steps is hostile. Provide a year-jump dropdown in the calendar header.
|
|
220
|
+
- **Far-future dates** (lease end, project deadline): same — year jump.
|
|
221
|
+
- **Holidays / 공휴일**: Korean apps often highlight holidays in red. Pass `holidays={[...]}` and style at the cell level.
|
|
222
|
+
- **Quick presets vs calendar**: when both are present, picking a preset highlights the date(s) on the calendar but stays in the popover. User can adjust manually after.
|
|
223
|
+
|
|
224
|
+
## Don't
|
|
225
|
+
|
|
226
|
+
- Don't ship date picker for birthday / DOB in calendar mode. Use 3-dropdown (Y/M/D) or text input with format hint. The user **knows** their DOB.
|
|
227
|
+
- Don't disable confirm-button until both range dates are picked — let user click the same date twice (single-day range) or pick non-contiguous if `mode="multi"` is supported.
|
|
228
|
+
- Don't auto-close popover after picking start of range. Wait for end.
|
|
229
|
+
- Don't use 12-hour time with AM/PM in Korean apps. Default 24-hour.
|
|
230
|
+
- Don't use month names "January" in Korean app. Use `1월`.
|
|
231
|
+
- Don't put DatePicker inside a Modal — both want focus management. Use a non-modal popover anchored to the input.
|
|
232
|
+
|
|
233
|
+
## References
|
|
234
|
+
|
|
235
|
+
- Ant Design: [`refs/ant-design/components/date-picker/`](../refs/ant-design/components/date-picker/) — most variants (`DatePicker`, `RangePicker`, `MonthPicker`, `YearPicker`, `WeekPicker`, `QuarterPicker`). Heavy but covers everything.
|
|
236
|
+
- MUI: `@mui/x-date-pickers` (separate package) — `DatePicker`, `DateTimePicker`, `DateRangePicker`. Excellent locale support; pairs with date-fns / dayjs / luxon adapters.
|
|
237
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/calendar.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/calendar.tsx) — wraps `react-day-picker`. Compose with `Popover` for the picker pattern.
|
|
238
|
+
|
|
239
|
+
API choices made:
|
|
240
|
+
- **`mode` axis** (single / range / dateTime / quickRange) over Ant's separate components — fewer top-level imports.
|
|
241
|
+
- **`presets` first-class**: most product UIs eventually want them; building a wrapper to add them is more friction than necessary.
|
|
242
|
+
- **`weekStartsOn` exposed**: locale-driven default (KR/US: Sunday; EU: Monday).
|
|
243
|
+
- **No "lunar calendar" mode**: niche. Spec a separate `LunarDatePicker` if needed; don't bloat this.
|
|
244
|
+
|
|
245
|
+
## Cross-reference
|
|
246
|
+
|
|
247
|
+
- [knowledge/i18n/korean-typography.md](../knowledge/i18n/korean-typography.md) — Korean date formats
|
|
248
|
+
- [knowledge/patterns/form-design.md](../knowledge/patterns/form-design.md) — when to use vs three-dropdown
|
|
249
|
+
- [WAI-ARIA Date Picker pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/examples/datepicker-dialog/)
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# `Descriptions` (key-value list) — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Descriptions`, MUI (composition with `<dl>`), shadcn-ui (composition).
|
|
4
|
+
>
|
|
5
|
+
> Renders structured key-value pairs in a tidy layout. Used for: order details, account profile fields, transaction metadata, settings summaries.
|
|
6
|
+
|
|
7
|
+
## When Descriptions vs alternatives
|
|
8
|
+
|
|
9
|
+
| Pattern | Use |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| **Descriptions** | Static read-only labels + values, multi-row, possibly multi-column |
|
|
12
|
+
| **Form** | Editable; each field has validation |
|
|
13
|
+
| **Table** | Many comparable items; one row per record |
|
|
14
|
+
| **Definition list** (raw `<dl>`) | When tagged HTML is enough; no styling layer needed |
|
|
15
|
+
|
|
16
|
+
## Anatomy
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Single column:
|
|
20
|
+
┌────────────────────────────────────────────┐
|
|
21
|
+
│ 이름 │ 김민지 │
|
|
22
|
+
│ 이메일 │ minji@example.com │
|
|
23
|
+
│ 휴대폰 │ 010-1234-5678 │
|
|
24
|
+
│ 가입일 │ 2024.03.15 │
|
|
25
|
+
└────────────────────────────────────────────┘
|
|
26
|
+
|
|
27
|
+
Two columns:
|
|
28
|
+
┌────────────┬───────────────┬────────────┬───────────────┐
|
|
29
|
+
│ 이름 │ 김민지 │ 이메일 │ minji@... │
|
|
30
|
+
│ 휴대폰 │ 010-... │ 가입일 │ 2024.03.15 │
|
|
31
|
+
└────────────┴───────────────┴────────────┴───────────────┘
|
|
32
|
+
|
|
33
|
+
With sections:
|
|
34
|
+
┌────────────────────────────────────────────┐
|
|
35
|
+
│ ── 계정 정보 ──────────────────── │
|
|
36
|
+
│ 이름 │ 김민지 │
|
|
37
|
+
│ 이메일 │ minji@example.com │
|
|
38
|
+
│ ── 결제 ────────────────────────── │
|
|
39
|
+
│ 카드 │ KB국민 ****-1234 │
|
|
40
|
+
│ 자동결제 │ 사용 중 │
|
|
41
|
+
└────────────────────────────────────────────┘
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
| Slot | Required | Notes |
|
|
45
|
+
| --- | --- | --- |
|
|
46
|
+
| Item label | yes | Left column or above value |
|
|
47
|
+
| Item value | yes | Right column or below label |
|
|
48
|
+
| Title | optional | Heading for the descriptions block |
|
|
49
|
+
| Section divider | optional | Group items |
|
|
50
|
+
|
|
51
|
+
## API
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
<Descriptions title="계정 정보" columns={1}>
|
|
55
|
+
<Descriptions.Item label="이름">김민지</Descriptions.Item>
|
|
56
|
+
<Descriptions.Item label="이메일">minji@example.com</Descriptions.Item>
|
|
57
|
+
<Descriptions.Item label="휴대폰">010-1234-5678</Descriptions.Item>
|
|
58
|
+
<Descriptions.Item label="가입일">2024.03.15</Descriptions.Item>
|
|
59
|
+
</Descriptions>
|
|
60
|
+
|
|
61
|
+
// Two-column on desktop, single on mobile
|
|
62
|
+
<Descriptions columns={{ default: 1, md: 2 }}>
|
|
63
|
+
...
|
|
64
|
+
</Descriptions>
|
|
65
|
+
|
|
66
|
+
// With sections
|
|
67
|
+
<Descriptions
|
|
68
|
+
sections={[
|
|
69
|
+
{
|
|
70
|
+
title: "계정",
|
|
71
|
+
items: [
|
|
72
|
+
{ label: "이름", value: "김민지" },
|
|
73
|
+
{ label: "이메일", value: "minji@example.com" },
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
title: "결제",
|
|
78
|
+
items: [
|
|
79
|
+
{ label: "카드", value: "KB국민 ****-1234" },
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
]}
|
|
83
|
+
/>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
| Prop | Type | Default | Description |
|
|
87
|
+
| --- | --- | --- | --- |
|
|
88
|
+
| `title` | `string \| ReactNode` | — | Heading |
|
|
89
|
+
| `columns` | `number \| { default, md, lg, ... }` | `1` | How many key-value pairs per row |
|
|
90
|
+
| `layout` | `"horizontal" \| "vertical"` | `"horizontal"` | Label position relative to value |
|
|
91
|
+
| `bordered` | `boolean` | `false` | Renders cell borders |
|
|
92
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
|
|
93
|
+
| `colon` | `boolean` | `false` | Append `:` to labels |
|
|
94
|
+
| `labelStyle` / `valueStyle` | `CSSProperties` | — | Per-cell overrides |
|
|
95
|
+
|
|
96
|
+
| Prop (Item) | Type | Description |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| `label` | `ReactNode` | Required |
|
|
99
|
+
| `children` | `ReactNode` | Value content |
|
|
100
|
+
| `span` | `number` | Multi-column span (when `columns > 1`) |
|
|
101
|
+
| `valueColor` | semantic color | For status / amount |
|
|
102
|
+
|
|
103
|
+
## Layouts
|
|
104
|
+
|
|
105
|
+
### Horizontal (default)
|
|
106
|
+
|
|
107
|
+
Label on left, value on right. Most product UIs.
|
|
108
|
+
|
|
109
|
+
| Property | Width |
|
|
110
|
+
| --- | --- |
|
|
111
|
+
| Label column | ~30% (or fixed 120–160px) |
|
|
112
|
+
| Value column | rest |
|
|
113
|
+
|
|
114
|
+
### Vertical
|
|
115
|
+
|
|
116
|
+
Label above value. Use when:
|
|
117
|
+
- Labels are long (Korean labels often need this).
|
|
118
|
+
- Values are wide (long URLs, multi-line text).
|
|
119
|
+
- Forms-adjacent style.
|
|
120
|
+
|
|
121
|
+
## States
|
|
122
|
+
|
|
123
|
+
| State | Visual |
|
|
124
|
+
| --- | --- |
|
|
125
|
+
| Default | Plain text |
|
|
126
|
+
| Empty value | "—" or "정보 없음" placeholder |
|
|
127
|
+
| Sensitive (masked) | "****-1234" partial reveal |
|
|
128
|
+
| Editable on hover | Pen icon appears, click → enters edit mode (if interactive) |
|
|
129
|
+
|
|
130
|
+
## Tokens consumed
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
--color-text-primary (value)
|
|
134
|
+
--color-text-secondary (label)
|
|
135
|
+
--color-text-tertiary
|
|
136
|
+
--color-bg-default
|
|
137
|
+
--color-bg-subtle (alternating rows if bordered)
|
|
138
|
+
--color-border-default (bordered variant)
|
|
139
|
+
--space-xs, --space-sm, --space-md
|
|
140
|
+
--font-size-sm, --font-size-base
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Accessibility
|
|
144
|
+
|
|
145
|
+
Render as `<dl>` (definition list) for semantics:
|
|
146
|
+
|
|
147
|
+
```html
|
|
148
|
+
<dl>
|
|
149
|
+
<div>
|
|
150
|
+
<dt>이름</dt>
|
|
151
|
+
<dd>김민지</dd>
|
|
152
|
+
</div>
|
|
153
|
+
<div>
|
|
154
|
+
<dt>이메일</dt>
|
|
155
|
+
<dd>minji@example.com</dd>
|
|
156
|
+
</div>
|
|
157
|
+
</dl>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Screen readers parse `<dt>` as "term", `<dd>` as "description". Keyboard users tab through interactive values only.
|
|
161
|
+
|
|
162
|
+
For sensitive values (account number): provide `aria-label` on the masked rendering — "계좌번호 마지막 네 자리, 일이삼사".
|
|
163
|
+
|
|
164
|
+
## Korean conventions
|
|
165
|
+
|
|
166
|
+
Typical labels:
|
|
167
|
+
|
|
168
|
+
| Korean | English |
|
|
169
|
+
| --- | --- |
|
|
170
|
+
| 이름 | Name |
|
|
171
|
+
| 이메일 | Email |
|
|
172
|
+
| 휴대폰 / 전화번호 | Phone |
|
|
173
|
+
| 주소 | Address |
|
|
174
|
+
| 가입일 | Sign-up date |
|
|
175
|
+
| 결제 수단 | Payment method |
|
|
176
|
+
| 자동결제 | Auto-payment |
|
|
177
|
+
| 회원 등급 | Membership tier |
|
|
178
|
+
| 적립금 | Points |
|
|
179
|
+
|
|
180
|
+
For long Korean labels: switch to vertical layout (label above value).
|
|
181
|
+
|
|
182
|
+
## Code example
|
|
183
|
+
|
|
184
|
+
```tsx
|
|
185
|
+
function ProfileScreen() {
|
|
186
|
+
const user = useUser();
|
|
187
|
+
|
|
188
|
+
return (
|
|
189
|
+
<Page>
|
|
190
|
+
<PageHeader>내 정보</PageHeader>
|
|
191
|
+
|
|
192
|
+
<Descriptions title="계정" columns={1} bordered>
|
|
193
|
+
<Descriptions.Item label="이름">{user.name}</Descriptions.Item>
|
|
194
|
+
<Descriptions.Item label="이메일">{user.email}</Descriptions.Item>
|
|
195
|
+
<Descriptions.Item label="휴대폰">{formatPhone(user.phone)}</Descriptions.Item>
|
|
196
|
+
<Descriptions.Item label="가입일">{formatDate(user.createdAt)}</Descriptions.Item>
|
|
197
|
+
</Descriptions>
|
|
198
|
+
|
|
199
|
+
<Descriptions title="결제" columns={1} bordered>
|
|
200
|
+
<Descriptions.Item label="카드">
|
|
201
|
+
{user.savedCard
|
|
202
|
+
? `${user.savedCard.bank} ****-${user.savedCard.last4}`
|
|
203
|
+
: "등록된 카드 없음"}
|
|
204
|
+
</Descriptions.Item>
|
|
205
|
+
<Descriptions.Item label="자동결제">
|
|
206
|
+
<Tag color={user.autoPayment ? "success" : "default"}>
|
|
207
|
+
{user.autoPayment ? "사용 중" : "미사용"}
|
|
208
|
+
</Tag>
|
|
209
|
+
</Descriptions.Item>
|
|
210
|
+
</Descriptions>
|
|
211
|
+
</Page>
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Edge cases
|
|
217
|
+
|
|
218
|
+
- **Long values that wrap**: align label to top of value (`vertical-align: top`).
|
|
219
|
+
- **Empty value**: render `—` or culturally-appropriate placeholder ("정보 없음").
|
|
220
|
+
- **Sensitive value masked**: pair with copy-button if it's user's identifier (account number, member ID).
|
|
221
|
+
- **Editable inline**: switch to Form when in edit mode; revert to Descriptions when done.
|
|
222
|
+
- **Mobile**: descend to single-column regardless of `columns` prop, or use vertical layout per item.
|
|
223
|
+
|
|
224
|
+
## Don't
|
|
225
|
+
|
|
226
|
+
- Don't use Descriptions for editable forms. Use `Form`.
|
|
227
|
+
- Don't put complex interactive widgets in values (use a different component).
|
|
228
|
+
- Don't omit the label — values without labels are mystery data.
|
|
229
|
+
- Don't show empty values without placeholder — looks broken.
|
|
230
|
+
- Don't use `:` in labels by default (Korean convention is space). Toggle `colon` prop if needed.
|
|
231
|
+
|
|
232
|
+
## References
|
|
233
|
+
|
|
234
|
+
- Ant Design: [`refs/ant-design/components/descriptions/`](../refs/ant-design/components/descriptions/) — most exhaustive (column, span, layout, bordered, sections).
|
|
235
|
+
- MUI / shadcn-ui: no built-in. Compose with `<dl>` + Tailwind.
|
|
236
|
+
|
|
237
|
+
## Cross-reference
|
|
238
|
+
|
|
239
|
+
- [`examples/component-form.md`](component-form.md) — editable counterpart
|
|
240
|
+
- [`examples/component-table.md`](component-table.md) — for many comparable items
|
|
241
|
+
- [`examples/component-card.md`](component-card.md) — wraps Descriptions in detail screens
|
|
242
|
+
- [`knowledge/patterns/settings-page.md`](../knowledge/patterns/settings-page.md) — Descriptions on settings pages
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# `DialogActions` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `DialogActions`. The action row at the bottom of a `Dialog`. Right-aligns buttons by default; primary action goes last (right-most) so it gets the user's reading-direction emphasis.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Inside every interactive `Dialog` — confirmation, form submission, choice prompts.
|
|
8
|
+
- For non-blocking inline confirmations, prefer `Popconfirm` instead of opening a Dialog.
|
|
9
|
+
|
|
10
|
+
## Anatomy
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌────────────────────────────────────────────┐
|
|
14
|
+
│ [ Cancel ] [ Primary ] │
|
|
15
|
+
└────────────────────────────────────────────┘
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Korean / Western convention: cancel on the left, primary on the right. macOS / iOS native convention is reversed (primary on the right is consistent across both, but cancel position varies). Match your platform target.
|
|
19
|
+
|
|
20
|
+
## API
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
<DialogActions>
|
|
24
|
+
<Button onClick={handleClose}>취소</Button>
|
|
25
|
+
<Button onClick={handleConfirm} variant="contained" autoFocus>
|
|
26
|
+
삭제
|
|
27
|
+
</Button>
|
|
28
|
+
</DialogActions>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Prop | Type | Default | Description |
|
|
32
|
+
| --- | --- | --- | --- |
|
|
33
|
+
| `children` | `ReactNode` | — | Action buttons |
|
|
34
|
+
| `disableSpacing` | `boolean` | `false` | Remove default 8px gap between buttons |
|
|
35
|
+
|
|
36
|
+
## States
|
|
37
|
+
|
|
38
|
+
Non-interactive itself. Buttons own their states.
|
|
39
|
+
|
|
40
|
+
## Button order convention
|
|
41
|
+
|
|
42
|
+
| Convention | Order (left → right) |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| Web / Material / Korean apps | Cancel · Primary |
|
|
45
|
+
| iOS native (sheet style) | Cancel · Primary (primary highlighted) |
|
|
46
|
+
| Windows native | Primary · Cancel |
|
|
47
|
+
| Linux GNOME native | Cancel · Primary |
|
|
48
|
+
|
|
49
|
+
For Korean B2C / B2B apps, use **Cancel · Primary** (matches Toss / KakaoBank / NaverPay convention).
|
|
50
|
+
|
|
51
|
+
For destructive primary actions (e.g., 삭제), use `color="error"` on the primary button + place it in the same right-most position. Don't move it to the left to "discourage" — users learn one position; consistency matters more than friction.
|
|
52
|
+
|
|
53
|
+
## Tokens consumed
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
--space-sm /* gap between buttons */
|
|
57
|
+
--space-md /* container padding */
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Accessibility
|
|
61
|
+
|
|
62
|
+
- The primary action should have `autoFocus` (so Enter activates it without keyboard nav).
|
|
63
|
+
- For destructive primary actions, consider NOT auto-focusing — require explicit click. Cite [`knowledge/patterns/empty-states.md`](../knowledge/patterns/empty-states.md) (the same pattern applies to confirmation flows).
|
|
64
|
+
- Tab order: cancel → primary (matches visual order).
|
|
65
|
+
- Esc must trigger cancel (handled at the `Dialog` level, not here).
|
|
66
|
+
|
|
67
|
+
## Edge cases
|
|
68
|
+
|
|
69
|
+
- **3-button choice** — left: tertiary action ("나중에"); middle: cancel; right: primary. Avoid 4+ buttons — split into a multi-step flow.
|
|
70
|
+
- **Loading primary** — disable both cancel and primary while pending; show spinner on primary. Don't allow cancel during destructive operations that can't actually be undone.
|
|
71
|
+
- **Mobile narrow widths** — buttons can wrap to two rows. Test at 320px width.
|
|
72
|
+
|
|
73
|
+
## Code example
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
<Dialog open={open} onClose={handleClose}>
|
|
77
|
+
<DialogTitle id="delete-title">정말 삭제할까요?</DialogTitle>
|
|
78
|
+
<DialogContent>
|
|
79
|
+
<DialogContentText>이 작업은 취소할 수 없어요.</DialogContentText>
|
|
80
|
+
</DialogContent>
|
|
81
|
+
<DialogActions>
|
|
82
|
+
<Button onClick={handleClose}>취소</Button>
|
|
83
|
+
<LoadingButton
|
|
84
|
+
onClick={handleDelete}
|
|
85
|
+
loading={isPending}
|
|
86
|
+
variant="contained"
|
|
87
|
+
color="error"
|
|
88
|
+
>
|
|
89
|
+
삭제
|
|
90
|
+
</LoadingButton>
|
|
91
|
+
</DialogActions>
|
|
92
|
+
</Dialog>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Don't
|
|
96
|
+
|
|
97
|
+
- Don't put 4+ buttons — confusing.
|
|
98
|
+
- Don't reverse the order to discourage destructive actions — users learn one order; consistency matters more.
|
|
99
|
+
- Don't omit a clear cancel — every dialog needs a way out (Esc + at least one button).
|
|
100
|
+
|
|
101
|
+
## References
|
|
102
|
+
|
|
103
|
+
- MUI: [`DialogActions.d.ts`](../refs/mui/packages/mui-material/src/DialogActions/DialogActions.d.ts)
|
|
104
|
+
|
|
105
|
+
## Cross-reference
|
|
106
|
+
|
|
107
|
+
- [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
|
|
108
|
+
- [`component-dialog.md`](component-dialog.md)
|
|
109
|
+
- [`component-dialog-title.md`](component-dialog-title.md)
|
|
110
|
+
- [`component-dialog-content.md`](component-dialog-content.md)
|
|
111
|
+
- [`component-button.md`](component-button.md)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# `DialogContentText` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `DialogContentText`. The descriptive paragraph inside `DialogContent`. Provides the accessible *description* for the dialog via `aria-describedby` association.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Inside every Dialog whose body has explanatory text.
|
|
8
|
+
- Pair with `aria-describedby` on the parent Dialog.
|
|
9
|
+
|
|
10
|
+
## API
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
<Dialog aria-labelledby="t" aria-describedby="d">
|
|
14
|
+
<DialogTitle id="t">정말 삭제할까요?</DialogTitle>
|
|
15
|
+
<DialogContent>
|
|
16
|
+
<DialogContentText id="d">
|
|
17
|
+
이 작업은 되돌릴 수 없어요.
|
|
18
|
+
</DialogContentText>
|
|
19
|
+
</DialogContent>
|
|
20
|
+
<DialogActions>...</DialogActions>
|
|
21
|
+
</Dialog>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| `id` | `string` | — | Required for `aria-describedby` association on parent Dialog |
|
|
27
|
+
| `children` | `ReactNode` | — | Description text |
|
|
28
|
+
|
|
29
|
+
Extends `Typography` — all typography props work.
|
|
30
|
+
|
|
31
|
+
## Tokens consumed
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
--font-size-body
|
|
35
|
+
--color-fg-muted /* slightly less prominent than primary content */
|
|
36
|
+
--line-height-body
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Accessibility
|
|
40
|
+
|
|
41
|
+
- Without matching `aria-describedby` on the parent Dialog, the description is just visual — screen readers won't connect it.
|
|
42
|
+
- For dialogs with multiple paragraphs, only one needs the `id` (the most informative). Or wrap multiple paragraphs in a `<div id="d">` and put `id` on that.
|
|
43
|
+
|
|
44
|
+
## Edge cases
|
|
45
|
+
|
|
46
|
+
- **Long description** — wraps. For multi-paragraph, use multiple `<Typography>` children with one outer container holding the `id`.
|
|
47
|
+
- **Markdown links inside** — inline links work; ensure they're keyboard-accessible (focus moves to them inside the trapped dialog).
|
|
48
|
+
- **Korean honorific** — match the title's register. Confirmation: 합쇼체 ("되돌릴 수 없습니다"). Friendly: 해요체 ("되돌릴 수 없어요").
|
|
49
|
+
|
|
50
|
+
## Code example
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<DialogContent>
|
|
54
|
+
<DialogContentText id="leave-desc">
|
|
55
|
+
저장하지 않은 변경사항이 있어요.{' '}
|
|
56
|
+
<Link href="/help/auto-save" target="_blank" onClick={(e) => e.stopPropagation()}>
|
|
57
|
+
자동 저장이 켜져 있나요?
|
|
58
|
+
</Link>
|
|
59
|
+
</DialogContentText>
|
|
60
|
+
</DialogContent>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Don't
|
|
64
|
+
|
|
65
|
+
- Don't omit `id` — defeats `aria-describedby`.
|
|
66
|
+
- Don't use as a generic paragraph — for non-described body text, use `<Typography>`.
|
|
67
|
+
|
|
68
|
+
## References
|
|
69
|
+
|
|
70
|
+
- MUI: [`DialogContentText`](../refs/mui/packages/mui-material/src/DialogContentText/)
|
|
71
|
+
|
|
72
|
+
## Cross-reference
|
|
73
|
+
|
|
74
|
+
- [`component-dialog.md`](component-dialog.md)
|
|
75
|
+
- [`component-dialog-title.md`](component-dialog-title.md)
|
|
76
|
+
- [`component-dialog-content.md`](component-dialog-content.md)
|