@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,102 @@
|
|
|
1
|
+
# `Icon` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `Icon`/`SvgIcon` and Ant Design `Icon`. The base primitive for rendering icons. Pairs with [`knowledge/icons/curated-sets.md`](../knowledge/icons/curated-sets.md) for icon-set selection.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Inline icons in buttons, links, list items.
|
|
8
|
+
- Decorative or status indicators.
|
|
9
|
+
- As building blocks for `IconButton`, `Avatar`, `Toast`.
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<Icon as={CheckIcon} />
|
|
15
|
+
<Icon size="md" color="brand" />
|
|
16
|
+
<Icon as={WarningIcon} aria-label="Warning" />
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Description |
|
|
20
|
+
| --- | --- | --- | --- |
|
|
21
|
+
| `as` | `ComponentType` | required | The actual icon SVG component (Phosphor, Lucide, etc) |
|
|
22
|
+
| `size` | `"xs" \| "sm" \| "md" \| "lg" \| "xl" \| number` | `"md"` | Pixel size |
|
|
23
|
+
| `color` | `"current" \| "brand" \| "muted" \| "success" \| "warning" \| "error"` | `"current"` | Color via token |
|
|
24
|
+
| `weight` | `"thin" \| "light" \| "regular" \| "bold" \| "fill"` | `"regular"` | Phosphor-style weight (if icon set supports) |
|
|
25
|
+
| `aria-label` | `string` | — | Required for meaningful icons |
|
|
26
|
+
| `aria-hidden` | `boolean` | auto | True for decorative |
|
|
27
|
+
|
|
28
|
+
## Sizes
|
|
29
|
+
|
|
30
|
+
| Size | px |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| `xs` | 12 |
|
|
33
|
+
| `sm` | 16 |
|
|
34
|
+
| `md` (default) | 20-24 |
|
|
35
|
+
| `lg` | 32 |
|
|
36
|
+
| `xl` | 48 |
|
|
37
|
+
|
|
38
|
+
## Color via `currentColor`
|
|
39
|
+
|
|
40
|
+
```svg
|
|
41
|
+
<svg viewBox="0 0 24 24" fill="currentColor">
|
|
42
|
+
<path d="..." />
|
|
43
|
+
</svg>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The icon SVG should use `fill="currentColor"` (or `stroke="currentColor"` for stroke-style). Icon component sets the parent `color` token; SVG inherits.
|
|
47
|
+
|
|
48
|
+
```css
|
|
49
|
+
.icon[data-color="brand"] { color: var(--color-brand-default); }
|
|
50
|
+
.icon[data-color="muted"] { color: var(--color-fg-muted); }
|
|
51
|
+
.icon[data-color="success"] { color: var(--color-success-default); }
|
|
52
|
+
.icon[data-color="warning"] { color: var(--color-warning-default); }
|
|
53
|
+
.icon[data-color="error"] { color: var(--color-error-default); }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Accessibility
|
|
57
|
+
|
|
58
|
+
| Use | Pattern |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| Decorative (label-redundant) | `aria-hidden="true"` |
|
|
61
|
+
| Meaningful (no adjacent label) | `<span role="img" aria-label="...">` wrapper |
|
|
62
|
+
| Inside button text label | `aria-hidden="true"` (button label conveys meaning) |
|
|
63
|
+
| Inside icon-only button | label on the button, NOT the icon |
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
{/* Decorative inside text-labeled button */}
|
|
67
|
+
<button>
|
|
68
|
+
<Icon as={SaveIcon} aria-hidden /> 저장
|
|
69
|
+
</button>
|
|
70
|
+
|
|
71
|
+
{/* Meaningful icon-only button */}
|
|
72
|
+
<button aria-label="저장">
|
|
73
|
+
<Icon as={SaveIcon} aria-hidden />
|
|
74
|
+
</button>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Icon-set conventions
|
|
78
|
+
|
|
79
|
+
- Pick **one set** per project (Phosphor, Lucide, Heroicons, Material Icons).
|
|
80
|
+
- Don't mix stroke and fill icon sets — visual inconsistency.
|
|
81
|
+
- For Phosphor: weights (thin / light / regular / bold / fill) accepted.
|
|
82
|
+
- For Lucide / Heroicons: stroke-only; uniform line weight.
|
|
83
|
+
|
|
84
|
+
See [`knowledge/icons/curated-sets.md`](../knowledge/icons/curated-sets.md).
|
|
85
|
+
|
|
86
|
+
## Don't
|
|
87
|
+
|
|
88
|
+
- Don't use color alone to convey state. Pair with adjacent text or shape.
|
|
89
|
+
- Don't render icon SVG inline without `aria-hidden` if it's decorative.
|
|
90
|
+
- Don't use `<i className="icon-...">` icon-font pattern. Bad a11y, no theming.
|
|
91
|
+
- Don't render at non-multiple-of-2 sizes (15px). Stays sharp on retina at 16/20/24.
|
|
92
|
+
|
|
93
|
+
## References
|
|
94
|
+
|
|
95
|
+
- MUI: [`SvgIcon`](../refs/mui/packages/mui-material/src/SvgIcon)
|
|
96
|
+
- Phosphor Icons: 1200+ icons, 5 weights
|
|
97
|
+
- Lucide: stroke-only minimalist set
|
|
98
|
+
|
|
99
|
+
## Cross-reference
|
|
100
|
+
|
|
101
|
+
- [`examples/component-icon-button.md`](component-icon-button.md)
|
|
102
|
+
- [`knowledge/icons/curated-sets.md`](../knowledge/icons/curated-sets.md)
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
# `Illustration` (custom — themeable SVG illustration display) — spec
|
|
3
|
+
|
|
4
|
+
> Generic wrapper for displaying a system illustration with theming, sizing, accessibility, and reduced-motion support. Used directly when `EmptyState` / `Result` / `OnboardingStep` aren't the right fit. Pairs with [`knowledge/illustration/svg-optimization.md`](../knowledge/illustration/svg-optimization.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
When you want to drop a system illustration into a screen — feature explainer, onboarding card, marketing surface — without the empty-state layout. `Illustration` provides:
|
|
9
|
+
|
|
10
|
+
1. **Registry-backed name** — typesafe lookup from the system's illustration set.
|
|
11
|
+
2. **Theming via `currentColor` + CSS variables**.
|
|
12
|
+
3. **Responsive sizing** — width or height; the other auto-scales via aspect ratio.
|
|
13
|
+
4. **Accessibility** — decorative by default; meaningful on opt-in.
|
|
14
|
+
5. **Lottie escape hatch** — if the illustration is animated, delegate to `LottiePlayer`.
|
|
15
|
+
|
|
16
|
+
## Anatomy
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
┌──────────────────┐
|
|
20
|
+
│ │
|
|
21
|
+
│ [SVG render] │ ← from registry
|
|
22
|
+
│ │
|
|
23
|
+
└──────────────────┘
|
|
24
|
+
OR
|
|
25
|
+
┌──────────────────┐
|
|
26
|
+
│ │
|
|
27
|
+
│ [Lottie render] │ ← when name maps to a Lottie source
|
|
28
|
+
│ │
|
|
29
|
+
└──────────────────┘
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## API
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
<Illustration name="onboarding-welcome" size="lg" />
|
|
36
|
+
|
|
37
|
+
<Illustration
|
|
38
|
+
name="payment-success"
|
|
39
|
+
size={200}
|
|
40
|
+
label="결제가 완료되었습니다" // makes meaningful (not decorative)
|
|
41
|
+
/>
|
|
42
|
+
|
|
43
|
+
const heroMoneyFlowSize = { desktop: 480, mobile: 240 };
|
|
44
|
+
<Illustration name="hero-money-flow" size={heroMoneyFlowSize} />
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
| Prop | Type | Default | Description |
|
|
48
|
+
| --- | --- | --- | --- |
|
|
49
|
+
| `name` | `IllustrationName` | — | Registry key. Required. Typesafe via TS union. |
|
|
50
|
+
| `size` | `"sm" \| "md" \| "lg" \| "xl" \| number \| { desktop: number; mobile: number }` | `"md"` | Display size in px. Object form for responsive. |
|
|
51
|
+
| `label` | `string` | `undefined` | If set, illustration is meaningful (`role="img"` + `aria-label`). Default: decorative (`aria-hidden`). |
|
|
52
|
+
| `tone` | `"brand" \| "neutral" \| "success" \| "warning" \| "danger"` | `"brand"` | Color theme via CSS variable cascade |
|
|
53
|
+
| `as` | `"div" \| "span" \| "figure"` | `"div"` | Wrapper element |
|
|
54
|
+
| `className` | `string` | — | Additional classes |
|
|
55
|
+
|
|
56
|
+
## Sizes
|
|
57
|
+
|
|
58
|
+
| token | px |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| `sm` | 80 |
|
|
61
|
+
| `md` (default) | 120 |
|
|
62
|
+
| `lg` | 200 |
|
|
63
|
+
| `xl` | 320 |
|
|
64
|
+
|
|
65
|
+
For responsive: pass `{ desktop, mobile }` object. The component renders both via CSS `clamp()`:
|
|
66
|
+
|
|
67
|
+
```css
|
|
68
|
+
.illustration[data-size-responsive] {
|
|
69
|
+
width: clamp(var(--mobile-size), 30vw, var(--desktop-size));
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Tones
|
|
74
|
+
|
|
75
|
+
`tone` maps to a CSS variable setting the illustration's `currentColor`:
|
|
76
|
+
|
|
77
|
+
```css
|
|
78
|
+
.illustration[data-tone="brand"] { color: var(--color-brand-default); }
|
|
79
|
+
.illustration[data-tone="neutral"] { color: var(--color-fg-muted); }
|
|
80
|
+
.illustration[data-tone="success"] { color: var(--color-success-default); }
|
|
81
|
+
.illustration[data-tone="warning"] { color: var(--color-warning-default); }
|
|
82
|
+
.illustration[data-tone="danger"] { color: var(--color-error-default); }
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The illustration's SVG must use `currentColor` for the themable element. Multi-color illustrations also use CSS variables (`var(--color-bg-illo)`).
|
|
86
|
+
|
|
87
|
+
Contrast contract: each tone token must clear at least **3:1** against `--color-bg-default` for non-text graphic strokes/fills, and any nearby explanatory text must keep the normal **4.5:1** body-text contrast target from [`knowledge/a11y/contrast.md`](../knowledge/a11y/contrast.md).
|
|
88
|
+
|
|
89
|
+
## Usage context
|
|
90
|
+
|
|
91
|
+
Use `Illustration` as a reusable visual-language primitive when the layout is owned by another surface: onboarding panels, fintech confirmation screens, feature explainers, or Korean payment-success moments where the surrounding copy already carries the meaning. Use `label` only when the image itself adds information not repeated in text; otherwise keep it decorative so screen-reader output stays concise.
|
|
92
|
+
|
|
93
|
+
## Registry
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
// illustrations/registry.ts
|
|
97
|
+
import { OnboardingWelcome } from "./svg/OnboardingWelcome";
|
|
98
|
+
import { PaymentSuccess } from "./svg/PaymentSuccess";
|
|
99
|
+
import { HeroMoneyFlow } from "./svg/HeroMoneyFlow";
|
|
100
|
+
|
|
101
|
+
export const illustrationRegistry = {
|
|
102
|
+
// Spot illustrations
|
|
103
|
+
"onboarding-welcome": { type: "svg", component: OnboardingWelcome },
|
|
104
|
+
"payment-success": { type: "svg", component: PaymentSuccess },
|
|
105
|
+
"filter-empty": { type: "svg", component: FilterEmpty },
|
|
106
|
+
|
|
107
|
+
// Hero illustrations
|
|
108
|
+
"hero-money-flow": { type: "svg", component: HeroMoneyFlow },
|
|
109
|
+
"hero-onboarding": { type: "svg", component: HeroOnboarding },
|
|
110
|
+
|
|
111
|
+
// Animated (Lottie)
|
|
112
|
+
"celebration": { type: "lottie", src: "/illustrations/celebration.json", poster: "/illustrations/celebration.png" },
|
|
113
|
+
} as const;
|
|
114
|
+
|
|
115
|
+
export type IllustrationName = keyof typeof illustrationRegistry;
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The registry is the **only** place new illustrations get added. Engineers can't ship an illustration not in the registry — enforces governance.
|
|
119
|
+
|
|
120
|
+
## States
|
|
121
|
+
|
|
122
|
+
| State | Visual |
|
|
123
|
+
| --- | --- |
|
|
124
|
+
| Default (decorative) | Renders illustration with brand tone |
|
|
125
|
+
| Meaningful (label set) | Same render; adds `role="img"` and `aria-label` |
|
|
126
|
+
| Reduced motion + animated illustration | Static frame from poster |
|
|
127
|
+
| Loading (Lottie source) | Poster while JSON streams; cross-fade when ready |
|
|
128
|
+
| Error (illustration name not in registry) | Dev: throw. Prod: fallback to `generic` illustration. |
|
|
129
|
+
|
|
130
|
+
## Tokens consumed
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
--color-brand-default
|
|
134
|
+
--color-fg-muted
|
|
135
|
+
--color-success-default
|
|
136
|
+
--color-warning-default
|
|
137
|
+
--color-error-default
|
|
138
|
+
--color-bg-illo (multi-color illustrations)
|
|
139
|
+
--motion-fast (poster → animation cross-fade)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Accessibility
|
|
143
|
+
|
|
144
|
+
### Default — decorative
|
|
145
|
+
|
|
146
|
+
```html
|
|
147
|
+
<div class="illustration" aria-hidden="true">
|
|
148
|
+
<svg ...>...</svg>
|
|
149
|
+
</div>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Screen readers skip. Used when surrounding text already explains.
|
|
153
|
+
|
|
154
|
+
### Meaningful — label set
|
|
155
|
+
|
|
156
|
+
```html
|
|
157
|
+
<div class="illustration" role="img" aria-label="결제가 완료되었습니다">
|
|
158
|
+
<svg aria-hidden="true">...</svg>
|
|
159
|
+
</div>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
The wrapper carries the label. Inner SVG stays `aria-hidden` to avoid double-announcement.
|
|
163
|
+
|
|
164
|
+
### Animated illustrations
|
|
165
|
+
|
|
166
|
+
If `name` maps to a Lottie source, delegates to `LottiePlayer` which handles `prefers-reduced-motion`. See [`examples/component-lottie-player.md`](component-lottie-player.md).
|
|
167
|
+
|
|
168
|
+
## Implementation
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
import { illustrationRegistry, type IllustrationName } from "./registry";
|
|
172
|
+
import { LottiePlayer } from "./LottiePlayer";
|
|
173
|
+
|
|
174
|
+
interface Props {
|
|
175
|
+
name: IllustrationName;
|
|
176
|
+
size?: "sm" | "md" | "lg" | "xl" | number | { desktop: number; mobile: number };
|
|
177
|
+
label?: string;
|
|
178
|
+
tone?: "brand" | "neutral" | "success" | "warning" | "danger";
|
|
179
|
+
as?: "div" | "span" | "figure";
|
|
180
|
+
className?: string;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const SIZE_MAP = { sm: 80, md: 120, lg: 200, xl: 320 };
|
|
184
|
+
|
|
185
|
+
export function Illustration({
|
|
186
|
+
name,
|
|
187
|
+
size = "md",
|
|
188
|
+
label,
|
|
189
|
+
tone = "brand",
|
|
190
|
+
as: Tag = "div",
|
|
191
|
+
className,
|
|
192
|
+
}: Props) {
|
|
193
|
+
const entry = illustrationRegistry[name];
|
|
194
|
+
|
|
195
|
+
if (!entry) {
|
|
196
|
+
if (process.env.NODE_ENV !== "production") {
|
|
197
|
+
throw new Error(`Illustration "${name}" not in registry`);
|
|
198
|
+
}
|
|
199
|
+
return null; // or fallback
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const dims = typeof size === "number"
|
|
203
|
+
? { width: size, height: size }
|
|
204
|
+
: typeof size === "string"
|
|
205
|
+
? { width: SIZE_MAP[size], height: SIZE_MAP[size] }
|
|
206
|
+
: { responsive: size };
|
|
207
|
+
|
|
208
|
+
const a11y = label
|
|
209
|
+
? { role: "img", "aria-label": label }
|
|
210
|
+
: { "aria-hidden": "true" };
|
|
211
|
+
|
|
212
|
+
return (
|
|
213
|
+
<Tag
|
|
214
|
+
className={cn("illustration", className)}
|
|
215
|
+
data-tone={tone}
|
|
216
|
+
data-size-responsive={dims.responsive ? "" : undefined}
|
|
217
|
+
style={
|
|
218
|
+
dims.responsive
|
|
219
|
+
? {
|
|
220
|
+
"--desktop-size": `${dims.responsive.desktop}px`,
|
|
221
|
+
"--mobile-size": `${dims.responsive.mobile}px`,
|
|
222
|
+
}
|
|
223
|
+
: { width: dims.width, height: dims.height }
|
|
224
|
+
}
|
|
225
|
+
{...a11y}
|
|
226
|
+
>
|
|
227
|
+
{entry.type === "svg" ? (
|
|
228
|
+
<entry.component aria-hidden="true" />
|
|
229
|
+
) : (
|
|
230
|
+
<LottiePlayer src={entry.src} poster={entry.poster} ariaLabel={label ?? ""} />
|
|
231
|
+
)}
|
|
232
|
+
</Tag>
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Performance
|
|
238
|
+
|
|
239
|
+
- SVG illustrations: inlined as React components via SVGR / vite-plugin-svgr; treeshaken automatically.
|
|
240
|
+
- Lottie illustrations: lazy-loaded via `LottiePlayer`'s built-in lazy strategy.
|
|
241
|
+
- For 50+ illustrations in registry: import on-demand to avoid shipping all in main bundle:
|
|
242
|
+
|
|
243
|
+
```ts
|
|
244
|
+
"hero-money-flow": {
|
|
245
|
+
type: "svg",
|
|
246
|
+
component: lazy(() => import("./svg/HeroMoneyFlow")),
|
|
247
|
+
},
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Wrap consumers in `<Suspense fallback={<IllustrationSkeleton width={width} height={height} />}>`.
|
|
251
|
+
|
|
252
|
+
## Edge cases
|
|
253
|
+
|
|
254
|
+
- **Name not in registry (typo)**: TS catches at compile time. Runtime: throw in dev, fallback in prod.
|
|
255
|
+
- **Responsive size on SSR**: server renders both sizes; CSS `clamp()` resolves on client paint. No layout shift if dimensions are reserved.
|
|
256
|
+
- **Dark mode**: registry's SVGs use `currentColor` + CSS variables. Tone variable cascades through dark theme. No per-illustration dark variant needed if SVG is built right.
|
|
257
|
+
- **RTL languages**: most illustrations are visually symmetric; if not, mark in registry with `flippable: true` and apply `transform: scaleX(-1)` in RTL contexts.
|
|
258
|
+
- **Print**: illustrations using `currentColor` print in current text color. For colored print, use named colors in registry's CSS layer.
|
|
259
|
+
|
|
260
|
+
## Don't
|
|
261
|
+
|
|
262
|
+
- Don't pass arbitrary SVG nodes — extend the registry.
|
|
263
|
+
- Don't bake tone color in the SVG file. Use `currentColor`.
|
|
264
|
+
- Don't size illustrations with raw px from the consumer's css. Use the `size` prop.
|
|
265
|
+
- Don't render an `<img src=".svg">` — that's the wrong escape. Use the registry; SVG is inlined for theming.
|
|
266
|
+
- Don't auto-loop animated illustrations on every screen. Battery + a11y.
|
|
267
|
+
- Don't omit `label` if the illustration carries the only meaning on the screen. Defaults are decorative.
|
|
268
|
+
|
|
269
|
+
## References
|
|
270
|
+
|
|
271
|
+
No upstream component matches. Most libraries either ship icon systems (different concern) or expect raw `<img>` / `<svg>` for illustrations. This component formalizes the registry + theming pattern.
|
|
272
|
+
|
|
273
|
+
## Cross-reference
|
|
274
|
+
|
|
275
|
+
- [`knowledge/illustration/illustration-systems.md`](../knowledge/illustration/illustration-systems.md) — system foundation
|
|
276
|
+
- [`knowledge/illustration/svg-optimization.md`](../knowledge/illustration/svg-optimization.md) — SVG production
|
|
277
|
+
- [`knowledge/illustration/spot-illustrations.md`](../knowledge/illustration/spot-illustrations.md) — illustration types
|
|
278
|
+
- [`examples/component-empty-state.md`](component-empty-state.md) — common consumer
|
|
279
|
+
- [`examples/component-lottie-player.md`](component-lottie-player.md) — animated branch
|
|
280
|
+
- [`examples/component-hero-block.md`](component-hero-block.md) — hero illustration consumer
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# `ImageList` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `ImageList`. Grid of images with consistent rules — distinct from `Masonry` (varied heights) and `Grid` (general).
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Photo galleries where uniform proportions OK.
|
|
8
|
+
- Product image grids.
|
|
9
|
+
- Avatars / icons in a grid.
|
|
10
|
+
|
|
11
|
+
When NOT to use:
|
|
12
|
+
- Pinterest-style varied heights → `Masonry`.
|
|
13
|
+
- Reading-order content → semantic `<ul>`/`<ol>`.
|
|
14
|
+
|
|
15
|
+
## Anatomy
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
┌──┬──┬──┬──┐
|
|
19
|
+
│ │ │ │ │
|
|
20
|
+
├──┼──┼──┼──┤
|
|
21
|
+
│ │ │ │ │
|
|
22
|
+
├──┼──┼──┼──┤
|
|
23
|
+
│ │ │ │ │
|
|
24
|
+
└──┴──┴──┴──┘
|
|
25
|
+
uniform tiles
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## API
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
<ImageList cols={4} gap={8}>
|
|
32
|
+
{photos.map(p => (
|
|
33
|
+
<ImageList.Item key={p.id}>
|
|
34
|
+
<img src={p.thumb} alt={p.alt} loading="lazy" />
|
|
35
|
+
<ImageList.ItemBar
|
|
36
|
+
title={p.title}
|
|
37
|
+
subtitle={p.author}
|
|
38
|
+
actionIcon={<IconButton><InfoIcon /></IconButton>}
|
|
39
|
+
/>
|
|
40
|
+
</ImageList.Item>
|
|
41
|
+
))}
|
|
42
|
+
</ImageList>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
| Prop | Type | Default | Description |
|
|
46
|
+
| --- | --- | --- | --- |
|
|
47
|
+
| `cols` | `number` | `2` | Column count |
|
|
48
|
+
| `gap` | `number` | `4` | Gap between tiles (px) |
|
|
49
|
+
| `rowHeight` | `number \| "auto"` | `"auto"` | Fixed row height; "auto" sizes by content |
|
|
50
|
+
| `variant` | `"standard" \| "quilted" \| "masonry" \| "woven"` | `"standard"` | Layout style |
|
|
51
|
+
|
|
52
|
+
## Variants
|
|
53
|
+
|
|
54
|
+
- **standard**: uniform grid.
|
|
55
|
+
- **quilted**: different tile sizes (some span 2 cols/rows) for visual rhythm.
|
|
56
|
+
- **masonry**: varying heights (use `Masonry` instead — clearer name).
|
|
57
|
+
- **woven**: alternating row heights.
|
|
58
|
+
|
|
59
|
+
## States
|
|
60
|
+
|
|
61
|
+
Stateless. Tiles can be interactive (click → open / navigate); each tile follows Item semantics.
|
|
62
|
+
|
|
63
|
+
## Tokens consumed
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
--image-list-gap
|
|
67
|
+
--image-list-bar-bg (caption bar bg)
|
|
68
|
+
--image-list-bar-fg
|
|
69
|
+
--radius-sm (tile rounding)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Accessibility
|
|
73
|
+
|
|
74
|
+
- Each `<img alt="...">` required.
|
|
75
|
+
- For interactive grids: wrap each Item in `<a>` or `<button>`.
|
|
76
|
+
- Keyboard: Tab through items; arrow keys can navigate (configurable).
|
|
77
|
+
|
|
78
|
+
## Code example
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
<ImageList cols={3} gap={12} rowHeight={200}>
|
|
82
|
+
{products.map(p => (
|
|
83
|
+
<ImageList.Item key={p.id}>
|
|
84
|
+
<a href={`/products/${p.id}`}>
|
|
85
|
+
<img src={p.image} alt={p.name} loading="lazy" />
|
|
86
|
+
</a>
|
|
87
|
+
<ImageList.ItemBar title={p.name} subtitle={`₩${p.price.toLocaleString()}`} />
|
|
88
|
+
</ImageList.Item>
|
|
89
|
+
))}
|
|
90
|
+
</ImageList>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Don't
|
|
94
|
+
|
|
95
|
+
- Don't omit `alt` on images.
|
|
96
|
+
- Don't use ImageList for non-image grids — use Grid.
|
|
97
|
+
- Don't lazy-load above-the-fold — they should appear immediately.
|
|
98
|
+
|
|
99
|
+
## References
|
|
100
|
+
|
|
101
|
+
- MUI: [`ImageList`](../refs/mui/packages/mui-material/src/ImageList)
|
|
102
|
+
|
|
103
|
+
## Cross-reference
|
|
104
|
+
|
|
105
|
+
- [`examples/component-masonry.md`](component-masonry.md) — varied heights
|
|
106
|
+
- [`examples/component-grid.md`](component-grid.md) — generic 2D
|
|
107
|
+
- [`examples/component-aspect-ratio.md`](component-aspect-ratio.md) — single tile
|