@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,105 @@
|
|
|
1
|
+
# `DialogContent` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `DialogContent`. The body region of a `Dialog`. Holds the descriptive text + any form controls between the title and the action row.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Inside every `Dialog` that has body content beyond a single title.
|
|
8
|
+
- For long forms inside a dialog — but reconsider: long forms usually belong on a page, not a modal.
|
|
9
|
+
|
|
10
|
+
## Anatomy
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌────────────────────────────────────────────┐
|
|
14
|
+
│ Title (DialogTitle) │
|
|
15
|
+
├────────────────────────────────────────────┤
|
|
16
|
+
│ Content (DialogContent) │
|
|
17
|
+
│ - DialogContentText (optional) │
|
|
18
|
+
│ - form controls / list / image │
|
|
19
|
+
├────────────────────────────────────────────┤
|
|
20
|
+
│ Actions (DialogActions) │
|
|
21
|
+
└────────────────────────────────────────────┘
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## API
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
<DialogContent dividers>
|
|
28
|
+
<DialogContentText>안내 본문</DialogContentText>
|
|
29
|
+
<TextField label="이메일" fullWidth />
|
|
30
|
+
</DialogContent>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| Prop | Type | Default | Description |
|
|
34
|
+
| --- | --- | --- | --- |
|
|
35
|
+
| `children` | `ReactNode` | — | Body content |
|
|
36
|
+
| `dividers` | `boolean` | `false` | Top + bottom divider lines (use when content scrolls) |
|
|
37
|
+
|
|
38
|
+
## States
|
|
39
|
+
|
|
40
|
+
Non-interactive itself. Children own their states.
|
|
41
|
+
|
|
42
|
+
## Scrolling
|
|
43
|
+
|
|
44
|
+
When content overflows: `DialogContent` becomes the scrollable region (not the whole dialog). Set `dividers` to add visual cues that more content exists above/below the fold.
|
|
45
|
+
|
|
46
|
+
For a long-content dialog: `Dialog` with `scroll="paper"` (default) and `dividers` on `DialogContent`.
|
|
47
|
+
|
|
48
|
+
## Tokens consumed
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
--color-fg-default
|
|
52
|
+
--color-divider
|
|
53
|
+
--space-md
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Accessibility
|
|
57
|
+
|
|
58
|
+
- The first descendant text node should provide context — pair with `DialogContentText` whose `id` matches `aria-describedby` on the parent `Dialog`.
|
|
59
|
+
- Focus management: when the dialog opens, focus should move to the first interactive control inside `DialogContent` (or to the cancel button if there's no input). Cite [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md).
|
|
60
|
+
|
|
61
|
+
## Edge cases
|
|
62
|
+
|
|
63
|
+
- **Form submission via Enter** — wrap content in `<form>`; `Enter` should trigger the primary action button. Don't auto-submit forms with destructive primary actions.
|
|
64
|
+
- **Korean text density** — leave 24-32px horizontal padding (`space-md`) so Hangul doesn't feel cramped. 16px is too tight for Korean.
|
|
65
|
+
- **Image-only content** — provide alt text or describe via `aria-describedby`.
|
|
66
|
+
|
|
67
|
+
## Code example
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
<Dialog open={open} onClose={handleClose} fullWidth maxWidth="sm">
|
|
71
|
+
<DialogTitle id="invite-title">팀원 초대</DialogTitle>
|
|
72
|
+
<DialogContent dividers>
|
|
73
|
+
<DialogContentText id="invite-desc">
|
|
74
|
+
이메일 주소를 입력하면 초대 링크가 발송돼요.
|
|
75
|
+
</DialogContentText>
|
|
76
|
+
<TextField
|
|
77
|
+
autoFocus
|
|
78
|
+
margin="dense"
|
|
79
|
+
label="이메일"
|
|
80
|
+
type="email"
|
|
81
|
+
fullWidth
|
|
82
|
+
/>
|
|
83
|
+
</DialogContent>
|
|
84
|
+
<DialogActions>
|
|
85
|
+
<Button onClick={handleClose}>취소</Button>
|
|
86
|
+
<Button onClick={handleSend} variant="contained">초대 보내기</Button>
|
|
87
|
+
</DialogActions>
|
|
88
|
+
</Dialog>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Don't
|
|
92
|
+
|
|
93
|
+
- Don't pack the dialog with 5+ form fields — split into a multi-step pattern or move to a page.
|
|
94
|
+
- Don't put the primary action *inside* `DialogContent` — it belongs in `DialogActions` for keyboard-traversal predictability.
|
|
95
|
+
|
|
96
|
+
## References
|
|
97
|
+
|
|
98
|
+
- MUI: [`DialogContent.d.ts`](../refs/mui/packages/mui-material/src/DialogContent/DialogContent.d.ts)
|
|
99
|
+
|
|
100
|
+
## Cross-reference
|
|
101
|
+
|
|
102
|
+
- [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
|
|
103
|
+
- [`component-dialog.md`](component-dialog.md)
|
|
104
|
+
- [`component-dialog-title.md`](component-dialog-title.md)
|
|
105
|
+
- [`component-dialog-actions.md`](component-dialog-actions.md)
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# `DialogTitle` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `DialogTitle`. The header row of a `Dialog`. Provides the accessible name for the dialog via the `aria-labelledby` association.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Inside every `Dialog` (modal). The accessibility contract requires every modal to have a heading.
|
|
8
|
+
- For sheet / drawer headers, prefer the equivalent `<SheetTitle>` / `<DrawerHeader>` from those primitives — same role, different visual context.
|
|
9
|
+
|
|
10
|
+
## Anatomy
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌────────────────────────────────────────────┐
|
|
14
|
+
│ Title text [close ×] │
|
|
15
|
+
└────────────────────────────────────────────┘
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The close button is typically rendered separately (often inside the title row via `position: absolute` or as a sibling); MUI's `DialogTitle` doesn't include one by default.
|
|
19
|
+
|
|
20
|
+
## API
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
<Dialog open={open} onClose={handleClose} aria-labelledby="confirm-title">
|
|
24
|
+
<DialogTitle id="confirm-title">정말 삭제할까요?</DialogTitle>
|
|
25
|
+
<DialogContent>...</DialogContent>
|
|
26
|
+
<DialogActions>...</DialogActions>
|
|
27
|
+
</Dialog>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| Prop | Type | Default | Description |
|
|
31
|
+
| --- | --- | --- | --- |
|
|
32
|
+
| `id` | `string` | — | Required for `aria-labelledby` association on the parent `Dialog` |
|
|
33
|
+
| `children` | `ReactNode` | — | Title text; usually short (≤ 60 chars) |
|
|
34
|
+
|
|
35
|
+
`DialogTitle` extends `Typography` so all typography props (`variant`, `align`, `noWrap`, etc.) work.
|
|
36
|
+
|
|
37
|
+
## States
|
|
38
|
+
|
|
39
|
+
`DialogTitle` is non-interactive. Visual is constant.
|
|
40
|
+
|
|
41
|
+
## Tokens consumed
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
--color-fg-default
|
|
45
|
+
--font-size-xl /* default; h2 equivalent */
|
|
46
|
+
--font-weight-semibold
|
|
47
|
+
--space-md /* horizontal padding */
|
|
48
|
+
--space-md-y /* vertical padding */
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Accessibility
|
|
52
|
+
|
|
53
|
+
- Semantic element: `<h2>` (default; via `Typography component="h2"`).
|
|
54
|
+
- The `id` MUST match the parent `Dialog`'s `aria-labelledby`.
|
|
55
|
+
- If the dialog also needs a description, use `<DialogContentText>` with `id` matching `aria-describedby`.
|
|
56
|
+
- For dialogs without a visible title (rare; e.g., image lightbox), provide an `aria-label` directly on the `Dialog` instead of `DialogTitle`.
|
|
57
|
+
|
|
58
|
+
## Edge cases
|
|
59
|
+
|
|
60
|
+
- **Long titles** — wrap to 2 lines max; truncating breaks comprehension. Prefer rephrasing.
|
|
61
|
+
- **Korean honorific level** — match the dialog's purpose. Confirmation: 합쇼체 ("정말 삭제하시겠습니까?"). Friendly action: 해요체 ("삭제할까요?"). Cite [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md).
|
|
62
|
+
- **No title with destructive action** — *don't*. Even simple confirms need a title for screen readers and reading order.
|
|
63
|
+
|
|
64
|
+
## Code example
|
|
65
|
+
|
|
66
|
+
```tsx
|
|
67
|
+
<Dialog
|
|
68
|
+
open={open}
|
|
69
|
+
onClose={handleClose}
|
|
70
|
+
aria-labelledby="leave-title"
|
|
71
|
+
aria-describedby="leave-desc"
|
|
72
|
+
>
|
|
73
|
+
<DialogTitle id="leave-title">저장하지 않은 변경사항이 있어요</DialogTitle>
|
|
74
|
+
<DialogContent>
|
|
75
|
+
<DialogContentText id="leave-desc">
|
|
76
|
+
페이지를 떠나면 변경사항이 사라져요. 계속할까요?
|
|
77
|
+
</DialogContentText>
|
|
78
|
+
</DialogContent>
|
|
79
|
+
<DialogActions>
|
|
80
|
+
<Button onClick={handleClose}>머무르기</Button>
|
|
81
|
+
<Button color="error" onClick={handleLeave} autoFocus>
|
|
82
|
+
나가기
|
|
83
|
+
</Button>
|
|
84
|
+
</DialogActions>
|
|
85
|
+
</Dialog>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Don't
|
|
89
|
+
|
|
90
|
+
- Don't omit `id` — without it, the dialog has no accessible name.
|
|
91
|
+
- Don't put a close button as `children` — render it as a sibling or via `position: absolute` so the heading text is the `<h2>` content.
|
|
92
|
+
- Don't write title as a question if the body answers — match cause & effect (title states the situation; body provides detail).
|
|
93
|
+
|
|
94
|
+
## References
|
|
95
|
+
|
|
96
|
+
- MUI: [`DialogTitle.d.ts`](../refs/mui/packages/mui-material/src/DialogTitle/DialogTitle.d.ts)
|
|
97
|
+
|
|
98
|
+
## Cross-reference
|
|
99
|
+
|
|
100
|
+
- [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
|
|
101
|
+
- [`component-dialog.md`](component-dialog.md)
|
|
102
|
+
- [`component-dialog-content.md`](component-dialog-content.md)
|
|
103
|
+
- [`component-dialog-actions.md`](component-dialog-actions.md)
|
|
104
|
+
- [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md)
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# `Dialog` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from Ant Design `Modal` + MUI `Dialog`. The flagship modal primitive — focus-trapped, esc-closeable, scroll-locked overlay containing structured content (title, body, actions). Used for confirmations, focused tasks, and content too important to dismiss inline.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Confirmations with destructive consequences ("Delete?", "Leave without saving?").
|
|
8
|
+
- Focused short tasks that pull the user out of context (invite, schedule, single-step config).
|
|
9
|
+
- Critical disclosures the user must acknowledge.
|
|
10
|
+
|
|
11
|
+
## When NOT to use
|
|
12
|
+
|
|
13
|
+
- Long forms (5+ fields) → use a dedicated page.
|
|
14
|
+
- Optional info → use a Tooltip / Popover / Sheet.
|
|
15
|
+
- Errors that don't block flow → use Toast / Snackbar.
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌─[scrim]─────────────────────────────────────┐
|
|
21
|
+
│ │
|
|
22
|
+
│ ┌──────────────────────────────────┐ │
|
|
23
|
+
│ │ DialogTitle [✕] │ │
|
|
24
|
+
│ ├──────────────────────────────────┤ │
|
|
25
|
+
│ │ DialogContent │ │
|
|
26
|
+
│ │ DialogContentText (optional) │ │
|
|
27
|
+
│ │ form fields / list / image │ │
|
|
28
|
+
│ ├──────────────────────────────────┤ │
|
|
29
|
+
│ │ [Cancel] [Primary] │ │
|
|
30
|
+
│ └──────────────────────────────────┘ │
|
|
31
|
+
│ │
|
|
32
|
+
└─────────────────────────────────────────────┘
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## API
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
<Dialog
|
|
39
|
+
open={open}
|
|
40
|
+
onClose={handleClose}
|
|
41
|
+
fullWidth
|
|
42
|
+
maxWidth="sm"
|
|
43
|
+
aria-labelledby="dialog-title"
|
|
44
|
+
aria-describedby="dialog-desc"
|
|
45
|
+
>
|
|
46
|
+
<DialogTitle id="dialog-title">팀원 초대</DialogTitle>
|
|
47
|
+
<DialogContent>
|
|
48
|
+
<DialogContentText id="dialog-desc">
|
|
49
|
+
이메일로 초대 링크를 보내요.
|
|
50
|
+
</DialogContentText>
|
|
51
|
+
<TextField autoFocus fullWidth label="이메일" />
|
|
52
|
+
</DialogContent>
|
|
53
|
+
<DialogActions>
|
|
54
|
+
<Button onClick={handleClose}>취소</Button>
|
|
55
|
+
<Button onClick={handleSend} variant="contained">보내기</Button>
|
|
56
|
+
</DialogActions>
|
|
57
|
+
</Dialog>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
| Prop | Type | Default | Description |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| `open` | `boolean` | required | Controlled open state |
|
|
63
|
+
| `onClose` | `(e, reason) => void` | — | Called on backdrop click / Esc / close button |
|
|
64
|
+
| `fullWidth` | `boolean` | `false` | Stretch to `maxWidth` |
|
|
65
|
+
| `maxWidth` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| false` | `'sm'` | Width cap |
|
|
66
|
+
| `fullScreen` | `boolean` | `false` | Full viewport (mobile) |
|
|
67
|
+
| `scroll` | `'paper' \| 'body'` | `'paper'` | `paper`: content scrolls inside; `body`: page scrolls |
|
|
68
|
+
| `disableEscapeKeyDown` | `boolean` | `false` | Block Esc — use sparingly |
|
|
69
|
+
| `aria-labelledby` | `string` | — | Required; matches DialogTitle's `id` |
|
|
70
|
+
| `aria-describedby` | `string` | — | Required when there's body description; matches DialogContentText's `id` |
|
|
71
|
+
| `TransitionComponent` | `Component` | `Fade` | Custom enter/exit transition |
|
|
72
|
+
| `keepMounted` | `boolean` | `false` | Keep DOM after close (state preservation) |
|
|
73
|
+
|
|
74
|
+
## States
|
|
75
|
+
|
|
76
|
+
| State | Visual |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| Closed | Not in DOM (or `display: none` if `keepMounted`) |
|
|
79
|
+
| Opening | Scrim fades in (200ms); dialog scales/fades from 90% to 100% |
|
|
80
|
+
| Open | Focus trapped inside; scroll locked on body; backdrop receives Esc |
|
|
81
|
+
| Closing | Reverse of opening; restore focus to opener |
|
|
82
|
+
|
|
83
|
+
## Tokens consumed
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
--scrim-bg /* black/40 light, black/60 dark */
|
|
87
|
+
--dialog-bg /* surface elevated */
|
|
88
|
+
--dialog-radius
|
|
89
|
+
--dialog-shadow /* elevation-md */
|
|
90
|
+
--dialog-max-width-sm /* 444 */
|
|
91
|
+
--dialog-max-width-md /* 600 */
|
|
92
|
+
--dialog-max-width-lg /* 900 */
|
|
93
|
+
--space-md /* internal padding */
|
|
94
|
+
--motion-duration-200
|
|
95
|
+
--motion-easing-out
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Accessibility
|
|
99
|
+
|
|
100
|
+
- Focus trap: Tab cycles within dialog only. First focus goes to first interactive element (or `autoFocus` button).
|
|
101
|
+
- Escape closes (unless `disableEscapeKeyDown`).
|
|
102
|
+
- Scroll lock: body scroll disabled while dialog open.
|
|
103
|
+
- `role="dialog"` + `aria-modal="true"` (MUI sets these).
|
|
104
|
+
- `aria-labelledby` + `aria-describedby` MUST be set; otherwise screen readers announce just "dialog".
|
|
105
|
+
- On close: focus returns to the element that opened the dialog.
|
|
106
|
+
- Cite [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md).
|
|
107
|
+
|
|
108
|
+
## Edge cases
|
|
109
|
+
|
|
110
|
+
- **Backdrop click ambiguity** — `onClose` fires with `reason='backdropClick'`. For destructive flows (unsaved changes), confirm before actually closing.
|
|
111
|
+
- **Nested dialogs** — possible but discouraged. If unavoidable: focus trap moves to the inner one, restores correctly on close.
|
|
112
|
+
- **Mobile fullscreen** — set `fullScreen={isMobile}` (e.g., `useMediaQuery('(max-width:600px)')`) so dialogs fill the small viewport instead of cramping.
|
|
113
|
+
- **Korean honorific** — title 합쇼체 for confirmations ("삭제하시겠습니까?"); 해요체 for friendly modals ("초대 보내볼까요?"). Cite [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md).
|
|
114
|
+
- **Long content** — set `scroll="paper"` (default) and pair `dividers` on `DialogContent` to signal scrollability.
|
|
115
|
+
|
|
116
|
+
## Code example
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
function DeleteConfirmDialog({ open, onClose, onConfirm, isPending }) {
|
|
120
|
+
return (
|
|
121
|
+
<Dialog
|
|
122
|
+
open={open}
|
|
123
|
+
onClose={(_, reason) => {
|
|
124
|
+
if (reason === 'backdropClick' && isPending) return; // block during pending
|
|
125
|
+
onClose();
|
|
126
|
+
}}
|
|
127
|
+
aria-labelledby="del-title"
|
|
128
|
+
aria-describedby="del-desc"
|
|
129
|
+
maxWidth="sm"
|
|
130
|
+
fullWidth
|
|
131
|
+
>
|
|
132
|
+
<DialogTitle id="del-title">정말 삭제할까요?</DialogTitle>
|
|
133
|
+
<DialogContent>
|
|
134
|
+
<DialogContentText id="del-desc">
|
|
135
|
+
이 작업은 되돌릴 수 없어요.
|
|
136
|
+
</DialogContentText>
|
|
137
|
+
</DialogContent>
|
|
138
|
+
<DialogActions>
|
|
139
|
+
<Button onClick={onClose}>취소</Button>
|
|
140
|
+
<LoadingButton
|
|
141
|
+
onClick={onConfirm}
|
|
142
|
+
loading={isPending}
|
|
143
|
+
color="error"
|
|
144
|
+
variant="contained"
|
|
145
|
+
>
|
|
146
|
+
삭제
|
|
147
|
+
</LoadingButton>
|
|
148
|
+
</DialogActions>
|
|
149
|
+
</Dialog>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Don't
|
|
155
|
+
|
|
156
|
+
- Don't disable Esc unless the flow truly requires explicit confirmation.
|
|
157
|
+
- Don't put 4+ buttons in DialogActions — overflow into a menu or split into steps.
|
|
158
|
+
- Don't open a dialog from a dialog (nested) without strong reason.
|
|
159
|
+
- Don't make the dialog dismissable during a destructive operation that's actually running.
|
|
160
|
+
- Don't omit `aria-labelledby` — the dialog has no accessible name without it.
|
|
161
|
+
|
|
162
|
+
## References
|
|
163
|
+
|
|
164
|
+
- Ant Design: [`Modal`](../refs/ant-design/components/modal/) — class API, mask
|
|
165
|
+
- MUI: [`Dialog`](../refs/mui/packages/mui-material/src/Dialog/) — flagship reference
|
|
166
|
+
|
|
167
|
+
## Cross-reference
|
|
168
|
+
|
|
169
|
+
- [`knowledge/components/INDEX.md`](../knowledge/components/INDEX.md)
|
|
170
|
+
- [`component-dialog-title.md`](component-dialog-title.md)
|
|
171
|
+
- [`component-dialog-content.md`](component-dialog-content.md)
|
|
172
|
+
- [`component-dialog-actions.md`](component-dialog-actions.md)
|
|
173
|
+
- [`component-dialog-content-text.md`](component-dialog-content-text.md)
|
|
174
|
+
- [`component-modal.md`](component-modal.md) — Ant-flavor modal
|
|
175
|
+
- [`knowledge/patterns/empty-states.md`](../knowledge/patterns/empty-states.md) — confirmation patterns
|
|
176
|
+
- [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md)
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# `Divider` (Separator) — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Divider`, MUI `Divider`, shadcn-ui `separator`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A visual line that separates content. Smaller than headings or whitespace gaps; lighter weight than borders.
|
|
8
|
+
|
|
9
|
+
Use sparingly. **Whitespace is usually a better separator than a line.** A divider says "these are related but distinct"; whitespace says "these are unrelated, period."
|
|
10
|
+
|
|
11
|
+
## When to use
|
|
12
|
+
|
|
13
|
+
- Inside a card or list to separate items of similar visual weight.
|
|
14
|
+
- Between sections in a settings page (with section heading above).
|
|
15
|
+
- Between toolbar items.
|
|
16
|
+
- Inside menus to group related actions.
|
|
17
|
+
|
|
18
|
+
## When NOT to use
|
|
19
|
+
|
|
20
|
+
- Between paragraphs in body content (use whitespace + paragraph spacing).
|
|
21
|
+
- Around a card or section that already has a border or background contrast.
|
|
22
|
+
- As decoration. Dividers should mean something.
|
|
23
|
+
|
|
24
|
+
## Anatomy
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Horizontal: Vertical:
|
|
28
|
+
───────────────────────── │
|
|
29
|
+
│
|
|
30
|
+
With label: With margin in toolbar:
|
|
31
|
+
──── Section title ──── Item 1 │ Item 2 │ Item 3
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## API
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<Divider /> {/* default: horizontal hairline */}
|
|
38
|
+
<Divider orientation="vertical" />
|
|
39
|
+
<Divider>Section</Divider> {/* with label */}
|
|
40
|
+
<Divider variant="dashed" />
|
|
41
|
+
<Divider spacing="lg" />
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
| Prop | Type | Default | Description |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | |
|
|
47
|
+
| `variant` | `"solid" \| "dashed" \| "dotted"` | `"solid"` | Line style |
|
|
48
|
+
| `children` | `ReactNode` | — | Optional label inline (horizontal only) |
|
|
49
|
+
| `align` | `"start" \| "center" \| "end"` | `"center"` | Position of label along the line |
|
|
50
|
+
| `spacing` | `"sm" \| "md" \| "lg"` | `"md"` | Vertical/horizontal margin around the divider |
|
|
51
|
+
| `inset` | `number \| string` | `0` | Indent from the start (e.g., to skip an icon column in a list) |
|
|
52
|
+
| `decorative` | `boolean` | `true` | If true, `aria-hidden`. If false, `role="separator"`. |
|
|
53
|
+
|
|
54
|
+
## Spacing guidance
|
|
55
|
+
|
|
56
|
+
| Spacing | Margin |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| `sm` | 8px above + below |
|
|
59
|
+
| `md` (default) | 16px above + below |
|
|
60
|
+
| `lg` | 24px above + below |
|
|
61
|
+
|
|
62
|
+
For dividers between items in a tight list (transactions, chats): use a 1px bottom border on each row instead of a separate divider element. It's the same visual but cleaner DOM.
|
|
63
|
+
|
|
64
|
+
## Inset
|
|
65
|
+
|
|
66
|
+
For a list with leading icons / avatars:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
[icon] Name 1
|
|
70
|
+
─────── (inset 48px to skip the 40px icon + 8px gap)
|
|
71
|
+
[icon] Name 2
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The inset divider doesn't extend over the icon column — visually unifies the icons.
|
|
75
|
+
|
|
76
|
+
## States
|
|
77
|
+
|
|
78
|
+
A divider doesn't have states. Static.
|
|
79
|
+
|
|
80
|
+
## Tokens consumed
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
--color-divider (preferred — usually lighter than border)
|
|
84
|
+
OR
|
|
85
|
+
--color-border-default (when divider should match other borders)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
For dark mode: same token; the value is recomputed in dark.
|
|
89
|
+
|
|
90
|
+
The divider color is typically:
|
|
91
|
+
- 1 step lighter than `--color-border-default`
|
|
92
|
+
- Often `rgba(0, 0, 0, 0.06)` or `rgba(255, 255, 255, 0.08)` depending on mode
|
|
93
|
+
|
|
94
|
+
## Sizes / thickness
|
|
95
|
+
|
|
96
|
+
| Thickness | Use |
|
|
97
|
+
| --- | --- |
|
|
98
|
+
| 1px (default) | Universal |
|
|
99
|
+
| 2px | Heavier section breaks |
|
|
100
|
+
| 0.5px (Retina-only) | Very subtle (Apple-style); pairs with `.5px` `transform: scaleY(0.5)` hack on non-Retina |
|
|
101
|
+
|
|
102
|
+
For most product UIs: 1px. Going thicker without intent reads as a heavy mistake.
|
|
103
|
+
|
|
104
|
+
## Accessibility
|
|
105
|
+
|
|
106
|
+
- **Decorative dividers** (the default): `aria-hidden="true"` so screen readers skip.
|
|
107
|
+
- **Semantic dividers** (rare — when the line genuinely separates regions of meaning): `role="separator"` with `aria-orientation`. Use `<hr>` for full-width semantic horizontal dividers.
|
|
108
|
+
|
|
109
|
+
```html
|
|
110
|
+
<!-- Decorative (default) -->
|
|
111
|
+
<div className="divider" aria-hidden="true"></div>
|
|
112
|
+
|
|
113
|
+
<!-- Semantic -->
|
|
114
|
+
<hr role="separator" aria-orientation="horizontal" />
|
|
115
|
+
<div role="separator" aria-orientation="vertical"></div>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Most dividers in product UIs should be `aria-hidden`. The structure is conveyed by surrounding semantic elements (headings, regions).
|
|
119
|
+
|
|
120
|
+
## Code examples
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
// Between sections in a settings page
|
|
124
|
+
<SettingsSection title="알림">
|
|
125
|
+
...
|
|
126
|
+
</SettingsSection>
|
|
127
|
+
<Divider spacing="lg" />
|
|
128
|
+
<SettingsSection title="결제">
|
|
129
|
+
...
|
|
130
|
+
</SettingsSection>
|
|
131
|
+
|
|
132
|
+
// With label
|
|
133
|
+
<Divider>또는</Divider> {/* "Or" between social login and email login */}
|
|
134
|
+
<Button>이메일로 가입</Button>
|
|
135
|
+
|
|
136
|
+
// Vertical in a toolbar
|
|
137
|
+
<Toolbar>
|
|
138
|
+
<Button>저장</Button>
|
|
139
|
+
<Divider orientation="vertical" />
|
|
140
|
+
<Button>되돌리기</Button>
|
|
141
|
+
<Divider orientation="vertical" />
|
|
142
|
+
<Button>다음 단계</Button>
|
|
143
|
+
</Toolbar>
|
|
144
|
+
|
|
145
|
+
// Inset in a list with avatars
|
|
146
|
+
<List>
|
|
147
|
+
{users.map(u => (
|
|
148
|
+
<ListItem key={u.id}>
|
|
149
|
+
<Avatar src={u.photoUrl} />
|
|
150
|
+
<span>{u.name}</span>
|
|
151
|
+
</ListItem>
|
|
152
|
+
))}
|
|
153
|
+
</List>
|
|
154
|
+
{/* Each ListItem has its own bottom border with inset 48px — preferred over <Divider /> elements */}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Edge cases
|
|
158
|
+
|
|
159
|
+
- **Divider at the end of a list**: don't render. The last item's bottom is the natural end.
|
|
160
|
+
- **Divider immediately after a heading**: redundant. The heading's bottom margin is the divider.
|
|
161
|
+
- **Vertical divider that needs to match the parent's height**: stretch with `align-self: stretch` in flex parent.
|
|
162
|
+
- **Dashed/dotted on small spans**: doesn't render cleanly under 8px; use solid for short dividers.
|
|
163
|
+
|
|
164
|
+
## Don't
|
|
165
|
+
|
|
166
|
+
- Don't put a divider inside another divider (e.g., divider above and below the same divider).
|
|
167
|
+
- Don't use heavy dividers (4px+) — they read as accidental.
|
|
168
|
+
- Don't color a divider the same as text. Subtle is the point.
|
|
169
|
+
- Don't use a divider where a heading would be clearer.
|
|
170
|
+
- Don't use vertical dividers for vertical lists. Use horizontal.
|
|
171
|
+
- Don't combine inset divider with full-width divider in the same list — pick one.
|
|
172
|
+
|
|
173
|
+
## References
|
|
174
|
+
|
|
175
|
+
- Ant Design: [`refs/ant-design/components/divider/`](../refs/ant-design/components/divider/) — `Divider` with `type="horizontal" | "vertical"`, `dashed`, optional inline text. Mature.
|
|
176
|
+
- MUI: [`refs/mui/packages/mui-material/src/Divider/`](../refs/mui/packages/mui-material/src/Divider/) — `Divider` with `orientation`, `variant="fullWidth" | "inset" | "middle"`, `textAlign`. Most variants.
|
|
177
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/separator.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/separator.tsx) — Radix Separator. Minimal primitive. `decorative` prop drives `aria-hidden` vs `role="separator"`.
|
|
178
|
+
|
|
179
|
+
## Cross-reference
|
|
180
|
+
|
|
181
|
+
- [`knowledge/layout/spacing-and-grid.md`](../knowledge/layout/spacing-and-grid.md) — when whitespace is the better separator
|
|
182
|
+
- [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md) — list-row dividers via per-item border
|