@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,308 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
---
|
|
3
|
+
title: SVG optimization (file size, performance, accessibility)
|
|
4
|
+
applies_to: [svg, illustration, performance, optimization]
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
last_updated: 2026-05
|
|
7
|
+
stability: stable
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# SVG optimization
|
|
11
|
+
|
|
12
|
+
SVGs are usually the right format for illustration. They scale, theme, and animate. But raw exports from Figma / Illustrator are bloated — 5-10× larger than they need to be, and they break theming.
|
|
13
|
+
|
|
14
|
+
This file is the production checklist for shipping a clean SVG.
|
|
15
|
+
|
|
16
|
+
## Why optimize
|
|
17
|
+
|
|
18
|
+
A typical Figma SVG export of a medium-detail spot illustration:
|
|
19
|
+
- **Raw**: 80kB
|
|
20
|
+
- **After optimization**: 8-15kB
|
|
21
|
+
|
|
22
|
+
10× reduction is normal. For 100 illustrations across a site, that's 7MB → 1MB.
|
|
23
|
+
|
|
24
|
+
Beyond size: optimized SVGs theme correctly, render faster, and are easier to inline in React.
|
|
25
|
+
|
|
26
|
+
## The bloat sources
|
|
27
|
+
|
|
28
|
+
Raw SVG exports include:
|
|
29
|
+
1. **Editor metadata** — Figma / Sketch / Illustrator editor tags (10-30% of file).
|
|
30
|
+
2. **Default styles** — `fill="#000"`, `stroke-width="1"` on every element even when it's the default.
|
|
31
|
+
3. **Decimal precision** — `M123.4567890123` instead of `M123.46`.
|
|
32
|
+
4. **Empty groups** — `<g></g>` wrappers with no purpose.
|
|
33
|
+
5. **Unused attributes** — `id` on every element, even when unused.
|
|
34
|
+
6. **Embedded fonts** — text rendered as font (not paths) carrying entire font subsets.
|
|
35
|
+
7. **Embedded raster** — images embedded as base64 inside the SVG.
|
|
36
|
+
|
|
37
|
+
Cleaning these is mechanical (run a tool) plus judgmental (preserve structure for theming / animation).
|
|
38
|
+
|
|
39
|
+
## SVGO — the standard tool
|
|
40
|
+
|
|
41
|
+
**SVGO** (svgo on npm) is the de-facto SVG optimizer. Run on every SVG before shipping.
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm install -g svgo
|
|
45
|
+
svgo input.svg -o output.svg
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Or batch:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
svgo --folder=src/illustrations --output=dist/illustrations
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Recommended SVGO config
|
|
55
|
+
|
|
56
|
+
```js
|
|
57
|
+
// svgo.config.js
|
|
58
|
+
module.exports = {
|
|
59
|
+
plugins: [
|
|
60
|
+
{
|
|
61
|
+
name: "preset-default",
|
|
62
|
+
params: {
|
|
63
|
+
overrides: {
|
|
64
|
+
removeViewBox: false, // KEEP viewBox — required for responsive scaling
|
|
65
|
+
cleanupIds: false, // KEEP ids if you reference them in CSS / JS
|
|
66
|
+
removeUselessDefs: false, // KEEP defs if used by clipPath / filter / linearGradient
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
"removeXMLNS", // Remove if you inline; keep if standalone <img src>
|
|
71
|
+
"convertStyleToAttrs",
|
|
72
|
+
"removeDimensions", // Use viewBox + CSS sizing
|
|
73
|
+
{
|
|
74
|
+
name: "convertPathData",
|
|
75
|
+
params: { floatPrecision: 2 },
|
|
76
|
+
},
|
|
77
|
+
"removeMetadata",
|
|
78
|
+
"removeEditorsNSData",
|
|
79
|
+
"removeEmptyContainers",
|
|
80
|
+
"convertColors", // Hex → shorter forms / named
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`removeViewBox: false` is critical. Without viewBox, SVG can't scale responsively.
|
|
86
|
+
|
|
87
|
+
`cleanupIds: false` if you have any `<use>`, `clipPath`, or CSS targeting by id.
|
|
88
|
+
|
|
89
|
+
## Theming with currentColor
|
|
90
|
+
|
|
91
|
+
To make SVGs theme-aware, use `currentColor`:
|
|
92
|
+
|
|
93
|
+
```svg
|
|
94
|
+
<!-- Bad: hardcoded brand color -->
|
|
95
|
+
<svg viewBox="0 0 24 24"><path d="..." fill="#0064FF"/></svg>
|
|
96
|
+
|
|
97
|
+
<!-- Good: themeable -->
|
|
98
|
+
<svg viewBox="0 0 24 24"><path d="..." fill="currentColor"/></svg>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```css
|
|
102
|
+
.icon { color: var(--color-brand-default); }
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Now the SVG inherits color from CSS. Dark mode? Just change the variable.
|
|
106
|
+
|
|
107
|
+
For multi-color illustrations, use CSS variables in the SVG (requires inline SVG or CSS-aware loader):
|
|
108
|
+
|
|
109
|
+
```svg
|
|
110
|
+
<svg viewBox="0 0 240 240">
|
|
111
|
+
<circle cx="120" cy="120" r="100" fill="var(--color-bg-illo, #E0F2FF)" />
|
|
112
|
+
<path d="..." fill="var(--color-brand-default, #0064FF)" />
|
|
113
|
+
</svg>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
The fallback after the comma is the static value — used if CSS variables aren't applied.
|
|
117
|
+
|
|
118
|
+
## Inline vs `<img src>` vs `<object>`
|
|
119
|
+
|
|
120
|
+
| Method | When | Pros | Cons |
|
|
121
|
+
| --- | --- | --- | --- |
|
|
122
|
+
| **Inline `<svg>`** in HTML / JSX | Theming, animation, SVG you control | Full theming, full animation | Bigger HTML, no caching of SVG itself |
|
|
123
|
+
| **`<img src="...svg">`** | Decorative, no theming needed | Cacheable, simple | No CSS targeting from outside |
|
|
124
|
+
| **`<object>` / `<iframe>`** | Rare | SVG can have its own CSS | Layout edge cases |
|
|
125
|
+
| **CSS `background-image: url(...svg)`** | Decorative backgrounds | Cacheable | No theming, no animation |
|
|
126
|
+
|
|
127
|
+
Default: **inline** for icons / themed illustrations; **`<img>`** for static illustrations.
|
|
128
|
+
|
|
129
|
+
For React, popular pattern is inline-as-component:
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
// SearchEmpty.tsx
|
|
133
|
+
export function SearchEmptyIllustration({ className, ...props }: SVGProps) {
|
|
134
|
+
return (
|
|
135
|
+
<svg viewBox="0 0 240 240" className={className} {...props}>
|
|
136
|
+
<path d="..." fill="currentColor" />
|
|
137
|
+
</svg>
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Build tool (vite-svg-loader, SVGR, esbuild-plugin-svgr) auto-converts SVG files to React components.
|
|
143
|
+
|
|
144
|
+
## Avoiding common pitfalls
|
|
145
|
+
|
|
146
|
+
### 1. Don't lose theming during optimization
|
|
147
|
+
|
|
148
|
+
SVGO can replace `currentColor` with the value if it's not careful. Whitelist `currentColor`:
|
|
149
|
+
|
|
150
|
+
```js
|
|
151
|
+
// In svgo config
|
|
152
|
+
{
|
|
153
|
+
name: "convertColors",
|
|
154
|
+
params: { currentColor: false }, // Don't replace currentColor
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 2. Don't strip ids you reference
|
|
159
|
+
|
|
160
|
+
If your CSS or JS targets `#illo-bg` inside SVG, `cleanupIds: false` and explicit preservation needed.
|
|
161
|
+
|
|
162
|
+
### 3. Don't strip viewBox
|
|
163
|
+
|
|
164
|
+
Without viewBox, SVG renders at intrinsic size and won't respond to `width` / `height` CSS.
|
|
165
|
+
|
|
166
|
+
### 4. Don't inline raster
|
|
167
|
+
|
|
168
|
+
Some Figma exports embed PNGs as base64 inside SVG. This defeats the point — you have an SVG wrapper around a PNG. Identify with:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
grep "data:image" myfile.svg
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
If found: re-export with the raster as a separate file, OR redraw the part as vector.
|
|
175
|
+
|
|
176
|
+
### 5. Don't keep editor metadata
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# Check size before / after
|
|
180
|
+
ls -la myfile.svg # 80kB
|
|
181
|
+
svgo myfile.svg
|
|
182
|
+
ls -la myfile.svg # 8kB
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
If your "after" is still 30kB+, something didn't strip — open and check.
|
|
186
|
+
|
|
187
|
+
## Accessibility
|
|
188
|
+
|
|
189
|
+
### Decorative SVG
|
|
190
|
+
|
|
191
|
+
```html
|
|
192
|
+
<svg aria-hidden="true" focusable="false">...</svg>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
`aria-hidden` removes from a11y tree. `focusable="false"` prevents keyboard focus on the SVG element (important for IE/legacy; defensive in modern browsers).
|
|
196
|
+
|
|
197
|
+
### Meaningful SVG (conveys information)
|
|
198
|
+
|
|
199
|
+
```html
|
|
200
|
+
<svg role="img" aria-label="결제 완료">
|
|
201
|
+
<title>결제 완료</title>
|
|
202
|
+
...
|
|
203
|
+
</svg>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
`role="img"` + `aria-label` is the cleanest. `<title>` element inside SVG is also read by some screen readers — defense in depth.
|
|
207
|
+
|
|
208
|
+
### Interactive SVG (button, link)
|
|
209
|
+
|
|
210
|
+
```html
|
|
211
|
+
<svg role="button" aria-label="닫기" tabindex="0" onclick="..." onkeydown="...">
|
|
212
|
+
...
|
|
213
|
+
</svg>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Better: wrap the SVG in a real `<button>` and let the SVG be decorative. Avoids handling keyboard manually.
|
|
217
|
+
|
|
218
|
+
## Performance
|
|
219
|
+
|
|
220
|
+
| Metric | Target |
|
|
221
|
+
| --- | --- |
|
|
222
|
+
| Inline SVG (icon-sized, < 32px) | < 1kB |
|
|
223
|
+
| Inline SVG (spot illustration, 100-200px) | < 10kB |
|
|
224
|
+
| Hero SVG | < 100kB; ideal < 50kB |
|
|
225
|
+
| Path count per SVG | < 200 (above this, consider raster) |
|
|
226
|
+
| Distinct gradients | < 5 (browsers de-dupe; > 10 hurts paint) |
|
|
227
|
+
| Filters (blur, drop-shadow) | Use sparingly; expensive |
|
|
228
|
+
|
|
229
|
+
For SVG with > 500 paths (very detailed): seriously consider a WebP / AVIF instead. Browsers paint thousands of paths slowly on mobile.
|
|
230
|
+
|
|
231
|
+
## Animation in SVG
|
|
232
|
+
|
|
233
|
+
SVG can animate via:
|
|
234
|
+
|
|
235
|
+
| Method | Use |
|
|
236
|
+
| --- | --- |
|
|
237
|
+
| **CSS animation on SVG elements** | Hover effects, simple loops |
|
|
238
|
+
| **SMIL** (`<animate>`, `<animateTransform>`) | Legacy; deprecated in some browsers; avoid for new |
|
|
239
|
+
| **JavaScript (GSAP, Framer Motion)** | Complex animation, scroll-triggered |
|
|
240
|
+
| **Lottie** | Designer-led; bypasses SVG animation entirely |
|
|
241
|
+
|
|
242
|
+
For most cases: CSS animation on inline SVG is the best balance. SMIL is dead. Lottie when designer makes it in After Effects.
|
|
243
|
+
|
|
244
|
+
```css
|
|
245
|
+
@keyframes spin {
|
|
246
|
+
to { transform: rotate(360deg); }
|
|
247
|
+
}
|
|
248
|
+
.spinner svg {
|
|
249
|
+
animation: spin 1s linear infinite;
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
`prefers-reduced-motion` rules apply — pause / freeze on reduce.
|
|
254
|
+
|
|
255
|
+
## Sprite vs separate files
|
|
256
|
+
|
|
257
|
+
| Approach | Use |
|
|
258
|
+
| --- | --- |
|
|
259
|
+
| **One SVG sprite** (one file, many `<symbol>` IDs, referenced via `<use>`) | Many icons, want HTTP single-fetch |
|
|
260
|
+
| **Separate SVG files** | Treeshaking with build tools, modern HTTP/2/3 |
|
|
261
|
+
| **React component per SVG** (most common modern) | React apps, full type-safety, easy theming |
|
|
262
|
+
|
|
263
|
+
With HTTP/2/3 multiplexing, separate files are usually fine. Sprites add build complexity. For most projects: separate files / per-component is simpler.
|
|
264
|
+
|
|
265
|
+
## Workflow checklist
|
|
266
|
+
|
|
267
|
+
For each new illustration:
|
|
268
|
+
|
|
269
|
+
- [ ] Created at canvas size matching display (don't scale up small canvas)
|
|
270
|
+
- [ ] Strokes converted to fills (or kept as strokes — pick one and stay consistent)
|
|
271
|
+
- [ ] Text either converted to paths OR uses Pretendard / system fonts (safe for cross-platform)
|
|
272
|
+
- [ ] Brand colors replaced with `currentColor` or CSS variables
|
|
273
|
+
- [ ] Run through SVGO with config above
|
|
274
|
+
- [ ] viewBox preserved
|
|
275
|
+
- [ ] No embedded raster (`grep "data:image"`)
|
|
276
|
+
- [ ] No editor metadata (`grep -E "sodipodi|inkscape|sketch:"`)
|
|
277
|
+
- [ ] File size < target for category (1kB icon, 10kB spot, 50kB hero)
|
|
278
|
+
- [ ] Accessibility: `aria-hidden` for decorative, `role="img"` + `aria-label` for meaningful
|
|
279
|
+
- [ ] Tested in light + dark modes
|
|
280
|
+
- [ ] Tested at 1×, 2×, 3× device pixel ratio (cribs / blur check)
|
|
281
|
+
|
|
282
|
+
## Tools
|
|
283
|
+
|
|
284
|
+
| Tool | Use |
|
|
285
|
+
| --- | --- |
|
|
286
|
+
| **SVGO** | CLI optimizer; mandatory |
|
|
287
|
+
| **SVGOMG** (svgomg.net) | Web UI for SVGO; preview before/after |
|
|
288
|
+
| **vite-plugin-svgr / SVGR** | SVG → React component build |
|
|
289
|
+
| **Figma → "Copy as SVG"** | Fast extraction; still needs SVGO |
|
|
290
|
+
| **Adobe Illustrator → "Save for Web"** | Slightly cleaner output than Figma |
|
|
291
|
+
| **PurgeCSS / unused style sweep** | After build, ensure unused SVG IDs / classes purged |
|
|
292
|
+
|
|
293
|
+
## Don't
|
|
294
|
+
|
|
295
|
+
- Don't ship raw Figma exports — always SVGO.
|
|
296
|
+
- Don't keep `width` / `height` attributes on the `<svg>` if you want it responsive — use viewBox + CSS sizing.
|
|
297
|
+
- Don't embed raster inside SVG. Defeats the format.
|
|
298
|
+
- Don't bake brand color as raw hex — use `currentColor` or CSS variables.
|
|
299
|
+
- Don't make 100 separate SVG components when an inline icon font / sprite would do (icons specifically).
|
|
300
|
+
- Don't ignore reduced-motion when SVG animates.
|
|
301
|
+
|
|
302
|
+
## Cross-reference
|
|
303
|
+
|
|
304
|
+
- [`knowledge/illustration/illustration-systems.md`](illustration-systems.md) — system foundation
|
|
305
|
+
- [`knowledge/illustration/spot-illustrations.md`](spot-illustrations.md) — production rules
|
|
306
|
+
- [`knowledge/illustration/hero-illustrations.md`](hero-illustrations.md) — performance targets
|
|
307
|
+
- [`knowledge/icons/curated-sets.md`](../icons/curated-sets.md) — icon system
|
|
308
|
+
- [`knowledge/motion/motion-tools.md`](../motion/motion-tools.md) — Lottie alternative
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
---
|
|
3
|
+
title: Spacing, grid, and responsive layout
|
|
4
|
+
applies_to: [web, mobile, all-ui]
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
last_updated: 2026-05
|
|
7
|
+
stability: stable
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Spacing, grid, and responsive layout
|
|
11
|
+
|
|
12
|
+
## The 4-or-8 rule
|
|
13
|
+
|
|
14
|
+
Pick one base unit and use **only multiples**. Most systems pick **4 px** (with 8 px subset). Tailwind defaults to 4. Material defaults to 4. Ant Design's `sizeUnit` is 4.
|
|
15
|
+
|
|
16
|
+
**Why 4 not 8?** 4 lets you express tight component padding (e.g., 12 px, 20 px) without breaking grid. 8-only is simpler but produces blocky UIs.
|
|
17
|
+
|
|
18
|
+
The canonical scale derived from base 4:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Skip 28, 36, 44, 52, 56**: they are intermediate steps that should be expressed as `+8` from neighbors when truly needed, not added to the scale.
|
|
25
|
+
|
|
26
|
+
## Spacing tokens
|
|
27
|
+
|
|
28
|
+
Name spacing tokens by **role**, not value:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
✗ space-12
|
|
32
|
+
✓ space-md OR component-padding-y
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Two-axis naming is the cleanest:
|
|
36
|
+
- **`space-2xs / xs / sm / md / lg / xl / 2xl / 3xl`** for layout (4, 8, 12, 16, 24, 32, 48, 64).
|
|
37
|
+
- **`gap-x` / `gap-y`** for component-internal spacing.
|
|
38
|
+
- **`inset`** vs **`stack`** vs **`inline`** (Braid/Mirage style) — fancier but disambiguates "padding inside" vs "vertical rhythm" vs "horizontal flow".
|
|
39
|
+
|
|
40
|
+
## Grid systems
|
|
41
|
+
|
|
42
|
+
| System | Columns | Gutter | Margin |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| 12-column (Bootstrap, Ant) | 12 | 16–24 px | 24 px (mobile) → 80+ px (desktop) |
|
|
45
|
+
| 8-point grid | flexible | 8 multiples | aligns to 8 |
|
|
46
|
+
| Material | 4-column (mobile), 8 (tablet), 12 (desktop) | 16/24/24 | 16/24/24 |
|
|
47
|
+
| Editorial | 6-column or asymmetric | wide | wide |
|
|
48
|
+
|
|
49
|
+
For most product UIs: **12 columns, 24 px gutter, 24 px outer margin on mobile, scaling**.
|
|
50
|
+
|
|
51
|
+
## Breakpoints
|
|
52
|
+
|
|
53
|
+
The pragmatic set, ordered by frequency of use:
|
|
54
|
+
|
|
55
|
+
| Name | Min width | Usage |
|
|
56
|
+
| --- | --- | --- |
|
|
57
|
+
| `xs` | 0 | Mobile portrait. Single column, full-width buttons. |
|
|
58
|
+
| `sm` | 640 px | Large mobile / phablet. |
|
|
59
|
+
| `md` | 768 px | Tablet portrait, foldables. |
|
|
60
|
+
| `lg` | 1024 px | Tablet landscape, small laptops. |
|
|
61
|
+
| `xl` | 1280 px | Desktop. |
|
|
62
|
+
| `2xl` | 1536 px | Large desktop. |
|
|
63
|
+
|
|
64
|
+
Tailwind v4 defaults match exactly (mobile-first). Ant Design uses 576/768/992/1200/1600 — slightly different, less aligned with modern devices.
|
|
65
|
+
|
|
66
|
+
**Mobile-first**: write base styles for mobile, use `min-width` queries to add desktop adjustments. Don't author for desktop and shrink down.
|
|
67
|
+
|
|
68
|
+
## Container queries vs media queries
|
|
69
|
+
|
|
70
|
+
Use container queries when:
|
|
71
|
+
- A component reused at multiple sizes (a card in a grid AND in a sidebar).
|
|
72
|
+
- Layout depends on its own width, not the viewport.
|
|
73
|
+
|
|
74
|
+
Use media queries when:
|
|
75
|
+
- Page-level layout shifts (sidebar collapses, navigation opens).
|
|
76
|
+
- Typography scale changes globally.
|
|
77
|
+
|
|
78
|
+
```css
|
|
79
|
+
@container card (min-width: 320px) {
|
|
80
|
+
.card { display: grid; grid-template-columns: 1fr 2fr; }
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Browser support: 2023+ all major browsers.
|
|
85
|
+
|
|
86
|
+
## Density modes
|
|
87
|
+
|
|
88
|
+
Many products need at least two density modes:
|
|
89
|
+
|
|
90
|
+
| Mode | Use | Adjustments |
|
|
91
|
+
| --- | --- | --- |
|
|
92
|
+
| **Comfortable** (default) | Consumer apps, marketing | Standard padding, 16 px body |
|
|
93
|
+
| **Compact** | Power users, data tables, IDE-like UIs | -25% vertical padding, 14 px body, smaller controls (28 px height vs 32) |
|
|
94
|
+
| **Spacious** | First-time-user, accessibility mode | +25% padding, 16+ px body |
|
|
95
|
+
|
|
96
|
+
Implement as a CSS variable scale that all components consume:
|
|
97
|
+
|
|
98
|
+
```css
|
|
99
|
+
:root[data-density="compact"] {
|
|
100
|
+
--space-md: 12px; /* normally 16 */
|
|
101
|
+
--control-height: 28px; /* normally 32 */
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Responsive type
|
|
106
|
+
|
|
107
|
+
Three approaches, pick one:
|
|
108
|
+
|
|
109
|
+
1. **Stepped**: Different `font-size` at each breakpoint. Predictable, easy to QA. _Default for most projects._
|
|
110
|
+
2. **Fluid (clamp)**: `font-size: clamp(1rem, 0.5rem + 2vw, 1.5rem)`. Smooth, harder to QA. Good for editorial.
|
|
111
|
+
3. **Combined**: Stepped at small/medium, fluid above to fill wide screens. Most expressive, most work.
|
|
112
|
+
|
|
113
|
+
## Common layout failures
|
|
114
|
+
|
|
115
|
+
- **No max-width on text content**: lines exceeding 75 chars hurt readability. Cap with `max-w-prose` (Tailwind) or `max-width: 65ch`.
|
|
116
|
+
- **Form fields full-width on desktop**: a 1200 px-wide email input looks broken. Cap at 480 px.
|
|
117
|
+
- **Card grids without min/max width**: pure `repeat(auto-fit, 1fr)` produces 50 px cards on tiny screens. Use `repeat(auto-fit, minmax(280px, 1fr))`.
|
|
118
|
+
- **Mobile drawer that scrolls behind backdrop**: scroll-locking the body is required.
|
|
119
|
+
- **No safe-area handling on iOS**: notch/home-bar overlap. `padding-top: env(safe-area-inset-top)`.
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
---
|
|
3
|
+
title: App loading sequences
|
|
4
|
+
applies_to: [splash, app-launch, route-transitions, progressive-load]
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
last_updated: 2026-05
|
|
7
|
+
stability: stable
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# App loading sequences
|
|
11
|
+
|
|
12
|
+
The first 3 seconds of an app launch decide whether users feel the app is fast or slow. **Perceived performance** > actual performance. Design the loading sequence intentionally.
|
|
13
|
+
|
|
14
|
+
## Three loading moments
|
|
15
|
+
|
|
16
|
+
| Moment | Duration | UX goal |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| **Cold launch** (app first opens) | 0–3s | Make waiting feel intentional |
|
|
19
|
+
| **Warm launch** (app already in memory) | 0–500ms | Hide the load entirely |
|
|
20
|
+
| **Route change** (user navigates within app) | 0–500ms | Smooth transition |
|
|
21
|
+
|
|
22
|
+
Each needs different patterns.
|
|
23
|
+
|
|
24
|
+
## Cold launch — splash + first paint
|
|
25
|
+
|
|
26
|
+
Native apps (iOS / Android) show a splash screen during launch. Web / PWA does similar via service worker + first paint.
|
|
27
|
+
|
|
28
|
+
### Splash screen rules
|
|
29
|
+
|
|
30
|
+
- **Brand-led** — logo + brand color. No spinner.
|
|
31
|
+
- **Static or minimal motion**. Looping spinner reads as loading-stuck.
|
|
32
|
+
- **Match the first screen** — splash's bg color = first screen's bg color, so transition is seamless.
|
|
33
|
+
- **iOS / Android handle splash automatically** in many cases (LaunchScreen.storyboard / SplashScreen API).
|
|
34
|
+
|
|
35
|
+
### iOS splash strategy
|
|
36
|
+
|
|
37
|
+
Use LaunchScreen.storyboard:
|
|
38
|
+
- Centered logo on brand background.
|
|
39
|
+
- No spinner (Apple HIG explicitly says no).
|
|
40
|
+
- Disappears as soon as React Native / web view is ready.
|
|
41
|
+
|
|
42
|
+
### Android splash (API 31+)
|
|
43
|
+
|
|
44
|
+
Native SplashScreen API:
|
|
45
|
+
- Animated icon support
|
|
46
|
+
- Brand background color
|
|
47
|
+
- Auto-handles transition to app
|
|
48
|
+
|
|
49
|
+
For older Android: simple solid-color screen with logo.
|
|
50
|
+
|
|
51
|
+
## Warm launch — invisible
|
|
52
|
+
|
|
53
|
+
When app is already in memory, launch should feel instant. < 500ms.
|
|
54
|
+
|
|
55
|
+
If you can't hit < 500ms:
|
|
56
|
+
- Show **same splash** (consistency).
|
|
57
|
+
- Or: snapshot of last app state (iOS does this automatically).
|
|
58
|
+
|
|
59
|
+
## Route changes within app
|
|
60
|
+
|
|
61
|
+
Web / SPA / native apps: navigating between screens.
|
|
62
|
+
|
|
63
|
+
### Three transition patterns
|
|
64
|
+
|
|
65
|
+
| Pattern | Use |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| **Cross-fade** | Default for content-led transitions. 200ms opacity. Calm. |
|
|
68
|
+
| **Slide-in** | Native iOS pattern. New screen slides from right; old slides left. |
|
|
69
|
+
| **Hero / shared element** | Element from old screen "transforms" into element on new screen (Material's shared transitions). |
|
|
70
|
+
|
|
71
|
+
### Cross-fade (web default)
|
|
72
|
+
|
|
73
|
+
```css
|
|
74
|
+
.page-transition-enter {
|
|
75
|
+
opacity: 0;
|
|
76
|
+
}
|
|
77
|
+
.page-transition-enter-active {
|
|
78
|
+
opacity: 1;
|
|
79
|
+
transition: opacity 200ms;
|
|
80
|
+
}
|
|
81
|
+
.page-transition-exit {
|
|
82
|
+
opacity: 1;
|
|
83
|
+
}
|
|
84
|
+
.page-transition-exit-active {
|
|
85
|
+
opacity: 0;
|
|
86
|
+
transition: opacity 200ms;
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
For React Router with Framer Motion or React Transition Group: 5 lines.
|
|
91
|
+
|
|
92
|
+
For modern web: **View Transitions API** (browser-native, 2024+):
|
|
93
|
+
|
|
94
|
+
```js
|
|
95
|
+
document.startViewTransition(() => {
|
|
96
|
+
// Update DOM
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Browser handles the cross-fade. Cleanest path for modern Chrome / Edge / Safari.
|
|
101
|
+
|
|
102
|
+
### Slide-in (native pattern)
|
|
103
|
+
|
|
104
|
+
iOS native: `pushViewController` slides new screen from right. Back swipe slides it back.
|
|
105
|
+
|
|
106
|
+
For web: use Framer Motion `<AnimatePresence>` with `x` translation.
|
|
107
|
+
|
|
108
|
+
For React Native: `@react-navigation/native` handles it automatically.
|
|
109
|
+
|
|
110
|
+
### Shared element / hero transitions
|
|
111
|
+
|
|
112
|
+
Most sophisticated. Element from screen A morphs into element on screen B.
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
Screen A: [Card with image]
|
|
116
|
+
↓ tap
|
|
117
|
+
Screen B: [Image full-bleed, card details below]
|
|
118
|
+
|
|
119
|
+
The image element animates (FLIP technique) from card position → full-bleed
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Tools:
|
|
123
|
+
- **Material You shared transitions** (Android native)
|
|
124
|
+
- **Framer Motion `layoutId`** (React)
|
|
125
|
+
- **View Transitions API** (web, with named transitions)
|
|
126
|
+
- **react-native-shared-element** (RN)
|
|
127
|
+
|
|
128
|
+
When to use:
|
|
129
|
+
- Photo gallery → detail view
|
|
130
|
+
- Card-grid → card-detail
|
|
131
|
+
- Logo persistence across pages
|
|
132
|
+
|
|
133
|
+
When to skip:
|
|
134
|
+
- Simple route changes (overkill)
|
|
135
|
+
- Rapid-tap navigation (animation can't keep up)
|
|
136
|
+
|
|
137
|
+
## Progressive content loading
|
|
138
|
+
|
|
139
|
+
Once app is rendered, content arrives async. Three patterns:
|
|
140
|
+
|
|
141
|
+
### 1. Skeleton coordination
|
|
142
|
+
|
|
143
|
+
Multiple skeletons load simultaneously. **Stagger the resolve** to avoid simultaneous flash:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
Fetch 3 sections in parallel:
|
|
147
|
+
- Header data: arrives at 200ms
|
|
148
|
+
- Body data: arrives at 350ms
|
|
149
|
+
- Footer data: arrives at 500ms
|
|
150
|
+
|
|
151
|
+
Don't replace each skeleton instantly. Coordinate:
|
|
152
|
+
- At 500ms (when slowest is ready), reveal all three with 50ms stagger.
|
|
153
|
+
- Total settle: 650ms with smooth orchestrated reveal.
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Or simpler: replace each skeleton as data arrives. Less coordinated but faster to ship.
|
|
157
|
+
|
|
158
|
+
### 2. Pull-to-refresh
|
|
159
|
+
|
|
160
|
+
Mobile-native pattern. User pulls down → refresh indicator → data fetched → indicator hides.
|
|
161
|
+
|
|
162
|
+
| Phase | Behavior |
|
|
163
|
+
| --- | --- |
|
|
164
|
+
| Pull (1–80px) | List moves with finger |
|
|
165
|
+
| Past threshold (80px+) | Indicator appears |
|
|
166
|
+
| Release | List bounces back; indicator stays during fetch (typical 1–3s) |
|
|
167
|
+
| Done | Indicator fades; new content (if any) at top |
|
|
168
|
+
|
|
169
|
+
Cite [`knowledge/patterns/list-and-feed.md`](../patterns/list-and-feed.md).
|
|
170
|
+
|
|
171
|
+
### 3. Infinite scroll triggers
|
|
172
|
+
|
|
173
|
+
User scrolls near bottom → next page loads.
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
Scroll position 80% of total → trigger fetch
|
|
177
|
+
Spinner at bottom while loading
|
|
178
|
+
New items append (with 50ms entrance stagger)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Don't:
|
|
182
|
+
- Reset scroll on append.
|
|
183
|
+
- Auto-scroll to new items (user is reading something).
|
|
184
|
+
|
|
185
|
+
## Page state transitions
|
|
186
|
+
|
|
187
|
+
Beyond just loading: empty → loading → content → error states all need motion-aware transitions.
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
Empty state visible
|
|
191
|
+
↓ user adds item
|
|
192
|
+
↓ list animates with new item entering
|
|
193
|
+
Content visible
|
|
194
|
+
↓ user filters to nothing
|
|
195
|
+
↓ items fade out
|
|
196
|
+
Empty state slides in (filtered variant)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Each state-to-state transition is ~200ms. Cross-fade is the safe default.
|
|
200
|
+
|
|
201
|
+
## Korean fintech app launch convention
|
|
202
|
+
|
|
203
|
+
Korean fintech apps (Toss, KakaoBank) often have:
|
|
204
|
+
- **Solid brand color splash** — yellow (Kakao) / blue (Toss).
|
|
205
|
+
- **No logo animation** — stays clean.
|
|
206
|
+
- **Biometric gate** appears immediately on launch (Face ID / Fingerprint).
|
|
207
|
+
- **After auth**: cross-fade to dashboard.
|
|
208
|
+
|
|
209
|
+
Total cold launch experience: 1.5–3s. The biometric gate is the bulk; actual app load hides under it.
|
|
210
|
+
|
|
211
|
+
Cite [`examples/component-biometric-gate.md`](../../examples/component-biometric-gate.md).
|
|
212
|
+
|
|
213
|
+
## Reduced motion
|
|
214
|
+
|
|
215
|
+
For loading sequences:
|
|
216
|
+
- Splash: still show (brand recognition matters more than "no motion").
|
|
217
|
+
- Route transitions: instant cross-fade, no slide.
|
|
218
|
+
- Skeleton entrance: still show skeleton, but no shimmer animation.
|
|
219
|
+
- Hero / shared element: skip the morph, just instant layout change.
|
|
220
|
+
|
|
221
|
+
## Performance — perceived vs actual
|
|
222
|
+
|
|
223
|
+
| Strategy | Perceived speed |
|
|
224
|
+
| --- | --- |
|
|
225
|
+
| Show app chrome (header, nav) immediately, content later | Faster |
|
|
226
|
+
| Show skeleton matching final layout | Faster |
|
|
227
|
+
| Animate progress (even fake) | Feels active |
|
|
228
|
+
| Optimistic UI (act on click before server confirms) | Instant |
|
|
229
|
+
| Keep stale data visible during refresh | Faster |
|
|
230
|
+
|
|
231
|
+
vs:
|
|
232
|
+
|
|
233
|
+
| Strategy | Slower perceived speed |
|
|
234
|
+
| --- | --- |
|
|
235
|
+
| Blank screen during load | Slowest |
|
|
236
|
+
| Spinner with no context | Slow |
|
|
237
|
+
| Block all interaction until loaded | Slow |
|
|
238
|
+
|
|
239
|
+
## Code example — page transition wrapper (Framer Motion)
|
|
240
|
+
|
|
241
|
+
```tsx
|
|
242
|
+
import { motion, AnimatePresence } from "framer-motion";
|
|
243
|
+
|
|
244
|
+
function PageTransition({ children, route }: Props) {
|
|
245
|
+
return (
|
|
246
|
+
<AnimatePresence mode="wait">
|
|
247
|
+
<motion.div
|
|
248
|
+
key={route}
|
|
249
|
+
initial={{ opacity: 0, y: 8 }}
|
|
250
|
+
animate={{ opacity: 1, y: 0 }}
|
|
251
|
+
exit={{ opacity: 0, y: -8 }}
|
|
252
|
+
transition={{ duration: 0.2, ease: "easeOut" }}
|
|
253
|
+
>
|
|
254
|
+
{children}
|
|
255
|
+
</motion.div>
|
|
256
|
+
</AnimatePresence>
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Don't
|
|
262
|
+
|
|
263
|
+
- Don't show looping spinner on splash. Brand-led is calmer.
|
|
264
|
+
- Don't animate route changes longer than 300ms.
|
|
265
|
+
- Don't transition every state change with motion. Only meaningful ones.
|
|
266
|
+
- Don't auto-replay splash on every cold launch — user has seen it.
|
|
267
|
+
- Don't ignore `prefers-reduced-motion` in transitions.
|
|
268
|
+
- Don't block interactivity during transitions (button clicks during fade should still work).
|
|
269
|
+
|
|
270
|
+
## Cross-reference
|
|
271
|
+
|
|
272
|
+
- [`knowledge/motion/principles.md`](principles.md) — duration / easing fundamentals
|
|
273
|
+
- [`knowledge/motion/marketing-motion.md`](marketing-motion.md) — hero entrances
|
|
274
|
+
- [`knowledge/motion/choreography-depth.md`](choreography-depth.md) — multi-element coordination
|
|
275
|
+
- [`knowledge/motion/motion-tools.md`](motion-tools.md) — tool comparison
|
|
276
|
+
- [`knowledge/patterns/list-and-feed.md`](../patterns/list-and-feed.md) — pull-to-refresh + infinite scroll
|
|
277
|
+
- [`examples/component-biometric-gate.md`](../../examples/component-biometric-gate.md) — Korean launch gate
|