@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,409 @@
|
|
|
1
|
+
<!-- hand-written -->
|
|
2
|
+
# `VideoHero` (custom — autoplay landing-page video hero) — spec
|
|
3
|
+
|
|
4
|
+
> Above-the-fold autoplay video loop with text overlay, poster fallback, and reduced-motion handling. Pairs with [`knowledge/video/marketing-video.md`](../knowledge/video/marketing-video.md) and [`knowledge/patterns/landing-hero-design.md`](../knowledge/patterns/landing-hero-design.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Hero loops on landing pages need specific behavior:
|
|
9
|
+
1. Autoplay muted; loop seamlessly.
|
|
10
|
+
2. Show poster instantly; video loads behind.
|
|
11
|
+
3. Skip video entirely on reduced-motion or slow connection.
|
|
12
|
+
4. Layer text + CTA over the video without competing.
|
|
13
|
+
5. Respond to mobile (often vertical / different ratio).
|
|
14
|
+
|
|
15
|
+
Without this: every team hand-rolls `<video>` and gets some of these wrong.
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌──────────────────────────────────────────┐
|
|
21
|
+
│ │
|
|
22
|
+
│ [video loop or poster] │
|
|
23
|
+
│ │
|
|
24
|
+
│ [Headline overlay] │
|
|
25
|
+
│ [Sub-headline] │
|
|
26
|
+
│ [CTA button] │
|
|
27
|
+
│ │
|
|
28
|
+
│ [↓ scroll cue] │
|
|
29
|
+
└──────────────────────────────────────────┘
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## API
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
<VideoHero
|
|
36
|
+
src={[
|
|
37
|
+
{ src: "/hero.webm", type: "video/webm", media: "(min-width: 768px)" },
|
|
38
|
+
{ src: "/hero-mobile.webm", type: "video/webm", media: "(max-width: 767px)" },
|
|
39
|
+
{ src: "/hero.mp4", type: "video/mp4", media: "(min-width: 768px)" },
|
|
40
|
+
{ src: "/hero-mobile.mp4", type: "video/mp4", media: "(max-width: 767px)" },
|
|
41
|
+
]}
|
|
42
|
+
poster="/hero-poster.jpg"
|
|
43
|
+
posterMobile="/hero-poster-mobile.jpg"
|
|
44
|
+
overlay="dark"
|
|
45
|
+
align="center"
|
|
46
|
+
>
|
|
47
|
+
<h1>송금이 더 쉬워졌어요</h1>
|
|
48
|
+
<p>30초 만에 가입하고, 첫 송금까지 무료.</p>
|
|
49
|
+
<Button>지금 시작하기</Button>
|
|
50
|
+
</VideoHero>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
| Prop | Type | Default | Description |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| `src` | `Source[]` | — | Multi-format sources; can include `media` for art-direction (mobile vs desktop video) |
|
|
56
|
+
| `poster` | `string` | — | Desktop poster image (REQUIRED) |
|
|
57
|
+
| `posterMobile` | `string` | `poster` | Mobile-specific poster |
|
|
58
|
+
| `overlay` | `"none" \| "light" \| "dark" \| "gradient-bottom" \| "gradient-top"` | `"dark"` | Tint over video for text contrast |
|
|
59
|
+
| `overlayOpacity` | `number` | `0.4` | 0-1 |
|
|
60
|
+
| `align` | `"start" \| "center" \| "end"` | `"center"` | Horizontal text alignment |
|
|
61
|
+
| `verticalAlign` | `"top" \| "middle" \| "bottom"` | `"middle"` | Vertical text position |
|
|
62
|
+
| `aspectRatio` | `string` | `"16/9"` desktop / `"4/5"` mobile | CSS aspect-ratio |
|
|
63
|
+
| `minHeight` | `string` | `"600px"` desktop / `"500px"` mobile | Minimum hero height |
|
|
64
|
+
| `lazy` | `boolean` | `false` | Delay video load (only for non-LCP heroes) |
|
|
65
|
+
| `children` | `ReactNode` | — | Text + CTA overlay |
|
|
66
|
+
| `loadingStrategy` | `"eager" \| "viewport" \| "interaction"` | `"eager"` | When to start loading video |
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
type Source = { src: string; type: string; media?: string };
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Behavior
|
|
73
|
+
|
|
74
|
+
### Loading strategy
|
|
75
|
+
|
|
76
|
+
Hero is above-the-fold → above-the-fold. Optimize for **LCP**:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
Phase 1 (instant): poster image renders. LCP captures this.
|
|
80
|
+
Phase 2 (parallel): video starts streaming.
|
|
81
|
+
Phase 3 (when buffered): video plays + cross-fades poster out.
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Don't block on video. The poster IS the LCP element; video enhances after.
|
|
85
|
+
|
|
86
|
+
### Reduced motion
|
|
87
|
+
|
|
88
|
+
```css
|
|
89
|
+
@media (prefers-reduced-motion: reduce) {
|
|
90
|
+
.video-hero video {
|
|
91
|
+
display: none;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
In reduced-motion: poster only. No video. Text + CTA still overlay normally.
|
|
97
|
+
|
|
98
|
+
### Slow connection detection
|
|
99
|
+
|
|
100
|
+
If `navigator.connection?.effectiveType` is `"2g"` or `"slow-2g"`: skip video; show poster only.
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
const connection = (navigator as any).connection;
|
|
104
|
+
const slowConnection = connection?.effectiveType === "slow-2g" || connection?.effectiveType === "2g";
|
|
105
|
+
const shouldLoadVideo = !slowConnection && !reducedMotion;
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Art direction (mobile vs desktop video)
|
|
109
|
+
|
|
110
|
+
Desktop hero might be 16:9 wide cinematic; mobile 4:5 with subject closer.
|
|
111
|
+
|
|
112
|
+
`<source media="...">` lets browser pick:
|
|
113
|
+
|
|
114
|
+
```html
|
|
115
|
+
<video autoplay muted loop playsinline poster="hero-mobile.jpg">
|
|
116
|
+
<source src="hero-desktop.mp4" media="(min-width: 768px)" type="video/mp4" />
|
|
117
|
+
<source src="hero-mobile.mp4" media="(max-width: 767px)" type="video/mp4" />
|
|
118
|
+
</video>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Browser respects `media` query; only loads the matching source.
|
|
122
|
+
|
|
123
|
+
### Loop seamlessness
|
|
124
|
+
|
|
125
|
+
Video must loop without visible cut:
|
|
126
|
+
- Edit so first frame == last frame.
|
|
127
|
+
- OR fade out / fade in at loop boundary in encoded video itself.
|
|
128
|
+
|
|
129
|
+
Don't rely on `loop` attribute alone; bad edits show a flash on loop.
|
|
130
|
+
|
|
131
|
+
## States
|
|
132
|
+
|
|
133
|
+
| State | Visual |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| Initial | Poster + text overlay; video loading |
|
|
136
|
+
| Video ready | Cross-fade poster → video (200ms); video plays |
|
|
137
|
+
| Playing | Video loops; text overlay always |
|
|
138
|
+
| Reduced motion | Poster only; text overlay |
|
|
139
|
+
| Slow connection | Poster only; text overlay |
|
|
140
|
+
| Video error | Poster only; text overlay |
|
|
141
|
+
|
|
142
|
+
## Tokens consumed
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
--color-bg-overlay-light (light overlay tint)
|
|
146
|
+
--color-bg-overlay-dark (dark overlay tint)
|
|
147
|
+
--color-fg-on-overlay (text color over video)
|
|
148
|
+
--space-lg, --space-xl (overlay spacing)
|
|
149
|
+
--motion-medium (poster → video fade)
|
|
150
|
+
--ease-out
|
|
151
|
+
--max-width-prose (overlay text max-width)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Accessibility
|
|
155
|
+
|
|
156
|
+
- **Video has no audio** (autoplay + muted). No caption track needed.
|
|
157
|
+
- **Text content** carries the meaning. Video is decorative.
|
|
158
|
+
- Wrap video in `<div role="presentation">` or use `aria-hidden="true"` on `<video>`.
|
|
159
|
+
- Heading + body + CTA in standard semantic markup (`<h1>`, `<p>`, `<button>`).
|
|
160
|
+
- Pause control: provide a small "Pause" button (corner) for users who want to stop the loop. Required by WCAG 2.2 SC 2.2.2.
|
|
161
|
+
|
|
162
|
+
```html
|
|
163
|
+
<button aria-label="비디오 일시정지" class="video-pause-toggle">⏸</button>
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
- Reduced motion: handled via media query; no video shown.
|
|
167
|
+
|
|
168
|
+
## Performance budget
|
|
169
|
+
|
|
170
|
+
| Metric | Target |
|
|
171
|
+
| --- | --- |
|
|
172
|
+
| Hero loop file size | < 3MB (5-15s, 1080p, ~1.5 Mbps) |
|
|
173
|
+
| Mobile variant | < 1.5MB (5-15s, 720p) |
|
|
174
|
+
| Framerate | 24-30 fps; prefer 24 fps for cinematic loops and 30 fps for product motion |
|
|
175
|
+
| LCP | < 2.5s (poster, not video) |
|
|
176
|
+
| Video start playing | < 3s on 4G |
|
|
177
|
+
| First frame match poster | Critical (otherwise visible flash) |
|
|
178
|
+
|
|
179
|
+
## File preparation tips (for content team)
|
|
180
|
+
|
|
181
|
+
- **Source**: 4K master, edit in 16:9 desktop + 4:5 / 9:16 mobile.
|
|
182
|
+
- **Trim**: 5-15 seconds; loop-friendly cuts.
|
|
183
|
+
- **Audio**: stripped (autoplay = muted).
|
|
184
|
+
- **Framerate**: export at 24 fps or 30 fps; avoid 60 fps hero loops because file size rises faster than perceived polish.
|
|
185
|
+
- **Compression**: ffmpeg with H.264 + faststart:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
ffmpeg -i master.mov \
|
|
189
|
+
-c:v libx264 -profile:v main -crf 23 -preset slow \
|
|
190
|
+
-an \
|
|
191
|
+
-movflags +faststart \
|
|
192
|
+
-vf "scale=1920:1080" \
|
|
193
|
+
hero-desktop.mp4
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
- **WebM (smaller)**:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
ffmpeg -i master.mov \
|
|
200
|
+
-c:v libvpx-vp9 -crf 35 -b:v 0 \
|
|
201
|
+
-an \
|
|
202
|
+
-vf "scale=1920:1080" \
|
|
203
|
+
hero-desktop.webm
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Implementation hints
|
|
207
|
+
|
|
208
|
+
```tsx
|
|
209
|
+
function VideoHero({
|
|
210
|
+
src,
|
|
211
|
+
poster,
|
|
212
|
+
posterMobile,
|
|
213
|
+
overlay = "dark",
|
|
214
|
+
overlayOpacity = 0.4,
|
|
215
|
+
align = "center",
|
|
216
|
+
verticalAlign = "middle",
|
|
217
|
+
aspectRatio = "16/9",
|
|
218
|
+
minHeight = "600px",
|
|
219
|
+
loadingStrategy = "eager",
|
|
220
|
+
children,
|
|
221
|
+
}: Props) {
|
|
222
|
+
const videoRef = useRef<HTMLVideoElement>(null);
|
|
223
|
+
const [videoReady, setVideoReady] = useState(false);
|
|
224
|
+
const reduced = usePrefersReducedMotion();
|
|
225
|
+
const slowConnection = useSlowConnection();
|
|
226
|
+
const [pausedByUser, setPausedByUser] = useState(false);
|
|
227
|
+
|
|
228
|
+
const shouldLoadVideo = !reduced && !slowConnection;
|
|
229
|
+
|
|
230
|
+
useEffect(() => {
|
|
231
|
+
if (!shouldLoadVideo || !videoRef.current) return;
|
|
232
|
+
|
|
233
|
+
const video = videoRef.current;
|
|
234
|
+
const onCanPlay = () => setVideoReady(true);
|
|
235
|
+
video.addEventListener("canplaythrough", onCanPlay);
|
|
236
|
+
|
|
237
|
+
if (loadingStrategy === "eager") {
|
|
238
|
+
video.load();
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return () => video.removeEventListener("canplaythrough", onCanPlay);
|
|
242
|
+
}, [shouldLoadVideo, loadingStrategy]);
|
|
243
|
+
|
|
244
|
+
return (
|
|
245
|
+
<section
|
|
246
|
+
className="video-hero"
|
|
247
|
+
data-overlay={overlay}
|
|
248
|
+
data-align={align}
|
|
249
|
+
data-vertical-align={verticalAlign}
|
|
250
|
+
style={{
|
|
251
|
+
aspectRatio,
|
|
252
|
+
minHeight,
|
|
253
|
+
"--overlay-opacity": overlayOpacity,
|
|
254
|
+
} as React.CSSProperties}
|
|
255
|
+
>
|
|
256
|
+
<picture className="video-hero__poster" data-state={videoReady ? "hidden" : "visible"}>
|
|
257
|
+
<source media="(max-width: 767px)" srcSet={posterMobile ?? poster} />
|
|
258
|
+
<img src={poster} alt="" />
|
|
259
|
+
</picture>
|
|
260
|
+
|
|
261
|
+
{shouldLoadVideo && (
|
|
262
|
+
<video
|
|
263
|
+
ref={videoRef}
|
|
264
|
+
className="video-hero__video"
|
|
265
|
+
data-state={videoReady && !pausedByUser ? "visible" : "hidden"}
|
|
266
|
+
autoPlay
|
|
267
|
+
muted
|
|
268
|
+
loop
|
|
269
|
+
playsInline
|
|
270
|
+
aria-hidden="true"
|
|
271
|
+
>
|
|
272
|
+
{src.map(s => (
|
|
273
|
+
<source key={s.src} src={s.src} type={s.type} media={s.media} />
|
|
274
|
+
))}
|
|
275
|
+
</video>
|
|
276
|
+
)}
|
|
277
|
+
|
|
278
|
+
<div className="video-hero__overlay" />
|
|
279
|
+
|
|
280
|
+
<div className="video-hero__content">
|
|
281
|
+
{children}
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
{shouldLoadVideo && (
|
|
285
|
+
<button
|
|
286
|
+
className="video-hero__pause"
|
|
287
|
+
aria-label={pausedByUser ? "비디오 재생" : "비디오 일시정지"}
|
|
288
|
+
onClick={() => {
|
|
289
|
+
const video = videoRef.current;
|
|
290
|
+
if (!video) return;
|
|
291
|
+
if (video.paused) { video.play(); setPausedByUser(false); }
|
|
292
|
+
else { video.pause(); setPausedByUser(true); }
|
|
293
|
+
}}
|
|
294
|
+
>
|
|
295
|
+
{pausedByUser ? "▶" : "⏸"}
|
|
296
|
+
</button>
|
|
297
|
+
)}
|
|
298
|
+
</section>
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## CSS
|
|
304
|
+
|
|
305
|
+
```css
|
|
306
|
+
.video-hero {
|
|
307
|
+
position: relative;
|
|
308
|
+
width: 100%;
|
|
309
|
+
display: grid;
|
|
310
|
+
place-items: center;
|
|
311
|
+
overflow: hidden;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
.video-hero__poster,
|
|
315
|
+
.video-hero__video {
|
|
316
|
+
position: absolute;
|
|
317
|
+
inset: 0;
|
|
318
|
+
width: 100%;
|
|
319
|
+
height: 100%;
|
|
320
|
+
object-fit: cover;
|
|
321
|
+
transition: opacity 200ms var(--ease-out);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.video-hero__poster[data-state="hidden"] { opacity: 0; }
|
|
325
|
+
.video-hero__video[data-state="visible"] { opacity: 1; }
|
|
326
|
+
.video-hero__video[data-state="hidden"] { opacity: 0; }
|
|
327
|
+
|
|
328
|
+
.video-hero__overlay {
|
|
329
|
+
position: absolute;
|
|
330
|
+
inset: 0;
|
|
331
|
+
background: rgba(0, 0, 0, var(--overlay-opacity, 0.4));
|
|
332
|
+
pointer-events: none;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.video-hero[data-overlay="light"] .video-hero__overlay { background: rgba(255,255,255, var(--overlay-opacity)); }
|
|
336
|
+
.video-hero[data-overlay="gradient-bottom"] .video-hero__overlay {
|
|
337
|
+
background: linear-gradient(to bottom, transparent, rgba(0,0,0,0.7));
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.video-hero__content {
|
|
341
|
+
position: relative;
|
|
342
|
+
z-index: 1;
|
|
343
|
+
color: var(--color-fg-on-overlay, white);
|
|
344
|
+
padding: var(--space-xl);
|
|
345
|
+
max-width: var(--max-width-prose);
|
|
346
|
+
text-align: center;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.video-hero[data-align="start"] .video-hero__content { text-align: start; }
|
|
350
|
+
.video-hero[data-align="end"] .video-hero__content { text-align: end; }
|
|
351
|
+
|
|
352
|
+
.video-hero__pause {
|
|
353
|
+
position: absolute;
|
|
354
|
+
bottom: var(--space-md);
|
|
355
|
+
right: var(--space-md);
|
|
356
|
+
z-index: 2;
|
|
357
|
+
width: 40px; height: 40px;
|
|
358
|
+
background: rgba(0,0,0,0.5);
|
|
359
|
+
color: white;
|
|
360
|
+
border: 0;
|
|
361
|
+
border-radius: 50%;
|
|
362
|
+
cursor: pointer;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
@media (prefers-reduced-motion: reduce) {
|
|
366
|
+
.video-hero__video { display: none; }
|
|
367
|
+
.video-hero__pause { display: none; }
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Contrast contract: text on `--color-bg-overlay-dark` must clear at least **4.5:1** against `--color-fg-on-overlay`; the pause control icon on the `rgba(0,0,0,0.5)` background must clear at least **3:1** for UI graphics. If the source video has bright regions behind text, increase `overlayOpacity` before shipping instead of relying on the average frame.
|
|
372
|
+
|
|
373
|
+
## Edge cases
|
|
374
|
+
|
|
375
|
+
- **Mobile data saver mode**: `prefers-reduced-data` (experimental) — treat as slow connection.
|
|
376
|
+
- **iOS Low Power Mode**: video may pause; user can manually resume.
|
|
377
|
+
- **Browser tab background**: video pauses automatically (browser default); resumes on focus.
|
|
378
|
+
- **Video sources all 404**: fall back to poster only; text overlay still works.
|
|
379
|
+
- **Poster image fails to load**: fall back to solid background color from `--color-bg-default`.
|
|
380
|
+
- **Mobile bandwidth**: even with WiFi, mobile WebKit is conservative on autoplay; respect that.
|
|
381
|
+
- **RTL languages**: text overlay alignment swaps automatically with `text-align: start/end`.
|
|
382
|
+
|
|
383
|
+
## Don't
|
|
384
|
+
|
|
385
|
+
- Don't auto-play with sound. Browsers block; users hate.
|
|
386
|
+
- Don't put critical info ONLY in the video. Text overlay carries meaning.
|
|
387
|
+
- Don't ship 4K hero loops. 1080p mobile + 1080p desktop is enough.
|
|
388
|
+
- Don't skip the poster. First paint is otherwise blank.
|
|
389
|
+
- Don't loop without seamless edit — visible flash kills polish.
|
|
390
|
+
- Don't auto-play on cellular without `prefers-reduced-data` check (where supported).
|
|
391
|
+
- Don't omit the pause button — WCAG 2.2 requires user control over autoplay > 5s.
|
|
392
|
+
- Don't put text behind low-contrast video areas — overlay tint exists for this.
|
|
393
|
+
|
|
394
|
+
## References
|
|
395
|
+
|
|
396
|
+
Patterns drawn from:
|
|
397
|
+
- Apple.com hero video patterns (poster + autoplay + loop)
|
|
398
|
+
- Stripe.com hero patterns
|
|
399
|
+
- Linear.app hero patterns
|
|
400
|
+
- Toss.im / 토스 landing-page hero patterns
|
|
401
|
+
|
|
402
|
+
## Cross-reference
|
|
403
|
+
|
|
404
|
+
- [`knowledge/video/video-fundamentals.md`](../knowledge/video/video-fundamentals.md) — encoding
|
|
405
|
+
- [`knowledge/video/marketing-video.md`](../knowledge/video/marketing-video.md) — marketing video strategy
|
|
406
|
+
- [`knowledge/video/korean-video-conventions.md`](../knowledge/video/korean-video-conventions.md) — KR
|
|
407
|
+
- [`knowledge/patterns/landing-hero-design.md`](../knowledge/patterns/landing-hero-design.md) — hero strategy
|
|
408
|
+
- [`examples/component-video-player.md`](component-video-player.md) — full controls player
|
|
409
|
+
- [`examples/component-hero-block.md`](component-hero-block.md) — hero block (alternate without video)
|